Skip to content
Toggle navigation
Toggle navigation
This project
Loading...
Sign in
csbr-daop
/
fe-data-trusted-space
Go to a project
Toggle navigation
Toggle navigation pinning
Projects
Groups
Snippets
Help
Project
Activity
Repository
Pipelines
Graphs
Issues
0
Merge Requests
0
Wiki
Network
Create a new issue
Builds
Commits
Issue Boards
Files
Commits
Network
Compare
Branches
Tags
7d41b35c
authored
2025-08-14 19:55:08 +0800
by
lxs
Committed by
lihua
2025-09-24 15:03:17 +0800
Browse Files
Options
Browse Files
Tag
Download
Email Patches
Plain Diff
数据定价更新
1 parent
9eb1c020
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
199 additions
and
262 deletions
src/views/data_pricing/calculateConfig.vue
src/views/data_pricing/calculateConfig.vue
View file @
7d41b35
...
...
@@ -52,8 +52,13 @@ const dictionaryData: any = ref([]);
const
diseaseData
:
any
=
ref
([]);
const
qualityScoreData
:
any
=
ref
({});
const
disScore
:
any
=
ref
([]);
const
exportData
:
any
=
ref
([]);
const
dataUsage
=
ref
(
''
);
const
buildInData
:
any
=
ref
([]);
const
dataUsage
=
ref
({
field
:
''
,
dictValue
:
''
});
const
currModelGuid
=
ref
(
''
);
// 基础设置
const
baseConfigFormRef
=
ref
();
const
baseConfigFormItems
:
any
=
ref
([
...
...
@@ -93,7 +98,6 @@ const baseConfigFormItems: any = ref([
placeholder
:
''
,
field
:
'belongingEntityGuid'
,
default
:
''
,
options
:
[],
clearable
:
true
,
disabled
:
true
},
...
...
@@ -141,10 +145,16 @@ const tableLoading = ref(false);
const
dataTransactionPrice
:
any
=
ref
(
''
);
const
setFormItems
=
(
info
=
null
)
=>
{
let
datas
:
any
=
info
||
flowDetail
.
value
||
{};
const
dData
=
datas
.
dictionaryJson
?
JSON
.
parse
(
datas
.
dictionaryJson
)
:
{};
datas
=
{
...
datas
,
...
dData
};
const
dictData
=
datas
.
dictionaryJson
?
JSON
.
parse
(
datas
.
dictionaryJson
)
:
{};
const
builtIndicators
=
datas
.
builtIndicators
||
buildInData
.
value
||
[];
let
buildData
=
{};
builtIndicators
.
map
(
item
=>
{
buildData
[
`build_
${
item
.
guid
}
`
]
=
item
.
isInputParameter
!=
'Y'
?
changeNum
(
item
.
targetValue
,
2
)
:
item
.
targetValue
!=
''
&&
item
.
targetValue
!=
null
?
parseFloat
(
item
.
targetValue
).
toFixed
(
2
)
:
''
;
});
datas
=
{
...
datas
,
...
dictData
,
...
buildData
};
baseConfigFormItems
.
value
.
map
(
item
=>
{
item
.
default
=
datas
[
item
.
field
]
||
''
;
item
.
label
==
'数据用途'
&&
(
dataUsage
.
value
.
dictValue
=
datas
[
item
.
field
]
||
''
);
})
nextTick
(()
=>
{
baseConfigFormRef
.
value
.
ruleFormRef
?.
clearValidate
();
...
...
@@ -256,7 +266,8 @@ const getDetail = () => {
const
data
=
res
.
data
||
{};
flowDetail
.
value
=
data
;
dataTransactionPrice
.
value
=
flowDetail
.
value
.
dataTransactionPrice
;
dataUsage
.
value
=
data
.
dataUsage
||
''
;
dataUsage
.
value
.
dictValue
=
data
.
dataUsage
||
''
;
currModelGuid
.
value
=
flowDetail
.
value
.
modelGuid
;
const
mItem
=
typeMap
.
value
.
modelGuid
.
find
(
m
=>
m
.
guid
==
flowDetail
.
value
.
modelGuid
);
if
(
!
mItem
)
{
const
mtem
=
{
guid
:
flowDetail
.
value
.
modelGuid
,
modelName
:
flowDetail
.
value
.
modelName
};
...
...
@@ -284,38 +295,38 @@ const getDataTypeList = () => {
)
}
}
const
setFormItemData
=
()
=>
{
let
dictionaryList
:
any
=
[],
diseaseList
:
any
=
[];
pricingTargetList
.
value
.
map
(
item
=>
{
switch
(
item
.
targetType
)
{
case
'2'
:
item
.
functionName
==
'2'
&&
diseaseList
.
push
(
item
);
break
;
case
'3'
:
dictionaryList
.
push
(
item
);
break
;
default
:
break
;
// 设置数据字典选项
const
setDictFormItems
=
(
dictList
)
=>
{
dictList
.
map
(
d
=>
{
const
dictName
=
d
.
dictionaryName
;
const
dictField
=
`dict_
${
d
.
guid
}
`
;
baseConfigFormItems
.
value
.
push
({
label
:
dictName
,
type
:
'select'
,
placeholder
:
'请输入'
,
field
:
dictField
,
default
:
''
,
options
:
[],
clearable
:
true
,
filterable
:
true
,
required
:
true
,
});
baseConfigFormRules
.
value
[
dictField
]
=
[{
required
:
true
,
trigger
:
'change'
,
message
:
`请选择
${
dictName
}
`
}];
dictName
==
'数据用途'
&&
(
dataUsage
.
value
.
field
=
dictField
);
(()
=>
{
if
(
typeMap
.
value
[
dictField
]
==
undefined
)
{
getDataType
(
dictName
,
dictField
)
}
else
{
let
item
=
baseConfigFormItems
.
value
.
find
(
item
=>
item
.
field
==
dictField
);
item
&&
(
item
.
options
=
typeMap
.
value
[
dictField
]);
}
})()
})
dictionaryData
.
value
=
dictionaryList
;
diseaseData
.
value
=
diseaseList
;
if
(
diseaseList
.
length
)
{
const
diseaseName
=
flowDetail
.
value
.
diseaseName
||
''
;
const
modelGuid
=
flowDetail
.
value
.
modelGuid
||
''
;
// 获取疾病得分
if
(
diseaseName
&&
modelGuid
)
{
getTargetNum
({
diseaseName
,
guid
:
modelGuid
});
}
}
baseConfigFormItems
.
value
.
splice
(
4
);
for
(
var
r
in
baseConfigFormRules
.
value
)
{
if
(
r
!=
'modelGuid'
&&
r
!=
'dataResourceGuid'
)
{
delete
baseConfigFormRules
.
value
[
r
];
}
}
// 添加所属疾病
if
(
diseaseList
.
length
>
0
)
{
}
// 设置疾病选项
const
setDiseaseFormItems
=
()
=>
{
baseConfigFormItems
.
value
.
push
({
label
:
'所属疾病'
,
type
:
'cascader'
,
...
...
@@ -335,7 +346,7 @@ const setFormItemData = () => {
clearable
:
true
,
required
:
true
,
});
baseConfigFormRules
.
value
.
diseaseGuid
=
{
required
:
true
,
trigger
:
'change'
,
message
:
"请选择所属疾病"
}
;
baseConfigFormRules
.
value
.
diseaseGuid
=
[{
required
:
true
,
trigger
:
'change'
,
message
:
"请选择所属疾病"
}]
;
if
(
typeMap
.
value
[
'diseaseGuid'
]
==
undefined
)
{
getDiseaseData
();
}
else
{
...
...
@@ -351,32 +362,98 @@ const setFormItemData = () => {
}
}
}
}
// 添加数据字典
dictionaryList
.
map
(
d
=>
{
const
dictName
=
d
.
dictionaryName
;
const
dictField
=
`dict_
${
d
.
guid
}
`
;
}
// 设置内置指标选项
const
setBuildInFormItems
=
(
buildList
)
=>
{
buildList
.
map
(
b
=>
{
const
buildName
=
b
.
targetName
;
const
buildField
=
`build_
${
b
.
guid
}
`
;
buildInData
.
value
.
push
({
guid
:
b
.
guid
,
targetName
:
buildName
,
targetValue
:
b
.
defaultValue
||
''
,
isInputParameter
:
b
.
isInputParameter
,
})
baseConfigFormItems
.
value
.
push
({
label
:
dictName
,
type
:
'select'
,
placeholder
:
'请输入'
,
field
:
dictField
,
default
:
''
,
options
:
[],
label
:
buildName
,
type
:
'input'
,
placeholder
:
''
,
field
:
buildField
,
default
:
b
.
isInputParameter
!=
'Y'
?
changeNum
(
b
.
defaultValue
,
2
)
:
b
.
defaultValue
!=
''
&&
b
.
defaultValue
!=
null
?
parseFloat
(
b
.
defaultValue
).
toFixed
(
2
)
:
''
,
inputType
:
'moneyNumber'
,
maxlength
:
18
,
clearable
:
true
,
filterable
:
true
,
required
:
true
,
disabled
:
b
.
isInputParameter
!=
'Y'
,
required
:
true
});
baseConfigFormRules
.
value
[
dictField
]
=
{
required
:
true
,
trigger
:
'change'
,
message
:
`请选择
${
dictName
}
`
};
(()
=>
{
if
(
typeMap
.
value
[
dictField
]
==
undefined
)
{
getDataType
(
dictName
,
dictField
)
baseConfigFormRules
.
value
[
buildField
]
=
[
{
required
:
true
,
message
:
`请填写
${
buildName
}
`
,
trigger
:
'blur'
},
{
validator
:
(
rule
,
value
,
callback
)
=>
{
if
(
value
===
''
)
{
callback
(
new
Error
(
`请填写
${
buildName
}
`
));
return
;
}
const
num
=
parseFloat
(
value
);
if
(
isNaN
(
num
))
{
callback
(
new
Error
(
'请输入有效的数字'
));
return
;
}
// 已自动保留两位小数,不需再验证小数位数
if
(
num
<
0
||
num
>
b
.
defaultValue
)
{
callback
(
new
Error
(
`输入值必须在0到
${
b
.
defaultValue
}
之间`
));
}
else
{
let
item
=
baseConfigFormItems
.
value
.
find
(
item
=>
item
.
field
==
dictField
);
item
&&
(
item
.
options
=
typeMap
.
value
[
dictField
]);
callback
();
}
},
trigger
:
"blur"
,
},
]
})
};
// 添加表单选项数据
const
setFormItemData
=
async
()
=>
{
let
dictionaryList
:
any
=
[],
diseaseList
:
any
=
[],
buildInList
:
any
=
[];
pricingTargetList
.
value
.
map
(
item
=>
{
switch
(
item
.
targetType
)
{
case
'2'
:
item
.
functionName
==
'2'
&&
diseaseList
.
push
(
item
);
break
;
case
'3'
:
dictionaryList
.
push
(
item
);
break
;
case
'1'
:
buildInList
.
push
(
item
);
break
;
default
:
break
;
}
})()
})
dictionaryData
.
value
=
dictionaryList
;
diseaseData
.
value
=
diseaseList
;
if
(
diseaseList
.
length
)
{
const
diseaseName
=
flowDetail
.
value
.
diseaseName
||
''
;
const
modelGuid
=
flowDetail
.
value
.
modelGuid
||
''
;
// 获取疾病得分
if
(
diseaseName
&&
modelGuid
)
{
getTargetNum
({
diseaseName
,
guid
:
modelGuid
});
}
}
baseConfigFormItems
.
value
.
splice
(
4
);
for
(
var
r
in
baseConfigFormRules
.
value
)
{
if
(
r
!=
'modelGuid'
&&
r
!=
'dataResourceGuid'
)
{
delete
baseConfigFormRules
.
value
[
r
];
}
}
// 添加所属疾病
diseaseList
.
length
>
0
&&
await
setDiseaseFormItems
();
// 添加数据字典
dictionaryList
.
length
>
0
&&
await
setDictFormItems
(
dictionaryList
);
// 添加内置指标
buildInList
.
length
>
0
&&
await
setBuildInFormItems
(
buildInList
);
setTimeout
(()
=>
{
baseConfigFormRef
.
value
.
ruleFormRef
?.
clearValidate
();
},
100
)
...
...
@@ -414,12 +491,10 @@ const setTableData = (dataArr) => {
if
((
item
.
demandTableGuid
||
item
.
guid
))
{
const
rGuid
=
item
.
demandTableGuid
||
item
.
guid
;
const
rIndex
=
i
;
if
(
!
guid
||
(
guid
&&
rGuid
!=
(
demInfo
?.
demandTableGuid
||
''
)))
{
(()
=>
{
getDemandField
(
rGuid
,
rIndex
);
})()
}
}
})
resourceTableFieldAllNum
.
value
=
tableData
.
value
.
reduce
((
accumulator
,
currentValue
)
=>
{
return
accumulator
+
Number
(
currentValue
.
dataFieldsNum
);
...
...
@@ -438,6 +513,7 @@ const getModelConfig = (mGuid) => {
demandTableList
.
value
=
data
.
pricingDemandMenuRSVOS
||
[];
pricingTargetList
.
value
=
data
.
pricingTargetRSVOS
||
[];
demandTableFieldAllNum
.
value
=
data
.
fieldCount
||
0
;
buildInData
.
value
=
[];
}
})
}
...
...
@@ -505,7 +581,7 @@ const getResourceDetail = (sGuid, toPromise = true) => {
const
dGuid
=
item
.
dataTableGuid
;
const
rIndex
=
i
;
(()
=>
{
!
toPromise
&&
dGuid
&&
setTableRowData
(
dGuid
,
rIndex
)
!
toPromise
&&
dGuid
&&
setTableRowData
(
dGuid
,
rIndex
,
false
)
})()
})
resourceTableAllNum
.
value
=
tableData
.
value
.
filter
(
item
=>
item
.
dataTableGuid
!=
''
&&
item
.
dataTableGuid
!=
null
).
length
;
...
...
@@ -566,11 +642,25 @@ const getResourceInfo = (sGuid) => {
loading
.
value
=
false
;
}
}
const
setTableRowData
=
(
dGuid
,
rIndex
)
=>
{
let
rowData
=
tableData
.
value
[
rIndex
];
// 需求表字段匹配
const
matchTableFields
=
(
rData
,
tData
)
=>
{
rData
.
dataFields
.
map
(
t
=>
{
const
match
=
tData
.
find
(
d
=>
d
.
chName
==
t
.
fieldName
);
if
(
match
)
{
t
.
chName
=
match
.
chName
;
t
.
enName
=
match
.
enName
;
}
})
rData
.
dataFieldsNum
=
rData
.
dataFields
.
filter
(
item
=>
item
.
chName
!=
''
&&
item
.
chName
!=
null
).
length
;
resourceTableFieldAllNum
.
value
=
tableData
.
value
.
reduce
((
accumulator
,
currentValue
)
=>
{
return
accumulator
+
Number
(
currentValue
.
dataFieldsNum
);
},
0
);
}
const
setRowData
=
(
rowData
,
dGuid
,
detailDataTable
)
=>
{
if
(
guid
&&
dGuid
==
rowData
.
dataTableGuid
)
{
const
sourceTableField
=
flowDetail
.
value
.
dataPricingDemandmatchingRQVOS
?.
find
(
s
=>
dGuid
==
s
.
dataTableGuid
);
const
pricingDemandField
=
sourceTableField
?.
pricingDemandFieldRQVOS
||
[];
const
pricingDemandField
=
detailDataTable
?.
pricingDemandFieldRQVOS
||
[];
rowData
.
dataFields
.
map
(
f
=>
{
f
.
chName
=
pricingDemandField
.
find
(
s
=>
f
.
guid
==
s
.
guid
)?.
chName
||
''
})
...
...
@@ -584,6 +674,13 @@ const setTableRowData = (dGuid, rIndex) => {
return
accumulator
+
Number
(
currentValue
.
dataFieldsNum
);
},
0
);
resourceTableAllNum
.
value
=
tableData
.
value
.
filter
(
item
=>
item
.
dataTableGuid
!=
''
&&
item
.
dataTableGuid
!=
null
).
length
;
}
const
setTableRowData
=
(
dGuid
,
rIndex
,
setRow
=
true
)
=>
{
let
rowData
=
tableData
.
value
[
rIndex
];
const
detailDataTable
=
(
flowDetail
.
value
.
dataPricingDemandmatchingRQVOS
||
[]).
find
(
f
=>
f
.
dataTableGuid
==
dGuid
&&
f
.
demandTableGuid
==
rowData
.
demandTableGuid
);
setRow
&&
setRowData
(
rowData
,
dGuid
,
detailDataTable
);
const
currDataTableGuid
=
detailDataTable
?.
dataTableGuid
||
''
;
if
(
dGuid
)
{
tableLoading
.
value
=
true
;
getRegisterCatalogTableDetail
(
dGuid
).
then
((
res
:
any
)
=>
{
...
...
@@ -600,17 +697,11 @@ const setTableRowData = (dGuid, rIndex) => {
})
rowData
.
dataFields
.
map
(
t
=>
{
t
.
damFieldTable
=
JSON
.
parse
(
JSON
.
stringify
(
damFieldOptions
));
const
match
=
damFieldOptions
.
find
(
d
=>
d
.
chName
==
t
.
fieldName
);
if
(
match
)
{
t
.
chName
=
match
.
chName
;
t
.
enName
=
match
.
enName
;
}
})
rowData
.
dataFieldsNum
=
rowData
.
dataFields
.
filter
(
item
=>
item
.
chName
!=
''
&&
item
.
chName
!=
null
).
length
;
resourceTableFieldAllNum
.
value
=
tableData
.
value
.
reduce
((
accumulator
,
currentValue
)
=>
{
return
accumulator
+
Number
(
currentValue
.
dataFieldsNum
);
},
0
);
// console.log('rowData', rowData)
// 匹配
if
(
!
guid
||
(
guid
&&
(
dGuid
!=
currDataTableGuid
||
currModelGuid
.
value
!=
flowDetail
.
value
.
modelGuid
)))
{
matchTableFields
(
rowData
,
damTableField
);
}
}
else
{
proxy
.
$ElMessage
.
error
(
res
.
msg
);
}
...
...
@@ -629,6 +720,7 @@ const changeDatasource = () => {
}
})
}
const
cascaderChange
=
(
val
)
=>
{
disScore
.
value
=
[];
if
(
val
)
{
...
...
@@ -650,6 +742,7 @@ const selectChange = async (val, row, info) => {
resourceTableFieldAllNum
.
value
=
0
;
await
setFormItems
(
info
);
val
&&
getModelInfo
(
val
);
currModelGuid
.
value
=
val
||
''
;
qualityScoreData
.
value
=
{};
baseConfigFormItems
.
value
[
1
].
default
=
''
;
changeDatasource
();
...
...
@@ -663,6 +756,9 @@ const selectChange = async (val, row, info) => {
}
else
{
changeDatasource
();
}
}
else
if
(
row
.
field
==
dataUsage
.
value
.
field
)
{
dataUsage
.
value
.
dictValue
=
val
||
''
;
setFormItems
(
info
);
}
else
if
(
row
.
field
==
'dataTableGuid'
)
{
setTableRowData
(
val
,
info
.
$index
)
}
else
if
(
row
.
field
==
'chName'
)
{
...
...
@@ -721,34 +817,8 @@ const toPath = () => {
name
:
'priceCalculate'
,
})
}
// 获取维度公式计算结果
const
getSignatory
=
(
row
)
=>
{
let
formulaVal
=
0
;
const
pricingTargetData
=
row
.
pricingTargetRSVOS
||
[];
if
(
!
row
.
computationalFormula
||
row
.
computationalFormula
==
'custom'
)
{
let
formula
=
row
.
customize
;
// 遍历数组,检查 customize 是否包含对应的 targetName,若包含则替换为 tNum
pricingTargetData
.
forEach
((
item
)
=>
{
if
(
formula
.
includes
(
item
.
targetName
))
{
formula
=
formula
.
replace
(
new
RegExp
(
item
.
targetName
,
'g'
),
item
.
tNum
);
}
});
// 使用 eval 计算公式结果(注意:eval 存在安全风险,仅适用于受控环境)
try
{
formulaVal
=
eval
(
formula
);
}
catch
(
error
)
{
console
.
error
(
'公式计算错误:'
,
error
);
}
}
else
{
const
formula
=
pricingTargetData
.
map
(
item
=>
item
.
tNum
);
if
(
row
.
computationalFormula
==
'3'
)
{
formulaVal
=
formula
.
reduce
((
accumulator
,
currentValue
)
=>
parseFloat
(
accumulator
)
*
parseFloat
(
currentValue
),
1
);
// 初始值为1
}
else
{
formulaVal
=
formula
.
reduce
((
accumulator
,
currentValue
)
=>
parseFloat
(
accumulator
)
+
parseFloat
(
currentValue
),
0
);
// 初始值为0
}
}
return
(
Math
.
round
(
formulaVal
*
100
)
/
100
).
toFixed
(
2
);
};
// 获取疾病得分
const
getTargetNum
=
(
params
)
=>
{
// loading.value = true;
getPriceResult
(
params
).
then
((
res
:
any
)
=>
{
...
...
@@ -764,151 +834,6 @@ const getTargetNum = (params) => {
});
}
// 生成报告内容
const
reporting
=
(
formInfo
)
=>
{
let
resultInfo
:
any
=
[];
const
signatoryData
=
JSON
.
parse
(
JSON
.
stringify
(
modelData
.
value
.
pricingDimensionalityRSVOS
||
'[]'
));
signatoryData
.
map
((
sign
,
s
)
=>
{
resultInfo
.
push
({
dimensionalityName
:
sign
.
dimensionalityName
,
computationalFormula
:
sign
.
computationalFormula
,
customize
:
sign
.
customize
,
pricingTargetRSVOS
:
[]
});
const
targets
=
sign
.
pricingTargetRSVOS
||
[];
const
signTargets
=
targets
.
map
(
t
=>
{
let
tNum
:
any
=
0
,
tCustomize
=
''
;
if
(
t
.
targetType
==
'3'
)
{
// 指标类型-数据字典
const
tName
=
dictionaryData
.
value
.
find
(
d
=>
d
.
guid
==
t
.
guid
)
?
`dict_
${
t
.
guid
}
`
:
''
;
if
(
tName
)
{
const
pVal
=
typeMap
.
value
[
tName
].
find
(
t
=>
t
.
value
==
formInfo
[
tName
]);
const
dictionary
=
t
.
dictionaryJson
.
find
(
d
=>
d
.
name
==
pVal
.
label
);
if
(
sign
.
computationalFormula
==
'1'
)
{
// 加权平均
tNum
=
parseFloat
(
t
.
weight
)
/
100
*
parseFloat
(
dictionary
?.
value
||
t
.
defaultValue
||
0
);
tCustomize
=
`权重
${
parseFloat
(
t
.
weight
)
/
100
}
* 因子/默认值
${
parseFloat
(
dictionary
?.
value
||
t
.
defaultValue
||
0
)}
`;
} else { // 其他
tNum = parseFloat(dictionary?.value || t.defaultValue || 0);
tCustomize = `
默认值
$
{
parseFloat
(
dictionary
?.
value
||
t
.
defaultValue
||
0
)}
`;
}
t.dictionaryName == '数据用途' && (dataUsage.value = pVal.value || '');
}
} else if (t.targetType == '2') {// 指标类型-系统功能
if (t.functionName == '1') { // 功能名称-质量评价模型
const score = parseFloat(qualityScoreData.value.qualityScore || 0);
tNum = parseFloat(t.weight || 1) / 100 * score / 100;
tCustomize = `
权重
$
{
parseFloat
(
t
.
weight
||
1
)
/
100
}
*
模型评分
$
{
score
}
/100`
;
}
else
if
(
t
.
functionName
==
'2'
)
{
// 功能名称-疾病管理
if
(
sign
.
computationalFormula
==
'1'
)
{
// 加权平均
const
score
=
parseFloat
(
disScore
.
value
.
find
(
d
=>
d
.
guid
==
t
.
guid
)?.
factor
||
0
);
tNum
=
parseFloat
(
t
.
weight
)
/
100
*
score
;
tCustomize
=
`权重
${
parseFloat
(
t
.
weight
)
/
100
}
* 疾病得分
${
score
}
`
;
}
else
{
//其他
tNum
=
parseFloat
(
disScore
.
value
.
find
(
d
=>
d
.
guid
==
t
.
guid
)?.
factor
||
0
);
tCustomize
=
`疾病得分
${
tNum
}
`
;
}
}
else
if
(
t
.
functionName
==
'3'
)
{
// 功能名称-需求表管理
const
tData
=
tableData
.
value
.
find
(
f
=>
f
.
demandTableGuid
==
t
.
demandTableGuid
||
f
.
guid
==
t
.
demandTableGuid
);
if
(
tData
)
{
if
(
sign
.
computationalFormula
==
'1'
)
{
// 加权平均
tNum
=
parseFloat
(
t
.
weight
)
/
100
*
(
parseFloat
(
tData
.
dataFieldsNum
)
/
tData
.
dataFields
.
length
||
parseFloat
(
t
.
defaultValue
||
0
));
tCustomize
=
`权重
${
parseFloat
(
t
.
weight
)
/
100
}
* 匹配率/默认值
${
parseFloat
(
tData
.
dataFieldsNum
)
/
tData
.
dataFields
.
length
||
parseFloat
(
t
.
defaultValue
||
0
)}
`
;
}
else
{
//其他
tNum
=
parseFloat
(
tData
.
dataFieldsNum
)
/
tData
.
dataFields
.
length
||
parseFloat
(
t
.
defaultValue
||
0
);
tCustomize
=
`匹配率/默认值
${
parseFloat
(
tData
.
dataFieldsNum
)
/
tData
.
dataFields
.
length
||
parseFloat
(
t
.
defaultValue
||
0
)}
`
;
}
}
}
}
else
{
// 指标类型-系统内置
if
(
sign
.
computationalFormula
==
'1'
)
{
// 加权平均
tNum
=
parseFloat
(
t
.
weight
)
/
100
*
parseFloat
(
t
.
defaultValue
||
0
);
tCustomize
=
`权重
${
parseFloat
(
t
.
weight
)
/
100
}
* 默认值
${
parseFloat
(
t
.
defaultValue
||
0
)}
`
;
}
else
{
//其他
tNum
=
parseFloat
(
t
.
defaultValue
||
0
);
tCustomize
=
`默认值
${
parseFloat
(
t
.
defaultValue
||
0
)}
`
;
}
}
t
.
tNum
=
(
Math
.
round
(
parseFloat
(
tNum
)
*
100
)
/
100
).
toFixed
(
2
);
resultInfo
[
s
].
pricingTargetRSVOS
.
push
({
targetName
:
t
.
targetName
,
targetType
:
t
.
targetType
,
functionName
:
t
.
functionName
,
customize
:
tCustomize
,
tNum
:
t
.
tNum
,
})
return
t
;
})
sign
.
pricingTargetRSVOS
=
signTargets
;
sign
.
sNum
=
getSignatory
(
sign
);
resultInfo
[
s
].
sNum
=
sign
.
sNum
;
})
// exportData.value = resultInfo;
return
{
signatoryData
,
resultInfo
};
}
// 计算价格
const
calculatePrice
=
(
pData
)
=>
{
let
modelFormula
=
modelData
.
value
.
modelFormula
;
// 1. 移除所有干扰的引号(确保是数学表达式)
modelFormula
=
modelFormula
.
replace
(
/
[
"'
]
/g
,
""
).
trim
();
// 2. 定义允许的数学运算符和函数
const
allowedOperators
=
/
[
+
\-
*
/
%^() .
\d]
/
;
const
mathFunctions
=
[
'sin'
,
'cos'
,
'tan'
,
'log'
,
'sqrt'
,
'abs'
,
'pow'
];
// 3. 提取变量名
const
variableRegex
=
/
[\u
4e00-
\u
9fa5a-zA-Z_
][\u
4e00-
\u
9fa5a-zA-Z0-9_
]
*/g
;
const
variableNames
=
[...
new
Set
(
modelFormula
.
match
(
variableRegex
)
||
[])];
// 4. 构建变量映射
const
variables
=
{};
variableNames
.
forEach
(
name
=>
{
const
dim
=
pData
.
find
(
d
=>
d
.
dimensionalityName
===
name
);
variables
[
name
]
=
dim
?
parseFloat
(
dim
.
sNum
)
||
0
:
0
;
});
// 5. 替换变量为数值(考虑边界情况)
let
expression
=
modelFormula
;
Object
.
keys
(
variables
).
forEach
(
name
=>
{
expression
=
expression
.
replace
(
new
RegExp
(
name
,
'g'
),
variables
[
name
]);
});
// 6. 表达式规范化(不丢失括号)
expression
=
expression
.
replace
(
/
\s
+/g
,
''
)
// 去空格
.
replace
(
/
\^
/g
,
'**'
)
// 幂运算转换
.
replace
(
/"|'/g
,
''
)
// 去引号(不破坏括号)
.
replace
(
/
(\d)\(
/g
,
'$1*('
)
// 处理隐式乘法
.
replace
(
/
\)\(
/g
,
')*('
);
// 括号间乘法
// 7. 验证括号配对
const
balance
=
expression
.
split
(
''
).
reduce
((
acc
,
char
)
=>
{
if
(
char
===
'('
)
acc
++
;
if
(
char
===
')'
)
acc
--
;
return
acc
;
},
0
);
if
(
balance
!==
0
)
{
console
.
error
(
'括号不匹配'
);
return
NaN
;
}
// 8. 安全计算
try
{
const
result
=
new
Function
(
'return '
+
expression
)();
const
roundedResult
=
Math
.
round
(
parseFloat
(
result
)
*
100
)
/
100
;
dataTransactionPrice
.
value
=
roundedResult
.
toFixed
(
2
);
return
roundedResult
;
}
catch
(
error
)
{
console
.
error
(
'计算错误:'
,
{
error
,
original
:
modelFormula
,
processed
:
expression
});
return
NaN
;
}
};
// 获取定价计算配置参数
const
getCalculateParams
=
(
baseConfigFormObj
,
baseConfigFormInfo
)
=>
{
const
modelName
=
typeMap
.
value
.
modelGuid
.
find
(
d
=>
d
.
guid
==
baseConfigFormInfo
.
modelGuid
)?.
modelName
||
''
;
...
...
@@ -925,19 +850,32 @@ const getCalculateParams = (baseConfigFormObj, baseConfigFormInfo) => {
belongingTheme
:
baseConfigFormInfo
.
belongingTheme
,
diseaseGuid
,
diseaseName
:
''
,
dataUsage
:
dataUsage
.
value
dataUsage
:
dataUsage
.
value
.
dictValue
};
if
(
diseaseGuid
)
{
const
parentsData
=
baseConfigFormObj
.
getCascaderCheckedData
();
params
.
diseaseName
=
parentsData
[
0
]?.
label
||
''
;
}
let
dictionaryJson
=
{};
let
dictionaryJson
=
{}
,
builtInTarget
:
any
=
[]
;
for
(
var
b
in
baseConfigFormInfo
)
{
if
(
b
.
indexOf
(
'dict_'
)
>
-
1
)
{
dictionaryJson
[
b
]
=
baseConfigFormInfo
[
b
];
}
}
buildInData
.
value
.
map
(
item
=>
{
let
targetValue
=
baseConfigFormInfo
[
`build_
${
item
.
guid
}
`
];
if
(
typeof
targetValue
===
'string'
)
{
if
(
/^
[
+-
]?\d{1,3}(
,
\d{3})
*
(\.\d{2})?
$/
.
test
(
targetValue
))
{
targetValue
=
parseFloat
(
targetValue
.
replace
(
/,/g
,
''
))
}
}
builtInTarget
.
push
({
...
item
,
targetValue
})
})
params
.
dictionaryJson
=
Object
.
keys
(
dictionaryJson
).
length
?
JSON
.
stringify
(
dictionaryJson
)
:
''
;
params
.
builtIndicators
=
builtInTarget
;
let
demandMatchingData
:
any
=
[];
tableData
.
value
.
map
(
item
=>
{
demandMatchingData
.
push
({
...
...
@@ -967,15 +905,16 @@ const getCalculateParams = (baseConfigFormObj, baseConfigFormInfo) => {
const
getCalculatPrice
=
async
(
params
)
=>
{
try
{
const
res
:
any
=
await
calculatPrice
(
params
);
loading
.
value
=
false
;
if
(
res
.
code
===
proxy
.
$passCode
)
{
const
data
=
res
.
data
||
{};
return
data
;
// 返回计算结果以便后续使用
}
else
{
proxy
.
$ElMessage
.
error
(
res
.
msg
);
loading
.
value
=
false
;
throw
new
Error
(
res
.
msg
);
// 抛出错误以便 catch 捕获
}
}
catch
(
error
)
{
console
.
error
(
'计算价格失败:'
,
error
);
loading
.
value
=
false
;
throw
error
;
// 重新抛出错误
}
...
...
@@ -994,10 +933,8 @@ const checkForm = (type) => {
const
priceData
=
await
getCalculatPrice
(
paramsInfo
);
// 显示结果
dataTransactionPrice
.
value
=
priceData
.
transactionPrice
.
toFixed
(
2
);
if
(
type
==
'calculate'
)
{
loading
.
value
=
false
;
}
else
if
(
type
==
'export'
)
{
if
(
type
==
'export'
)
{
loading
.
value
=
true
;
const
exportOut
=
{
one
:
priceData
.
one
,
two
:
priceData
.
two
,
...
...
@@ -1021,11 +958,12 @@ const checkForm = (type) => {
message
:
'下载报告请求失败'
,
});
})
}
else
{
}
else
if
(
type
==
'submit'
)
{
let
params
=
{
...
paramsInfo
,
dataTransactionPrice
:
dataTransactionPrice
.
value
,
}
loading
.
value
=
true
;
savePrice
(
params
).
then
((
res
:
any
)
=>
{
loading
.
value
=
false
;
if
(
res
.
code
==
proxy
.
$passCode
)
{
...
...
@@ -1058,6 +996,11 @@ const btnClick = async (btn, row: any = null) => {
expendTableRef
.
value
.
toggleRowExpansion
(
row
);
}
else
if
(
type
==
'calculate'
||
type
==
'submit'
)
{
if
(
type
==
'submit'
)
{
const
errorMsgText
=
document
.
querySelectorAll
(
'.el-form-item__error'
);
if
(
errorMsgText
.
length
)
{
ElMessage
.
info
(
'请修改错误提示项内容后,再操作'
);
return
}
ElMessageBox
.
confirm
(
dataTransactionPrice
.
value
===
''
?
'是否直接计算价格并提交'
:
'请确认当前数据交易价格是否为最新计算结果'
,
'提示'
,
{
confirmButtonText
:
'确定'
,
cancelButtonText
:
'取消'
,
...
...
@@ -1121,7 +1064,6 @@ onBeforeMount(() => {
getDetail
();
}
else
{
getDataTypeList
();
getModel
()
}
})
onMounted
(()
=>
{
...
...
@@ -1214,16 +1156,11 @@ onMounted(() => {
clearable
/>
</
template
>
</el-table-column>
<el-table-column
label=
"操作"
fixed=
"right"
width=
"100"
>
<
template
#
default=
"scope"
>
<el-button
type=
"primary"
link
@
click=
"btnClick(
{ value: 'expend' }, scope.row)">字段映射
</el-button>
</
template
>
</el-table-column>
</el-table>
</div>
</div>
</ContentWrap>
<ContentWrap
id=
"contract-content-wrap"
title=
"输出结
构
"
expandSwicth
style=
"margin-top: 15px"
:isExpand=
"expand3"
<ContentWrap
id=
"contract-content-wrap"
title=
"输出结
果
"
expandSwicth
style=
"margin-top: 15px"
:isExpand=
"expand3"
@
expand=
"(v) => expand3 = v"
>
<el-form
class=
"result-form"
>
<el-form-item
class=
"flex-column"
label=
"数据交易价格(元)"
>
...
...
Write
Preview
Styling with
Markdown
is supported
Attach a file
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to post a comment