This commit is contained in:
IT 老营长 @云轩领航-创始人 2025-04-25 18:23:19 +08:00
parent 29d61783d2
commit 4aa4eb691f
32 changed files with 540 additions and 316 deletions

View File

@ -13,6 +13,6 @@ import (
func main() { print(ice.Run()) }
func init() {
ice.Info.CodeMain = "src/operation/portal.go"
ice.Info.NodeMain = "web.team.operation.portal"
ice.Info.CodeMain = "src/production/portal.go"
ice.Info.NodeMain = "web.team.production.portal"
}

6
src/operation/studio.css Normal file
View File

@ -0,0 +1,6 @@
// $body { --action-height:64px; }
// $fieldset>div.header>div { line-height:54px; }
// $option>div.item.icon { line-height:58px; }
$project div.item:not(.text) { padding:10px; }
// $project div.item:hover { background-color:transparent; }
// $project div.item.select { background-color:transparent; }

View File

@ -9,42 +9,32 @@ import (
type Case struct {
Table
order string `data:"4"`
fields string `data:"title,content,case_status,process_time,finish_time,plan_uid,user_uid"`
create string `name:"create title* content*" role:"leader,worker"`
modify string `name:"modify title* content*" role:"leader,worker"`
remove string `name:"remove" role:"leader,worker"`
process string `name:"process" role:"leader,worker"`
finish string `name:"finish" role:"leader,worker"`
planBind string `name:"planBind plan_uid*" role:"leader"`
order string `data:"5"`
fields string `data:"title,content,case_status,begin_time,end_time,process_time,finish_time,task_uid,plan_uid,user_uid"`
create string `name:"create task_uid* title* content* begin_time:select@date end_time:select@date" role:"worker"`
modify string `name:"modify title* content* begin_time*:select@date end_time*:select@date" role:"worker"`
}
func (s Case) Create(m *ice.Message, arg ...string) {
s.ValueCreate(m, arg...)
s.ValueCreate(m, kit.ArgDef(arg, kit.Simple(model.BEGIN_TIME, m.Time(), model.END_TIME, m.Time("72h"))...)...)
s.taskCount(m, "1")
s.planCount(m, "1")
s.GetCommandUID(m)
s.SendMessage(m, "", "")
s.SendMessage(s.GetCommandUID(m), "", "")
}
func (s Case) Remove(m *ice.Message, arg ...string) {
s.ValueRemove(m, arg...)
s.taskCount(m, "-1")
s.planCount(m, "-1")
}
func (s Case) List(m *ice.Message, arg ...string) {
isLeader, user_uid := s.IsLeader(m), m.Option(model.USER_UID)
user_uid := m.Option(model.USER_UID)
s.ValueList(m, arg).Table(func(value ice.Maps) {
button := []ice.Any{}
switch CaseStatus(kit.Int(value[model.CASE_STATUS])) {
case CaseCreate:
if isLeader && value[model.PLAN_UID] == "" {
button = append(button, s.PlanBind)
}
if isLeader || user_uid == value[model.USER_UID] {
if user_uid == value[model.USER_UID] {
button = append(button, s.Process)
}
case CaseProcess:
if isLeader || user_uid == value[model.USER_UID] {
if user_uid == value[model.USER_UID] {
button = append(button, s.Finish)
}
case CaseFinish:
@ -60,24 +50,17 @@ func (s Case) Process(m *ice.Message, arg ...string) {
func (s Case) Finish(m *ice.Message, arg ...string) {
s.changeStatus(m, CaseProcess, CaseFinish)
}
func (s Case) PlanBind(m *ice.Message, arg ...string) {
s.ValueModify(m, arg...)
s.planCount(m, "1")
}
func init() { ice.TeamCtxCmd(Case{}) }
func (s Case) changeStatus(m *ice.Message, from, to CaseStatus) {
s.ChangeStatus(m, int(from), int(to), m.ActionKey()+"_time", m.Time())
}
func (s Case) planCount(m *ice.Message, value string) {
s.Table.planCount(m, model.CASE_COUNT, value)
}
func (s Case) taskCount(m *ice.Message, value string) {
if m.IsErr() || m.Option(model.TASK_UID) == "" {
return
}
m.Cmd(task{}, s.AddCount, model.CASE_COUNT, value, m.Option(model.TASK_UID))
m.Cmd(Task{}, s.AddCount, model.CASE_COUNT, value, m.Option(model.TASK_UID))
}
type CaseStatus int

View File

@ -1,10 +1,9 @@
Volcanos(chat.ONIMPORT, {
_init: function(can, msg) {
can.onimport.myView(can, msg, function(value) { return [
{view: html.TITLE, list: [value.title, can.onimport.textView(can, value), can.onimport.titleAction(can, value)]},
{view: html.STATUS, list: [value.uid.slice(0, 6), can.onimport.timeView(can, value), value.user_name]},
{view: html.STATUS, list: [can.base.TimeTrim(value.process_time), "~", can.base.TimeTrim(value.finish_time), "计划:", value.plan_title]},
{view: html.OUTPUT, list: [value.content]},
{view: html.TITLE, list: [value.title, can.onimport.textView(can, value)]},
{view: html.STATUS, list: [(value.process_time||value.begin_time).split(" ")[0], "计划:", value.plan_title]},
{view: html.OUTPUT, list: [value.content]}, can.onimport.titleAction(can, value),
] })
},
})

BIN
src/production/case.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

View File

@ -10,7 +10,10 @@ import (
type Table struct {
operation.Table
list string `name:"list story_uid uid auto" role:"void"`
remove string `name:"remove" role:"worker"`
process string `name:"process" role:"worker"`
finish string `name:"finish" role:"worker"`
list string `name:"list story_uid uid auto" role:"void"`
}
func (s Table) Inputs(m *ice.Message, arg ...string) {
@ -20,9 +23,11 @@ func (s Table) Inputs(m *ice.Message, arg ...string) {
case model.STORY_TYPE:
s.InputsList(m, StoryTypeList, arg...)
case model.PLAN_UID:
s.Fields(m, model.UID, model.TITLE)
m.Cmdy(plan{}, s.Select, m.OptionSimple(model.STORY_UID)).RenameAppend(model.UID, arg[0])
m.DisplayInputKeyNameIconTitle()
s.InputsUID(m, Plan{}, arg...)
case model.ISSUE_UID:
s.InputsUID(m, Issue{}, arg...)
case model.TASK_UID:
s.InputsUID(m, Task{}, arg...)
case model.ISSUE_TYPE:
s.InputsList(m, IssueTypeList, arg...)
case model.LEVEL:
@ -44,6 +49,8 @@ func (s Table) RewriteAppend(m *ice.Message, arg ...string) *ice.Message {
value = IssueType(kit.Int(value)).String()
case model.ISSUE_STATUS:
value = IssueStatus(kit.Int(value)).String()
case model.DESIGN_STATUS:
value = DesignStatus(kit.Int(value)).String()
case model.TASK_STATUS:
value = TaskStatus(kit.Int(value)).String()
case model.CASE_STATUS:
@ -56,18 +63,12 @@ func (s Table) RewriteAppend(m *ice.Message, arg ...string) *ice.Message {
return s.Table.RewriteAppend(m)
}
func (s Table) SelectJoinPlan(m *ice.Message, arg ...string) {
s.SelectJoin(m, plan{}, model.TITLE)
s.SelectJoin(m, Plan{}, model.TITLE)
}
func (s Table) ChangeStatus(m *ice.Message, from, to int, arg ...string) {
s.Table.ChangeStatus(m, m.Option(model.STORY_UID), m.Option(model.UID), from, to, arg...)
s.DashboardUpdate(m)
}
func (s Table) planCount(m *ice.Message, key, value string) {
if m.IsErr() || m.Option(model.PLAN_UID) == "" {
return
}
m.Cmd(plan{}, s.AddCount, key, value, m.Option(model.PLAN_UID))
}
type Tables struct{ Table }

81
src/production/design.go Normal file
View File

@ -0,0 +1,81 @@
package production
import (
"shylinux.com/x/ice"
kit "shylinux.com/x/toolkits"
"shylinux.com/x/operation/src/production/model"
)
type Design struct {
Table
order string `data:"3"`
fields string `data:"title,content,design_status,begin_time,end_time,process_time,finish_time,issue_uid,plan_uid,user_uid"`
create string `name:"create issue_uid* title* content* begin_time:select@date end_time:select@date" role:"worker"`
modify string `name:"modify title* content* begin_time*:select@date end_time*:select@date" role:"worker"`
}
func (s Design) Create(m *ice.Message, arg ...string) {
s.ValueCreate(m, kit.ArgDef(arg, kit.Simple(model.BEGIN_TIME, m.Time(), model.END_TIME, m.Time("72h"))...)...)
s.issueCount(m, "1")
s.SendMessage(s.GetCommandUID(m), "", "")
}
func (s Design) Remove(m *ice.Message, arg ...string) {
s.ValueRemove(m, arg...)
s.issueCount(m, "-1")
}
func (s Design) List(m *ice.Message, arg ...string) {
user_uid := m.Option(model.USER_UID)
s.ValueList(m, arg).Table(func(value ice.Maps) {
button := []ice.Any{}
switch DesignStatus(kit.Int(value[model.DESIGN_STATUS])) {
case DesignCreate:
if user_uid == value[model.USER_UID] {
button = append(button, s.Process)
}
case DesignProcess:
if user_uid == value[model.USER_UID] {
button = append(button, s.Finish)
}
case DesignFinish:
kit.If(len(arg) == 2, func() { s.DoneMessage(m) })
}
m.PushButton(button...)
}).Display("")
s.SelectJoinPlan(m)
}
func (s Design) Process(m *ice.Message, arg ...string) {
s.changeStatus(m, DesignCreate, DesignProcess)
}
func (s Design) Finish(m *ice.Message, arg ...string) {
s.changeStatus(m, DesignProcess, DesignFinish)
}
func init() { ice.TeamCtxCmd(Design{}) }
func (s Design) changeStatus(m *ice.Message, from, to DesignStatus) {
s.ChangeStatus(m, int(from), int(to), m.ActionKey()+"_time", m.Time())
}
func (s Design) issueCount(m *ice.Message, value string) Design {
if m.IsErr() || m.Option(model.ISSUE_UID) == "" {
return s
}
m.Cmd(Issue{}, s.AddCount, model.DESIGN_COUNT, value, m.Option(model.ISSUE_UID))
return s
}
type DesignStatus int
const (
DesignCreate DesignStatus = iota
DesignProcess
DesignFinish
)
var DesignStatusList = map[DesignStatus]string{
DesignCreate: "create",
DesignProcess: "process",
DesignFinish: "finish",
}
func (s DesignStatus) String() string { return DesignStatusList[s] }

9
src/production/design.js Normal file
View File

@ -0,0 +1,9 @@
Volcanos(chat.ONIMPORT, {
_init: function(can, msg) {
can.onimport.myView(can, msg, function(value) { return [
{view: html.TITLE, list: [value.title, can.onimport.textView(can, value)]},
{view: html.STATUS, list: [can.onimport.beginTime(can, value), "计划:", value.plan_title]},
{view: html.OUTPUT, list: [value.content]}, can.onimport.titleAction(can, value),
] })
},
})

BIN
src/production/design.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

View File

@ -7,36 +7,35 @@ import (
"shylinux.com/x/operation/src/production/model"
)
type issue struct {
type Issue struct {
Table
task task
order string `data:"2"`
fields string `data:"title,content,issue_type,level,issue_status,task_count,process_time,finish_time,plan_uid,user_uid"`
create string `name:"create title* content* issue_type:select level:select" role:"leader,worker"`
modify string `name:"modify title* content* issue_type*:select level*:select" role:"leader,worker"`
remove string `name:"remove" role:"leader,worker"`
reject string `name:"reject" role:"leader"`
approve string `name:"approve" role:"leader"`
process string `name:"process" role:"leader,worker"`
finish string `name:"finish" role:"leader,worker"`
planBind string `name:"planBind plan_uid*" role:"leader"`
taskCreate string `name:"taskCreate title* content* begin_time:select@date end_time:select@date" role:"leader,worker"`
order string `data:"2"`
fields string `data:"title,content,level,issue_type,issue_status,price,link,design_count,task_count,begin_time,end_time,process_time,finish_time,plan_uid,user_uid"`
create string `name:"create plan_uid* title* content* issue_type:select level:select price begin_time:select@date end_time:select@date" role:"worker"`
modify string `name:"modify title* content* issue_type*:select level*:select price begin_time:select@date end_time:select@date" role:"worker"`
reject string `name:"reject" role:"leader"`
approve string `name:"approve" role:"leader"`
submit string `name:"submit" role:"worker"`
reback string `name:"reback" role:"leader"`
payfor string `name:"payfor" role:"worker"`
designCreate string `name:"designCreate title* content* begin_time:select@date end_time:select@date" role:"worker"`
taskCreate string `name:"taskCreate title* content* begin_time:select@date end_time:select@date" role:"worker"`
}
func (s issue) Create(m *ice.Message, arg ...string) {
s.ValueCreate(m, kit.ArgDef(arg, kit.Simple(model.ISSUE_TYPE, IssueFeature, model.LEVEL, Level3)...)...)
s.planCount(m, "1")
s.DashboardUpdate(m)
s.GetCommandUID(m)
s.SendMessage(m, "", "")
func (s Issue) Create(m *ice.Message, arg ...string) {
s.ValueCreate(m, kit.ArgDef(s.TransPrice(m, arg), kit.Simple(
model.ISSUE_TYPE, IssueFeature, model.LEVEL, Level3, model.PRICE, "1000",
model.BEGIN_TIME, m.Time(), model.END_TIME, m.Time("72h"),
)...)...)
s.planCount(m, "1").DashboardUpdate(m)
s.SendMessage(s.GetCommandUID(m), "", "")
}
func (s issue) Remove(m *ice.Message, arg ...string) {
func (s Issue) Remove(m *ice.Message, arg ...string) {
s.ValueRemove(m, arg...)
s.planCount(m, "-1")
s.DashboardUpdate(m)
s.planCount(m, "-1").DashboardUpdate(m)
}
func (s issue) List(m *ice.Message, arg ...string) {
isLeader, user_uid := s.IsLeader(m), m.Option(model.USER_UID)
func (s Issue) List(m *ice.Message, arg ...string) {
isLeader, isWorker, user_uid := s.IsLeader(m), s.IsWorker(m), m.Option(model.USER_UID)
s.ValueList(m, arg).Table(func(value ice.Maps) {
button := []ice.Any{}
switch IssueStatus(kit.Int(value[model.ISSUE_STATUS])) {
@ -44,57 +43,81 @@ func (s issue) List(m *ice.Message, arg ...string) {
if isLeader {
button = append(button, s.Reject, s.Approve)
}
case IssueApproved:
if isLeader && value[model.PLAN_UID] == "" {
button = append(button, s.PlanBind)
if user_uid == value[model.USER_UID] {
button = append(button, s.Modify, s.Remove)
}
if isLeader || user_uid == value[model.USER_UID] {
case IssueApproved:
if user_uid == value[model.USER_UID] {
button = append(button, s.Process)
}
case IssueProcess:
button = append(button, s.TaskCreate)
if isLeader || user_uid == value[model.USER_UID] {
button = append(button, s.Finish)
if user_uid == value[model.USER_UID] {
button = append(button, s.Submit)
}
if isLeader && kit.Int(value[model.PRICE]) > 0 {
// button = append(button, s.Payfor)
}
case IssueSubmit:
if isLeader {
button = append(button, s.Reback, s.Finish)
}
case IssueFinish:
kit.If(len(arg) == 2, func() { s.DoneMessage(m) })
if isWorker {
button = append(button, s.DesignCreate, s.TaskCreate)
}
if isLeader && kit.Int(value[model.PRICE]) > 0 {
// button = append(button, s.Payfor)
}
kit.If(len(arg) == 2 && value[model.PRICE] == "0", func() { s.DoneMessage(m) })
}
m.PushButton(button...)
}).Display("")
s.SelectJoinPlan(m)
}
func (s issue) Reject(m *ice.Message, arg ...string) {
func (s Issue) Reject(m *ice.Message, arg ...string) {
s.changeStatus(m, IssueCreate, IssueRejected)
}
func (s issue) Approve(m *ice.Message, arg ...string) {
func (s Issue) Approve(m *ice.Message, arg ...string) {
s.changeStatus(m, IssueCreate, IssueApproved)
}
func (s issue) Process(m *ice.Message, arg ...string) {
func (s Issue) Process(m *ice.Message, arg ...string) {
s.changeStatus(m, IssueApproved, IssueProcess)
}
func (s issue) Finish(m *ice.Message, arg ...string) {
count := m.Cmd(s.task, s.Select, "issue_uid = ? AND status != ?", m.Option(model.UID), TaskFinish).Length()
func (s Issue) Submit(m *ice.Message, arg ...string) {
s.ChangeStatus(m, int(IssueProcess), int(IssueSubmit))
}
func (s Issue) Reback(m *ice.Message, arg ...string) {
s.ChangeStatus(m, int(IssueSubmit), int(IssueProcess))
}
func (s Issue) Finish(m *ice.Message, arg ...string) {
count := m.Cmd(Design{}, s.Select, "issue_uid = ? AND status != ?", m.Option(model.UID), DesignFinish).Length()
if m.WarnNotValid(count > 0, kit.Format("还有 %v 个未完成的设计", count)) {
return
}
count = m.Cmd(Task{}, s.Select, "issue_uid = ? AND status != ?", m.Option(model.UID), TaskFinish).Length()
if m.WarnNotValid(count > 0, kit.Format("还有 %v 个未完成的任务", count)) {
return
}
s.changeStatus(m, IssueProcess, IssueFinish)
s.DashboardUpdate(m)
s.changeStatus(m, IssueSubmit, IssueFinish)
}
func (s issue) PlanBind(m *ice.Message, arg ...string) {
s.ValueModify(m, arg...)
s.planCount(m, "1")
func (s Issue) DesignCreate(m *ice.Message, arg ...string) {
s.OtherCreate(m, Design{}, model.ISSUE_UID, m.Option(model.UID), arg, m.OptionSimple(model.PLAN_UID))
}
func (s issue) TaskCreate(m *ice.Message, arg ...string) {
m.Cmd(s.task, s.Create, arg, model.ISSUE_UID, m.Option(model.UID), m.OptionSimple(model.PLAN_UID))
func (s Issue) TaskCreate(m *ice.Message, arg ...string) {
s.OtherCreate(m, Task{}, model.ISSUE_UID, m.Option(model.UID), arg, m.OptionSimple(model.PLAN_UID))
}
func init() { ice.TeamCtxCmd(issue{}) }
func init() { ice.TeamCtxCmd(Issue{}) }
func (s issue) changeStatus(m *ice.Message, from, to IssueStatus) {
func (s Issue) changeStatus(m *ice.Message, from, to IssueStatus) {
s.ChangeStatus(m, int(from), int(to), m.ActionKey()+"_time", m.Time())
}
func (s issue) planCount(m *ice.Message, value string) {
s.Table.planCount(m, model.ISSUE_COUNT, value)
func (s Issue) planCount(m *ice.Message, value string) Issue {
if m.IsErr() || m.Option(model.PLAN_UID) == "" {
return s
}
m.Cmd(Plan{}, s.AddCount, model.ISSUE_COUNT, value, m.Option(model.PLAN_UID))
return s
}
type IssueType int
@ -118,6 +141,8 @@ const (
IssueRejected
IssueApproved
IssueProcess
IssueSubmit
IssueReback
IssueFinish
)
@ -126,6 +151,8 @@ var IssueStatusList = map[IssueStatus]string{
IssueRejected: "rejected",
IssueApproved: "approved",
IssueProcess: "process",
IssueSubmit: "submit",
IssueReback: "reback",
IssueFinish: "finish",
}

View File

@ -4,14 +4,16 @@ Volcanos(chat.ONIMPORT, {
{view: html.TITLE, list: [value.title,
value.issue_type != "feature" && can.onimport.textView(can, value, "issue_type"),
value.level != "level-3" && can.onimport.textView(can, value, "level"),
can.onimport.textView(can, value), can.onimport.titleAction(can, value),
can.onimport.textView(can, value),
]},
{view: html.STATUS, list: [value.uid.slice(0, 6), can.onimport.timeView(can, value), value.user_name]},
{view: html.STATUS, list: [
can.base.TimeTrim(value.process_time), "~", can.base.TimeTrim(value.finish_time),
"计划:", value.plan_title, "任务:", value.task_count+" 个",
can.onimport.beginTime(can, value),
"设计:", value.design_count+" 个",
"任务:", value.task_count+" 个",
"计划:", value.plan_title,
]},
{view: html.OUTPUT, list: [value.content]},
value.price > 0 && {view: html.OUTPUT, list: ["报价: "+value.price+" 元"]},
{view: html.OUTPUT, list: [value.content]}, can.onimport.titleAction(can, value),
] })
},
})

BIN
src/production/issue.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

View File

@ -9,8 +9,11 @@ const (
TYPE = "type"
LEVEL = "level"
STATUS = "status"
PRICE = "price"
LINK = "link"
TITLE = "title"
CONTENT = "content"
VERSION = "version"
USER_UID = "user_uid"
USER_ROLE = "user_role"
USER_STORY_ROLE = "user_story_role"
@ -19,6 +22,8 @@ const (
STORY_TYPE = "story_type"
PLAN_UID = "plan_uid"
PLAN_STATUS = "plan_status"
DESIGN_STATUS = "design_status"
DESIGN_COUNT = "design_count"
ISSUE_COUNT = "issue_count"
TASK_COUNT = "task_count"
CASE_COUNT = "case_count"
@ -44,10 +49,9 @@ type Story struct {
type Plan struct {
db.ModelContent
StoryUID string `gorm:"type:char(32);index"`
Version string `gorm:"type:varchar(16)"`
Status uint8 `gorm:"default:0"`
IssueCount int `gorm:"default:0"`
TaskCount int `gorm:"default:0"`
CaseCount int `gorm:"default:0"`
BeginTime db.Time
EndTime db.Time
ProcessTime db.Time
@ -55,23 +59,26 @@ type Plan struct {
}
type Issue struct {
Common
DesignCount int `gorm:"default:0"`
TaskCount int `gorm:"default:0"`
RejectTime db.Time
ApproveTime db.Time
}
type Design struct {
Common
IssueUID string `gorm:"type:char(32);index"`
}
type Task struct {
Common
IssueUID string `gorm:"type:char(32);index"`
CaseCount int `gorm:"default:0"`
BeginTime db.Time
EndTime db.Time
}
type Case struct {
Common
TaskUID string `gorm:"type:char(32);index"`
}
func init() { db.CmdModels("", &UserStory{}, &Story{}, &Plan{}, &Issue{}, &Task{}, &Case{}) }
func init() { db.CmdModels("", &UserStory{}, &Story{}, &Plan{}, &Issue{}, &Design{}, &Task{}, &Case{}) }
type Common struct {
db.ModelContent
@ -80,6 +87,11 @@ type Common struct {
Type uint8 `gorm:"default:0"`
Level uint8 `gorm:"default:2"`
Status uint8 `gorm:"default:0"`
Price int `gorm:"default:0"`
Score int `gorm:"default:0"`
Link string `gorm:"type:varchar(255)"`
BeginTime db.Time
EndTime db.Time
ProcessTime db.Time
FinishTime db.Time
}

1
src/production/plan.css Normal file
View File

@ -0,0 +1 @@
$output div.item.card>div.output span.status.create { color:var(--danger-bg-color); }

View File

@ -7,25 +7,25 @@ import (
"shylinux.com/x/operation/src/production/model"
)
type plan struct {
type Plan struct {
Table
issue issue
order string `data:"1"`
fields string `data:"title,content,plan_status,issue_count,task_count,case_count,begin_time,end_time,process_time,finish_time,user_uid"`
create string `name:"create title* content* begin_time:select@date end_time:select@date" role:"leader"`
modify string `name:"modify title* content* begin_time*:select@date end_time*:select@date" role:"leader"`
fields string `data:"title,content,version,plan_status,issue_count,begin_time,end_time,process_time,finish_time,user_uid"`
create string `name:"create title* content version begin_time:select@date end_time:select@date" role:"leader"`
modify string `name:"modify title* content version begin_time*:select@date end_time*:select@date" role:"leader"`
remove string `name:"remove" role:"leader"`
process string `name:"process" role:"leader"`
finish string `name:"finish" role:"leader"`
issueCreate string `name:"issueCreate title* content* issue_type:select level:select" role:"leader,worker"`
issueCreate string `name:"issueCreate title* content* issue_type:select level:select price begin_time:select@date end_time:select@date" role:"worker"`
}
func (s plan) Create(m *ice.Message, arg ...string) {
s.ValueCreate(m, kit.ArgDef(arg, kit.Simple(model.BEGIN_TIME, m.Time(), model.END_TIME, m.Time("720h"))...)...)
func (s Plan) Create(m *ice.Message, arg ...string) {
s.ValueCreate(m, kit.ArgDef(arg, kit.Simple(model.VERSION, "v1.0", model.BEGIN_TIME, m.Time(), model.END_TIME, m.Time("168h"))...)...)
s.SendMessage(m, "", "")
}
func (s plan) List(m *ice.Message, arg ...string) {
isLeader := s.IsLeader(m)
func (s Plan) List(m *ice.Message, arg ...string) {
isLeader, isWorker := s.IsLeader(m), s.IsWorker(m)
defer kit.If(!isLeader, func() { m.SetResult().Action() })
s.ValueList(m, arg).Table(func(value ice.Maps) {
button := []ice.Any{}
switch PlanStatus(kit.Int(value[model.PLAN_STATUS])) {
@ -34,7 +34,9 @@ func (s plan) List(m *ice.Message, arg ...string) {
button = append(button, s.Process, s.Modify, s.Remove)
}
case PlanProcess:
button = append(button, s.IssueCreate)
if isWorker {
button = append(button, s.IssueCreate)
}
if isLeader {
button = append(button, s.Finish)
}
@ -45,26 +47,28 @@ func (s plan) List(m *ice.Message, arg ...string) {
kit.If(len(arg) == 2, func() { s.DoneMessage(m) })
}
m.PushButton(button...)
}).Display("")
kit.If(!isLeader, func() { m.Action() })
}).Display("").DisplayCSS("").Sort("plan_status,issue_count,create_time")
}
func (s plan) Process(m *ice.Message, arg ...string) {
func (s Plan) Process(m *ice.Message, arg ...string) {
s.changeStatus(m, PlanCreate, PlanProcess)
}
func (s plan) Finish(m *ice.Message, arg ...string) {
count := m.Cmd(s.issue, s.Select, "plan_uid = ? AND status != ?", m.Option(model.UID), IssueFinish).Length()
if m.WarnNotValid(count > 0, kit.Format("还有 %v 个未完成的需求", count)) {
return
func (s Plan) Finish(m *ice.Message, arg ...string) {
count := m.Cmd(Issue{}, s.Select, "plan_uid = ? AND status != ?", m.Option(model.UID), IssueFinish).Length()
if !m.WarnNotValid(count > 0, kit.Format("还有 %v 个未完成的需求", count)) {
s.changeStatus(m, PlanProcess, PlanFinish)
}
s.changeStatus(m, PlanProcess, PlanFinish)
}
func (s plan) IssueCreate(m *ice.Message, arg ...string) {
m.Cmd(s.issue, s.Create, arg, model.PLAN_UID, m.Option(model.UID))
func (s Plan) IssueCreate(m *ice.Message, arg ...string) {
s.OtherCreate(m, Issue{}, model.PLAN_UID, m.Option(model.UID), arg)
}
func (s Table) OtherCreate(m *ice.Message, target ice.Any, arg ...ice.Any) {
m.Cmdy(target, s.Create, kit.Simple(arg...))
kit.If(!m.IsErr(), func() { m.ProcessField(target, []string{m.Option(model.STORY_UID), m.Result()}) })
}
func init() { ice.TeamCtxCmd(plan{}) }
func init() { ice.TeamCtxCmd(Plan{}) }
func (s plan) changeStatus(m *ice.Message, from, to PlanStatus) {
func (s Plan) changeStatus(m *ice.Message, from, to PlanStatus) {
s.ChangeStatus(m, int(from), int(to), m.ActionKey()+"_time", m.Time())
}

View File

@ -1,14 +1,9 @@
Volcanos(chat.ONIMPORT, {
_init: function(can, msg) {
can.onimport.myView(can, msg, function(value) { return [
{view: html.TITLE, list: [value.title, can.onimport.textView(can, value), can.onimport.titleAction(can, value)]},
{view: html.STATUS, list: [value.uid.slice(0, 6), can.onimport.timeView(can, value), value.user_name]},
{view: html.STATUS, list: [value.begin_time.split(" ")[0], "~", value.end_time.split(" ")[0]]},
{view: html.STATUS, list: [
can.base.TimeTrim(value.process_time), "~", can.base.TimeTrim(value.finish_time),
"需求:", value.issue_count+" 个", "任务:", value.task_count+" 个", "用例:", value.case_count+" 个",
]},
{view: html.OUTPUT, list: [value.content]},
{view: html.TITLE, list: [value.title, value.version, can.onimport.textView(can, value)]},
{view: html.STATUS, list: [can.onimport.beginTime(can, value), "需求量:", value.issue_count+" 个"]},
{view: html.OUTPUT, list: [value.content]}, can.onimport.titleAction(can, value),
] })
},
})

BIN
src/production/plan.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

View File

@ -15,10 +15,10 @@ type Portal struct {
func (s Portal) AfterPlaceAuth(m *ice.Message, arg ...string) {
defer s.DashboardCreate(m, "")()
s.DashboardInsert(m, 1, "需求总量", "个", issue{}, "")
s.DashboardInsert(m, 2, "需求待办", "个", issue{}, "", "story_uid = ? AND status != ? AND status != ?", m.Option(model.STORY_UID), IssueRejected, IssueFinish)
s.DashboardInsert(m, 3, "任务总量", "个", task{}, "")
s.DashboardInsert(m, 4, "任务待办", "个", task{}, "", "story_uid = ? AND status != ?", m.Option(model.STORY_UID), TaskFinish)
s.DashboardInsert(m, 1, "需求总量", "个", Issue{}, "")
s.DashboardInsert(m, 2, "需求待办", "个", Issue{}, "", "story_uid = ? AND status != ? AND status != ?", m.Option(model.STORY_UID), IssueRejected, IssueFinish)
s.DashboardInsert(m, 4, "任务待办", "个", Task{}, "", "story_uid = ? AND status != ?", m.Option(model.STORY_UID), TaskFinish)
s.DashboardInsert(m, 3, "任务总量", "个", Task{}, "")
}
func init() { gonganxitong.PortalCmd(Portal{Portal: guanlixitong.NewPortal(userStory{}, story{})}) }

5
src/production/portal.js Normal file
View File

@ -0,0 +1,5 @@
Volcanos(chat.ONIMPORT, {
beginTime: function(can, value) {
return (value.process_time||value.begin_time).split(" ")[0]+" ~ "+(value.finish_time||value.end_time).split(" ")[0]
},
})

View File

@ -1,38 +1,47 @@
{
"portal": "产品迭代", "member": "项目成员",
"plan": "迭代计划", "issue": "产品需求", "design": "界面设计", "task": "开发任务", "case": "测试用例",
"planBind": "绑定计划", "process": "开始",
"issueCreate": "创建需求", "taskCreate": "创建任务", "caseCreate": "创建用例",
"process": "开始", "submit": "提交", "reback": "返工", "finish": "完成", "payfor": "支付",
"issueCreate": "创建需求", "designCreate": "创建设计", "taskCreate": "创建任务", "caseCreate": "创建用例",
"style": {
"process": "notice",
"finish": "danger",
"submit": "notice",
"reback": "notice",
"finish": "notice",
"payfor": "notice",
"issueCreate": "notice",
"designCreate": "notice",
"taskCreate": "notice",
"caseCreate": "notice"
},
"icons": {
"plan": "https://img.icons8.com/officel/80/timeline-week.png",
"issue": "https://img.icons8.com/officel/80/communication.png",
"design": "https://img.icons8.com/officel/80/web-design.png",
"task": "https://img.icons8.com/officel/80/tasks.png",
"case": "https://img.icons8.com/officel/80/faq.png"
"plan": "plan.png",
"issue": "issue.png",
"design": "design.png",
"task": "task.png",
"case": "case.png"
},
"input": {
"My Story": "我的产品",
"user_story_role": "用户角色",
"story_name": "产品名称",
"story_type": "产品类型",
"plan_uid": "产品计划",
"plan_title": "产品计划",
"plan_status": "计划状态",
"story_name": "产品名称",
"story_type": "产品类型",
"issue_uid": "产品需求",
"issue_type": "需求类型",
"issue_status": "需求状态",
"issue_count": "需求数量",
"design_status": "设计状态",
"design_count": "设计数量",
"task_uid": "开发任务",
"task_status": "任务状态",
"task_count": "任务数量",
"case_status": "用例状态",
"case_count": "用例数量",
"issue_count": "需求数量",
"task_count": "任务数量",
"process_time": "开始时间",
"finish_time": "完成时间",
"level": "优先级"
},
"value": {
@ -48,7 +57,7 @@
}
},
"story_type": {
"custom": "应用软件",
"application": "应用软件",
"enterprise": "企业软件",
"industry": "工业软件",
"military": "军用软件",
@ -69,13 +78,23 @@
"issue_status": {
"create": "待评审",
"rejected": "已驳回",
"approved": "待开发",
"process": "开发中",
"approved": "待调研",
"process": "调研中",
"submit": "已提交",
"finish": "已完成",
"style": {
"create": "danger",
"approved": "danger",
"rejected": "danger"
"rejected": "danger",
"submit": "danger"
}
},
"design_status": {
"create": "待设计",
"process": "设计中",
"finish": "已完成",
"style": {
"create": "danger"
}
},
"task_status": {

View File

@ -9,7 +9,7 @@ func init() { ice.TeamCtxCmd(story{}) }
type StoryType int
const (
StoryCustom StoryType = iota
StoryApplication StoryType = iota
StoryEnterprise
StoryIndustry
StoryMilitary
@ -17,11 +17,11 @@ const (
)
var StoryTypeList = map[StoryType]string{
StoryCustom: "custom",
StoryEnterprise: "enterprise",
StoryIndustry: "industry",
StoryMilitary: "military",
StorySystem: "system",
StoryApplication: "application",
StoryEnterprise: "enterprise",
StoryIndustry: "industry",
StoryMilitary: "military",
StorySystem: "system",
}
func (s StoryType) String() string { return StoryTypeList[s] }

View File

@ -7,49 +7,38 @@ import (
"shylinux.com/x/operation/src/production/model"
)
type task struct {
type Task struct {
Table
Case Case
order string `data:"4"`
fields string `data:"title,content,task_status,case_count,begin_time,end_time,process_time,finish_time,issue_uid,plan_uid,user_uid"`
create string `name:"create title* content* begin_time:select@date end_time:select@date" role:"leader,worker"`
modify string `name:"modify title* content* begin_time*:select@date end_time*:select@date" role:"leader,worker"`
remove string `name:"remove" role:"leader,worker"`
process string `name:"process" role:"leader,worker"`
finish string `name:"finish" role:"leader,worker"`
planBind string `name:"planBind plan_uid*" role:"leader"`
caseCreate string `name:"caseCreate title* content*" role:"leader,worker"`
create string `name:"create issue_uid* title* content* begin_time:select@date end_time:select@date" role:"worker"`
modify string `name:"modify title* content* begin_time*:select@date end_time*:select@date" role:"worker"`
caseCreate string `name:"caseCreate title* content* begin_time:select@date end_time:select@date" role:"worker"`
}
func (s task) Create(m *ice.Message, arg ...string) {
func (s Task) Create(m *ice.Message, arg ...string) {
s.ValueCreate(m, kit.ArgDef(arg, kit.Simple(model.BEGIN_TIME, m.Time(), model.END_TIME, m.Time("72h"))...)...)
s.issueCount(m, "1")
s.planCount(m, "1")
s.DashboardUpdate(m)
s.GetCommandUID(m)
s.SendMessage(m, "", "")
s.issueCount(m, "1").DashboardUpdate(m)
s.SendMessage(s.GetCommandUID(m), "", "")
}
func (s task) Remove(m *ice.Message, arg ...string) {
func (s Task) Remove(m *ice.Message, arg ...string) {
s.ValueRemove(m, arg...)
s.issueCount(m, "-1")
s.planCount(m, "-1")
s.DashboardUpdate(m)
s.issueCount(m, "-1").DashboardUpdate(m)
}
func (s task) List(m *ice.Message, arg ...string) {
isLeader, user_uid := s.IsLeader(m), m.Option(model.USER_UID)
func (s Task) List(m *ice.Message, arg ...string) {
isWorker, user_uid := s.IsWorker(m), m.Option(model.USER_UID)
s.ValueList(m, arg).Table(func(value ice.Maps) {
button := []ice.Any{}
switch TaskStatus(kit.Int(value[model.TASK_STATUS])) {
case TaskCreate:
if isLeader && value[model.PLAN_UID] == "" {
button = append(button, s.PlanBind)
}
if isLeader || user_uid == value[model.USER_UID] {
if user_uid == value[model.USER_UID] {
button = append(button, s.Process)
}
case TaskProcess:
button = append(button, s.CaseCreate)
if isLeader || user_uid == value[model.USER_UID] {
if isWorker {
button = append(button, s.CaseCreate)
}
if user_uid == value[model.USER_UID] {
button = append(button, s.Finish)
}
case TaskFinish:
@ -59,38 +48,32 @@ func (s task) List(m *ice.Message, arg ...string) {
}).Display("")
s.SelectJoinPlan(m)
}
func (s task) Process(m *ice.Message, arg ...string) {
func (s Task) Process(m *ice.Message, arg ...string) {
s.changeStatus(m, TaskCreate, TaskProcess)
}
func (s task) Finish(m *ice.Message, arg ...string) {
count := m.Cmd(s.Case, s.Select, "task_uid = ? AND status != ?", m.Option(model.UID), CaseFinish).Length()
func (s Task) Finish(m *ice.Message, arg ...string) {
count := m.Cmd(Case{}, s.Select, "task_uid = ? AND status != ?", m.Option(model.UID), CaseFinish).Length()
if m.WarnNotValid(count > 0, kit.Format("还有 %v 个未完成的用例", count)) {
return
}
s.changeStatus(m, TaskProcess, TaskFinish)
}
func (s Task) CaseCreate(m *ice.Message, arg ...string) {
s.OtherCreate(m, Case{}, model.TASK_UID, m.Option(model.UID), arg, m.OptionSimple(model.PLAN_UID))
}
func init() { ice.TeamCtxCmd(Task{}) }
func (s Task) changeStatus(m *ice.Message, from, to TaskStatus) {
s.ChangeStatus(m, int(from), int(to), m.ActionKey()+"_time", m.Time())
s.DashboardUpdate(m)
}
func (s task) PlanBind(m *ice.Message, arg ...string) {
s.ValueModify(m, arg...)
s.planCount(m, "1")
}
func (s task) CaseCreate(m *ice.Message, arg ...string) {
m.Cmd(s.Case, s.Create, arg, model.TASK_UID, m.Option(model.UID), m.OptionSimple(model.PLAN_UID))
}
func init() { ice.TeamCtxCmd(task{}) }
func (s task) changeStatus(m *ice.Message, from, to TaskStatus) {
s.ChangeStatus(m, int(from), int(to), m.ActionKey()+"_time", m.Time())
}
func (s task) planCount(m *ice.Message, value string) {
s.Table.planCount(m, model.TASK_COUNT, value)
}
func (s task) issueCount(m *ice.Message, value string) {
func (s Task) issueCount(m *ice.Message, value string) Task {
if m.IsErr() || m.Option(model.ISSUE_UID) == "" {
return
return s
}
m.Cmd(issue{}, s.AddCount, model.TASK_COUNT, value, m.Option(model.ISSUE_UID))
m.Cmd(Issue{}, s.AddCount, model.TASK_COUNT, value, m.Option(model.ISSUE_UID))
return s
}
type TaskStatus int

View File

@ -1,10 +1,9 @@
Volcanos(chat.ONIMPORT, {
_init: function(can, msg) {
can.onimport.myView(can, msg, function(value) { return [
{view: html.TITLE, list: [value.title, can.onimport.textView(can, value), can.onimport.titleAction(can, value)]},
{view: html.STATUS, list: [value.uid.slice(0, 6), can.onimport.timeView(can, value), value.user_name]},
{view: html.STATUS, list: [can.base.TimeTrim(value.process_time), "~", can.base.TimeTrim(value.finish_time), "计划:", value.plan_title, "用例:", value.case_count+" 个"]},
{view: html.OUTPUT, list: [value.content]},
{view: html.TITLE, list: [value.title, can.onimport.textView(can, value)]},
{view: html.STATUS, list: [can.onimport.beginTime(can, value), "用例:", value.case_count+" 个", "计划:", value.plan_title]},
{view: html.OUTPUT, list: [value.content]}, can.onimport.titleAction(can, value),
] })
},
})

BIN
src/production/task.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

View File

@ -1,7 +1,14 @@
{
"047cb1827018c121a26a3dfe527fb629": {
"meta": {
"icons": "/root/2025-web/usr/local/work/20240724-community/src/gonganxitong/quotalist.png",
"index": "web.team.dashboard.quotalist",
"time": "2025-04-19 08:28:36.340"
}
},
"0fdb75d726752dab583e67287a8b378e": {
"meta": {
"icons": "https://img.icons8.com/officel/80/test-partial-passed.png",
"icons": "/p/src/gonganxitong/message.png?pod=20240724-community",
"index": "web.team.dashboard.message",
"name": "消息待办",
"order": "902",
@ -21,7 +28,7 @@
},
"2bda2c05c188eefba31832c7a12fe046": {
"meta": {
"icons": "https://img.icons8.com/officel/80/qr-code.png",
"icons": "/p/src/gonganxitong/qrcode.png?pod=20240724-community",
"index": "web.team.dashboard.qrcode",
"name": "场景码",
"order": "501",
@ -31,7 +38,7 @@
},
"2fd5ee121c2a76863adb7e5170d0411e": {
"meta": {
"icons": "https://img.icons8.com/officel/80/person-at-home.png",
"icons": "/p/src/gonganxitong/member.png?pod=20240724-community",
"index": "web.team.dashboard.member",
"name": "组织成员",
"order": "102",
@ -41,7 +48,7 @@
},
"33d8cc46706c23ba4b7f4b4ed7a9ceeb": {
"meta": {
"icons": "https://img.icons8.com/officel/80/customer-support.png",
"icons": "/p/src/gonganxitong/support.png?pod=20240724-community",
"index": "web.team.dashboard.support",
"name": "客服支持",
"order": "905",
@ -50,7 +57,7 @@
},
"4b2bf7c9b86f0fa23d0c2f9722523651": {
"meta": {
"icons": "https://img.icons8.com/officel/80/property-with-timer.png",
"icons": "/p/src/gonganxitong/event.png?pod=20240724-community",
"index": "web.team.dashboard.event",
"name": "事件流",
"order": "504",
@ -71,7 +78,7 @@
},
"61e32fdb1693caabfd9d9a116bdcefad": {
"meta": {
"icons": "https://img.icons8.com/officel/80/settings--v1.png",
"icons": "/p/src/gonganxitong/setting.png?pod=20240724-community",
"index": "web.team.dashboard.setting",
"name": "服务配置",
"order": "103",
@ -113,16 +120,23 @@
},
"9b9207dcf4b99c9bd85f2dbb98cce04d": {
"meta": {
"icons": "https://img.icons8.com/officel/80/multiple-smartphones.png",
"icons": "/p/src/gonganxitong/recent.png?pod=20240724-community",
"index": "web.team.dashboard.recent",
"name": "最近访问",
"order": "903",
"time": "2024-09-03 10:34:55.195"
}
},
"a14fa6b45b1627e58a3720453c829620": {
"meta": {
"icons": "/root/2025-web/usr/local/work/20240724-community/src/gonganxitong/spendlist.png",
"index": "web.team.dashboard.spendlist",
"time": "2025-04-19 08:28:36.342"
}
},
"a9e4e21d0f48ba85879164aa94bb97e7": {
"meta": {
"icons": "https://img.icons8.com/officel/80/activity-grid.png",
"icons": "/p/src/gonganxitong/service.png?pod=20240724-community",
"index": "web.team.dashboard.service",
"name": "服务发现",
"order": "904",
@ -131,7 +145,7 @@
},
"c381566111b7fa54b6dc78b1764c0503": {
"meta": {
"icons": "https://img.icons8.com/officel/80/receipt-approved.png",
"icons": "/p/src/gonganxitong/allow.png?pod=20240724-community",
"index": "web.team.dashboard.allow",
"name": "权限审批",
"order": "503",
@ -186,7 +200,7 @@
},
"e4039b1993b663907a2f2aa12a4fd104": {
"meta": {
"icons": "https://img.icons8.com/officel/80/passport.png",
"icons": "/p/src/gonganxitong/credit.png?pod=20240724-community",
"index": "web.team.dashboard.credit",
"name": "用户名片",
"order": "101",
@ -195,7 +209,7 @@
},
"e96c0373ddfbf817f5fd8970a6c69206": {
"meta": {
"icons": "https://img.icons8.com/officel/80/commercial.png",
"icons": "/p/src/gonganxitong/notice.png?pod=20240724-community",
"index": "web.team.dashboard.notice",
"name": "通知公告",
"order": "505",
@ -205,7 +219,7 @@
},
"f12f682b6938fe6bdaafd58bc683882d": {
"meta": {
"icons": "https://img.icons8.com/officel/80/square.png",
"icons": "/p/src/gonganxitong/market.png?pod=20240724-community",
"index": "web.team.dashboard.market",
"name": "人民广场",
"order": "901",
@ -214,7 +228,7 @@
},
"ffdabf002ce8700a7a1ecb2ddadfbf96": {
"meta": {
"icons": "https://img.icons8.com/officel/80/edit-property.png",
"icons": "/p/src/gonganxitong/apply.png?pod=20240724-community",
"index": "web.team.dashboard.apply",
"name": "权限申请",
"order": "502",

View File

@ -1,7 +1,7 @@
{
"0bea40222e9b6e5925bebd060815779b": {
"meta": {
"icons": "https://img.icons8.com/officel/80/property-with-timer.png",
"icons": "/p/src/gonganxitong/event.png?pod=20240724-community",
"index": "web.team.development.event",
"name": "事件流",
"order": "504",
@ -22,7 +22,7 @@
},
"2dde4851ba7e250e914790995d78f408": {
"meta": {
"icons": "https://img.icons8.com/officel/80/multiple-smartphones.png",
"icons": "/p/src/gonganxitong/recent.png?pod=20240724-community",
"index": "web.team.development.recent",
"name": "最近访问",
"order": "903",
@ -31,7 +31,7 @@
},
"3a84c93f797bf549e296841c33e78fae": {
"meta": {
"icons": "https://img.icons8.com/officel/80/passport.png",
"icons": "/p/src/gonganxitong/credit.png?pod=20240724-community",
"index": "web.team.development.credit",
"name": "用户名片",
"order": "101",
@ -40,7 +40,7 @@
},
"4fedc06280d241291c9e826e57532333": {
"meta": {
"icons": "https://img.icons8.com/officel/80/activity-grid.png",
"icons": "/p/src/gonganxitong/service.png?pod=20240724-community",
"index": "web.team.development.service",
"name": "服务发现",
"order": "904",
@ -58,7 +58,7 @@
},
"65bbf43dd9dd847f2c85f827030ea8ca": {
"meta": {
"icons": "https://img.icons8.com/officel/80/settings--v1.png",
"icons": "/p/src/gonganxitong/setting.png?pod=20240724-community",
"index": "web.team.development.setting",
"name": "服务配置",
"order": "103",
@ -68,7 +68,7 @@
},
"6c38b2d75cf77d3f3be03d4755650660": {
"meta": {
"icons": "https://img.icons8.com/officel/80/customer-support.png",
"icons": "/p/src/gonganxitong/support.png?pod=20240724-community",
"index": "web.team.development.support",
"name": "客服支持",
"order": "905",
@ -99,7 +99,7 @@
},
"90f891576bd575758a3bde4514e86e9c": {
"meta": {
"icons": "https://img.icons8.com/officel/80/qr-code.png",
"icons": "/p/src/gonganxitong/qrcode.png?pod=20240724-community",
"index": "web.team.development.qrcode",
"name": "场景码",
"order": "501",
@ -109,7 +109,7 @@
},
"9cd3425d133a3b63b67a3110e25af04d": {
"meta": {
"icons": "https://img.icons8.com/officel/80/commercial.png",
"icons": "/p/src/gonganxitong/notice.png?pod=20240724-community",
"index": "web.team.development.notice",
"name": "通知公告",
"order": "505",
@ -127,9 +127,16 @@
"time": "2024-09-03 10:22:15.301"
}
},
"9f9581dfeca0595b8c4ff982bb523791": {
"meta": {
"icons": "/root/2025-web/usr/local/work/20240724-community/src/gonganxitong/spendlist.png",
"index": "web.team.development.spendlist",
"time": "2025-04-19 08:28:36.255"
}
},
"ae176612af13a5cdb5b01ece8172651a": {
"meta": {
"icons": "https://img.icons8.com/officel/80/person-at-home.png",
"icons": "/p/src/gonganxitong/member.png?pod=20240724-community",
"index": "web.team.development.member",
"name": "组织成员",
"order": "102",
@ -139,7 +146,7 @@
},
"b985480805074cd9ce56b1f97dbf6c68": {
"meta": {
"icons": "https://img.icons8.com/officel/80/test-partial-passed.png",
"icons": "/p/src/gonganxitong/message.png?pod=20240724-community",
"index": "web.team.development.message",
"name": "消息待办",
"order": "902",
@ -148,7 +155,7 @@
},
"bc7d1f3b02ca339b1baeeda66822784e": {
"meta": {
"icons": "https://img.icons8.com/officel/80/receipt-approved.png",
"icons": "/p/src/gonganxitong/allow.png?pod=20240724-community",
"index": "web.team.development.allow",
"name": "权限审批",
"order": "503",
@ -158,7 +165,7 @@
},
"dee424d13ad309aa8ec7f4247072dcb3": {
"meta": {
"icons": "https://img.icons8.com/officel/80/edit-property.png",
"icons": "/p/src/gonganxitong/apply.png?pod=20240724-community",
"index": "web.team.development.apply",
"name": "权限申请",
"order": "502",
@ -188,9 +195,16 @@
"time": "2024-11-28 17:54:45.815"
}
},
"e89f61693ccdf4a978b3bc2c1329deca": {
"meta": {
"icons": "/root/2025-web/usr/local/work/20240724-community/src/gonganxitong/quotalist.png",
"index": "web.team.development.quotalist",
"time": "2025-04-19 08:28:36.255"
}
},
"e97ee926a1428c894e9d3e7d086b1e9c": {
"meta": {
"icons": "https://img.icons8.com/officel/80/square.png",
"icons": "/p/src/gonganxitong/market.png?pod=20240724-community",
"index": "web.team.development.market",
"name": "人民广场",
"order": "901",

View File

@ -196,7 +196,7 @@
},
"f28c03b5bdbbe92ebc89dabca5e7d4de": {
"meta": {
"icons": "https://img.icons8.com/officel/80/person-at-home.png",
"icons": "/p/usr/local/work/20240724-community/src/gonganxitong/member.png",
"index": "web.team.gonganxitong.member",
"name": "组织成员",
"order": "80",

View File

@ -9,7 +9,7 @@
},
"030e2a53ca3561a0d0d123c133a88b59": {
"meta": {
"icons": "https://img.icons8.com/officel/80/qr-code.png",
"icons": "/p/src/gonganxitong/qrcode.png?pod=20240724-community",
"index": "web.team.guanlixitong.qrcode",
"name": "场景码",
"order": "90",
@ -25,7 +25,7 @@
},
"0521e637b051a0e175a6070eded1bcef": {
"meta": {
"icons": "https://img.icons8.com/officel/80/settings--v1.png",
"icons": "/p/src/gonganxitong/setting.png?pod=20240724-community",
"index": "web.team.guanlixitong.setting",
"name": "服务配置",
"order": "102",
@ -35,7 +35,7 @@
},
"057616b7366e1930ef4e4a921fe45f1f": {
"meta": {
"icons": "https://img.icons8.com/officel/80/activity-grid.png",
"icons": "/p/src/gonganxitong/service.png?pod=20240724-community",
"index": "web.team.guanlixitong.service",
"name": "服务发现",
"order": "102",
@ -60,7 +60,7 @@
},
"2fd80c581b69c9f67420e793804dbd9f": {
"meta": {
"icons": "https://img.icons8.com/officel/80/passport.png",
"icons": "/p/src/gonganxitong/credit.png?pod=20240724-community",
"index": "web.team.guanlixitong.credit",
"name": "用户名片",
"order": "102",
@ -69,7 +69,7 @@
},
"30bfa47cab4cd689901fd2e1b87eb235": {
"meta": {
"icons": "https://img.icons8.com/officel/80/receipt-approved.png",
"icons": "/p/src/gonganxitong/allow.png?pod=20240724-community",
"index": "web.team.guanlixitong.allow",
"name": "权限审批",
"order": "92",
@ -85,9 +85,16 @@
"time": "2024-11-10 11:04:10.496"
}
},
"45a953c0d57edbfcece5f53e62d04bd3": {
"meta": {
"icons": "/root/2025-web/usr/local/work/20240724-community/src/gonganxitong/spendlist.png",
"index": "web.team.guanlixitong.spendlist",
"time": "2025-04-19 08:28:36.229"
}
},
"5695d50b28872804a01d7c923ee91cd1": {
"meta": {
"icons": "https://img.icons8.com/officel/80/person-at-home.png",
"icons": "/p/src/gonganxitong/member.png?pod=20240724-community",
"index": "web.team.guanlixitong.member",
"name": "团队成员",
"order": "80",
@ -97,7 +104,7 @@
},
"78d29149539be88d7561b8e17bd65882": {
"meta": {
"icons": "https://img.icons8.com/officel/80/square.png",
"icons": "/p/src/gonganxitong/market.png?pod=20240724-community",
"index": "web.team.guanlixitong.market",
"name": "人民广场",
"order": "100",
@ -117,7 +124,7 @@
},
"809b63c1819fc3ac1452e3b71889aec5": {
"meta": {
"icons": "https://img.icons8.com/officel/80/commercial.png",
"icons": "/p/src/gonganxitong/notice.png?pod=20240724-community",
"index": "web.team.guanlixitong.notice",
"name": "通知公告",
"order": "94",
@ -138,7 +145,7 @@
},
"9c18032c5bc252f2986e1b20e7e77db7": {
"meta": {
"icons": "https://img.icons8.com/officel/80/property-with-timer.png",
"icons": "/p/src/gonganxitong/event.png?pod=20240724-community",
"index": "web.team.guanlixitong.event",
"name": "事件流",
"order": "93",
@ -148,13 +155,20 @@
},
"9fffbe375e2d2a1a8e6cb1f341e35b55": {
"meta": {
"icons": "https://img.icons8.com/officel/80/multiple-smartphones.png",
"icons": "/p/src/gonganxitong/recent.png?pod=20240724-community",
"index": "web.team.guanlixitong.recent",
"name": "最近访问",
"order": "101",
"time": "2024-09-03 10:22:15.280"
}
},
"a59e847a365ef89dd35e250e9b663ac3": {
"meta": {
"icons": "/root/2025-web/usr/local/work/20240724-community/src/gonganxitong/quotalist.png",
"index": "web.team.guanlixitong.quotalist",
"time": "2025-04-19 08:28:36.221"
}
},
"ace6350cd663c693ddf47e81625c8a7a": {
"meta": {
"icons": "https://img.icons8.com/officel/80/meeting.png",
@ -181,7 +195,7 @@
},
"c27ad1df8aa9059d6018fb5add5ee546": {
"meta": {
"icons": "https://img.icons8.com/officel/80/customer-support.png",
"icons": "/p/src/gonganxitong/support.png?pod=20240724-community",
"index": "web.team.guanlixitong.support",
"name": "客服支持",
"order": "103",
@ -198,7 +212,7 @@
},
"c36d47e2611b0d1e7a14088bc3293d04": {
"meta": {
"icons": "https://img.icons8.com/officel/80/edit-property.png",
"icons": "/p/src/gonganxitong/apply.png?pod=20240724-community",
"index": "web.team.guanlixitong.apply",
"name": "权限申请",
"order": "91",
@ -219,7 +233,7 @@
},
"d25f3f88261ead2a0079415a26aa6853": {
"meta": {
"icons": "https://img.icons8.com/officel/80/test-partial-passed.png",
"icons": "/p/src/gonganxitong/message.png?pod=20240724-community",
"index": "web.team.guanlixitong.message",
"name": "消息待办",
"order": "100",

View File

@ -2,7 +2,7 @@
"03acc6ed03fa47e9639f1e5c459c3b50": {
"meta": {
"auth": "issued",
"icons": "https://img.icons8.com/officel/80/activity-grid.png",
"icons": "src/operation/activity-grid.png",
"index": "web.team.operation.template",
"name": "云模板",
"order": "2",
@ -36,7 +36,7 @@
},
"3b0ced2e41179097e594b91c3c36536b": {
"meta": {
"icons": "https://img.icons8.com/officel/80/person-at-home.png",
"icons": "/p/src/gonganxitong/member.png?pod=20240724-community",
"index": "web.team.operation.member",
"name": "组织成员",
"order": "102",
@ -44,9 +44,16 @@
"time": "2024-09-03 10:22:15.741"
}
},
"4282391df391e600e784bc8cae0cc2b8": {
"meta": {
"icons": "/root/2025-web/usr/local/work/20240724-community/src/gonganxitong/spendlist.png",
"index": "web.team.operation.spendlist",
"time": "2025-04-19 08:28:36.214"
}
},
"53b0f8b9867485bb8864f2205e31897e": {
"meta": {
"icons": "https://img.icons8.com/officel/80/activity-grid.png",
"icons": "/p/src/gonganxitong/service.png?pod=20240724-community",
"index": "web.team.operation.service",
"name": "服务发现",
"order": "904",
@ -56,7 +63,7 @@
"64be90144c205e73b1fc216962d7ad25": {
"meta": {
"auth": "issued",
"icons": "https://img.icons8.com/officel/80/activity-grid.png",
"icons": "src/operation/activity-grid.png",
"index": "web.team.operation.product",
"name": "云服务",
"order": "5",
@ -65,7 +72,7 @@
},
"6ca4f1fc571350c2498bc5c1d7ac3563": {
"meta": {
"icons": "https://img.icons8.com/officel/80/qr-code.png",
"icons": "/p/src/gonganxitong/qrcode.png?pod=20240724-community",
"index": "web.team.operation.qrcode",
"name": "场景码",
"order": "501",
@ -88,7 +95,7 @@
"7abb3b3760a9b686457938511c0ee7df": {
"meta": {
"auth": "issued",
"icons": "https://img.icons8.com/officel/80/activity-grid.png",
"icons": "src/operation/activity-grid.png",
"index": "web.team.operation.project",
"name": "云项目",
"order": "4",
@ -98,7 +105,7 @@
},
"85c8678d4af08bb0c3e9560155b7c98f": {
"meta": {
"icons": "https://img.icons8.com/officel/80/property-with-timer.png",
"icons": "/p/src/gonganxitong/event.png?pod=20240724-community",
"index": "web.team.operation.event",
"name": "事件流",
"order": "504",
@ -106,6 +113,13 @@
"time": "2024-09-03 10:22:15.264"
}
},
"89a7a6f18c32f37972a916f0aebe2a42": {
"meta": {
"icons": "/root/2025-web/usr/local/work/20240724-community/src/gonganxitong/quotalist.png",
"index": "web.team.operation.quotalist",
"time": "2025-04-19 08:28:36.106"
}
},
"91b0ca086b5b8aa00e84737c4395a19f": {
"meta": {
"auth": "issued",
@ -120,7 +134,7 @@
},
"aa58390a9fac9f8210eca564d1ad82ff": {
"meta": {
"icons": "https://img.icons8.com/officel/80/passport.png",
"icons": "/p/src/gonganxitong/credit.png?pod=20240724-community",
"index": "web.team.operation.credit",
"name": "用户名片",
"order": "101",
@ -129,7 +143,7 @@
},
"b2d8434f3ab5340408f71c4bf087e3d9": {
"meta": {
"icons": "https://img.icons8.com/officel/80/multiple-smartphones.png",
"icons": "/p/src/gonganxitong/recent.png?pod=20240724-community",
"index": "web.team.operation.recent",
"name": "最近访问",
"order": "903",
@ -139,7 +153,7 @@
"c8159ab932f400dbafa08fb995e16355": {
"meta": {
"auth": "issued",
"icons": "https://img.icons8.com/officel/80/activity-grid.png",
"icons": "src/operation/activity-grid.png",
"index": "web.team.operation.cluster",
"name": "云集群",
"order": "1",
@ -149,7 +163,7 @@
},
"ca74fb83cfd850b1ca03fe18976c253a": {
"meta": {
"icons": "https://img.icons8.com/officel/80/test-partial-passed.png",
"icons": "/p/src/gonganxitong/message.png?pod=20240724-community",
"index": "web.team.operation.message",
"name": "消息待办",
"order": "902",
@ -158,7 +172,7 @@
},
"d2c6f264302bdd5d46beb921f389efda": {
"meta": {
"icons": "https://img.icons8.com/officel/80/commercial.png",
"icons": "/p/src/gonganxitong/notice.png?pod=20240724-community",
"index": "web.team.operation.notice",
"name": "通知公告",
"order": "505",
@ -168,7 +182,7 @@
},
"d47d5d11064235734413113c7440af7f": {
"meta": {
"icons": "https://img.icons8.com/officel/80/receipt-approved.png",
"icons": "/p/src/gonganxitong/allow.png?pod=20240724-community",
"index": "web.team.operation.allow",
"name": "权限审批",
"order": "503",
@ -179,7 +193,7 @@
"d8f6d139d6a5f9b5aa504702e7777eb3": {
"meta": {
"auth": "issued",
"icons": "https://img.icons8.com/officel/80/activity-grid.png",
"icons": "src/operation/activity-grid.png",
"index": "web.team.operation.gateway",
"name": "云主机",
"order": "3",
@ -201,7 +215,7 @@
},
"dad14d38feac6ebfb61953f8aae393bb": {
"meta": {
"icons": "https://img.icons8.com/officel/80/square.png",
"icons": "/p/src/gonganxitong/market.png?pod=20240724-community",
"index": "web.team.operation.market",
"name": "人民广场",
"order": "901",
@ -210,7 +224,7 @@
},
"e0b69dbd47a289ed57d970877000fa40": {
"meta": {
"icons": "https://img.icons8.com/officel/80/settings--v1.png",
"icons": "/p/src/gonganxitong/setting.png?pod=20240724-community",
"index": "web.team.operation.setting",
"name": "服务配置",
"order": "103",
@ -232,7 +246,7 @@
},
"ec25b5c62a4d26688fe114d9b25f7a56": {
"meta": {
"icons": "https://img.icons8.com/officel/80/customer-support.png",
"icons": "/p/src/gonganxitong/support.png?pod=20240724-community",
"index": "web.team.operation.support",
"name": "客服支持",
"order": "905",
@ -241,7 +255,7 @@
},
"f7484dd174d63a6800f84d1fb5fbb584": {
"meta": {
"icons": "https://img.icons8.com/officel/80/edit-property.png",
"icons": "/p/src/gonganxitong/apply.png?pod=20240724-community",
"index": "web.team.operation.apply",
"name": "权限申请",
"order": "502",

View File

@ -1,7 +1,7 @@
{
"1b5f923af5910ea22c451559e7d6a640": {
"meta": {
"icons": "https://img.icons8.com/officel/80/timeline-week.png",
"icons": "src/production/plan.png",
"index": "web.team.production.plan",
"name": "迭代计划",
"order": "1",
@ -10,7 +10,7 @@
},
"247b484fb13394452bc978e5ecad33ff": {
"meta": {
"icons": "https://img.icons8.com/officel/80/edit-property.png",
"icons": "/p/src/gonganxitong/apply.png?pod=20240724-community",
"index": "web.team.production.apply",
"name": "权限申请",
"order": "502",
@ -31,11 +31,11 @@
},
"2cf321f56f8ace96e561bf54f664f276": {
"meta": {
"icons": "https://img.icons8.com/officel/80/communication.png",
"icons": "src/production/issue.png",
"index": "web.team.production.issue",
"name": "产品需求",
"order": "2",
"role": "leader,worker",
"portal": "true",
"time": "2024-09-03 15:44:28.509"
}
},
@ -52,7 +52,7 @@
},
"50dd2633fafc2efb90760b602f1500ea": {
"meta": {
"icons": "https://img.icons8.com/officel/80/commercial.png",
"icons": "/p/src/gonganxitong/notice.png?pod=20240724-community",
"index": "web.team.production.notice",
"name": "通知公告",
"order": "505",
@ -62,7 +62,7 @@
},
"53d92f96ed804b0981073cd6fa7121d7": {
"meta": {
"icons": "https://img.icons8.com/officel/80/square.png",
"icons": "/p/src/gonganxitong/market.png?pod=20240724-community",
"index": "web.team.production.market",
"name": "人民广场",
"order": "901",
@ -71,7 +71,7 @@
},
"684ebb2576bd4d7024a04693de6aaeab": {
"meta": {
"icons": "https://img.icons8.com/officel/80/multiple-smartphones.png",
"icons": "/p/src/gonganxitong/recent.png?pod=20240724-community",
"index": "web.team.production.recent",
"name": "最近访问",
"order": "903",
@ -80,7 +80,7 @@
},
"6871a5c44a6021f7edaf46cf356266e3": {
"meta": {
"icons": "https://img.icons8.com/officel/80/settings--v1.png",
"icons": "/p/src/gonganxitong/setting.png?pod=20240724-community",
"index": "web.team.production.setting",
"name": "服务配置",
"order": "103",
@ -88,9 +88,16 @@
"time": "2024-09-21 08:58:33.492"
}
},
"6a772ca2070051382a919d62bb784e3a": {
"meta": {
"icons": "/root/2025-web/usr/local/work/20240724-community/src/gonganxitong/spendlist.png",
"index": "web.team.production.spendlist",
"time": "2025-04-19 08:28:36.007"
}
},
"6d06c21df099b1bc6b85fa6ff59ae6d1": {
"meta": {
"icons": "https://img.icons8.com/officel/80/receipt-approved.png",
"icons": "/p/src/gonganxitong/allow.png?pod=20240724-community",
"index": "web.team.production.allow",
"name": "权限审批",
"order": "503",
@ -100,10 +107,11 @@
},
"73b81840f26d2885c065d19e08e923f1": {
"meta": {
"icons": "https://img.icons8.com/officel/80/web-design.png",
"icons": "src/production/design.png",
"index": "web.team.production.design",
"name": "界面设计",
"order": "3",
"role": "leader,worker",
"time": "2025-03-21 08:49:22.166"
}
},
@ -120,7 +128,7 @@
},
"8efc6b4f9d0d59713215fb5843f8f037": {
"meta": {
"icons": "https://img.icons8.com/officel/80/customer-support.png",
"icons": "/p/src/gonganxitong/support.png?pod=20240724-community",
"index": "web.team.production.support",
"name": "客服支持",
"order": "905",
@ -129,7 +137,7 @@
},
"9a1b27391021fe202075fdec5e55011d": {
"meta": {
"icons": "https://img.icons8.com/officel/80/faq.png",
"icons": "src/production/case.png",
"index": "web.team.production.case",
"name": "测试用例",
"order": "4",
@ -139,7 +147,7 @@
},
"9c8310df39f8423ff77f19652b471a35": {
"meta": {
"icons": "https://img.icons8.com/officel/80/qr-code.png",
"icons": "/p/src/gonganxitong/qrcode.png?pod=20240724-community",
"index": "web.team.production.qrcode",
"name": "场景码",
"order": "501",
@ -147,6 +155,13 @@
"time": "2024-09-03 15:44:29.253"
}
},
"a22f30598723eaf9a2f2e3b105ffd7ec": {
"meta": {
"icons": "/root/2025-web/usr/local/work/20240724-community/src/gonganxitong/quotalist.png",
"index": "web.team.production.quotalist",
"time": "2025-04-19 08:28:36.019"
}
},
"a9b5b213c868653f1a060c3231d57e8f": {
"meta": {
"auth": "issued",
@ -160,7 +175,7 @@
},
"af401082a04bff4314523e5ebb69abff": {
"meta": {
"icons": "https://img.icons8.com/officel/80/passport.png",
"icons": "/p/src/gonganxitong/credit.png?pod=20240724-community",
"index": "web.team.production.credit",
"name": "用户名片",
"order": "101",
@ -169,7 +184,7 @@
},
"b7772dfc47e42e8c7e1c07fc1657546a": {
"meta": {
"icons": "https://img.icons8.com/officel/80/test-partial-passed.png",
"icons": "/p/src/gonganxitong/message.png?pod=20240724-community",
"index": "web.team.production.message",
"name": "消息待办",
"order": "902",
@ -178,7 +193,7 @@
},
"c27f5383bb62fe30347da4fbac3ff0a8": {
"meta": {
"icons": "https://img.icons8.com/officel/80/property-with-timer.png",
"icons": "/p/src/gonganxitong/event.png?pod=20240724-community",
"index": "web.team.production.event",
"name": "事件流",
"order": "504",
@ -199,11 +214,10 @@
},
"c96881ba1b560e55d4d589e7c52033ca": {
"meta": {
"icons": "https://img.icons8.com/officel/80/tasks.png",
"icons": "src/production/task.png",
"index": "web.team.production.task",
"name": "开发任务",
"order": "3",
"portal": "true",
"public": "true",
"role": "leader,worker",
"time": "2024-09-12 20:43:01.633"
@ -222,7 +236,7 @@
},
"e10cc3b27f6a9f02fbf22bc58551d862": {
"meta": {
"icons": "https://img.icons8.com/officel/80/activity-grid.png",
"icons": "/p/src/gonganxitong/service.png?pod=20240724-community",
"index": "web.team.production.service",
"name": "服务发现",
"order": "904",
@ -231,7 +245,7 @@
},
"e4bdcf2bcde46db180cad771406987b5": {
"meta": {
"icons": "https://img.icons8.com/officel/80/person-at-home.png",
"icons": "/p/src/gonganxitong/member.png?pod=20240724-community",
"index": "web.team.production.member",
"name": "项目成员",
"order": "102",

View File

@ -12,7 +12,7 @@
},
"0d7f068029dbf7f9f0d307070cc3a79b": {
"meta": {
"icons": "https://img.icons8.com/officel/80/receipt-approved.png",
"icons": "/p/src/gonganxitong/allow.png?pod=20240724-community",
"index": "web.team.renzhengshouquan.allow",
"name": "权限审批",
"order": "503",
@ -42,6 +42,20 @@
"time": "2024-11-29 21:33:29.662"
}
},
"1d5fb457d3223d26afd076c38d7daf66": {
"meta": {
"icons": "/root/2025-web/usr/local/work/20240724-community/src/gonganxitong/quotalist.png",
"index": "web.team.renzhengshouquan.quotalist",
"time": "2025-04-19 08:28:35.980"
}
},
"21887f37ce8dabe4c52648ea096f8e4d": {
"meta": {
"icons": "/root/2025-web/usr/local/work/20240724-community/src/gonganxitong/spendlist.png",
"index": "web.team.renzhengshouquan.spendlist",
"time": "2025-04-19 08:28:35.972"
}
},
"2a065e0a48b909ae79fbb3dd750e1eb5": {
"meta": {
"icons": "https://img.icons8.com/officel/80/id-verified.png",
@ -53,7 +67,7 @@
},
"456d3a031a140d43f54690ea7203628d": {
"meta": {
"icons": "https://img.icons8.com/officel/80/property-with-timer.png",
"icons": "/p/src/gonganxitong/event.png?pod=20240724-community",
"index": "web.team.renzhengshouquan.event",
"name": "事件流",
"order": "504",
@ -63,7 +77,7 @@
},
"4cac9ca99ccb8db395f703434647f5f3": {
"meta": {
"icons": "https://img.icons8.com/officel/80/settings--v1.png",
"icons": "/p/src/gonganxitong/setting.png?pod=20240724-community",
"index": "web.team.renzhengshouquan.setting",
"name": "服务配置",
"order": "102",
@ -73,7 +87,7 @@
},
"52fb3a7d85d879b638cc246850b236f6": {
"meta": {
"icons": "https://img.icons8.com/officel/80/qr-code.png",
"icons": "/p/src/gonganxitong/qrcode.png?pod=20240724-community",
"index": "web.team.renzhengshouquan.qrcode",
"name": "场景码",
"order": "501",
@ -94,7 +108,7 @@
},
"732373815fa26c85ad04dd57ca57db39": {
"meta": {
"icons": "https://img.icons8.com/officel/80/edit-property.png",
"icons": "/p/src/gonganxitong/apply.png?pod=20240724-community",
"index": "web.team.renzhengshouquan.apply",
"name": "权限申请",
"order": "502",
@ -143,7 +157,7 @@
},
"9e52a4f0a1a8d35c14b40d14b0d9cff1": {
"meta": {
"icons": "https://img.icons8.com/officel/80/test-partial-passed.png",
"icons": "/p/src/gonganxitong/message.png?pod=20240724-community",
"index": "web.team.renzhengshouquan.message",
"name": "消息待办",
"order": "902",
@ -152,7 +166,7 @@
},
"a040dfa713a6fa9533b3184244dbbb74": {
"meta": {
"icons": "https://img.icons8.com/officel/80/customer-support.png",
"icons": "/p/src/gonganxitong/support.png?pod=20240724-community",
"index": "web.team.renzhengshouquan.support",
"name": "客服支持",
"order": "905",
@ -161,7 +175,7 @@
},
"bfecb55b11fe68186270fe1b4b8de8cf": {
"meta": {
"icons": "https://img.icons8.com/officel/80/person-at-home.png",
"icons": "/p/src/gonganxitong/member.png?pod=20240724-community",
"index": "web.team.renzhengshouquan.member",
"name": "组织成员",
"order": "101",
@ -182,7 +196,7 @@
},
"d9f55b517f4b2579693523ed3b5bd088": {
"meta": {
"icons": "https://img.icons8.com/officel/80/square.png",
"icons": "/p/src/gonganxitong/market.png?pod=20240724-community",
"index": "web.team.renzhengshouquan.market",
"name": "人民广场",
"order": "901",
@ -191,7 +205,7 @@
},
"e038450591f3c8e7babc0c21b1c6fa6d": {
"meta": {
"icons": "https://img.icons8.com/officel/80/multiple-smartphones.png",
"icons": "/p/src/gonganxitong/recent.png?pod=20240724-community",
"index": "web.team.renzhengshouquan.recent",
"name": "最近访问",
"order": "903",
@ -200,7 +214,7 @@
},
"ecfb11fad5b4bdf21384e2e1ff571598": {
"meta": {
"icons": "https://img.icons8.com/officel/80/commercial.png",
"icons": "/p/src/gonganxitong/notice.png?pod=20240724-community",
"index": "web.team.renzhengshouquan.notice",
"name": "通知公告",
"order": "505",
@ -210,7 +224,7 @@
},
"f669e15e1c1c9da2bd3ea0c58abc0bd3": {
"meta": {
"icons": "https://img.icons8.com/officel/80/passport.png",
"icons": "/p/src/gonganxitong/credit.png?pod=20240724-community",
"index": "web.team.renzhengshouquan.credit",
"name": "用户名片",
"order": "102",
@ -219,7 +233,7 @@
},
"f6b093d122ff3cec363b00093e0a6f19": {
"meta": {
"icons": "https://img.icons8.com/officel/80/activity-grid.png",
"icons": "/p/src/gonganxitong/service.png?pod=20240724-community",
"index": "web.team.renzhengshouquan.service",
"name": "服务发现",
"order": "904",

View File

@ -1,7 +1,14 @@
{
"0f24ae224b99c8d65e550cd9528468f4": {
"meta": {
"icons": "/root/2025-web/usr/local/work/20240724-community/src/gonganxitong/spendlist.png",
"index": "web.team.storage.spendlist",
"time": "2025-04-19 08:28:35.967"
}
},
"11eb042ebed16b7ab0a8a89ac55affb1": {
"meta": {
"icons": "https://img.icons8.com/officel/80/property-with-timer.png",
"icons": "/p/src/gonganxitong/event.png?pod=20240724-community",
"index": "web.team.storage.event",
"name": "事件流",
"order": "504",
@ -11,7 +18,7 @@
},
"2812f9176629b9966be481676fb3aee5": {
"meta": {
"icons": "https://img.icons8.com/officel/80/multiple-smartphones.png",
"icons": "/p/src/gonganxitong/recent.png?pod=20240724-community",
"index": "web.team.storage.recent",
"name": "最近访问",
"order": "903",
@ -20,7 +27,7 @@
},
"351e876ab886708d42b1d82d00cb3bc3": {
"meta": {
"icons": "https://img.icons8.com/officel/80/square.png",
"icons": "/p/src/gonganxitong/market.png?pod=20240724-community",
"index": "web.team.storage.market",
"name": "人民广场",
"order": "901",
@ -29,7 +36,7 @@
},
"38f2721b02a7cf2074f9c3ce78aa6e29": {
"meta": {
"icons": "https://img.icons8.com/officel/80/qr-code.png",
"icons": "/p/src/gonganxitong/qrcode.png?pod=20240724-community",
"index": "web.team.storage.qrcode",
"name": "场景码",
"order": "501",
@ -50,7 +57,7 @@
},
"44e0cc566504640e376a20a3eb26e6d6": {
"meta": {
"icons": "https://img.icons8.com/officel/80/person-at-home.png",
"icons": "/p/src/gonganxitong/member.png?pod=20240724-community",
"index": "web.team.storage.member",
"name": "网盘成员",
"order": "102",
@ -71,7 +78,7 @@
},
"4c837d128ab03d59c8479b695276828c": {
"meta": {
"icons": "https://img.icons8.com/officel/80/customer-support.png",
"icons": "/p/src/gonganxitong/support.png?pod=20240724-community",
"index": "web.team.storage.support",
"name": "客服支持",
"order": "905",
@ -80,7 +87,7 @@
},
"5bfbd386cce531816ef93117ce33ff51": {
"meta": {
"icons": "https://img.icons8.com/officel/80/settings--v1.png",
"icons": "/p/src/gonganxitong/setting.png?pod=20240724-community",
"index": "web.team.storage.setting",
"name": "服务配置",
"order": "103",
@ -90,7 +97,7 @@
},
"618ea5c219d7eb5e194b6eea12853281": {
"meta": {
"icons": "https://img.icons8.com/officel/80/receipt-approved.png",
"icons": "/p/src/gonganxitong/allow.png?pod=20240724-community",
"index": "web.team.storage.allow",
"name": "权限审批",
"order": "503",
@ -98,6 +105,13 @@
"time": "2024-09-17 21:19:56.263"
}
},
"8bd4c73beb0edbf0a185a6327c8d1aba": {
"meta": {
"icons": "/root/2025-web/usr/local/work/20240724-community/src/gonganxitong/quotalist.png",
"index": "web.team.storage.quotalist",
"time": "2025-04-19 08:28:35.877"
}
},
"9b56f892d867dde5e6b65fa81d24a328": {
"meta": {
"icons": "https://img.icons8.com/officel/80/user-folder.png",
@ -109,7 +123,7 @@
},
"b4ff2685fd26c4c952f94986c588b34a": {
"meta": {
"icons": "https://img.icons8.com/officel/80/edit-property.png",
"icons": "/p/src/gonganxitong/apply.png?pod=20240724-community",
"index": "web.team.storage.apply",
"name": "权限申请",
"order": "502",
@ -119,7 +133,7 @@
},
"c3574c11edb3e5e912c39adbeeb04f26": {
"meta": {
"icons": "https://img.icons8.com/officel/80/test-partial-passed.png",
"icons": "/p/src/gonganxitong/message.png?pod=20240724-community",
"index": "web.team.storage.message",
"name": "消息待办",
"order": "902",
@ -150,7 +164,7 @@
},
"d9bdb3105dda162dd303f87e5d7bb301": {
"meta": {
"icons": "https://img.icons8.com/officel/80/passport.png",
"icons": "/p/src/gonganxitong/credit.png?pod=20240724-community",
"index": "web.team.storage.credit",
"name": "用户名片",
"order": "101",
@ -159,7 +173,7 @@
},
"de46b4a43370c18fc02cb039592ece22": {
"meta": {
"icons": "https://img.icons8.com/officel/80/activity-grid.png",
"icons": "/p/src/gonganxitong/service.png?pod=20240724-community",
"index": "web.team.storage.service",
"name": "服务发现",
"order": "904",
@ -179,7 +193,7 @@
},
"f55ae08834fc5fe3a334f35ee0bc8572": {
"meta": {
"icons": "https://img.icons8.com/officel/80/commercial.png",
"icons": "/p/src/gonganxitong/notice.png?pod=20240724-community",
"index": "web.team.storage.notice",
"name": "通知公告",
"order": "505",