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
c9f12146
authored
2025-08-14 14:05:18 +0800
by
lxs
Browse Files
Options
Browse Files
Tag
Download
Email Patches
Plain Diff
数据定价更新
1 parent
5b9b1b70
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
141 additions
and
275 deletions
src/router/modules/dataPricing.ts
src/views/data_entry/index.vue
src/views/data_pricing/calculateConfig.vue
src/router/modules/dataPricing.ts
View file @
c9f1214
...
...
@@ -78,7 +78,6 @@ const routes: RouteRecordRaw[] = [
sidebar
:
false
,
breadcrumb
:
false
,
cache
:
true
,
reuse
:
true
,
editPage
:
true
,
activeMenu
:
'/data-pricing/pricing-manage/price-config'
},
...
...
@@ -109,7 +108,6 @@ const routes: RouteRecordRaw[] = [
sidebar
:
false
,
breadcrumb
:
false
,
cache
:
true
,
reuse
:
true
,
editPage
:
true
,
activeMenu
:
'/data-pricing/pricing-manage/price-calculate'
},
...
...
src/views/data_entry/index.vue
View file @
c9f1214
...
...
@@ -77,7 +77,7 @@ const costForm = ref({
placeholder
:
"请选择"
,
clearable
:
true
,
required
:
true
,
visible
:
fals
e
,
visible
:
tru
e
,
popperClass
:
'date-year-popper'
,
disabledDate
:
(
date
)
=>
{
const
curr
=
new
Date
();
...
...
@@ -92,7 +92,7 @@ const costForm = ref({
placeholder
:
"请选择"
,
clearable
:
true
,
required
:
true
,
visible
:
fals
e
,
visible
:
tru
e
,
style
:
{
width
:
'calc(33.33% - 70px)'
,
'margin-right'
:
'8px'
},
popperClass
:
'date-month-popper'
,
disabledDate
:
(
date
)
=>
{
...
...
@@ -321,6 +321,7 @@ const getCostData = () => {
})
levelList
.
level1
.
map
(
l
=>
allMapList
.
value
.
push
(
l
));
setAllMapList
(
levelList
,
allMapList
.
value
,
2
);
}).
catch
((
res
)
=>
{
loading
.
value
=
false
;
});
...
...
@@ -339,10 +340,10 @@ const setAllMapList = (mapObj, arr, level) => {
const
setStep
=
async
()
=>
{
const
info
=
costFormInfo
.
value
;
await
setFormItems
(
info
,
'cost'
);
costForm
.
value
.
items
[
0
].
disabled
=
step
.
value
>
0
;
costForm
.
value
.
items
[
1
].
visible
=
step
.
value
==
1
;
costForm
.
value
.
items
[
2
].
visible
=
step
.
value
==
1
;
costForm
.
value
.
items
[
3
].
visible
=
step
.
value
==
1
;
//
costForm.value.items[0].disabled = step.value > 0;
//
costForm.value.items[1].visible = step.value == 1;
//
costForm.value.items[2].visible = step.value == 1;
//
costForm.value.items[3].visible = step.value == 1;
if
(
step
.
value
==
1
)
{
setSumRow
();
}
...
...
@@ -793,6 +794,61 @@ const btnClick = async (btn, bType = null) => {
}
};
const
initTableFileds
=
()
=>
{
let
fields
=
[
{
label
:
"累计投入"
,
field
:
"total"
,
width
:
120
,
align
:
'right'
,
getName
:
(
scope
)
=>
{
return
changeNum
(
scope
.
row
.
total
,
2
,
true
);
}
},
]
const
hasLevel1
=
checkedList
.
value
.
find
(
c
=>
c
.
level
==
1
);
if
(
hasLevel1
)
{
fields
.
splice
(
-
1
,
0
,
{
label
:
"指标"
,
field
:
"level1"
,
width
:
120
});
}
const
hasLevel2
=
checkedList
.
value
.
find
(
c
=>
c
.
level
==
2
);
if
(
hasLevel2
)
{
fields
.
splice
(
-
1
,
0
,
{
label
:
"一级分类"
,
field
:
"level2"
,
width
:
120
});
}
const
hasLevel3
=
checkedList
.
value
.
find
(
c
=>
c
.
level
==
3
);
if
(
hasLevel3
)
{
fields
.
splice
(
-
1
,
0
,
{
label
:
"二级分类"
,
field
:
"level3"
,
width
:
120
});
}
const
hasLevel4
=
checkedList
.
value
.
find
(
c
=>
c
.
level
==
4
);
if
(
hasLevel4
)
{
fields
.
splice
(
-
1
,
0
,
{
label
:
"三级分类"
,
field
:
"level4"
,
width
:
120
});
}
tableField
.
value
.
splice
(
0
);
tableField
.
value
.
push
(...
fields
);
initField
.
value
=
JSON
.
parse
(
JSON
.
stringify
(
tableField
.
value
));
const
datas
=
JSON
.
parse
(
JSON
.
stringify
(
checkedData
.
value
));
datas
.
sort
((
a
,
b
)
=>
a
.
code
.
localeCompare
(
b
.
code
));
const
dGuid
=
datas
.
map
(
d
=>
d
.
guid
);
let
tDatas
=
tableData
.
value
.
filter
(
t
=>
dGuid
.
indexOf
(
t
.
guid
)
>
-
1
);
datas
.
forEach
((
td
,
t
)
=>
{
if
(
tGuids
.
indexOf
(
td
.
guid
)
==
-
1
)
{
tDatas
.
splice
(
t
,
0
,
td
)
}
else
{
tDatas
.
map
(
d
=>
{
if
(
d
.
guid
==
td
.
guid
)
{
d
.
name
=
td
.
name
;
d
.
level1
=
td
.
level1
;
d
.
level2
=
td
.
level2
;
d
.
level3
=
td
.
level3
;
d
.
level4
=
td
.
level4
;
}
})
}
})
tableData
.
value
.
splice
(
0
);
tableData
.
value
=
tDatas
;
// if (tGuids.length > 0 && costFormInfo.value.baseDate && costFormInfo.value.investYear) {
// setTableFields(costFormInfo.value);
// besure.value = true;
// }
getMergeRow
();
};
const
setShowLevel4
=
()
=>
{
nextTick
(()
=>
{
const
box4
=
document
.
querySelectorAll
(
'.grid-panel-box.box3 .grid-items'
);
...
...
@@ -1368,33 +1424,27 @@ watch(showLevel4, (newVal, oldVal) => {
<
template
>
<div
class=
"container_wrap"
>
<div
class=
"content_main"
>
<div
class=
"top_tool_wrap"
>
<
!--
<
div
class=
"top_tool_wrap"
>
<StepBar
:steps-info=
"stepsInfo"
/>
</div>
<div
class=
"operator_panel_wrap"
:style=
"
{ 'min-height': step == 0 ? 'calc(100% - 112px)' : 'unset' }"
v-loading="loading">
<ContentWrap
title=
"入表类型"
description=
""
:expandSwicth=
"false"
v-show=
"step == 1"
>
<Form
ref=
"entryFormRef"
:itemList=
"entryForm.items"
formId=
"dam-base-form"
:rules=
"entryForm.rules"
col=
"col3"
@
selectChange=
"selectChange"
/>
</ContentWrap>
</div>
-->
<div
class=
"operator_panel_wrap"
:style=
"
{ 'min-height': 'unset' }" v-loading="loading">
<div
class=
"v-tip"
v-show=
"step == 0"
>
<div
class=
"tip-icon"
></div>
<div
class=
"tip-des"
>
本工具提供的入表评估结果仅为初步测算参考,基于用户输入参数生成,不代表最终入表金额。实际入表需遵循《企业数据资源相关会计处理暂行规定》及会计准则要求,经专业审计机构确认后方可生效。
</div>
</div>
<ContentWrap
:title=
"step == 0 ? '设置成本项' : step == 1 ? '填写成本明细' : '文件预览'"
description=
""
:expandSwicth=
"false"
:style=
"step == 1 ?
{ 'margin-top': '16px' } : {}">
<ContentWrap
:title=
"step == 0 ? '设置成本项' : '文件预览'"
description=
""
:expandSwicth=
"false"
:style=
"step == 1 ?
{ 'margin-top': '16px' } : {}">
<div
class=
"table_tool_wrap"
>
<Form
ref=
"costFormRef"
:itemList=
"costForm.items"
formId=
"dam-base-form"
:rules=
"costForm.rules"
col=
"col3"
@
btnClick=
"btnClick"
@
selectChange=
"selectChange"
/>
<div
class=
"tool_btn"
v-if=
"step ==
2
"
>
<div
class=
"tool_btn"
v-if=
"step ==
1
"
>
<el-button
type=
"primary"
@
click=
"exportClick"
>
下载文件
</el-button>
<!--
<el-button
type=
"primary"
plain
@
click=
"senMessage"
>
入表咨询
</el-button>
-->
</div>
</div>
<div
class=
"grid-box-wrap"
v-show=
"step ==
0
"
>
<div
class=
"grid-box-wrap"
v-show=
"step ==
3
"
>
<!-- 头部标题 -->
<div
class=
"grid-panel-wrap header"
:class=
"
{ col4: showLevel4 }">
<template
v-for=
"(list, l) in gridList"
:key=
"'panel'+l"
>
...
...
@@ -1497,14 +1547,14 @@ watch(showLevel4, (newVal, oldVal) => {
</div>
</div>
</div>
<div
class=
"table_panel_wrap"
v-show=
"step > 0"
>
<div
class=
"amount_tool"
v-if=
"step == 1"
>
<div
class=
"table_panel_wrap"
>
<div
class=
"amount_tool"
>
<span
class=
"amount_text"
>
累计投入:
</span>
<span
class=
"amount_num"
>
{{ changeNum(amount, 2, true) }}
</span>
<span>
元
</span>
</div>
<div
class=
"table_panel"
>
<el-table
id=
"cost-table"
v-show=
"step ==
1
"
ref=
"costTableRef"
:data=
"tableData"
<el-table
id=
"cost-table"
v-show=
"step ==
0
"
ref=
"costTableRef"
:data=
"tableData"
:span-method=
"tableSpanMethod"
:summary-method=
"tableSummaryMethod"
show-summary
border
:cell-class-name=
"isMergedCell"
>
<el-table-column
v-for=
"(item, i) in tableField"
:label=
"item.label"
:width=
"item.width"
...
...
@@ -1525,7 +1575,7 @@ watch(showLevel4, (newVal, oldVal) => {
</
template
>
</el-table-column>
</el-table>
<el-table
id=
"entry-table"
ref=
"entryTableRef"
:data=
"transposedData"
stripe
border
v-show=
"step ==
2
"
>
<el-table
id=
"entry-table"
ref=
"entryTableRef"
:data=
"transposedData"
stripe
border
v-show=
"step ==
1
"
>
<el-table-column
prop=
"title"
label=
"项目"
:width=
"140"
>
<
template
v-slot=
"{ row }"
>
<span>
{{
setLabel
(
row
.
title
)
}}
</span>
...
...
@@ -1545,14 +1595,19 @@ watch(showLevel4, (newVal, oldVal) => {
</div>
</div>
</ContentWrap>
<ContentWrap
title=
"入表类型"
description=
""
:expandSwicth=
"false"
v-show=
"step == 0"
>
<Form
ref=
"entryFormRef"
:itemList=
"entryForm.items"
formId=
"dam-base-form"
:rules=
"entryForm.rules"
col=
"col3"
@
selectChange=
"selectChange"
/>
</ContentWrap>
</div>
</div>
<div
class=
"tool_btns"
>
<div
class=
"btns"
>
<el-button
@
click=
"btnClick({ value: 'refresh' })"
>
重置
</el-button>
<el-button
@
click=
"btnClick({ value: 'prev' })"
v-if=
"step == 1"
>
上一步
</el-button>
<el-button
@
click=
"btnClick({ value: 'next' })"
v-if=
"step == 0"
>
入表
</el-button>
<!-- <el-button @click="btnClick({ value: 'prev' })" v-if="step == 1">上一步</el-button>
<el-button type="primary" @click="btnClick({ value: 'prev' })" v-if="step == 2">上一步</el-button>
<el-button
type=
"primary"
@
click=
"btnClick({ value: 'next' })"
v-if=
"step < 2"
>
下一步
</el-button>
<el-button type="primary" @click="btnClick({ value: 'next' })" v-if="step < 2">下一步</el-button>
-->
</div>
</div>
</div>
...
...
@@ -1848,7 +1903,7 @@ watch(showLevel4, (newVal, oldVal) => {
background
:
#FFFBF2
;
border
:
1px
solid
rgba
(
255
,
241
,
212
,
1
);
border-radius
:
4px
;
margin
:
5
px
0px
8px
;
margin
:
16
px
0px
8px
;
padding
:
2px
0px
;
.tip-icon
{
...
...
src/views/data_pricing/calculateConfig.vue
View file @
c9f1214
...
...
@@ -52,11 +52,13 @@ const dictionaryData: any = ref([]);
const
diseaseData
:
any
=
ref
([]);
const
qualityScoreData
:
any
=
ref
({});
const
disScore
:
any
=
ref
([]);
const
export
Data
:
any
=
ref
([]);
const
buildIn
Data
:
any
=
ref
([]);
const
dataUsage
=
ref
({
field
:
''
,
dictValue
:
''
});
// 基础设置
const
baseConfigFormRef
=
ref
();
const
baseConfigFormItems
:
any
=
ref
([
...
...
@@ -143,8 +145,13 @@ 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
||
[];
let
buildData
=
{};
builtIndicators
.
map
(
item
=>
{
buildData
[
`build_
${
item
.
guid
}
`
]
=
item
.
targetValue
;
});
datas
=
{
...
datas
,
...
dictData
,
...
buildData
};
baseConfigFormItems
.
value
.
map
(
item
=>
{
item
.
default
=
datas
[
item
.
field
]
||
''
;
item
.
label
==
'数据用途'
&&
(
dataUsage
.
value
.
dictValue
=
datas
[
item
.
field
]
||
''
);
...
...
@@ -266,8 +273,10 @@ const getDetail = () => {
typeMap
.
value
.
modelGuid
.
unshift
(
mtem
);
baseConfigFormItems
.
value
[
0
].
options
.
unshift
(
mtem
);
};
getModelInfo
(
flowDetail
.
value
.
modelGuid
);
getDataTypeList
()
setTimeout
(()
=>
{
getModelInfo
(
flowDetail
.
value
.
modelGuid
);
getDataTypeList
()
},
200
)
}
}).
catch
(()
=>
{
loading
.
value
=
false
;
...
...
@@ -304,7 +313,7 @@ const setDictFormItems = (dictList) => {
filterable
:
true
,
required
:
true
,
});
baseConfigFormRules
.
value
[
dictField
]
=
{
required
:
true
,
trigger
:
'change'
,
message
:
`请选择
${
dictName
}
`
}
;
baseConfigFormRules
.
value
[
dictField
]
=
[{
required
:
true
,
trigger
:
'change'
,
message
:
`请选择
${
dictName
}
`
}]
;
dictName
==
'数据用途'
&&
(
dataUsage
.
value
.
field
=
dictField
);
(()
=>
{
if
(
typeMap
.
value
[
dictField
]
==
undefined
)
{
...
...
@@ -338,7 +347,7 @@ const setDiseaseFormItems = () => {
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
{
...
...
@@ -361,16 +370,44 @@ const setBuildInFormItems = (buildList) => {
buildList
.
map
(
b
=>
{
const
buildName
=
b
.
targetName
;
const
buildField
=
`build_
${
b
.
guid
}
`
;
buildInData
.
value
.
push
({
guid
:
b
.
guid
,
targetName
:
buildName
,
})
baseConfigFormItems
.
value
.
push
({
label
:
buildName
,
type
:
'input'
,
placeholder
:
''
,
field
:
buildField
,
default
:
b
.
defaultValue
||
''
,
default
:
changeNum
(
b
.
defaultValue
,
2
),
inputType
:
'moneyNumber'
,
maxlength
:
18
,
clearable
:
true
,
disabled
:
b
.
isInputParameter
=
=
'Y'
disabled
:
b
.
isInputParameter
!
=
'Y'
});
baseConfigFormRules
.
value
[
buildField
]
=
{
required
:
true
,
trigger
:
'blur'
,
message
:
`请填写
${
buildName
}
`
};
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
{
callback
();
}
},
trigger
:
"blur"
,
},
]
})
};
...
...
@@ -413,7 +450,7 @@ const setFormItemData = async () => {
// 添加数据字典
dictionaryList
.
length
>
0
&&
await
setDictFormItems
(
dictionaryList
);
// 添加内置指标
//
buildInList.length > 0 && await setBuildInFormItems(buildInList);
buildInList
.
length
>
0
&&
await
setBuildInFormItems
(
buildInList
);
setTimeout
(()
=>
{
baseConfigFormRef
.
value
.
ruleFormRef
?.
clearValidate
();
...
...
@@ -476,6 +513,7 @@ const getModelConfig = (mGuid) => {
demandTableList
.
value
=
data
.
pricingDemandMenuRSVOS
||
[];
pricingTargetList
.
value
=
data
.
pricingTargetRSVOS
||
[];
demandTableFieldAllNum
.
value
=
data
.
fieldCount
||
0
;
buildInData
.
value
=
[];
}
})
}
...
...
@@ -773,34 +811,7 @@ const toPath = () => {
})
}
// 获取维度公式计算结果
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
)
=>
{
...
...
@@ -816,151 +827,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.dictValue = 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
||
''
;
...
...
@@ -983,13 +849,20 @@ const getCalculateParams = (baseConfigFormObj, baseConfigFormInfo) => {
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
=>
{
builtInTarget
.
push
({
...
item
,
targetValue
:
baseConfigFormInfo
[
`build_
${
item
.
guid
}
`
],
})
})
params
.
dictionaryJson
=
Object
.
keys
(
dictionaryJson
).
length
?
JSON
.
stringify
(
dictionaryJson
)
:
''
;
params
.
builtIndicators
=
builtInTarget
;
let
demandMatchingData
:
any
=
[];
tableData
.
value
.
map
(
item
=>
{
demandMatchingData
.
push
({
...
...
@@ -1048,65 +921,7 @@ const checkForm = (type) => {
// 显示结果
dataTransactionPrice
.
value
=
priceData
.
transactionPrice
.
toFixed
(
2
);
if
(
type
==
'calculate'
)
{
// const { signatoryData, resultInfo } = reporting(baseConfigFormInfo);
// exportData.value = resultInfo;
// calculatePrice(signatoryData);
}
else
if
(
type
==
'export'
)
{
// const { signatoryData, resultInfo } = reporting(baseConfigFormInfo);
// exportData.value = resultInfo;
// !dataTransactionPrice.value && calculatePrice(signatoryData);
// loading.value = true;
// let exportOut: any = {};
// // 估值对象信息
// const damName = typeMap.value.dataResourceGuid.find(f => f.damGuid == baseConfigFormInfo.dataResourceGuid)?.damName || '';
// exportOut.one = `因${baseConfigFormInfo.belongingEntityGuid}拟了解其所持有的\"${damName}\"相关数据资源的价格,为此需对该行为涉及的数据资源在不同应用场景下,基于数据资源持有单位的性质、信息化程度、数据稀缺性、需求匹配等情况下,为上述经济行为提供定价参考依据。`;
// exportOut.two = `估值对象:${baseConfigFormInfo.belongingEntityGuid}持有的\"${damName}\"`;
// // 估值范围信息
// const damNames = demandTableList.value.map(item => item.menuName)
// let rangStr = `包含${damNames.join('、')}等${damNames.length}张表单,${damNames.length}张表共计${demandTableFieldAllNum.value}个字段`;
// const dataTimeliness = pricingTargetList.value.find(p => p.dictionaryName == '时效性');
// const dataTimelinessStr = dataTimeliness ? typeMap.value[`dict_${dataTimeliness.guid}`].find(f => f.value == baseConfigFormInfo[`dict_${dataTimeliness.guid}`])?.label || '' : '';
// rangStr += dataTimelinessStr ? `,时间跨度为${dataTimelinessStr}的数据` : `的数据`;
// damNames.length && (exportOut.two = `${exportOut.two}\n估值范围:${rangStr}`);
// // 字典
// let dictList: any = [], hasModelScore = false;
// const dictStr = exportData.value.map(e => {
// // 检查是否有质量模型评分
// hasModelScore = hasModelScore || e.pricingTargetRSVOS.some(
// t => t.targetType === '2' && t.functionName === '1'
// );
// // 只有当维度指标数大于1时才处理明细
// if (e.pricingTargetRSVOS.length > 1) {
// const targetStr = e.pricingTargetRSVOS
// .map(t => `${t.targetName}为${changeNum(t.tNum, 2)}`)
// .join('、');
// dictList.push(`${e.dimensionalityName}为${changeNum(e.sNum, 2)},其中${targetStr}`);
// }
// return `${e.dimensionalityName}为${changeNum(e.sNum, 2)}`;
// })
// let dictListStr = `${dictStr.join(',')}。\n${dictList.join(';\n')}`
// // 质量模型
// if (hasModelScore) {
// const { largeCategoryScoreList = [], qualityScore = 0 } = qualityScoreData.value;
// const qualityParts = [
// `数据的总体质量得分为${changeNum(qualityScore, 2)}`
// ];
// if (largeCategoryScoreList.length) {
// const categoryScores = largeCategoryScoreList.map(
// q => `${q.largeCategoryName}方面得分为${changeNum(q.largeCategoryScore || 0, 2)}`
// );
// qualityParts.push(`其中${categoryScores.join(',')}`);
// }
// dictListStr += `;\n${qualityParts.join('。')}`;
// }
// exportOut.three = `${baseConfigFormInfo.belongingEntityGuid}持有的"${damName}"的数据(患者人次)单价为${changeNum(dataTransactionPrice.value, 2)}元${dictListStr ? `;其中${dictListStr}` : '。'}`;
if
(
type
==
'export'
)
{
loading
.
value
=
true
;
const
exportOut
=
{
one
:
priceData
.
one
,
...
...
@@ -1132,9 +947,6 @@ const checkForm = (type) => {
});
})
}
else
{
// const { signatoryData, resultInfo } = reporting(baseConfigFormInfo);
// exportData.value = resultInfo;
// !dataTransactionPrice.value && calculatePrice(signatoryData);
let
params
=
{
...
paramsInfo
,
dataTransactionPrice
:
dataTransactionPrice
.
value
,
...
...
@@ -1239,6 +1051,7 @@ onBeforeMount(() => {
}
})
onMounted
(()
=>
{
getModel
()
})
</
script
>
<
template
>
...
...
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