ffe5da2f by lxs

数据定价对接计算接口

1 parent 8dd504ae
...@@ -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 };
......
Styling with Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!