forked from x/icebergs
87 lines
3.1 KiB
Go
87 lines
3.1 KiB
Go
package team
|
||
|
||
import (
|
||
"math"
|
||
|
||
ice "shylinux.com/x/icebergs"
|
||
"shylinux.com/x/icebergs/base/web/html"
|
||
kit "shylinux.com/x/toolkits"
|
||
)
|
||
|
||
const LOAN = "loan"
|
||
|
||
func init() {
|
||
const (
|
||
YEAR = "year"
|
||
RATE = "rate"
|
||
MONTH = "month"
|
||
PAYMENT = "payment"
|
||
PRESENT = "present"
|
||
INTEREST = "interest"
|
||
INTERESTS = "interests"
|
||
PRESENTS = "presents"
|
||
)
|
||
Index.MergeCommands(ice.Commands{
|
||
LOAN: {Name: "loan auto loan1 loan2", Help: "分期贷款", Meta: kit.Dict(
|
||
ice.CTX_TRANS, kit.Dict(html.INPUT, kit.Dict(
|
||
YEAR, "年数", RATE, "利率", MONTH, "期数", PAYMENT, "月供",
|
||
PRESENT, "本金", INTEREST, "利息", INTERESTS, "累积利息", PRESENTS, "还欠本金",
|
||
AMOUNT, "累积还款",
|
||
)),
|
||
), Actions: ice.MergeActions(ice.Actions{
|
||
"loan1": {Name: "load present=300 year=30 rate=4.2", Help: "等额本息", Hand: func(m *ice.Message, arg ...string) {
|
||
//〔贷款本金×月利率×(1+月利率)^还款月数〕÷〔(1+月利率)^还款月数 - 1〕
|
||
number, rate := kit.Float(m.Option(YEAR))*12, kit.Float(m.Option(RATE))/100/12
|
||
present := kit.Float(m.Option(PRESENT)) * 10000
|
||
pow := math.Pow((1 + rate), number)
|
||
p := present * rate * pow / (pow - 1)
|
||
var interests, presents float64
|
||
presents = present
|
||
for i := float64(0); i < number; i++ {
|
||
_p := presents * rate
|
||
interests += _p
|
||
presents -= (present / number)
|
||
m.Push(MONTH, kit.Int(i+1)).Push(PAYMENT, p)
|
||
m.Push(PRESENT, p-_p).Push(INTEREST, _p)
|
||
m.Push(INTERESTS, interests)
|
||
m.Push(PRESENTS, presents)
|
||
m.Push(AMOUNT, p*(i+1))
|
||
}
|
||
m.Status(kit.Dict(
|
||
PAYMENT, kit.Format("%0.2f 元", p),
|
||
PRESENT, kit.Format("%0.2f 万", present/10000),
|
||
INTEREST, kit.Format("%0.2f 万", p*number/10000-present/10000),
|
||
AMOUNT, kit.Format("%0.2f 万", p*number/10000),
|
||
MONTH, kit.Format("%v 期", number),
|
||
))
|
||
}},
|
||
"loan2": {Name: "load present=300 year=30 rate=4.2", Help: "等额本金", Hand: func(m *ice.Message, arg ...string) {
|
||
// 每月还款金额 =(贷款本金 ÷ 还款月数)+(本金 — 已归还本金累计额)×每月利率
|
||
present := kit.Float(m.Option(PRESENT)) * 10000
|
||
number, rate := kit.Float(m.Option(YEAR))*12, kit.Float(m.Option(RATE))/100/12
|
||
var interests, presents, amount, payment float64
|
||
presents = present
|
||
for i := float64(0); i < number; i++ {
|
||
p := present/number + (present-i*(present/number))*rate
|
||
interests += (present - i*(present/number)) * rate
|
||
presents -= present / number
|
||
amount += p
|
||
kit.If(i == 0, func() { payment = p })
|
||
m.Push(MONTH, kit.Int(i+1)).Push(PAYMENT, p)
|
||
m.Push(PRESENT, present/number).Push(INTEREST, (present-i*(present/number))*rate)
|
||
m.Push(INTERESTS, interests)
|
||
m.Push(PRESENTS, presents)
|
||
m.Push(AMOUNT, amount)
|
||
}
|
||
m.Status(kit.Dict(
|
||
PAYMENT, kit.Format("%0.2f 元", payment),
|
||
PRESENT, kit.Format("%0.2f 万", present/10000),
|
||
INTEREST, kit.Format("%0.2f 万", amount/10000-present/10000),
|
||
AMOUNT, kit.Format("%0.2f 万", amount/10000),
|
||
MONTH, kit.Format("%v 期", number),
|
||
))
|
||
}},
|
||
})},
|
||
})
|
||
}
|