mirror of
https://shylinux.com/x/icebergs
synced 2025-06-26 02:17:30 +08:00
add asset
This commit is contained in:
parent
ea3d45e77b
commit
96553ee70c
@ -211,16 +211,26 @@ var Index = &ice.Context{Name: MDB, Help: "数据模块", Commands: ice.Commands
|
||||
m.OptionDefault(CACHE_LIMIT, "-1")
|
||||
file := _mdb_export_file(m, arg...)
|
||||
kit.Switch(arg[2],
|
||||
HASH, func() { _hash_export(m, arg[0], arg[1], file) },
|
||||
ZONE, func() { _zone_export(m, arg[0], arg[1], file) },
|
||||
HASH, func() {
|
||||
_hash_export(m, arg[0], arg[1], file)
|
||||
},
|
||||
ZONE, func() {
|
||||
_zone_export(m, arg[0], arg[1], file)
|
||||
_hash_export(m, arg[0], arg[1], file)
|
||||
},
|
||||
LIST, func() { _list_export(m, arg[0], arg[1], file) },
|
||||
)
|
||||
}},
|
||||
IMPORT: {Name: "import key sub type file", Hand: func(m *ice.Message, arg ...string) {
|
||||
file := _mdb_export_file(m, arg...)
|
||||
kit.Switch(arg[2],
|
||||
HASH, func() { _hash_import(m, arg[0], arg[1], file) },
|
||||
ZONE, func() { _zone_import(m, arg[0], arg[1], file) },
|
||||
HASH, func() {
|
||||
_hash_import(m, arg[0], arg[1], file)
|
||||
},
|
||||
ZONE, func() {
|
||||
_hash_import(m, arg[0], arg[1], file)
|
||||
_zone_import(m, arg[0], arg[1], file)
|
||||
},
|
||||
LIST, func() { _list_import(m, arg[0], arg[1], file) },
|
||||
)
|
||||
}},
|
||||
|
@ -66,7 +66,6 @@ func _zone_export(m *ice.Message, prefix, chain, file string) {
|
||||
w := csv.NewWriter(f)
|
||||
defer w.Flush()
|
||||
head := kit.AddUniq(_zone_fields(m), EXTRA)
|
||||
m.Debug("export %v", head)
|
||||
w.Write(head)
|
||||
count := 0
|
||||
for _, key := range kit.SortedKey(m.Confv(prefix, kit.Keys(chain, HASH))) {
|
||||
@ -81,13 +80,14 @@ func _zone_export(m *ice.Message, prefix, chain, file string) {
|
||||
count++
|
||||
})
|
||||
})
|
||||
m.Conf(prefix, kit.Keys(chain, HASH, key, LIST), "")
|
||||
m.Conf(prefix, kit.Keys(chain, HASH, key, META, COUNT), "")
|
||||
}
|
||||
if count == 0 {
|
||||
os.Remove(p)
|
||||
return
|
||||
}
|
||||
m.Logs(EXPORT, KEY, path.Join(prefix, chain), FILE, p, COUNT, count)
|
||||
m.Conf(prefix, kit.Keys(chain, HASH), "")
|
||||
}
|
||||
func _zone_import(m *ice.Message, prefix, chain, file string) {
|
||||
defer Lock(m, prefix)()
|
||||
@ -228,7 +228,9 @@ func ZoneInsert(m *ice.Message, arg ...Any) {
|
||||
}
|
||||
}
|
||||
func ZoneModify(m *ice.Message, arg ...Any) {
|
||||
if args := kit.Simple(arg...); args[0] == HASH || args[0] == ZoneShort(m) {
|
||||
if args := kit.Simple(arg...); m.Option(ID) == "" {
|
||||
HashModify(m, arg...)
|
||||
} else if args[0] == HASH || args[0] == ZoneShort(m) {
|
||||
m.Cmdy(MODIFY, m.PrefixKey(), "", ZONE, args[1], args[3], arg[4:])
|
||||
} else {
|
||||
m.Cmdy(MODIFY, m.PrefixKey(), "", ZONE, m.Option(ZoneKey(m)), m.Option(ID), arg)
|
||||
|
@ -1,116 +0,0 @@
|
||||
package mall
|
||||
|
||||
import (
|
||||
ice "shylinux.com/x/icebergs"
|
||||
"shylinux.com/x/icebergs/base/mdb"
|
||||
"shylinux.com/x/icebergs/base/web"
|
||||
kit "shylinux.com/x/toolkits"
|
||||
)
|
||||
|
||||
func _sub_value(m *ice.Message, key string, arg ...string) string {
|
||||
for i := 0; i < len(arg)-1; i += 2 {
|
||||
if arg[i] == key {
|
||||
return arg[i+1]
|
||||
}
|
||||
}
|
||||
return ""
|
||||
}
|
||||
func _sub_amount(m *ice.Message, arg []string) {
|
||||
for i := 0; i < len(arg)-1; i += 2 {
|
||||
if arg[i] == AMOUNT {
|
||||
if amount := kit.Int(arg[i+1]); amount > 0 {
|
||||
arg[i+1] = kit.Format(-amount)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func _asset_check(m *ice.Message, account string) {
|
||||
amount := 0
|
||||
m.OptionCB(mdb.SELECT, func(key string, value ice.Map) {
|
||||
amount += kit.Int(kit.Value(value, AMOUNT))
|
||||
})
|
||||
m.Cmd(mdb.SELECT, m.PrefixKey(), "", mdb.ZONE, account, ice.OptionFields(mdb.ZoneField(m)))
|
||||
|
||||
m.Cmdy(mdb.MODIFY, m.PrefixKey(), "", mdb.HASH, ACCOUNT, account, AMOUNT, amount)
|
||||
}
|
||||
func _asset_insert(m *ice.Message, account string, arg ...string) {
|
||||
m.Cmdy(mdb.INSERT, m.PrefixKey(), "", mdb.HASH, ACCOUNT, account)
|
||||
m.Cmdy(mdb.INSERT, m.PrefixKey(), "", mdb.ZONE, account, arg)
|
||||
m.OptionFields("time,account,amount,count")
|
||||
amount := kit.Int(m.Cmd(mdb.SELECT, m.PrefixKey(), "", mdb.HASH, ACCOUNT, account).Append(AMOUNT))
|
||||
amount += kit.Int(_sub_value(m, AMOUNT, arg...))
|
||||
m.Cmdy(mdb.MODIFY, m.PrefixKey(), "", mdb.HASH, ACCOUNT, account, AMOUNT, amount)
|
||||
}
|
||||
|
||||
const (
|
||||
ACCOUNT = "account"
|
||||
AMOUNT = "amount"
|
||||
COUNT = "count"
|
||||
|
||||
FROM = "from"
|
||||
TO = "to"
|
||||
|
||||
SPEND = "spend"
|
||||
TRANS = "trans"
|
||||
BONUS = "bonus"
|
||||
CHECK = "check"
|
||||
)
|
||||
const ASSET = "asset"
|
||||
|
||||
func init() {
|
||||
Index.Merge(&ice.Context{Configs: ice.Configs{
|
||||
ASSET: {Name: ASSET, Help: "资产", Value: kit.Data(
|
||||
mdb.SHORT, ACCOUNT, mdb.FIELD, "time,id,type,amount,name,text",
|
||||
mdb.ALIAS, kit.Dict(FROM, ACCOUNT, TO, ACCOUNT),
|
||||
)},
|
||||
}, Commands: ice.Commands{
|
||||
ASSET: {Name: "asset account id auto spend trans bonus", Help: "资产", Meta: kit.Dict(
|
||||
ice.CTX_TRANS, kit.Dict(ACCOUNT, "账户", AMOUNT, "金额", FROM, "转出", TO, "转入", "time", "时间", "name", "商家", "text", "备注"),
|
||||
), Actions: ice.MergeActions(ice.Actions{
|
||||
SPEND: {Name: "spend account name amount time@date text", Help: "支出", Hand: func(m *ice.Message, arg ...string) {
|
||||
_sub_amount(m, arg)
|
||||
_asset_insert(m, arg[1], kit.Simple(mdb.TYPE, "支出", arg[2:])...)
|
||||
}},
|
||||
TRANS: {Name: "trans from to amount time@date text", Help: "转账", Hand: func(m *ice.Message, arg ...string) {
|
||||
_asset_insert(m, arg[3], kit.Simple(mdb.TYPE, "转入", mdb.NAME, arg[1], arg[4:])...)
|
||||
_sub_amount(m, arg)
|
||||
_asset_insert(m, arg[1], kit.Simple(mdb.TYPE, "转出", mdb.NAME, arg[3], arg[4:])...)
|
||||
}},
|
||||
BONUS: {Name: "bonus account name amount time@date text", Help: "收入", Hand: func(m *ice.Message, arg ...string) {
|
||||
_asset_insert(m, arg[1], kit.Simple(mdb.TYPE, "收入", arg[2:])...)
|
||||
}},
|
||||
CHECK: {Name: "check", Help: "核算", Hand: func(m *ice.Message, arg ...string) {
|
||||
if m.Option(ACCOUNT) == "" {
|
||||
m.Cmd(ASSET, func(value ice.Maps) {
|
||||
_asset_check(m, value[ACCOUNT])
|
||||
})
|
||||
m.ProcessRefresh()
|
||||
} else {
|
||||
_asset_check(m, m.Option(ACCOUNT))
|
||||
}
|
||||
web.Toast(m, "核算成功")
|
||||
}},
|
||||
}, mdb.ZoneAction(mdb.FIELD, "time,account,amount,count")), Hand: func(m *ice.Message, arg ...string) {
|
||||
amount, count := 0, 0
|
||||
if mdb.ZoneSelect(m, arg...); len(arg) == 0 {
|
||||
m.PushAction(CHECK)
|
||||
m.SortIntR(AMOUNT)
|
||||
|
||||
m.Table(func(value ice.Maps) {
|
||||
amount += kit.Int(value[AMOUNT])
|
||||
count += kit.Int(value[COUNT])
|
||||
})
|
||||
|
||||
} else {
|
||||
m.PushAction(mdb.PLUGIN)
|
||||
|
||||
m.Table(func(value ice.Maps) {
|
||||
amount += kit.Int(value[AMOUNT])
|
||||
count++
|
||||
})
|
||||
}
|
||||
m.StatusTime(COUNT, count, AMOUNT, amount)
|
||||
}},
|
||||
}})
|
||||
}
|
@ -11,8 +11,9 @@ import (
|
||||
)
|
||||
|
||||
const (
|
||||
PRICE = "price"
|
||||
UNITS = "units"
|
||||
AMOUNT = "amount"
|
||||
PRICE = "price"
|
||||
UNITS = "units"
|
||||
)
|
||||
const GOODS = "goods"
|
||||
|
||||
|
117
core/team/asset.go
Normal file
117
core/team/asset.go
Normal file
@ -0,0 +1,117 @@
|
||||
package team
|
||||
|
||||
import (
|
||||
ice "shylinux.com/x/icebergs"
|
||||
"shylinux.com/x/icebergs/base/mdb"
|
||||
"shylinux.com/x/icebergs/base/web"
|
||||
"shylinux.com/x/icebergs/base/web/html"
|
||||
kit "shylinux.com/x/toolkits"
|
||||
)
|
||||
|
||||
func _sub_value(m *ice.Message, key string, arg ...string) string {
|
||||
for i := 0; i < len(arg)-1; i += 2 {
|
||||
if arg[i] == key {
|
||||
return arg[i+1]
|
||||
}
|
||||
}
|
||||
return ""
|
||||
}
|
||||
func _sub_amount(m *ice.Message, arg []string) {
|
||||
for i := 0; i < len(arg)-1; i += 2 {
|
||||
if arg[i] == AMOUNT {
|
||||
if amount := kit.Float(arg[i+1]); amount > 0 {
|
||||
arg[i+1] = kit.Format(-amount)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
func _asset_check(m *ice.Message, account string) {
|
||||
var amount float64
|
||||
m.OptionCB(mdb.SELECT, func(key string, value ice.Map) { amount += kit.Float(kit.Value(value, AMOUNT)) })
|
||||
m.Cmd(mdb.SELECT, m.PrefixKey(), "", mdb.ZONE, account, ice.OptionFields(mdb.ZoneField(m)))
|
||||
m.Cmd(mdb.MODIFY, m.PrefixKey(), "", mdb.HASH, ACCOUNT, account, AMOUNT, amount)
|
||||
}
|
||||
func _asset_insert(m *ice.Message, account string, arg ...string) {
|
||||
m.Cmd(mdb.INSERT, m.PrefixKey(), "", mdb.HASH, ACCOUNT, account)
|
||||
m.Cmd(mdb.INSERT, m.PrefixKey(), "", mdb.ZONE, account, arg)
|
||||
amount := kit.Float(m.Cmdv(mdb.SELECT, m.PrefixKey(), "", mdb.HASH, ACCOUNT, account, AMOUNT))
|
||||
amount += kit.Float(_sub_value(m, AMOUNT, arg...))
|
||||
m.Cmd(mdb.MODIFY, m.PrefixKey(), "", mdb.HASH, ACCOUNT, account, AMOUNT, amount)
|
||||
}
|
||||
|
||||
const (
|
||||
ACCOUNT = "account"
|
||||
AMOUNT = "amount"
|
||||
COUNT = "count"
|
||||
FROM = "from"
|
||||
TO = "to"
|
||||
|
||||
ICOME = "income"
|
||||
SPEND = "spend"
|
||||
TRANS = "trans"
|
||||
INVEST = "invest"
|
||||
CHECK = "check"
|
||||
)
|
||||
const ASSET = "asset"
|
||||
|
||||
func init() {
|
||||
Index.MergeCommands(ice.Commands{
|
||||
ASSET: {Name: "asset account id auto", Help: "资产", Meta: kit.Dict(
|
||||
ice.CTX_TRANS, kit.Dict(
|
||||
html.INPUT, kit.Dict(
|
||||
ACCOUNT, "账户", AMOUNT, "金额", FROM, "转出", TO, "转入", mdb.NAME, "商家", mdb.TEXT, "备注",
|
||||
),
|
||||
html.VALUE, kit.Dict(
|
||||
INCOME, "收入", SPEND, "支出", TRANS, "转账", INVEST, "投资",
|
||||
),
|
||||
),
|
||||
), Actions: ice.MergeActions(ice.Actions{
|
||||
mdb.INPUTS: {Hand: func(m *ice.Message, arg ...string) {
|
||||
if kit.IsIn(arg[0], FROM, TO) {
|
||||
back := arg[0]
|
||||
arg[0] = ACCOUNT
|
||||
defer func() { m.RenameAppend(ACCOUNT, back) }()
|
||||
}
|
||||
mdb.ZoneInputs(m, arg)
|
||||
}},
|
||||
mdb.CREATE: {Name: "create account* type*"},
|
||||
INCOME: {Name: "income account* amount* name* time text", Help: "收入", Hand: func(m *ice.Message, arg ...string) {
|
||||
_asset_insert(m, arg[1], kit.Simple(mdb.TYPE, m.ActionKey(), arg[2:])...)
|
||||
}},
|
||||
SPEND: {Name: "spend account* amount* name* time text", Help: "支出", Hand: func(m *ice.Message, arg ...string) {
|
||||
_sub_amount(m, arg)
|
||||
_asset_insert(m, arg[1], kit.Simple(mdb.TYPE, m.ActionKey(), arg[2:])...)
|
||||
}},
|
||||
TRANS: {Name: "trans from* to* amount* time text", Help: "转账", Hand: func(m *ice.Message, arg ...string) {
|
||||
_asset_insert(m, arg[3], kit.Simple(mdb.TYPE, TRANS, mdb.NAME, arg[1], arg[4:])...)
|
||||
_sub_amount(m, arg)
|
||||
_asset_insert(m, arg[1], kit.Simple(mdb.TYPE, TRANS, mdb.NAME, arg[3], arg[4:])...)
|
||||
}},
|
||||
INVEST: {Name: "invset account* amount* name* time text", Help: "投资", Hand: func(m *ice.Message, arg ...string) {
|
||||
_asset_insert(m, arg[1], kit.Simple(mdb.TYPE, m.ActionKey(), arg[2:])...)
|
||||
}},
|
||||
CHECK: {Help: "核算", Hand: func(m *ice.Message, arg ...string) {
|
||||
defer web.ToastProcess(m)()
|
||||
if m.Option(ACCOUNT) == "" {
|
||||
m.Cmd("", func(value ice.Maps) { _asset_check(m, value[ACCOUNT]) })
|
||||
} else {
|
||||
_asset_check(m, m.Option(ACCOUNT))
|
||||
}
|
||||
}},
|
||||
}, mdb.ExportZoneAction(mdb.SHORT, ACCOUNT, mdb.FIELD, "time,account,type,amount,count", mdb.FIELDS, "time,id,type,amount,name,text")), Hand: func(m *ice.Message, arg ...string) {
|
||||
mdb.ZoneSelect(m, arg...)
|
||||
web.PushPodCmd(m, "", arg...)
|
||||
if m.SortIntR(AMOUNT); len(arg) == 0 {
|
||||
m.Action(INCOME, SPEND, TRANS, INVEST, CHECK, mdb.CREATE)
|
||||
} else {
|
||||
m.Action(INCOME, SPEND, TRANS, INVEST, CHECK)
|
||||
}
|
||||
var amount, count float64
|
||||
m.Table(func(value ice.Maps) {
|
||||
amount += kit.Float(value[AMOUNT])
|
||||
kit.If(len(arg) == 0, func() { count += kit.Float(value[COUNT]) }, func() { count++ })
|
||||
})
|
||||
m.StatusTime(COUNT, count, AMOUNT, amount)
|
||||
}},
|
||||
})
|
||||
}
|
@ -1,4 +1,4 @@
|
||||
package mall
|
||||
package team
|
||||
|
||||
import (
|
||||
"math"
|
@ -7,7 +7,6 @@ import (
|
||||
)
|
||||
|
||||
const (
|
||||
AMOUNT = "amount"
|
||||
INCOME = "income"
|
||||
TAX = "tax"
|
||||
)
|
||||
|
Loading…
x
Reference in New Issue
Block a user