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
8fbb6b15
authored
2025-03-31 15:14:32 +0800
by
lihua
Browse Files
Options
Browse Files
Tag
Download
Email Patches
Plain Diff
fix: 估值模型
1 parent
c6a967a9
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
112 additions
and
39 deletions
src/components/Form/index.vue
src/views/data_transaction/valuationModelCreate.vue
src/components/Form/index.vue
View file @
8fbb6b1
...
...
@@ -586,11 +586,11 @@ const visibleChange = (visible, row) => {
}
const panelChange = (scope, row) => {
if (row.field == 'baseDate' || row.field == 'investYear') {
if (row.field == '
evaluateBaseDate' || row.field == '
baseDate' || row.field == 'investYear') {
const date = new Date();
const year = date.getFullYear();
const datePopperNextBtn = document.querySelector('.date-month-popper .d-arrow-right');
if (row.field == 'baseDate') {
if (row.field == 'baseDate'
|| row.field == 'evaluateBaseDate'
) {
const currentYear = scope.date.getFullYear();
if (currentYear >= year) {
datePopperNextBtn.setAttribute("disabled", '');
...
...
@@ -1463,8 +1463,8 @@ const panelChange = (scope, row) => {
@panel-change="(date, mode) => panelChange({ date, mode }, item)"
@visible-change="(vis) => visibleChange(vis, item)" />
<el-date-picker
:class=
"[item.col,
{ is_block: item.block }]" v-else-if="item.type == 'date-month'"
v-model="formInline[item.field]" type="month"
format="YYYY-MM" value-format="YYYY-MM
"
:placeholder="item.placeholder" :unlink-panels="item.unlink ?? false" :shortcuts="item.shortcuts ?? []"
v-model="formInline[item.field]" type="month"
:format="item.format ?? 'YYYY-MM'" :value-format="item.valueFormat ?? 'YYYY-MM'
"
:placeholder="item.placeholder" :unlink-panels="item.unlink ?? false" :shortcuts="item.shortcuts ?? []"
:clearable="item.clearable ?? true"
:default-value="item.defaultDate" :disabled="item.disabled ?? false" :disabled-date="item.disabledDate"
:popper-class="item.popperClass" @change="(val) => inputChange(val, item)"
@panel-change="(date, mode) => panelChange({ date, mode }, item)"
...
...
src/views/data_transaction/valuationModelCreate.vue
View file @
8fbb6b1
...
...
@@ -22,6 +22,17 @@ const route = useRoute();
const
fullPath
=
route
.
fullPath
;
const
fullscreenLoading
=
ref
(
false
);
/** 获取当月的最后一天。 */
const
getLastDayOfMonth
=
(
month
)
=>
{
const
year
=
parseInt
(
month
.
split
(
'-'
)[
0
],
10
);
const
monthIndex
=
parseInt
(
month
.
split
(
'-'
)[
1
],
10
)
-
1
;
// JavaScript 的月份是从0开始计数的
const
date
=
new
Date
(
year
,
monthIndex
+
1
,
0
);
// 使用0可以得到前一个月的最后一天
const
yearString
=
date
.
getFullYear
();
const
monthString
=
String
(
date
.
getMonth
()
+
1
).
padStart
(
2
,
'0'
);
// JavaScript 的月份是从0开始计数的
const
dayString
=
String
(
date
.
getDate
()).
padStart
(
2
,
'0'
);
return
`
${
yearString
}
-
${
monthString
}
-
${
dayString
}
`
;
}
/** 数据产品列表 */
const
damProductList
:
any
=
ref
([]);
...
...
@@ -47,9 +58,11 @@ const valuateFormItems: any = ref([
label
:
"基准日"
,
type
:
"date-month"
,
field
:
"evaluateBaseDate"
,
default
:
moment
(
new
Date
()).
format
(
'YYYY-MM'
),
default
:
getLastDayOfMonth
(
moment
(
new
Date
()).
format
(
'YYYY-MM'
)
),
placeholder
:
"请选择"
,
clearable
:
true
,
format
:
'YYYY-MM-DD'
,
valueFormat
:
'YYYY-MM-DD'
,
clearable
:
false
,
required
:
true
,
style
:
{
width
:
'calc(33.33% - 70px)'
,
'margin-right'
:
'8px'
},
popperClass
:
'date-month-popper'
,
...
...
@@ -115,7 +128,7 @@ const valuateFormItems: any = ref([
]);
const
valuateFormRules
=
ref
({
//
damGuid: [required('请选择数据产品名称')],
damGuid
:
[
required
(
'请选择数据产品名称'
)],
evaluateBaseDate
:
[
required
(
'请选择基准日'
)],
evaluateMethod
:
[
required
(
'请选择评估方法'
)],
useYears
:
[{
type
:
'number'
,
min
:
1
,
max
:
10
,
message
:
"请填写年限1~10"
,
trigger
:
"change"
,
},]
...
...
@@ -126,22 +139,24 @@ const handleValudateFormChange = (val, row, info) => {
valuateFormItems
.
value
.
forEach
(
item
=>
{
item
.
default
=
info
[
item
.
field
];
if
(
item
.
field
==
'useYears'
)
{
item
.
visible
=
item
.
default
!=
'1'
;
item
.
visible
=
val
!=
'1'
;
item
.
default
=
info
.
useYears
?
info
.
useYears
:
1
;
}
})
}
}
/** 获取当月的最后一天。 */
const
getLastDayOfMonth
=
(
month
)
=>
{
const
year
=
parseInt
(
month
.
split
(
'-'
)[
0
],
10
);
const
monthIndex
=
parseInt
(
month
.
split
(
'-'
)[
1
],
10
)
-
1
;
// JavaScript 的月份是从0开始计数的
const
date
=
new
Date
(
year
,
monthIndex
+
1
,
0
);
// 使用0可以得到前一个月的最后一天
const
yearString
=
date
.
getFullYear
();
const
monthString
=
String
(
date
.
getMonth
()
+
1
).
padStart
(
2
,
'0'
);
// JavaScript 的月份是从0开始计数的
const
dayString
=
String
(
date
.
getDate
()).
padStart
(
2
,
'0'
);
return
`
${
yearString
}
-
${
monthString
}
-
${
dayString
}
`
;
const
handleInputChange
=
(
val
,
row
,
info
)
=>
{
if
(
row
.
field
==
'evaluateBaseDate'
)
{
valuateFormItems
.
value
.
forEach
(
item
=>
{
item
.
default
=
info
[
item
.
field
];
if
(
item
.
field
==
'useYears'
)
{
item
.
visible
=
info
.
evaluateMethod
!=
'1'
;
}
else
if
(
item
.
field
==
'evaluateBaseDate'
)
{
item
.
default
=
getLastDayOfMonth
(
val
);
}
})
}
}
const
costTableField
:
any
=
ref
([
...
...
@@ -433,10 +448,7 @@ const incomeYears = computed(() => {
let
year
=
parseInt
(
infos
[
0
]);
let
month
=
parseInt
(
infos
[
1
]);
if
(
month
==
12
)
{
let
a
=
[{
field
:
year
+
''
,
label
:
year
+
'年'
}];
let
a
:
any
=
[];
for
(
var
i
=
1
;
i
<
useYears
+
1
;
i
++
)
{
a
.
push
({
field
:
year
+
i
+
''
,
...
...
@@ -447,7 +459,7 @@ const incomeYears = computed(() => {
}
else
if
(
month
==
1
)
{
let
a
=
[{
field
:
evaluateBaseDate
+
''
,
label
:
year
+
'年'
+
`(
1
)`
label
:
year
+
'年'
+
`(
2~12
)`
}];
for
(
var
i
=
1
;
i
<
useYears
+
1
;
i
++
)
{
a
.
push
({
...
...
@@ -459,12 +471,12 @@ const incomeYears = computed(() => {
}
else
{
let
a
=
[{
field
:
evaluateBaseDate
+
''
,
label
:
year
+
'年'
+
`(
1~
${
month
}
)`
label
:
year
+
'年'
+
`(
${
month
+
1
}
~12
)`
}];
for
(
var
i
=
1
;
i
<
useYears
+
1
;
i
++
)
{
a
.
push
({
field
:
year
+
i
+
''
,
label
:
i
==
useYears
?
((
year
+
i
)
+
'年'
+
`(
${
month
}
~12
)`
)
:
((
year
+
i
)
+
'年'
)
label
:
i
==
useYears
?
((
year
+
i
)
+
'年'
+
`(
1~
${
month
}
)`
)
:
((
year
+
i
)
+
'年'
)
});
}
return
a
;
...
...
@@ -560,11 +572,16 @@ const inputChange = (val, scope, field) => {
}
else
{
row
[
field
]
=
val
=
parseFloat
(
val
||
0
).
toFixed
(
2
);
}
if
(
val
==
'NaN'
)
{
row
[
field
]
=
'0.00'
;
}
}
/** 输入框输入触发事件 */
const
inputEventChange
=
(
val
,
scope
,
field
,
max
:
any
=
null
)
=>
{
let
row
=
scope
.
row
;
if
(
row
.
indexName
==
'数据资产分成率'
||
row
.
indexName
==
'衰减率'
||
formRef
.
value
.
formInline
?.
evaluateMethod
==
'1'
)
{
//只能输入正数
let
row
=
scope
.
row
;
row
[
field
]
=
row
[
field
].
toString
().
replace
(
/
[^\d
.
]
/g
,
""
)
row
[
field
]
=
row
[
field
].
toString
().
replace
(
/
\.{2,}
/g
,
"."
)
row
[
field
]
=
row
[
field
].
toString
().
replace
(
"."
,
"$#$"
).
replace
(
/
\.
/g
,
""
).
replace
(
"$#$"
,
"."
)
...
...
@@ -573,6 +590,45 @@ const inputEventChange = (val, scope, field, max: any = null) => {
if
(
max
!==
null
&&
row
[
field
]
>
max
)
{
row
[
field
]
=
max
;
}
}
else
{
//需要支持负数
row
[
field
]
=
row
[
field
].
toString
().
replace
(
/
[^\d
.-
]
/g
,
""
)
row
[
field
]
=
row
[
field
].
toString
().
replace
(
/
\.{2,}
/g
,
"."
)
// 第四步:移除整数部分前面不必要的零,但保留小数部分的有效零
if
(
row
[
field
].
startsWith
(
'-'
))
{
// 对于负数,去掉负号进行处理
let
tempValue
=
row
[
field
].
substring
(
1
);
tempValue
=
tempValue
.
replace
(
/-/g
,
''
);;
row
[
field
]
=
'-'
+
tempValue
;
}
else
{
// 对于正数直接处理
row
[
field
]
=
row
[
field
].
replace
(
/-/g
,
''
);
}
row
[
field
]
=
row
[
field
].
toString
().
replace
(
/^
(
-
?\d{0,12})(\.\d{0,2})?
$/
,
'$1$2'
);
let
parts
=
row
[
field
].
split
(
'.'
);
let
integerPart
=
parts
[
0
];
let
decimalPart
=
parts
.
length
>
1
?
parts
[
1
]
:
''
;
// 限制整数部分最多12位
if
(
integerPart
.
length
>
12
)
{
integerPart
=
integerPart
.
substring
(
0
,
12
);
}
// 限制小数部分最多2位
if
(
decimalPart
.
length
>
2
)
{
decimalPart
=
decimalPart
.
substring
(
0
,
2
);
}
row
[
field
]
=
integerPart
+
(
decimalPart
?
'.'
+
decimalPart
:
(
row
[
field
].
includes
(
'.'
)
?
'.'
:
''
))
if
(
max
!==
null
)
{
if
(
row
[
field
]
>
max
)
{
row
[
field
]
=
max
;
}
if
(
row
[
field
]
<
0
&&
row
[
field
]
<
-
max
)
{
row
[
field
]
=
-
max
;
}
}
}
}
const
incomeCalculateData
=
computed
(()
=>
{
//响应式不生效
...
...
@@ -584,30 +640,42 @@ const incomeCalculateData = computed(() => { //响应式不生效
resultInfo
[
'折现因子'
]
=
[];
resultInfo
[
'折现现值'
]
=
[];
resultInfo
[
'数据资产估值'
]
=
0
;
let
formInline
=
formRef
.
value
.
formInline
;
let
evaluateBaseDate
=
formInline
.
evaluateBaseDate
;
let
infos
=
evaluateBaseDate
.
split
(
'-'
);
let
month
=
parseInt
(
infos
[
1
]);
let
transfer
=
(
v
,
need
=
true
)
=>
{
return
v
?
(
need
?
parseFloat
(
v
)
/
100
:
parseFloat
(
v
))
:
0
;
}
incomeYears
.
value
.
forEach
((
year
,
i
)
=>
{
let
C6
=
transfer
(
data
[
5
][
year
.
field
])
let
C7
=
transfer
(
data
[
6
][
year
.
field
])
let
sumC7
:
any
=
i
==
0
?
C7
:
incomeYears
.
value
.
slice
(
0
,
i
+
1
).
reduce
(
function
(
prev
,
curr
,
idx
,
arr
)
{
return
transfer
(
data
[
6
][
prev
.
field
])
+
transfer
(
data
[
6
][
curr
.
field
]);
let
sumC7
:
any
=
0
;
if
(
i
==
0
)
{
sumC7
=
C7
;
}
else
{
incomeYears
.
value
.
slice
(
0
,
i
+
1
).
forEach
((
item
)
=>
{
sumC7
=
sumC7
+
transfer
(
data
[
6
][
item
.
field
]);
})
}
resultInfo
[
'综合分成率'
].
push
(
changeNum
(
C6
*
(
1
-
sumC7
+
C7
/
2
)
*
100
,
2
,
true
));
//TODO综合分成率算法有问题
let
C1
=
transfer
(
data
[
0
][
year
.
field
],
false
)
let
C5
=
transfer
(
data
[
4
][
year
.
field
])
resultInfo
[
'现金流'
].
push
(
changeNum
(
C1
*
C5
*
resultInfo
[
'综合分成率'
][
i
]
/
100
,
2
,
true
));
if
(
i
==
0
)
{
resultInfo
[
'折现年期'
].
push
(
changeNum
(
10
/
12
/
2
,
2
,
true
));
let
cnt
=
month
==
12
?
12
:
(
12
-
month
);
resultInfo
[
'折现年期'
].
push
(
changeNum
(
cnt
/
12
/
2
,
2
,
true
));
}
else
if
(
i
==
incomeYears
.
value
.
length
-
1
)
{
resultInfo
[
'折现年期'
].
push
(
changeNum
(
parseFloat
(
resultInfo
[
'折现年期'
][
i
-
1
])
+
(
month
==
12
?
1
:
(
month
/
12
/
2
)),
2
,
true
))
}
else
{
resultInfo
[
'折现年期'
].
push
(
changeNum
(
parseFloat
(
resultInfo
[
'折现年期'
][
i
-
1
])
+
1
,
2
,
true
))
}
let
C10
=
transfer
(
data
[
9
][
year
.
field
]);
resultInfo
[
'折现因子'
].
push
(
changeNum
(
1
/
Math
.
pow
((
1
+
C10
),
parseFloat
(
resultInfo
[
'折现年期'
][
i
])),
2
,
true
));
resultInfo
[
'折现现值'
].
push
(
changeNum
(
parseFloat
(
resultInfo
[
'折现因子'
][
i
])
*
parseFloat
(
resultInfo
[
'现金流'
][
i
]),
2
,
true
));
resultInfo
[
'折现现值'
].
push
(
changeNum
(
parseFloat
(
resultInfo
[
'折现因子'
][
i
])
*
parseFloat
(
resultInfo
[
'现金流'
][
i
]
?.
replace
(
/,/g
,
''
)
),
2
,
true
));
})
resultInfo
[
'数据资产估值'
]
=
changeNum
(
resultInfo
[
'折现现值'
].
reduce
(
function
(
prev
,
curr
,
idx
,
arr
)
{
return
parseFloat
(
prev
)
+
parseFloat
(
curr
);
return
(
typeof
prev
==
'string'
?
parseFloat
(
prev
?.
replace
(
/,/g
,
''
))
:
parseFloat
(
prev
))
+
parseFloat
(
curr
?.
replace
(
/,/g
,
''
)
);
}),
2
,
true
);
return
resultInfo
;
})
...
...
@@ -619,18 +687,25 @@ const submit = () => {
if
(
params
.
evaluateMethod
==
'1'
)
{
params
.
valuationCostRQVOList
=
costTableData
.
value
;
params
.
damValuation
=
costTableSummaryValue
.
value
;
if
(
!
costTableData
.
value
.
some
(
table
=>
table
.
amount
!==
''
))
{
proxy
.
$ElMessage
.
error
(
'成本法请至少输入一项指标金额'
);
return
}
}
else
{
params
.
valuationEarningsRQVOList
=
incomeTableData
.
value
;
params
.
damValuation
=
incomeCalculateData
.
value
[
'数据资产估值'
];
params
.
valuationEarningsRQVOList
.
forEach
(
d
=>
{
for
(
const
d
of
params
.
valuationEarningsRQVOList
)
{
let
years
:
any
=
{};
incomeYears
.
value
.
forEach
(
y
=>
{
for
(
const
y
of
incomeYears
.
value
)
{
if
(
d
.
auto
!=
true
&&
d
[
y
.
field
]
==
null
)
{
proxy
.
$ElMessage
.
error
(
`收益法的指标【
${
d
.
indexName
}
】预测年限中存在空值,请输入`
);
return
;
}
years
[
y
.
field
]
=
d
[
y
.
field
];
}
)
}
d
.
predictedYears
=
years
;
})
}
params
.
evaluateBaseDate
=
getLastDayOfMonth
(
params
.
evaluateBaseDate
);
}
fullscreenLoading
.
value
=
true
;
if
(
!
route
.
query
.
guid
)
{
saveValuationMode
(
params
).
then
((
res
:
any
)
=>
{
...
...
@@ -714,8 +789,6 @@ onBeforeMount(() => {
item
.
default
=
detailData
[
item
.
field
];
if
(
item
.
field
==
'evaluateMethod'
)
{
valuateFormItems
.
value
.
at
(
-
1
).
visible
=
item
.
default
==
'2'
;
}
else
if
(
item
.
field
==
'evaluateBaseDate'
)
{
item
.
default
=
item
.
default
.
substring
(
0
,
7
);
}
})
if
(
detailData
.
evaluateMethod
==
'2'
)
{
...
...
@@ -761,10 +834,10 @@ onMounted(async () => {
<div
class=
"content_main"
>
<ContentWrap
id=
"id-baseInfo"
title=
"估值类型"
instructions=
""
style=
"margin-top: 8px;"
>
<Form
ref=
"formRef"
:itemList=
"valuateFormItems"
:rules=
"valuateFormRules"
formId=
"main-model-edit"
@
select-change=
"handleValudateFormChange"
col=
"col3"
/>
@
select-change=
"handleValudateFormChange"
@
input-change=
"handleInputChange"
col=
"col3"
/>
</ContentWrap>
<ContentWrap
id=
"id-grade-info"
title=
"填写成本明细
"
:
instructions
=
"formRef?.formInline?.evaluateMethod == '1' ? '填写时请按照所选数据产品的成本投入进行填写,跟数据产品产生的成本一致' : ''"
<ContentWrap
id=
"id-grade-info"
:title=
"formRef?.formInline?.evaluateMethod == '1' ? '填写成本明细' : '填写预期收益'
"
:
description
=
"formRef?.formInline?.evaluateMethod == '1' ? '填写时请按照所选数据产品的成本投入进行填写,跟数据产品产生的成本一致' : ''"
style=
"margin-top: 16px;"
>
<el-table
id=
"cost-table"
v-show=
"formRef?.formInline?.evaluateMethod == '1'"
ref=
"costTableRef"
:data=
"costTableData"
:span-method=
"costTableSpanMethod"
:summary-method=
"costTableSummaryMethod"
show-summary
...
...
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