数据定价对接计算接口
Showing
2 changed files
with
98 additions
and
109 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,72 +909,100 @@ const calculatePrice = (pData) => { | ... | @@ -908,72 +909,100 @@ const calculatePrice = (pData) => { |
| 908 | } | 909 | } |
| 909 | }; | 910 | }; |
| 910 | 911 | ||
| 912 | // 获取定价计算配置参数 | ||
| 913 | const getCalculateParams = (baseConfigFormObj, baseConfigFormInfo) => { | ||
| 914 | const modelName = typeMap.value.modelGuid.find(d => d.guid == baseConfigFormInfo.modelGuid)?.modelName || ''; | ||
| 915 | const dataResourceName = typeMap.value.dataResourceGuid.find(d => d.damGuid == baseConfigFormInfo.dataResourceGuid)?.damName || ''; | ||
| 916 | const diseaseGuid = baseConfigFormInfo.diseaseGuid || ''; | ||
| 917 | let params: any = { | ||
| 918 | tenantGuid: userData.tenantGuid, | ||
| 919 | dataTransactionPrice: dataTransactionPrice.value, | ||
| 920 | modelGuid: baseConfigFormInfo.modelGuid, | ||
| 921 | modelName, | ||
| 922 | dataResourceGuid: baseConfigFormInfo.dataResourceGuid, | ||
| 923 | dataResourceName, | ||
| 924 | belongingEntityGuid: baseConfigFormInfo.belongingEntityGuid, | ||
| 925 | belongingTheme: baseConfigFormInfo.belongingTheme, | ||
| 926 | diseaseGuid, | ||
| 927 | diseaseName: '', | ||
| 928 | dataUsage: dataUsage.value | ||
| 929 | }; | ||
| 930 | if (diseaseGuid) { | ||
| 931 | const parentsData = baseConfigFormObj.getCascaderCheckedData(); | ||
| 932 | params.diseaseName = parentsData[0]?.label || ''; | ||
| 933 | } | ||
| 934 | let dictionaryJson = {}; | ||
| 935 | for (var b in baseConfigFormInfo) { | ||
| 936 | if (b.indexOf('dict_') > -1) { | ||
| 937 | dictionaryJson[b] = baseConfigFormInfo[b]; | ||
| 938 | } | ||
| 939 | } | ||
| 940 | params.dictionaryJson = Object.keys(dictionaryJson).length ? JSON.stringify(dictionaryJson) : ''; | ||
| 941 | let demandMatchingData: any = []; | ||
| 942 | tableData.value.map(item => { | ||
| 943 | demandMatchingData.push({ | ||
| 944 | demandTableName: item.demandTableName, | ||
| 945 | demandTableGuid: item.demandTableGuid || item.guid, // 需求表guid | ||
| 946 | dataTableGuid: item.dataTableGuid || '', // 数据资源表guid | ||
| 947 | weightDemandTable: item.weightDemandTable, | ||
| 948 | dataFieldsNum: item.dataFieldsNum, | ||
| 949 | pricingDemandFieldRQVOS: item.dataFields.map(d => { | ||
| 950 | return { | ||
| 951 | demandFieldGuid: d.demandFieldGuid || d.guid, // 资源表字段guid | ||
| 952 | fieldName: d.fieldName, | ||
| 953 | enName: d.enName, | ||
| 954 | chName: d.chName, | ||
| 955 | isRequired: d.isRequired, | ||
| 956 | orderNum: d.orderNum | ||
| 957 | } | ||
| 958 | }) | ||
| 959 | }) | ||
| 960 | }); | ||
| 961 | params.dataPricingDemandmatchingRQVOS = demandMatchingData; | ||
| 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 | if (res.code === proxy.$passCode) { | ||
| 971 | const data = res.data || {}; | ||
| 972 | return data; // 返回计算结果以便后续使用 | ||
| 973 | } else { | ||
| 974 | proxy.$ElMessage.error(res.msg); | ||
| 975 | loading.value = false; | ||
| 976 | throw new Error(res.msg); // 抛出错误以便 catch 捕获 | ||
| 977 | } | ||
| 978 | } catch (error) { | ||
| 979 | loading.value = false; | ||
| 980 | throw error; // 重新抛出错误 | ||
| 981 | } | ||
| 982 | }; | ||
| 983 | |||
| 911 | // 计算结果和提交 | 984 | // 计算结果和提交 |
| 912 | const checkForm = (type) => { | 985 | const checkForm = (type) => { |
| 913 | const baseConfigFormObj = baseConfigFormRef.value; | 986 | const baseConfigFormObj = baseConfigFormRef.value; |
| 914 | const baseConfigFormEl = baseConfigFormObj.ruleFormRef; | 987 | const baseConfigFormEl = baseConfigFormObj.ruleFormRef; |
| 915 | const baseConfigFormInfo = baseConfigFormObj.formInline; | 988 | const baseConfigFormInfo = baseConfigFormObj.formInline; |
| 916 | baseConfigFormEl.validate((valid, errorItem) => { | 989 | baseConfigFormEl.validate(async (valid, errorItem) => { |
| 917 | if (valid) { | 990 | if (valid) { |
| 991 | const paramsInfo = getCalculateParams(baseConfigFormObj, baseConfigFormInfo); | ||
| 992 | loading.value = true; | ||
| 993 | // 先获取计算结果 | ||
| 994 | const priceData = await getCalculatPrice(paramsInfo); | ||
| 995 | // 显示结果 | ||
| 996 | dataTransactionPrice.value = priceData.transactionPrice.toFixed(2); | ||
| 997 | |||
| 918 | if (type == 'calculate') { | 998 | if (type == 'calculate') { |
| 919 | const { signatoryData, resultInfo } = reporting(baseConfigFormInfo); | 999 | loading.value = false; |
| 920 | exportData.value = resultInfo; | ||
| 921 | calculatePrice(signatoryData); | ||
| 922 | } else if (type == 'export') { | 1000 | } else if (type == 'export') { |
| 923 | const { signatoryData, resultInfo } = reporting(baseConfigFormInfo); | 1001 | const exportOut = { |
| 924 | exportData.value = resultInfo; | 1002 | one: priceData.one, |
| 925 | !dataTransactionPrice.value && calculatePrice(signatoryData); | 1003 | two: priceData.two, |
| 926 | loading.value = true; | 1004 | three: priceData.three, |
| 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 | } | 1005 | } |
| 975 | exportOut.three = `${baseConfigFormInfo.belongingEntityGuid}持有的"${damName}"的数据(患者人次)单价为${changeNum(dataTransactionPrice.value, 2)}元${dictListStr ? `;其中${dictListStr}` : '。'}`; | ||
| 976 | |||
| 977 | exportModelScore(exportOut).then((res: any) => { | 1006 | exportModelScore(exportOut).then((res: any) => { |
| 978 | loading.value = false; | 1007 | loading.value = false; |
| 979 | if (res && !res.msg) { | 1008 | if (res && !res.msg) { |
| ... | @@ -993,59 +1022,10 @@ const checkForm = (type) => { | ... | @@ -993,59 +1022,10 @@ const checkForm = (type) => { |
| 993 | }); | 1022 | }); |
| 994 | }) | 1023 | }) |
| 995 | } else { | 1024 | } else { |
| 996 | const { signatoryData, resultInfo } = reporting(baseConfigFormInfo); | 1025 | let params = { |
| 997 | exportData.value = resultInfo; | 1026 | ...paramsInfo, |
| 998 | !dataTransactionPrice.value && calculatePrice(signatoryData); | ||
| 999 | 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 || ''; | ||
| 1001 | const diseaseGuid = baseConfigFormInfo.diseaseGuid || ''; | ||
| 1002 | let params: any = { | ||
| 1003 | tenantGuid: userData.tenantGuid, | ||
| 1004 | dataTransactionPrice: dataTransactionPrice.value, | 1027 | dataTransactionPrice: dataTransactionPrice.value, |
| 1005 | modelGuid: baseConfigFormInfo.modelGuid, | ||
| 1006 | modelName, | ||
| 1007 | dataResourceGuid: baseConfigFormInfo.dataResourceGuid, | ||
| 1008 | dataResourceName, | ||
| 1009 | belongingEntityGuid: baseConfigFormInfo.belongingEntityGuid, | ||
| 1010 | belongingTheme: baseConfigFormInfo.belongingTheme, | ||
| 1011 | diseaseGuid, | ||
| 1012 | diseaseName: '', | ||
| 1013 | dataUsage: dataUsage.value | ||
| 1014 | }; | ||
| 1015 | if (diseaseGuid) { | ||
| 1016 | const parentsData = baseConfigFormObj.getCascaderCheckedData(); | ||
| 1017 | params.diseaseName = parentsData[0]?.label || ''; | ||
| 1018 | } | 1028 | } |
| 1019 | let dictionaryJson = {}; | ||
| 1020 | for (var b in baseConfigFormInfo) { | ||
| 1021 | if (b.indexOf('dict_') > -1) { | ||
| 1022 | dictionaryJson[b] = baseConfigFormInfo[b]; | ||
| 1023 | } | ||
| 1024 | } | ||
| 1025 | params.dictionaryJson = Object.keys(dictionaryJson).length ? JSON.stringify(dictionaryJson) : ''; | ||
| 1026 | let demandMatchingData: any = []; | ||
| 1027 | tableData.value.map(item => { | ||
| 1028 | demandMatchingData.push({ | ||
| 1029 | demandTableName: item.demandTableName, | ||
| 1030 | demandTableGuid: item.demandTableGuid || item.guid, // 需求表guid | ||
| 1031 | dataTableGuid: item.dataTableGuid, // 数据资源表guid | ||
| 1032 | weightDemandTable: item.weightDemandTable, | ||
| 1033 | dataFieldsNum: item.dataFieldsNum, | ||
| 1034 | pricingDemandFieldRQVOS: item.dataFields.map(d => { | ||
| 1035 | return { | ||
| 1036 | demandFieldGuid: d.demandFieldGuid || d.guid, // 资源表字段guid | ||
| 1037 | fieldName: d.fieldName, | ||
| 1038 | enName: d.enName, | ||
| 1039 | chName: d.chName, | ||
| 1040 | isRequired: d.isRequired, | ||
| 1041 | orderNum: d.orderNum | ||
| 1042 | } | ||
| 1043 | }) | ||
| 1044 | }) | ||
| 1045 | }); | ||
| 1046 | params.dataPricingDemandmatchingRQVOS = demandMatchingData; | ||
| 1047 | guid && (params.guid = guid); | ||
| 1048 | loading.value = true; | ||
| 1049 | savePrice(params).then((res: any) => { | 1029 | savePrice(params).then((res: any) => { |
| 1050 | loading.value = false; | 1030 | loading.value = false; |
| 1051 | if (res.code == proxy.$passCode) { | 1031 | if (res.code == proxy.$passCode) { | ... | ... |
-
Please register or sign in to post a comment