diff --git a/base/mdb/mdb.go b/base/mdb/mdb.go index 4dd60712..b6f7d52c 100644 --- a/base/mdb/mdb.go +++ b/base/mdb/mdb.go @@ -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) }, ) }}, diff --git a/base/mdb/zone.go b/base/mdb/zone.go index 8fb722b5..c4c28ca3 100644 --- a/base/mdb/zone.go +++ b/base/mdb/zone.go @@ -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) diff --git a/core/mall/asset.go b/core/mall/asset.go deleted file mode 100644 index acf2c548..00000000 --- a/core/mall/asset.go +++ /dev/null @@ -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) - }}, - }}) -} diff --git a/core/mall/goods.go b/core/mall/goods.go index e5881c30..08f8a776 100644 --- a/core/mall/goods.go +++ b/core/mall/goods.go @@ -11,8 +11,9 @@ import ( ) const ( - PRICE = "price" - UNITS = "units" + AMOUNT = "amount" + PRICE = "price" + UNITS = "units" ) const GOODS = "goods" diff --git a/core/team/asset.go b/core/team/asset.go new file mode 100644 index 00000000..47b4db14 --- /dev/null +++ b/core/team/asset.go @@ -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) + }}, + }) +} diff --git a/core/mall/loan.go b/core/team/loan.go similarity index 99% rename from core/mall/loan.go rename to core/team/loan.go index 41730bc8..22d6b6b8 100644 --- a/core/mall/loan.go +++ b/core/team/loan.go @@ -1,4 +1,4 @@ -package mall +package team import ( "math" diff --git a/core/team/salary.go b/core/team/salary.go index 79ebc052..88e1915f 100644 --- a/core/team/salary.go +++ b/core/team/salary.go @@ -7,7 +7,6 @@ import ( ) const ( - AMOUNT = "amount" INCOME = "income" TAX = "tax" )