mirror of
https://shylinux.com/x/operation
synced 2025-07-01 21:21:19 +08:00
Compare commits
15 Commits
Author | SHA1 | Date | |
---|---|---|---|
8512546d6c | |||
90b4fda290 | |||
42e9132b22 | |||
6bd50be073 | |||
ec9ae2faa8 | |||
01bf28a044 | |||
8101e23053 | |||
88b7b33049 | |||
3edaaa9f0c | |||
2c9aec52d5 | |||
b0f6f5ac82 | |||
b1c7d0a18a | |||
391d69579b | |||
e0d2b2f2e6 | |||
ce20a724c7 |
12
go.mod
12
go.mod
@ -5,15 +5,15 @@ go 1.21
|
||||
require (
|
||||
2025-dev.shylinux.com/x/20250211-service v0.0.6
|
||||
2025-dev.shylinux.com/x/20250215-cluster v0.0.7
|
||||
shylinux.com/x/community v0.0.29
|
||||
shylinux.com/x/enterprise v0.0.17
|
||||
shylinux.com/x/golang-story v0.0.33
|
||||
shylinux.com/x/mysql-story v0.6.33
|
||||
shylinux.com/x/community v0.0.31
|
||||
shylinux.com/x/enterprise v0.0.19
|
||||
shylinux.com/x/golang-story v0.0.33 // indirect
|
||||
shylinux.com/x/mysql-story v0.6.34
|
||||
)
|
||||
|
||||
require (
|
||||
shylinux.com/x/ice v1.5.75
|
||||
shylinux.com/x/icebergs v1.9.77
|
||||
shylinux.com/x/ice v1.5.76
|
||||
shylinux.com/x/icebergs v1.9.78
|
||||
shylinux.com/x/toolkits v1.0.20
|
||||
)
|
||||
|
||||
|
20
go.sum
20
go.sum
@ -162,10 +162,10 @@ modernc.org/strutil v1.1.3/go.mod h1:MEHNA7PdEnEwLvspRMtWTNnp2nnyvMfkimT1NKNAGbw
|
||||
modernc.org/tcl v1.15.2/go.mod h1:3+k/ZaEbKrC8ePv8zJWPtBSW0V7Gg9g8rkmhI1Kfs3c=
|
||||
modernc.org/token v1.0.1/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM=
|
||||
modernc.org/z v1.7.3/go.mod h1:Ipv4tsdxZRbQyLq9Q1M6gdbkxYzdlrciF2Hi/lS7nWE=
|
||||
shylinux.com/x/community v0.0.29 h1:j3Nd/ocfNbb6ZK3wdb4QnOc7GRnym4fUJjgWHseHBfQ=
|
||||
shylinux.com/x/community v0.0.29/go.mod h1:x7AVYKuPeA0LbGz1S8qRlsCZQgGoIHIHVIBPe14u7B4=
|
||||
shylinux.com/x/enterprise v0.0.17 h1:29VjNHt4YiPryQGNtVTnYqiXNHxau4EnkoUDzlxgB6Y=
|
||||
shylinux.com/x/enterprise v0.0.17/go.mod h1:+DmZbYMykX5U65BJ7DYOcwFubslKa2b78DyRaqUYuH4=
|
||||
shylinux.com/x/community v0.0.31 h1:YlnWrjuOnmFh0FHiYvk6xZQBysLgJ4qazhuf3VkmY4s=
|
||||
shylinux.com/x/community v0.0.31/go.mod h1:qHwUaq77i2EBVudxh4BvUearmS3wUiaykfHWt3h0jSE=
|
||||
shylinux.com/x/enterprise v0.0.19 h1:bdSAxhq8OAjW73P7bKmG2NNlAunGvu+bWFAz0cwtKJA=
|
||||
shylinux.com/x/enterprise v0.0.19/go.mod h1:IOuzDkyqcxYV4fQiMKTjXH9OY935U7kbQNq1+LFSbjI=
|
||||
shylinux.com/x/go-git/v5 v5.6.7 h1:WD5QSco7m3QooPCgdvQ6/GyGIFPun8C+hex5N41LYlk=
|
||||
shylinux.com/x/go-git/v5 v5.6.7/go.mod h1:Qb0lA+uIrofZg8NQerhYcJHgGWixFqvS6p3aJ/L5Nlk=
|
||||
shylinux.com/x/go-qrcode v0.0.3 h1:RMo+Vidbgq3HatLBj7DDXcTbTLFUwzis5K7TqBkD38U=
|
||||
@ -175,14 +175,14 @@ shylinux.com/x/golang-story v0.0.33 h1:QRu21+smDBEfEf5lczmu4T6lOZynm7LA4pys3bolo
|
||||
shylinux.com/x/golang-story v0.0.33/go.mod h1:/QdUqQzP/O0h3UCi29LUYv1K6beSe9sll+KlgvQJK3M=
|
||||
shylinux.com/x/ice v1.5.72/go.mod h1:ouTMN0stkJu1RGAQrMHrGj/BqDynyD1VV53shR9zQm4=
|
||||
shylinux.com/x/ice v1.5.73/go.mod h1:uGI73gYkk+FiJt5qmy/aYhoKRJ4wobcJk3WrPGh8Waw=
|
||||
shylinux.com/x/ice v1.5.75 h1:lYsJRNaO5XAC4hX/TK3xNrCG9Mxvsr1MJVBALg3p1H4=
|
||||
shylinux.com/x/ice v1.5.75/go.mod h1:94PDujxSBOYfNOgT85JoUXT1phLiMXde2i1fAup6+ZM=
|
||||
shylinux.com/x/ice v1.5.76 h1:/nVKwbVtHUxsvuHS+2cLSL8aXAdAVX6C42MdnUrixyI=
|
||||
shylinux.com/x/ice v1.5.76/go.mod h1:0EHRzIgufYwmKwlZzzUo7ZU5RZ6p0EsVYnA119G2CzM=
|
||||
shylinux.com/x/icebergs v1.9.73/go.mod h1:3Bdp3tjzw+hUKJF+kR8pfsrbjAf72DVZmCaE8/MPFtk=
|
||||
shylinux.com/x/icebergs v1.9.75/go.mod h1:3Bdp3tjzw+hUKJF+kR8pfsrbjAf72DVZmCaE8/MPFtk=
|
||||
shylinux.com/x/icebergs v1.9.77 h1:wkgm77t0s3M/IBQMlfwhjlYcGJo9C3ZrVHuYQtTOz8w=
|
||||
shylinux.com/x/icebergs v1.9.77/go.mod h1:F0sIQU0OP3YBMdd2goC6EKAQHAKzq1I08MMIfBo0yLo=
|
||||
shylinux.com/x/mysql-story v0.6.33 h1:BdJf6mtKmXsKa+AasPtVU+m7EAjVKPzVqxNap0dPQj8=
|
||||
shylinux.com/x/mysql-story v0.6.33/go.mod h1:pVmBXAbOUHduFvskriplrEIfbK+kCMBxStgfgc5Rxl8=
|
||||
shylinux.com/x/icebergs v1.9.78 h1:ERGMcc25WxQ4tyNGUTj7Crx8auCJEFiDEyoJQhFyRe8=
|
||||
shylinux.com/x/icebergs v1.9.78/go.mod h1:F0sIQU0OP3YBMdd2goC6EKAQHAKzq1I08MMIfBo0yLo=
|
||||
shylinux.com/x/mysql-story v0.6.34 h1:Hx70Ss38WBrUnaxK2qB4uygEqFXP1oxmdLX+GrV+ra0=
|
||||
shylinux.com/x/mysql-story v0.6.34/go.mod h1:yw6WkQbrFq1nwqX9konCk7jBli/JneK33zd7/p7ZxFw=
|
||||
shylinux.com/x/toolkits v0.7.10/go.mod h1:CHDJarGlDkg60kVsvMLYL/a5hAnRLEOShiEsMOuEp0Q=
|
||||
shylinux.com/x/toolkits v1.0.19/go.mod h1:CHDJarGlDkg60kVsvMLYL/a5hAnRLEOShiEsMOuEp0Q=
|
||||
shylinux.com/x/toolkits v1.0.20 h1:uBnfyyqDsbSWYsXfXmBugZ8ZWp5QQ8sthrzRdJ6ET90=
|
||||
|
@ -1,24 +1,34 @@
|
||||
Volcanos(chat.ONIMPORT, {
|
||||
_init: function(can, msg) { var width = can.onimport.width(can, 80, msg.Length())
|
||||
_init: function(can, msg) {
|
||||
var width = can.onimport.width(can, 80, msg.Length())
|
||||
can.page.Append(can, can._output, msg.Table(function(value) {
|
||||
var cb = can.onimport[value.unit]||can.onimport.unit
|
||||
return {view: html.ITEM, style: {width: width}, list: [
|
||||
{view: html.VALUE, list: cb(can, value.value, value.unit||"")},
|
||||
{view: html.TITLE, list: [{text: value.title||value.index.split(".").pop()}]},
|
||||
]}
|
||||
}))
|
||||
},
|
||||
money: function(can, value) { return can.onimport.unit(can, value, "元") },
|
||||
order: function(can, value) { return can.onimport.unit(can, value, "单") },
|
||||
stock: function(can, value) { return can.onimport.unit(can, value, "件") },
|
||||
size: function(can, value) { return [{text: can.base.Size(value)}] },
|
||||
unit: function(can, value, unit) { var v = parseFloat(value)
|
||||
if (v > 100000000) { return [{text: (v/100000000).toFixed(2)}, {text: ["亿"+unit, "", "unit"]}] }
|
||||
if (v > 10000) { return [{text: (v/10000).toFixed(2)}, {text: ["万"+unit, "", "unit"]}] }
|
||||
return [{text: value}, {text: [unit, "", "unit"]}]
|
||||
},
|
||||
width: function(can, min, length) {
|
||||
var count = (parseInt(can.ConfWidth()/min)); if (length < count) { count = length }
|
||||
return can.ConfWidth()/(count||1)
|
||||
},
|
||||
})
|
||||
// return {view: html.ITEM, style: {width: width}, list: [
|
||||
return {view: html.ITEM, list: [
|
||||
{view: html.VALUE, list: cb(can, value.value, value.unit||"")},
|
||||
{view: html.TITLE, list: [{text: value.title||value.index.split(".").pop()}]},
|
||||
]}
|
||||
}))
|
||||
},
|
||||
money: function(can, value) { return can.onimport.unit(can, value, "元") },
|
||||
order: function(can, value) { return can.onimport.unit(can, value, "单") },
|
||||
stock: function(can, value) { return can.onimport.unit(can, value, "件") },
|
||||
size: function(can, value) { return [{text: can.base.Size(value)}] },
|
||||
unit: function(can, value, unit) { var v = parseFloat(value)
|
||||
if (v > 100000000) { return [{text: (v/100000000).toFixed(2)}, {text: ["亿"+unit, "", "unit"]}] }
|
||||
if (v > 10000) { return [{text: (v/10000).toFixed(2)}, {text: ["万"+unit, "", "unit"]}] }
|
||||
return [{text: value}, {text: [unit, "", "unit"]}]
|
||||
},
|
||||
width: function(can, min, length) {
|
||||
var count = (parseInt(can.ConfWidth()/min)); if (length < count) { count = length }
|
||||
return can.ConfWidth()/(count||1)
|
||||
},
|
||||
/*
|
||||
layout: function(can) {
|
||||
var width = can.onimport.width(can, 80, msg.Length())
|
||||
can.page.Select(can, can._output, html.DIV_ITEM, function(target) {
|
||||
target.width
|
||||
})
|
||||
},
|
||||
*/
|
||||
})
|
@ -9,18 +9,23 @@ import (
|
||||
|
||||
type care struct {
|
||||
Tables
|
||||
order string `data:"6"`
|
||||
role string `data:"leader,worker"`
|
||||
setInfo string `name:"setInfo info" help:"备注" role:"worker"`
|
||||
order string `data:"6"`
|
||||
role string `data:"leader,worker"`
|
||||
setInfo string `name:"setInfo info" help:"备注" role:"worker"`
|
||||
userInfo string `name:"userInfo" help:"成员信息" role:"worker"`
|
||||
}
|
||||
|
||||
func (s care) SetInfo(m *ice.Message, arg ...string) {
|
||||
msg := m.Cmd(userStory{}, s.Select, m.OptionSimple(model.STORY_UID), model.USER_UID, m.Option(model.UID))
|
||||
m.Cmdy(s.PrefixMember(m), m.ActionKey(), arg, kit.Dict(msg.AppendSimple(model.UID)))
|
||||
}
|
||||
func (s care) SetScore(m *ice.Message, arg ...string) {
|
||||
msg := m.Cmd(userStory{}, s.Select, m.OptionSimple(model.STORY_UID), model.USER_UID, m.Option(model.UID))
|
||||
m.Cmdy(s.PrefixMember(m), m.ActionKey(), arg, kit.Dict(msg.AppendSimple(model.UID)))
|
||||
}
|
||||
func (s care) List(m *ice.Message, arg ...string) {
|
||||
isLeader := s.IsLeader(m)
|
||||
if s.Fields(m, model.USER_UID, model.INFO).Limit(m, 300); isLeader {
|
||||
if s.Fields(m, model.USER_UID, model.INFO, model.SCORE).Limit(m, 300); isLeader {
|
||||
if len(arg) == 1 {
|
||||
m.Cmdy(userStory{}, s.Select, model.STORY_UID, arg[0])
|
||||
} else {
|
||||
@ -53,27 +58,35 @@ func (s care) List(m *ice.Message, arg ...string) {
|
||||
m.Push("一星", check(Issue{}, 1)+check(Design{}, 1))
|
||||
m.Push("五星", check(Issue{}, 5)+check(Design{}, 5))
|
||||
m.Push(model.UID, value[model.USER_UID])
|
||||
if isLeader || value[model.USER_UID] == m.Option(ice.MSG_USERUID) {
|
||||
m.PushButton(s.SetInfo)
|
||||
} else {
|
||||
m.PushButton()
|
||||
button := []ice.Any{}
|
||||
if isLeader {
|
||||
button = append(button, s.SetScore)
|
||||
}
|
||||
if isLeader || value[model.USER_UID] == m.Option(ice.MSG_USERUID) {
|
||||
button = append(button, s.SetInfo)
|
||||
}
|
||||
m.PushButton(button...)
|
||||
})
|
||||
if m.Action().Display(""); m.FieldsIsDetail() {
|
||||
s.OtherListCmd(m, s.IssueList, s.DesignList)
|
||||
s.OtherListCmd(m, s.IssueList, s.DesignList, s.DealList)
|
||||
} else {
|
||||
m.Sort(kit.Fields("已支付", "原型已完成", "原型设计中", "界面已完成", "界面设计中"), ice.INT_R, ice.INT_R, ice.INT_R, ice.INT_R, ice.INT_R)
|
||||
}
|
||||
}
|
||||
func (s care) IssueList(m *ice.Message, arg ...string) {
|
||||
s.Orders(m, model.STATUS, model.DESIGN_COUNT, model.TASK_COUNT, s.Desc(model.CREATED_AT)).Limit(m, 300)
|
||||
s.Orders(m, model.STATUS, s.Desc(model.UPDATED_AT)).Limit(m, 300)
|
||||
s.OtherList(m, Issue{}, model.USER_UID, m.Option(model.UID))
|
||||
m.RenameAppend(model.STORY_UID, model.PLACE_UID)
|
||||
}
|
||||
func (s care) DesignList(m *ice.Message, arg ...string) {
|
||||
s.Orders(m, model.STATUS, s.Desc(model.CREATED_AT)).Limit(m, 300)
|
||||
s.Orders(m, model.STATUS, s.Desc(model.UPDATED_AT)).Limit(m, 300)
|
||||
s.OtherList(m, Design{}, model.USER_UID, m.Option(model.UID))
|
||||
m.RenameAppend(model.STORY_UID, model.PLACE_UID)
|
||||
}
|
||||
func (s care) DealList(m *ice.Message, arg ...string) {
|
||||
s.Limit(m, 300)
|
||||
s.OtherList(m, Deal{}, model.TO_USER_UID, m.Option(model.UID))
|
||||
m.RenameAppend(model.STORY_UID, model.PLACE_UID, model.TO_USER_UID, model.USER_UID)
|
||||
}
|
||||
|
||||
func init() { ice.TeamCtxCmd(care{}) }
|
||||
|
@ -3,6 +3,7 @@ Volcanos(chat.ONIMPORT, {
|
||||
can.onimport.myView(can, msg, function(value) { return [
|
||||
{view: html.TITLE, list: [value.user_name,
|
||||
can.onimport.unitView(can, value, "已支付", "元"),
|
||||
can.onimport.unitView(can, value, "score", "星"),
|
||||
can.onimport.unitView(can, value, "一星", "个"),
|
||||
can.onimport.unitView(can, value, "五星", "个"),
|
||||
can.onimport.titleAction(can, value),
|
||||
|
@ -11,9 +11,9 @@ type Case struct {
|
||||
Table
|
||||
order string `data:"5"`
|
||||
role string `data:"leader,worker"`
|
||||
fields string `data:"title,content,status,space,index,begin_time,end_time,process_time,finish_time,task_uid,issue_uid,plan_uid,story_uid,user_uid"`
|
||||
fields string `data:"title,content,status,score,space,index,begin_time,end_time,process_time,finish_time,task_uid,issue_uid,plan_uid,story_uid,user_uid"`
|
||||
create string `name:"create task_uid*:select title* content* space:select index:select begin_time:select@date end_time:select@date" role:"worker"`
|
||||
modify string `name:"modify title* content* space:select index:select begin_time*:select@date end_time*:select@date" role:"worker"`
|
||||
modify string `name:"modify title* content* space:select index:select" role:"worker"`
|
||||
finish string `name:"finish" role:"worker"`
|
||||
}
|
||||
|
||||
@ -31,15 +31,19 @@ func (s Case) Cancel(m *ice.Message, arg ...string) {
|
||||
s.taskCount(m)
|
||||
}
|
||||
func (s Case) List(m *ice.Message, arg ...string) {
|
||||
defer kit.If(!s.IsLeader(m), func() { m.Action() })
|
||||
s.Orders(m, model.STATUS, s.Desc(model.CREATED_AT))
|
||||
s.ValueList(m, arg)
|
||||
s.SelectJoinPlan(m)
|
||||
m.Table(func(value ice.Maps) {
|
||||
if value[model.SPACE] == "" {
|
||||
s.PushTaskButton(m, value)
|
||||
} else {
|
||||
s.PushTaskButton(m, value, s.Preview)
|
||||
button := []ice.Any{}
|
||||
if value[model.SPACE] != "" {
|
||||
button = append(button, s.Preview)
|
||||
}
|
||||
if s.IsLeader(m) {
|
||||
button = append(button, s.SetScore)
|
||||
}
|
||||
s.PushTaskButton(m, value, button...)
|
||||
}).RenameAppend(model.STATUS, model.CASE_STATUS).Display("")
|
||||
s.OtherListCmd(m, s.TaskList)
|
||||
}
|
||||
|
@ -1,6 +1,6 @@
|
||||
Volcanos(chat.ONIMPORT, {
|
||||
_init: function(can, msg) {
|
||||
can.onimport.myView(can, msg, function(value) { return [
|
||||
can.onimport.myViewTabs(can, "case_status", msg, function(value) { return [
|
||||
{view: html.TITLE, list: [value.title, can.onimport.textView(can, value, "case_status")]},
|
||||
{view: html.STATUS, list: [
|
||||
(value.process_time||value.begin_time).split(" ")[0],
|
||||
|
@ -2,6 +2,7 @@ package production
|
||||
|
||||
import (
|
||||
"shylinux.com/x/ice"
|
||||
"shylinux.com/x/icebergs/base/aaa"
|
||||
"shylinux.com/x/icebergs/core/code"
|
||||
kit "shylinux.com/x/toolkits"
|
||||
|
||||
@ -10,18 +11,34 @@ import (
|
||||
|
||||
type coder struct {
|
||||
Tables
|
||||
list string `name:"list path file line auto" help:"编辑器" role:"void"`
|
||||
repos string `name:"repos" role:"void"`
|
||||
render string `name:"render" role:"void"`
|
||||
save string `name:"save" role:"void"`
|
||||
compile string `name:"compile" role:"void"`
|
||||
list string `name:"list path file line auto" help:"编辑器" role:"void"`
|
||||
inputs string `name:"inputs" role:"void"`
|
||||
repos string `name:"repos" role:"void"`
|
||||
plugin string `name:"plugin" role:"void"`
|
||||
render string `name:"render" role:"void"`
|
||||
engine string `name:"engine" role:"void"`
|
||||
create string `name:"create file*" role:"void"`
|
||||
trash string `name:"trash" role:"void"`
|
||||
complete string `name:"complete" role:"void"`
|
||||
save string `name:"save" role:"void"`
|
||||
compile string `name:"compile" role:"void"`
|
||||
}
|
||||
|
||||
func (s coder) Repos(m *ice.Message, arg ...string) { m.Cmdy(code.VIMER, m.ActionKey(), arg) }
|
||||
func (s coder) Render(m *ice.Message, arg ...string) { m.Cmdy(code.VIMER, m.ActionKey(), arg) }
|
||||
func (s coder) Save(m *ice.Message, arg ...string) { s.cmd(m, arg...) }
|
||||
func (s coder) Compile(m *ice.Message, arg ...string) { s.cmd(m, arg...) }
|
||||
func (s coder) List(m *ice.Message, arg ...string) { m.Cmdy(code.VIMER, arg) }
|
||||
func (s coder) Inputs(m *ice.Message, arg ...string) {
|
||||
m.Cmdy(code.VIMER, m.ActionKey(), arg, kit.Dict(ice.MSG_USERROLE, aaa.TECH))
|
||||
}
|
||||
func (s coder) Repos(m *ice.Message, arg ...string) { m.Cmdy(code.VIMER, m.ActionKey(), arg) }
|
||||
func (s coder) Plugin(m *ice.Message, arg ...string) { m.Cmdy(code.VIMER, m.ActionKey(), arg) }
|
||||
func (s coder) Render(m *ice.Message, arg ...string) { m.Cmdy(code.VIMER, m.ActionKey(), arg) }
|
||||
func (s coder) Engine(m *ice.Message, arg ...string) { s.cmd(m, arg...) }
|
||||
func (s coder) Create(m *ice.Message, arg ...string) { s.cmd(m, arg...) }
|
||||
func (s coder) Trash(m *ice.Message, arg ...string) { s.cmd(m, arg...) }
|
||||
func (s coder) Complete(m *ice.Message, arg ...string) { s.cmd(m, arg...) }
|
||||
func (s coder) Save(m *ice.Message, arg ...string) { s.cmd(m, arg...) }
|
||||
func (s coder) Compile(m *ice.Message, arg ...string) { s.cmd(m, arg...) }
|
||||
func (s coder) List(m *ice.Message, arg ...string) {
|
||||
m.Cmdy(code.VIMER, arg).Option(ice.MSG_TOOLKIT, "")
|
||||
}
|
||||
|
||||
func init() { ice.TeamCtxCmd(coder{}) }
|
||||
|
||||
@ -32,7 +49,6 @@ func (s coder) check(m *ice.Message, arg ...string) bool {
|
||||
m.OptionDefault(model.USER_UID, m.Option(ice.MSG_USERUID))
|
||||
s.SettingSelect(m.Options(model.PLACE_UID, m.Option(model.STORY_UID)))
|
||||
msg := m.Cmd(userStory{}, s.Select, m.OptionSimple(model.STORY_UID, model.USER_UID))
|
||||
m.Info("what %v", msg.FormatChain())
|
||||
if s.SettingIsOn(m, CREATOR_PROGRAM) && msg.Append(model.ROLE) == "1" {
|
||||
return true
|
||||
} else if s.SettingIsOn(m, LEADER_PROGRAM) && msg.Append(model.ROLE) == "2" {
|
||||
|
@ -30,16 +30,18 @@ type Table struct {
|
||||
cancel string `name:"cancel" role:"leader"`
|
||||
trash string `name:"trash" role:"leader"`
|
||||
list string `name:"list story_uid uid auto" role:"void"`
|
||||
dateInsert string `name:"dateInsert" help:"约会" role:"leader"`
|
||||
discuss string `name:"discuss meet_type*:select title* content meet_link* date* time*" role:"leader"`
|
||||
addNote string `name:"addNote title content to_user_uid:select" help:"备注" role:"worker"`
|
||||
preview string `name:"preview" role:"worker"`
|
||||
program string `name:"program" role:"worker"`
|
||||
discuss string `name:"discuss meet_type* title* content meet_link* date* time*" role:"leader"`
|
||||
addNote string `name:"addNote title content to_user_uid:select" help:"备注" role:"worker"`
|
||||
setScore string `name:"setScore score" help:"评分" role:"leader"`
|
||||
payfor string `name:"payfor price* title* content" role:"leader"`
|
||||
join string `name:"join" help:"入会" style:"notice" role:"void"`
|
||||
replay string `name:"replay" help:"回放" style:"notice" role:"void"`
|
||||
upload string `name:"upload" role:"worker"`
|
||||
download string `name:"download" style:"notice" role:"worker"`
|
||||
fileCreate string `name:"fileCreate title* content file_type*:select file_link*@upload" help:"上传附件" role:"worker"`
|
||||
dateInsert string `name:"dateInsert" help:"约会" role:"leader"`
|
||||
fileCreate string `name:"fileCreate title* content file_type*:select file_link*:select@upload" help:"上传附件" role:"worker"`
|
||||
setScore string `name:"setScore score" help:"打分" role:"leader"`
|
||||
payfor string `name:"payfor price*=500 title* content" role:"leader"`
|
||||
planList string `name:"planList" role:"worker"`
|
||||
issueList string `name:"issueList" role:"worker"`
|
||||
designList string `name:"designList" role:"worker"`
|
||||
@ -49,6 +51,7 @@ type Table struct {
|
||||
fileList string `name:"fileList" role:"worker"`
|
||||
meetList string `name:"meetList" role:"worker"`
|
||||
dealList string `name:"dealList" role:"worker"`
|
||||
userInfo string `name:"userInfo" help:"所有项目" role:"worker"`
|
||||
}
|
||||
|
||||
func (s Table) Inputs(m *ice.Message, arg ...string) {
|
||||
@ -73,19 +76,37 @@ func (s Table) Inputs(m *ice.Message, arg ...string) {
|
||||
s.InputsList(m, FileTypeList, arg...)
|
||||
case model.LEVEL:
|
||||
s.InputsList(m, LevelList, arg...)
|
||||
case model.SCORE:
|
||||
m.Push(arg[0], "1", "2", "3", "4", "5")
|
||||
case model.VERSION:
|
||||
m.Push(arg[0], "v1", "v2", "v3", "v4", "v5")
|
||||
case nfs.PATH:
|
||||
m.Option(ice.MSG_USERROLE, aaa.TECH)
|
||||
m.Cmdy(web.SPACE, m.Option(web.SPACE), nfs.DIR, nfs.SRC, nfs.PATH)
|
||||
case ctx.INDEX:
|
||||
msg := m.Spawn()
|
||||
s.Table.Inputs(msg, arg...)
|
||||
msg.Table(func(value ice.Maps) {
|
||||
if strings.HasSuffix(value[arg[0]], ".portal") {
|
||||
m.Push(arg[0], value[arg[0]])
|
||||
}
|
||||
})
|
||||
if m.PrefixKey() == ice.GetTypeKey(Case{}) {
|
||||
msg := m.Spawn()
|
||||
s.Table.Inputs(msg, arg...)
|
||||
msg.Table(func(value ice.Maps) {
|
||||
if strings.HasPrefix(value[arg[0]], "web.team.") && strings.HasSuffix(value[arg[0]], ".portal") {
|
||||
m.PushRecord(value, arg[0], mdb.HELP)
|
||||
}
|
||||
})
|
||||
} else {
|
||||
s.Hash.Inputs(m, arg...)
|
||||
}
|
||||
case nfs.PATH:
|
||||
if m.PrefixKey() == ice.GetTypeKey(Task{}) {
|
||||
m.Option(ice.MSG_USERROLE, aaa.TECH)
|
||||
m.Cmdy(web.SPACE, m.Option(web.SPACE), nfs.DIR, nfs.SRC, nfs.PATH, kit.Dict(nfs.DIR_TYPE, nfs.DIR))
|
||||
} else {
|
||||
s.Hash.Inputs(m, arg...)
|
||||
}
|
||||
case "date":
|
||||
for i := 0; i < 5; i++ {
|
||||
m.Push(arg[0], strings.Split(m.Time(kit.Format("%dh", i*24)), " ")[0])
|
||||
}
|
||||
case "time":
|
||||
for i := 38; i < 48; i++ {
|
||||
m.Push(arg[0], kit.Format("%02d:%s", i/2, kit.Select("30", "00", i%2 == 0)))
|
||||
}
|
||||
default:
|
||||
switch m.Option(ctx.ACTION) {
|
||||
case "discuss":
|
||||
@ -98,6 +119,36 @@ func (s Table) Inputs(m *ice.Message, arg ...string) {
|
||||
for i := 38; i < 48; i++ {
|
||||
m.Push(arg[0], kit.Format("%02d:%s", i/2, kit.Select("30", "00", i%2 == 0)))
|
||||
}
|
||||
default:
|
||||
s.Table.Inputs(m, arg...)
|
||||
}
|
||||
case "payfor":
|
||||
switch arg[0] {
|
||||
case model.PRICE:
|
||||
m.Push(arg[0], "500")
|
||||
m.Push(arg[0], "1000")
|
||||
m.Push(arg[0], "1500")
|
||||
m.Push(arg[0], "2000")
|
||||
m.Push(arg[0], "2500")
|
||||
m.Push(arg[0], "3000")
|
||||
case model.TITLE:
|
||||
title := m.Option(model.TITLE)
|
||||
m.Push(arg[0], title+" PM 订金")
|
||||
m.Push(arg[0], title+" PM 尾款")
|
||||
m.Push(arg[0], title+" UI 订金")
|
||||
m.Push(arg[0], title+" UI 尾款")
|
||||
m.Push(arg[0], title+" PM+UI 订金")
|
||||
m.Push(arg[0], title+" PM+UI 尾款")
|
||||
default:
|
||||
s.Table.Inputs(m, arg...)
|
||||
}
|
||||
case "addNote":
|
||||
switch arg[0] {
|
||||
case model.CONTENT:
|
||||
m.Push(arg[0], "业务负责人已验收,请产研负责人验收~")
|
||||
m.Push(arg[0], "产研负责人已验收,请研发负责人验收~")
|
||||
default:
|
||||
s.Table.Inputs(m, arg...)
|
||||
}
|
||||
default:
|
||||
s.Table.Inputs(m, arg...)
|
||||
@ -156,7 +207,7 @@ func (s Table) PushIssueButton(m *ice.Message, value ice.Maps, arg ...ice.Any) {
|
||||
if isLeader {
|
||||
button = append(button, s.DateInsert)
|
||||
}
|
||||
if isWorker {
|
||||
if isLeader {
|
||||
button = append(button, s.AddNote)
|
||||
}
|
||||
if isLeaderApproved {
|
||||
@ -165,7 +216,7 @@ func (s Table) PushIssueButton(m *ice.Message, value ice.Maps, arg ...ice.Any) {
|
||||
if isLeader {
|
||||
button = append(button, s.Reject)
|
||||
}
|
||||
if user_uid == value[model.USER_UID] {
|
||||
if value[model.USER_UID] == user_uid {
|
||||
button = append(button, s.Modify, s.Remove)
|
||||
}
|
||||
case IssueRejected:
|
||||
@ -173,27 +224,30 @@ func (s Table) PushIssueButton(m *ice.Message, value ice.Maps, arg ...ice.Any) {
|
||||
button = append(button, s.Trash)
|
||||
}
|
||||
case IssueApproved:
|
||||
if user_uid == value[model.USER_UID] {
|
||||
if isLeader || value[model.USER_UID] == user_uid {
|
||||
button = append(button, s.Process)
|
||||
}
|
||||
case IssueProcess:
|
||||
if user_uid == value[model.USER_UID] {
|
||||
button = append(button, s.Submit)
|
||||
}
|
||||
if isWorker {
|
||||
button = append(button, arg...)
|
||||
}
|
||||
if value[model.USER_UID] == user_uid {
|
||||
button = append(button, s.Submit)
|
||||
}
|
||||
if isLeaderFinish {
|
||||
button = append(button, s.Cancel)
|
||||
}
|
||||
case IssueSubmit:
|
||||
if isLeader {
|
||||
button = append(button, s.DateInsert)
|
||||
}
|
||||
if isLeader {
|
||||
button = append(button, s.AddNote)
|
||||
}
|
||||
if isWorker && value[model.LINK] != "" {
|
||||
button = append(button, s.Preview)
|
||||
}
|
||||
if isWorker {
|
||||
button = append(button, s.AddNote)
|
||||
}
|
||||
if isWorker {
|
||||
if isLeader || value[model.USER_UID] == user_uid {
|
||||
button = append(button, s.FileCreate)
|
||||
}
|
||||
if isWorker {
|
||||
@ -209,7 +263,7 @@ func (s Table) PushIssueButton(m *ice.Message, value ice.Maps, arg ...ice.Any) {
|
||||
if isWorker && value[model.LINK] != "" {
|
||||
button = append(button, s.Preview)
|
||||
}
|
||||
if value[model.USER_UID] == m.Option(ice.MSG_USERUID) && PlanStatus(kit.Int(value[model.PLAN_STATUS])) != PlanFinish {
|
||||
if value[model.USER_UID] == user_uid && PlanStatus(kit.Int(value[model.PLAN_STATUS])) != PlanFinish {
|
||||
button = append(button, s.FileCreate)
|
||||
} else if isLeader {
|
||||
button = append(button, s.FileCreate)
|
||||
@ -217,7 +271,7 @@ func (s Table) PushIssueButton(m *ice.Message, value ice.Maps, arg ...ice.Any) {
|
||||
if isWorker {
|
||||
button = append(button, arg...)
|
||||
}
|
||||
if isLeaderPayfor && value[model.SCORE] == "0" {
|
||||
if isLeaderPayfor {
|
||||
button = append(button, s.SetScore)
|
||||
}
|
||||
if isLeaderPayfor && PlanStatus(kit.Int(value[model.PLAN_STATUS])) != PlanFinish {
|
||||
@ -271,7 +325,7 @@ func (s Table) StatusPrice(m *ice.Message, arg ...string) {
|
||||
}
|
||||
}
|
||||
func (s Table) UserInfo(m *ice.Message, arg ...string) {
|
||||
m.ProcessField(care{}, []string{m.Option(model.STORY_UID), m.Option(model.UID)}, arg...)
|
||||
m.ProcessField(care{}, []string{m.Option(model.STORY_UID), m.Option(model.TO_USER_UID)}, arg...)
|
||||
}
|
||||
func (s care) UserInfo(m *ice.Message, arg ...string) {
|
||||
m.Cmdy(s.PrefixPortal(m), s.UserInfo, arg)
|
||||
@ -305,6 +359,9 @@ func (s Table) Cancel(m *ice.Message, arg ...string) {
|
||||
func (s Table) Trash(m *ice.Message, arg ...string) {
|
||||
s.Delete(m, m.OptionSimple(model.UID, model.STORY_UID)...)
|
||||
}
|
||||
func (s Table) Join(m *ice.Message, arg ...string) {
|
||||
m.ProcessOpen(m.Option(model.MEET_LINK))
|
||||
}
|
||||
func (s Table) Preview(m *ice.Message, arg ...string) {
|
||||
m.OptionDefault(model.LINK, m.Option(model.MEET_LINK))
|
||||
m.ProcessOpen(m.OptionDefault(model.LINK, web.S(m.Option(web.SPACE))+web.C(m.Option(ctx.INDEX))))
|
||||
@ -314,11 +371,9 @@ func (s Table) sendTemplate(m *ice.Message, from, to, title string, arg ...strin
|
||||
s.SendTemplate(m, from, msg.Append(model.USER_UID), title, arg...)
|
||||
}
|
||||
func (s Table) coderLink(m *ice.Message, arg ...string) string {
|
||||
p := path.Base(m.Option(nfs.PATH))
|
||||
return kit.MergeURL(web.S(m.Option(web.SPACE))+web.C("web.team.production.coder"),
|
||||
nfs.PATH, nfs.SRC, nfs.FILE, path.Join(p, "portal.go"),
|
||||
m.OptionSimple(model.STORY_UID, model.ISSUE_UID),
|
||||
)
|
||||
return kit.MergeURL(web.S(m.Option(web.SPACE))+web.C(ice.GetTypeKey(coder{})),
|
||||
nfs.PATH, nfs.SRC, nfs.FILE, path.Join(path.Base(m.Option(nfs.PATH)), "portal.go"),
|
||||
m.OptionSimple(model.STORY_UID, model.ISSUE_UID, model.TITLE))
|
||||
}
|
||||
func (s Table) Program(m *ice.Message, arg ...string) {
|
||||
m.ProcessOpen(s.coderLink(m))
|
||||
@ -434,7 +489,15 @@ func (s Table) FileList(m *ice.Message, arg ...string) {
|
||||
}
|
||||
func (s Table) MeetList(m *ice.Message, arg ...string) {
|
||||
s.commonOtherList(m, Meet{})
|
||||
m.PushAction(s.Preview)
|
||||
m.Table(func(value ice.Maps) {
|
||||
button := []ice.Any{}
|
||||
defer func() { m.PushButton(button...) }()
|
||||
if strings.Split(value[model.BEGIN_TIME], " ")[0] == strings.Split(m.Time(), " ")[0] {
|
||||
button = append(button, s.Join)
|
||||
} else if kit.Contains(value[model.CONTENT], "iframe", "http") {
|
||||
button = append(button, s.Replay)
|
||||
}
|
||||
})
|
||||
}
|
||||
func (s Table) DealList(m *ice.Message, arg ...string) {
|
||||
s.commonOtherList(m, Deal{})
|
||||
|
@ -1,3 +1,6 @@
|
||||
$output th { box-shadow:none; color:var(--disable-fg-color); font-style:italic; padding:10px; }
|
||||
$output th:first-child { position:sticky; left:2px; z-index:1; }
|
||||
$output td { border:var(--box-border); padding:0; cursor:pointer; }
|
||||
$output th:first-child { position:sticky; left:2px; z-index:1; }
|
||||
$output div.item.card div.title div.space { flex-grow:1; }
|
||||
$output div.item.card div.title span.type.项目验收 { color:var(--danger-bg-color); }
|
||||
$output div.item.card div.title span.type.方向规划 { color:var(--danger-bg-color); }
|
@ -28,7 +28,6 @@ func (s Date) Inputs(m *ice.Message, arg ...string) {
|
||||
case MeetCheck:
|
||||
s.Fields(m, model.ISSUE_UID, model.TITLE, model.USER_UID).Limit(m, 300)
|
||||
m.Cmdy(Design{}, s.Select, args, model.STATUS, IssueSubmit)
|
||||
m.RenameAppend(model.ISSUE_UID, arg[0])
|
||||
m.DisplayInputKeyNameIconTitle()
|
||||
return
|
||||
case MeetPlan:
|
||||
@ -60,12 +59,13 @@ func (s Date) List(m *ice.Message, arg ...string) {
|
||||
func init() { ice.TeamCtxCmd(Date{}) }
|
||||
|
||||
func (s Date) head(m *ice.Message, arg ...string) {
|
||||
s.SettingSelect(m)
|
||||
head := []string{}
|
||||
for i := -kit.Int(m.OptionDefault("date_begin", kit.Select("2", "0", m.IsMobileUA()))); i < kit.Int(m.OptionDefault("date_end", "3")); i++ {
|
||||
for i := -kit.Int(m.OptionDefault("date_begin", kit.Select(m.Option(DATE_BEGIN_DAYS), "1", m.IsMobileUA()))); i < kit.Int(m.OptionDefault("date_end", m.Option(DATE_END_DAYS))); i++ {
|
||||
head = append(head, strings.Split(m.Time(kit.Format("%dh", i*24)), " ")[0])
|
||||
}
|
||||
list := []string{}
|
||||
for i := kit.Int(m.OptionDefault("date_start", "20")); i < kit.Int(m.OptionDefault("date_stop", "46")); i++ {
|
||||
for i := kit.Int(m.OptionDefault("date_start", m.Option(DATE_START_HOURS))) * 2; i < kit.Int(m.OptionDefault("date_stop", m.Option(DATE_STOP_HOURS)))*2; i++ {
|
||||
if i%2 == 0 {
|
||||
list = append(list, kit.Format("%2d:00", i/2))
|
||||
} else {
|
||||
|
@ -1,17 +1,17 @@
|
||||
Volcanos(chat.ONIMPORT, {
|
||||
_init: function(can, msg) { var head = can.core.Split(msg.Option("head")), list = can.core.Split(msg.Option("list"))
|
||||
can.page.Append(can, can._output, [{type: html.TABLE, className: "content full", list: [
|
||||
{type: html.THEAD, list: [{type: html.TR, list: [{type: html.TH, inner: "时间"}].concat(can.core.List(head, function(value) {
|
||||
var today = can.base.beginWith(can.base.Time(), value)? "(今天)": ""
|
||||
return {type: html.TH, inner: value+today}
|
||||
can.page.Append(can, can._output, [{type: html.TABLE, className: "content scroll full", list: [
|
||||
{type: html.THEAD, list: [{type: html.TR, list: [{type: html.TH, inner: can.user.trans(can, "time", "时间")}].concat(can.core.List(head, function(value) {
|
||||
var today = can.base.beginWith(can.base.Time(), value)? can.user.trans(can, "(today)", "(今天)"): ""
|
||||
return {type: html.TH, className: today? "today": "", inner: value+today}
|
||||
}))}]},
|
||||
{type: html.TBODY, list: can.core.List(list, function(time) {
|
||||
return {type: html.TR, list: [{type: html.TH, inner: time}].concat(can.core.List(head, function(date) {
|
||||
return {type: html.TD, list: msg.Table(function(value) { if (!can.base.beginWith(value.begin_time, date+" "+time)) { return }
|
||||
return {view: html.ITEM, _init: function(target) { var msg = can.request({}); msg.Push(value)
|
||||
can.onimport.myView(can, msg, function(value) { return [
|
||||
{view: html.TITLE, list: [value.title, value.meet_type]},
|
||||
{view: html.STATUS, list: [value.story_name, value.user_name]},
|
||||
{view: html.TITLE, list: [value.title, can.onimport.spaceView(can, value), can.onimport.textView(can, value, "meet_type")]},
|
||||
{view: html.STATUS, list: [value.story_name, value.user_name.split("@")[0]]},
|
||||
] }, function(event, value) { can.onkeymap.prevent(event)
|
||||
can.onimport.myStory(can, {index: "web.team.production.meet", args: [value.story_uid, value.uid]})
|
||||
}, target)
|
||||
|
@ -12,7 +12,7 @@ type Deal struct {
|
||||
order string `data:"11"`
|
||||
role string `data:"leader,worker"`
|
||||
fields string `data:"from_user_uid,to_user_uid,price,title,content,issue_uid"`
|
||||
create string `name:"create issue_uid* from_user_uid* to_user_uid* price* title* content" role:"leader"`
|
||||
create string `name:"create issue_uid*:select from_user_uid*:select to_user_uid*:select price* title* content" role:"leader"`
|
||||
modify string `name:"modify title* content" role:"leader"`
|
||||
}
|
||||
|
||||
@ -22,23 +22,20 @@ func (s Deal) Create(m *ice.Message, arg ...string) {
|
||||
s.SendMessage(s.GetCommandUID(m), m.Option(model.TO_USER_UID), m.Option(model.FROM_USER_UID))
|
||||
}
|
||||
func (s Deal) List(m *ice.Message, arg ...string) {
|
||||
defer kit.If(!s.IsCreator(m), func() { m.Action() })
|
||||
if s.IsLeader(m) {
|
||||
s.ValueList(m, arg).PushAction()
|
||||
s.StatusPrice(m, arg...)
|
||||
s.ValueList(m, arg)
|
||||
} else {
|
||||
if len(arg) == 1 {
|
||||
s.Select(m, model.STORY_UID, arg[0], model.TO_USER_UID, m.Option(model.USER_UID)).PushAction().Action()
|
||||
s.Select(m, model.STORY_UID, arg[0], model.TO_USER_UID, m.Option(model.USER_UID))
|
||||
kit.If(m.Length() == 0, func() { m.Echo("请等待管理人员支付工钱") })
|
||||
} else {
|
||||
s.SelectDetail(m, model.STORY_UID, arg[0], model.TO_USER_UID, m.Option(model.USER_UID), model.UID, arg[1]).PushAction().Action()
|
||||
s.SelectDetail(m, model.STORY_UID, arg[0], model.TO_USER_UID, m.Option(model.USER_UID), model.UID, arg[1])
|
||||
s.DoneMessage(m)
|
||||
}
|
||||
}
|
||||
if m.Display(""); s.IsLeader(m) {
|
||||
m.RenameAppend(model.TO_USER_UID, model.USER_UID)
|
||||
} else {
|
||||
m.RenameAppend(model.FROM_USER_UID, model.USER_UID)
|
||||
}
|
||||
m.PushAction()
|
||||
m.RenameAppend(model.TO_USER_UID, model.USER_UID).Display("")
|
||||
s.OtherListCmd(m, s.IssueList, s.DesignList)
|
||||
}
|
||||
|
||||
|
@ -13,7 +13,7 @@ type Design struct {
|
||||
role string `data:"leader,worker"`
|
||||
fields string `data:"updated_at,title,design_content,status,price,score,link,begin_time,end_time,process_time,finish_time,issue_uid,plan_uid,story_uid,user_uid"`
|
||||
create string `name:"create issue_uid*:select title* design_content* price*=1000 begin_time:select@date end_time:select@date" role:"worker"`
|
||||
modify string `name:"modify title* design_content* price* link" role:"worker"`
|
||||
modify string `name:"modify title* design_content* price*" role:"worker"`
|
||||
}
|
||||
|
||||
func (s Design) Create(m *ice.Message, arg ...string) {
|
||||
@ -43,6 +43,7 @@ func (s Design) Submit(m *ice.Message, arg ...string) {
|
||||
s.sendTemplate(m, "", msg.Append(model.USER_UID), "")
|
||||
}
|
||||
func (s Design) List(m *ice.Message, arg ...string) {
|
||||
defer kit.If(!s.IsLeader(m), func() { m.Action() })
|
||||
s.Orders(m, model.STATUS, s.Desc(model.UPDATED_AT)).Limit(m, 300)
|
||||
s.ValueList(m, arg)
|
||||
s.SelectJoinPlan(m)
|
||||
|
@ -3,6 +3,7 @@ Volcanos(chat.ONIMPORT, {
|
||||
msg.IsDetail() && msg.Option("_share_content", msg.Append("design_content"))
|
||||
can.onimport.myViewTabs(can, "status", msg, function(value) { return [
|
||||
{view: html.TITLE, list: [value.title,
|
||||
can.onimport.spaceView(can, value),
|
||||
// msg.IsTech() && value.price > 0 && can.onimport.unitView(can, value, "price", "元"),
|
||||
value.score != "3" && can.onimport.unitView(can, value, "score", "星"),
|
||||
can.onimport.textView(can, value, "status"),
|
||||
@ -15,4 +16,10 @@ Volcanos(chat.ONIMPORT, {
|
||||
{view: html.OUTPUT, list: [value.design_content]}, can.onimport.titleAction(can, value),
|
||||
] })
|
||||
},
|
||||
})
|
||||
Volcanos(chat.ONACTION, {
|
||||
_beforeInputs: function(event, can, button, sub) { var msg = can.request(event)
|
||||
sub.Prompt("link", "请输入设计链接,设置权限为所有人可查看,访问期限为永久。提交链接后,请及时与项目负责人联系,并根据反馈意见作出修改。")
|
||||
sub.Prompt("file_link", "请在项目验收完成之后,再上传设计文件。")
|
||||
},
|
||||
})
|
@ -17,7 +17,7 @@ type File struct {
|
||||
order string `data:"11"`
|
||||
role string `data:"leader,worker"`
|
||||
fields string `data:"title,content,file_type,file_link,file_name,file_size,issue_uid,user_uid"`
|
||||
create string `name:"create issue_uid* title* content file_type*:select file_link*@upload" role:"worker"`
|
||||
create string `name:"create issue_uid*:select title* content file_type*:select file_link*:select@upload" role:"worker"`
|
||||
}
|
||||
|
||||
func (s File) Create(m *ice.Message, arg ...string) {
|
||||
@ -25,11 +25,17 @@ func (s File) Create(m *ice.Message, arg ...string) {
|
||||
s.ValueCreate(m, kit.Simple(arg, msg.AppendSimple(model.NAME, model.SIZE))...)
|
||||
}
|
||||
func (s File) List(m *ice.Message, arg ...string) {
|
||||
if s.ValueList(m, arg).Display(""); s.IsLeader(m) {
|
||||
m.PushAction(s.Download, s.Remove)
|
||||
} else {
|
||||
m.PushAction()
|
||||
}
|
||||
defer kit.If(!s.IsLeader(m), func() { m.Action() })
|
||||
s.ValueList(m, arg).Display("").Table(func(value ice.Maps) {
|
||||
button := []ice.Any{}
|
||||
defer func() { m.PushButton(button...) }()
|
||||
if s.IsLeader(m) || value[model.USER_UID] == m.Option(ice.MSG_USERUID) {
|
||||
button = append(button, s.Download)
|
||||
}
|
||||
if s.IsCreator(m) {
|
||||
button = append(button, s.Remove)
|
||||
}
|
||||
})
|
||||
s.OtherListCmd(m, s.IssueList, s.DesignList)
|
||||
}
|
||||
func (s Table) Download(m *ice.Message, arg ...string) {
|
||||
|
2
src/production/issue.css
Normal file
2
src/production/issue.css
Normal file
@ -0,0 +1,2 @@
|
||||
body.width1 $output div.item.card>div.output input[type=button][name=designCreate] {
|
||||
}
|
@ -13,9 +13,9 @@ type Issue struct {
|
||||
portal string `data:"true"`
|
||||
fields string `data:"updated_at,title,issue_content,issue_type,level,status,price,score,link,design_count AS design_count,task_count AS task_count,begin_time,end_time,process_time,finish_time,plan_uid,story_uid,user_uid"`
|
||||
create string `name:"create plan_uid*:select title* issue_content* price=1000 begin_time:select@date end_time:select@date" role:"worker"`
|
||||
modify string `name:"modify title* issue_content* price* link" role:"worker"`
|
||||
modify string `name:"modify title* issue_content* price*" role:"worker"`
|
||||
designCreate string `name:"designCreate title* design_content* price=1000 begin_time:select@date end_time:select@date" role:"worker"`
|
||||
taskCreate string `name:"taskCreate title* content* space path begin_time:select@date end_time:select@date" role:"worker"`
|
||||
taskCreate string `name:"taskCreate title* content* space:select path:select begin_time:select@date end_time:select@date" role:"leader"`
|
||||
bindPlan string `name:"bindPlan plan_uid*:select"`
|
||||
}
|
||||
|
||||
@ -55,8 +55,10 @@ func (s Issue) List(m *ice.Message, arg ...string) {
|
||||
return
|
||||
}
|
||||
isCreator, isWorker := s.IsCreator(m), s.IsWorker(m)
|
||||
defer kit.If(!s.IsLeader(m), func() { m.Action() })
|
||||
msg := m.Cmd(Design{}, s.Select, model.STORY_UID, arg[0], m.OptionSimple(model.USER_UID), model.STATUS, IssueCreate)
|
||||
s.Orders(m, model.STATUS, model.DESIGN_COUNT, model.TASK_COUNT, s.Desc(model.UPDATED_AT)).Limit(m, 300)
|
||||
// s.Orders(m, model.STATUS, model.DESIGN_COUNT, model.TASK_COUNT, s.Desc(model.UPDATED_AT)).Limit(m, 300)
|
||||
s.Orders(m, model.STATUS, model.DESIGN_COUNT, s.Desc(model.UPDATED_AT)).Limit(m, 300)
|
||||
s.ValueList(m, arg)
|
||||
s.SelectJoinPlan(m)
|
||||
s.SettingSelect(m)
|
||||
@ -71,9 +73,10 @@ func (s Issue) List(m *ice.Message, arg ...string) {
|
||||
button = append(button, s.TaskCreate)
|
||||
}
|
||||
s.PushIssueButton(m, value, button...)
|
||||
}).Display("")
|
||||
}).Display("").DisplayCSS("")
|
||||
kit.If(len(arg) == 1, func() {
|
||||
m.Sort("plan_status,status,design_count,task_count,updated_at", ice.STR, ice.STR, ice.STR, ice.STR, ice.STR_R)
|
||||
// m.Sort("plan_status,status,design_count,task_count,updated_at", ice.STR, ice.STR, ice.STR, ice.STR, ice.STR_R)
|
||||
m.Sort("plan_status,status,design_count,updated_at", ice.STR, ice.STR, ice.STR, ice.STR_R)
|
||||
})
|
||||
s.OtherListCmd(m, s.PlanList, s.DesignList, s.TaskList, s.CaseList, s.NoteList, s.FileList, s.MeetList, s.DealList)
|
||||
}
|
||||
|
@ -1,8 +1,10 @@
|
||||
Volcanos(chat.ONIMPORT, {
|
||||
_init: function(can, msg) {
|
||||
msg.IsDetail() && msg.Append("score") > 3 && msg.Option("_share_title", msg.Append("title")+" "+msg.Append("score")+"星")
|
||||
msg.IsDetail() && msg.Option("_share_content", msg.Append("issue_content"))
|
||||
can.onimport.myViewTabs(can, "status", msg, function(value) { return [
|
||||
can.onimport.myViewTabs(can, ["status"], msg, function(value) { return [
|
||||
{view: html.TITLE, list: [value.title,
|
||||
can.onimport.spaceView(can, value),
|
||||
// value.issue_type != "feature" && can.onimport.textView(can, value, "issue_type"),
|
||||
// value.level != "level-3" && can.onimport.textView(can, value, "level"),
|
||||
// msg.IsTech() && value.price > 0 && can.onimport.unitView(can, value, "price", "元"),
|
||||
@ -19,4 +21,13 @@ Volcanos(chat.ONIMPORT, {
|
||||
{view: html.OUTPUT, list: [value.issue_content]}, can.onimport.titleAction(can, value),
|
||||
] })
|
||||
},
|
||||
})
|
||||
Volcanos(chat.ONACTION, {
|
||||
_beforeInputs: function(event, can, button, sub) { var msg = can.request(event)
|
||||
sub.Prompt("issue_content", "请输入五个功能名,每个功能简单明确,功能之间相互关联环环相扣,例如「工作职责、目标任务、工作报告、工作反馈、绩效评估」")
|
||||
sub.Prompt("link", "请输入设计链接,设置权限为所有人可查看,访问期限为永久。提交链接后,请及时与项目负责人联系,并根据反馈意见作出修改。")
|
||||
sub.Prompt("file_link", "请在项目验收完成之后,再上传设计文件。")
|
||||
button == "designCreate" && sub.Prompt("end_time", "请在三天之内完善功能清单,在五天之内提交原型链接,需要符合云社区的规范与标准,并及时与项目负责人沟通。")
|
||||
sub.Option("design_content", msg.Option("issue_content"))
|
||||
},
|
||||
})
|
2
src/production/meet.css
Normal file
2
src/production/meet.css
Normal file
@ -0,0 +1,2 @@
|
||||
$output div.item.card div.title span.type.项目验收 { color:var(--danger-bg-color); }
|
||||
$output div.item.card div.title span.type.方向规划 { color:var(--danger-bg-color); }
|
@ -1,6 +1,7 @@
|
||||
package production
|
||||
|
||||
import (
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"shylinux.com/x/ice"
|
||||
@ -11,13 +12,12 @@ import (
|
||||
|
||||
type Meet struct {
|
||||
Table
|
||||
order string `data:"10"`
|
||||
role string `data:"leader,worker"`
|
||||
fields string `data:"from_user_uid,to_user_uid,title,content,meet_type,meet_link,begin_time,end_time,issue_uid,plan_uid,story_uid,company_uid"`
|
||||
create string `name:"create issue_uid* from_user_uid* to_user_uid* title* content* meet_type* meet_link* date time" role:"leader"`
|
||||
modify string `name:"modify" role:"leader"`
|
||||
remove string `name:"remove" role:"leader"`
|
||||
preview string `name:"preview" help:"入会" role:"void"`
|
||||
order string `data:"10"`
|
||||
role string `data:"leader,worker"`
|
||||
fields string `data:"from_user_uid,to_user_uid,title,content,meet_type,meet_link,begin_time,end_time,issue_uid,plan_uid,story_uid,company_uid"`
|
||||
create string `name:"create issue_uid*:select from_user_uid*:select to_user_uid*:select title* content* meet_type*:select meet_link* date time" role:"leader"`
|
||||
modify string `name:"modify title content meet_link" role:"leader"`
|
||||
remove string `name:"remove" role:"leader"`
|
||||
}
|
||||
|
||||
func (s Meet) Create(m *ice.Message, arg ...string) {
|
||||
@ -30,19 +30,28 @@ func (s Meet) Create(m *ice.Message, arg ...string) {
|
||||
s.SendTemplate(m, "", "", "")
|
||||
}
|
||||
func (s Meet) List(m *ice.Message, arg ...string) {
|
||||
if s.ValueList(m, arg).Display(""); s.IsLeader(m) {
|
||||
m.RenameAppend(model.TO_USER_UID, model.USER_UID)
|
||||
m.PushAction(s.Preview, s.Remove)
|
||||
} else {
|
||||
m.RenameAppend(model.FROM_USER_UID, model.USER_UID)
|
||||
m.PushAction(s.Preview)
|
||||
}
|
||||
defer kit.If(!s.IsLeader(m), func() { m.Action() })
|
||||
s.Orders(m, s.Desc(model.BEGIN_TIME))
|
||||
s.ValueList(m, arg).Display("").DisplayCSS("")
|
||||
m.RenameAppend(model.TO_USER_UID, model.USER_UID)
|
||||
m.Table(func(value ice.Maps) {
|
||||
button := []ice.Any{}
|
||||
defer func() { m.PushButton(button...) }()
|
||||
if kit.Contains(value[model.CONTENT], "iframe", "http") {
|
||||
button = append(button, s.Replay)
|
||||
} else if strings.Split(value[model.BEGIN_TIME], " ")[0] == strings.Split(m.Time(), " ")[0] {
|
||||
button = append(button, s.Join, s.Modify, s.Remove)
|
||||
}
|
||||
})
|
||||
kit.If(!s.IsLeader(m) && m.Length() == 0, func() { m.SetResult().Echo("请等待管理员创建会议") })
|
||||
s.OtherListCmd(m, s.IssueList, s.DesignList)
|
||||
}
|
||||
|
||||
func init() { ice.TeamCtxCmd(Meet{}) }
|
||||
|
||||
func (s Table) Replay(m *ice.Message, arg ...string) {
|
||||
}
|
||||
|
||||
type MeetType int
|
||||
|
||||
const (
|
||||
@ -51,6 +60,7 @@ const (
|
||||
MeetCheck
|
||||
MeetPlan
|
||||
MeetCode
|
||||
MeetTest
|
||||
)
|
||||
|
||||
var MeetTypeList = map[MeetType]string{
|
||||
@ -59,6 +69,7 @@ var MeetTypeList = map[MeetType]string{
|
||||
MeetCheck: "项目验收",
|
||||
MeetPlan: "方向规划",
|
||||
MeetCode: "编程直播",
|
||||
MeetTest: "产品内测",
|
||||
}
|
||||
|
||||
func (s MeetType) String() string { return MeetTypeList[s] }
|
||||
|
@ -5,9 +5,22 @@ Volcanos(chat.ONIMPORT, {
|
||||
msg.Option("_share_content", "时间: "+can.base.trimPrefix(value.begin_time, can.base.Time(null, "%y-")).slice(0, -3)+"\n"+value.content)
|
||||
}
|
||||
can.onimport.myView(can, msg, function(value) { return [
|
||||
{view: html.TITLE, list: [value.title, value.meet_type, can.onimport.titleAction(can, value)]},
|
||||
{view: html.STATUS, list: [can.onimport.uidView(can, value), value.user_name, value.begin_time+" ~ "+value.end_time.split(" ")[1]]},
|
||||
{view: html.OUTPUT, list: [value.content]},
|
||||
// {view: html.TITLE, list: [value.title, value.meet_type, can.onimport.titleAction(can, value)]},
|
||||
{view: html.TITLE, list: [value.title, can.onimport.spaceView(can, value), can.onimport.textView(can, value, "meet_type")]},
|
||||
{view: html.STATUS, list: [can.onimport.uidView(can, value), value.begin_time, value.user_name]},
|
||||
// {view: html.STATUS, list: [can.onimport.uidView(can, value), value.user_name, value.begin_time+" ~ "+value.end_time.split(" ")[1]]},
|
||||
// can.onimport.contentView(can, value),
|
||||
can.onimport.titleAction(can, value),
|
||||
] })
|
||||
can.page.Select(can, can._output, html.IFRAME, function(target) {
|
||||
// can.page.style(can, target, html.HEIGHT, can.user.isMobile? 210: can.ConfHeight()-200)
|
||||
can.page.style(can, target, html.HEIGHT, can.user.isMobile? 210: 540)
|
||||
})
|
||||
},
|
||||
})
|
||||
Volcanos(chat.ONACTION, {
|
||||
replay: function(event, can, button) { if (can.Option(UID)) { return }
|
||||
var msg = can.request(event);
|
||||
can.onimport.myStory(can, {index: "web.team.production.meet", args: [msg.Option("story_uid"), msg.Option("uid")]})
|
||||
},
|
||||
})
|
@ -75,6 +75,7 @@ type Plan struct {
|
||||
StoryUID string `gorm:"type:char(32);index"`
|
||||
Version string `gorm:"type:varchar(16)"`
|
||||
Type uint8 `gorm:"default:0"`
|
||||
Score uint8 `gorm:"default:0"`
|
||||
Status uint8 `gorm:"default:0"`
|
||||
IssueCount int `gorm:"default:0"`
|
||||
BeginTime db.Time
|
||||
|
@ -7,7 +7,7 @@ import (
|
||||
type Note struct {
|
||||
Table
|
||||
fields string `data:"to_user_uid,title,content,issue_uid,plan_uid,user_uid"`
|
||||
create string `name:"create title content to_user_uid" role:"worker"`
|
||||
create string `name:"create title* content* to_user_uid:select" role:"worker"`
|
||||
remove string `name:"remove" role:"leader"`
|
||||
}
|
||||
|
||||
|
@ -1,2 +1,4 @@
|
||||
body.width1 $output div.item.card>div.output span.status { margin-left:unset !important; }
|
||||
body.width1 $output div.item.card>div.output span.type { margin-left:auto; }
|
||||
// body.width1 $output div.item.card>div.output span.status { margin-left:unset !important; }
|
||||
// body.width1 $output div.item.card>div.output span.type { margin-left:auto; }
|
||||
$output div.item.card>div.output span.status.待接单 { color:var(--danger-bg-color); }
|
||||
body.width1 $output div.item.card>div.output input[type=button][name=issueCreate] { background-color:var(--notice-bg-color); color:var(--notice-fg-color); }
|
@ -10,13 +10,13 @@ import (
|
||||
type Plan struct {
|
||||
Table
|
||||
order string `data:"1"`
|
||||
fields string `data:"updated_at,title,content,version,plan_type,plan_status,issue_count AS issue_count,begin_time,end_time,process_time,finish_time,story_uid,user_uid"`
|
||||
fields string `data:"updated_at,title,content,version,plan_type,plan_status,score,issue_count AS issue_count,begin_time,end_time,process_time,finish_time,story_uid,user_uid"`
|
||||
create string `name:"create title* content plan_type:select version:select 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"`
|
||||
remove string `name:"remove" role:"leader"`
|
||||
process string `name:"process" role:"leader"`
|
||||
setType string `name:"setType plan_type" role:"creator"`
|
||||
handover string `name:"handover to_user_uid*:select" role:"leader" style:"notice" help:"交接"`
|
||||
setType string `name:"setType plan_type:select" help:"归类" role:"creator"`
|
||||
handover string `name:"handover to_user_uid*:select" role:"leader" help:"交接"`
|
||||
issueCreate string `name:"issueCreate title* issue_content* price=1000 begin_time:select@date end_time:select@date" role:"worker"`
|
||||
}
|
||||
|
||||
@ -33,7 +33,7 @@ func (s Plan) Create(m *ice.Message, arg ...string) {
|
||||
s.SendMessage(m, "", "")
|
||||
}
|
||||
func (s Plan) List(m *ice.Message, arg ...string) {
|
||||
isCreator, isLeader, isWorker := s.IsCreator(m), s.IsLeader(m), s.IsWorker(m)
|
||||
isLeader, isWorker := s.IsLeader(m), s.IsWorker(m)
|
||||
defer kit.If(!isLeader, func() {
|
||||
if m.Action(); m.Length() == 0 {
|
||||
m.SetResult("请等待「管理员」创建迭代计划")
|
||||
@ -42,14 +42,14 @@ func (s Plan) List(m *ice.Message, arg ...string) {
|
||||
s.SettingSelect(m)
|
||||
issue_max_create := kit.Int(m.Option(ISSUE_MAX_CREATE))
|
||||
msg := m.Cmd(Issue{}, s.Select, model.STORY_UID, arg[0], m.OptionSimple(model.USER_UID), model.STATUS, IssueCreate)
|
||||
s.Orders(m, model.STATUS, model.ISSUE_COUNT, s.Desc(model.UPDATED_AT)).Limit(m, 300)
|
||||
s.Orders(m, model.STATUS, model.ISSUE_COUNT, s.Desc(model.TYPE), s.Desc(model.SCORE), s.Desc(model.UPDATED_AT)).Limit(m, 300)
|
||||
s.ValueList(m, arg).Table(func(value ice.Maps) {
|
||||
button := []ice.Any{}
|
||||
defer func() { m.PushButton(button...) }()
|
||||
switch PlanStatus(kit.Int(value[model.PLAN_STATUS])) {
|
||||
case PlanCreate:
|
||||
if isLeader {
|
||||
button = append(button, s.Process, s.Handover, s.Modify, s.Remove)
|
||||
button = append(button, s.Process, s.Modify, s.Remove)
|
||||
}
|
||||
case PlanProcess:
|
||||
if isWorker && kit.Int(value[model.ISSUE_COUNT]) == 0 && msg.Length() < issue_max_create {
|
||||
@ -58,7 +58,10 @@ func (s Plan) List(m *ice.Message, arg ...string) {
|
||||
if isLeader && m.Option(model.MARKET_UID) == "" {
|
||||
button = append(button, s.MarketInsert)
|
||||
}
|
||||
if isCreator {
|
||||
if isLeader {
|
||||
button = append(button, s.SetScore)
|
||||
}
|
||||
if isLeader {
|
||||
button = append(button, s.SetType)
|
||||
}
|
||||
if isLeader {
|
||||
@ -72,11 +75,14 @@ func (s Plan) List(m *ice.Message, arg ...string) {
|
||||
}
|
||||
case PlanFinish:
|
||||
if isLeader {
|
||||
button = append(button, s.Handover)
|
||||
button = append(button, s.SetScore)
|
||||
}
|
||||
if isCreator {
|
||||
if isLeader {
|
||||
button = append(button, s.SetType)
|
||||
}
|
||||
if isLeader {
|
||||
button = append(button, s.Handover)
|
||||
}
|
||||
kit.If(m.FieldsIsDetail(), func() { s.DoneMessage(m) })
|
||||
}
|
||||
}).Display("").DisplayCSS("")
|
||||
@ -96,6 +102,11 @@ func (s Plan) Finish(m *ice.Message, arg ...string) {
|
||||
}
|
||||
func (s Plan) SetType(m *ice.Message, arg ...string) {
|
||||
s.Modify(m, m.OptionSimple(model.PLAN_TYPE)...)
|
||||
m.ProcessHold()
|
||||
}
|
||||
func (s Plan) SetScore(m *ice.Message, arg ...string) {
|
||||
s.Modify(m, arg...)
|
||||
m.ProcessHold()
|
||||
}
|
||||
func (s Plan) Handover(m *ice.Message, arg ...string) {
|
||||
m.OptionDefault(model.TO_USER_UID, m.Option(ice.MSG_USERUID))
|
||||
|
@ -1,9 +1,24 @@
|
||||
Volcanos(chat.ONIMPORT, {
|
||||
_init: function(can, msg) {
|
||||
can.onimport.myViewTabs(can, "plan_status", msg, function(value) { return [
|
||||
{view: html.TITLE, list: [value.title, value.version, can.onimport.textView(can, value, "plan_type"), can.onimport.textView(can, value)]},
|
||||
{view: html.STATUS, list: [can.onimport.uidView(can, value), can.onimport.timeView(can, value), can.onimport.unitView(can, value, "issue_count", "个")]},
|
||||
{view: html.OUTPUT, list: [value.content]}, can.onimport.titleAction(can, value),
|
||||
] })
|
||||
can.onimport.myViewTabs(can, ["plan_status", "plan_type"], msg, function(value) {
|
||||
if (value.plan_status == "process" && value.issue_count == "0") { value.plan_status = "待接单" }
|
||||
return [
|
||||
{view: html.TITLE, list: [value.title, value.version, can.onimport.spaceView(can, value),
|
||||
can.onimport.unitView(can, value, "score", "星"),
|
||||
can.onimport.textView(can, value, "plan_type"),
|
||||
can.onimport.textView(can, value),
|
||||
]},
|
||||
{view: html.STATUS, list: [can.onimport.uidView(can, value), can.onimport.timeView(can, value), can.onimport.unitView(can, value, "issue_count", "个")]},
|
||||
{view: html.OUTPUT, list: [value.content]}, can.onimport.titleAction(can, value),
|
||||
]
|
||||
})
|
||||
},
|
||||
})
|
||||
Volcanos(chat.ONACTION, {
|
||||
_beforeInputs: function(event, can, button, sub) {
|
||||
button == "issueCreate" && sub.Prompt("issue_content", "请输入五个功能名,每个功能简单明确,功能之间相互关联环环相扣,例如「工作职责、目标任务、工作报告、工作反馈、绩效评估」。")
|
||||
button == "issueCreate" && sub.Prompt("end_time", "请在三天之内完善功能清单,在五天之内提交原型链接,需要符合云社区的规范与标准,并及时与项目负责人沟通。")
|
||||
sub.Option("plan_type", "")
|
||||
sub.Option("score", "")
|
||||
},
|
||||
})
|
||||
|
@ -2,6 +2,7 @@ package production
|
||||
|
||||
import (
|
||||
"shylinux.com/x/ice"
|
||||
"shylinux.com/x/icebergs/base/web/html"
|
||||
|
||||
"shylinux.com/x/community/src/api"
|
||||
"shylinux.com/x/community/src/gonganxitong"
|
||||
@ -11,18 +12,23 @@ import (
|
||||
|
||||
type Portal struct {
|
||||
guanlixitong.Portal
|
||||
placeCreate string `name:"placeCreate city_name* company_name* story_name* story_type:select" role:"void"`
|
||||
placeCreate string `name:"placeCreate city_name* company_name* story_name*" role:"void"`
|
||||
}
|
||||
|
||||
func (s Plan) AfterMigrate(m *ice.Message, arg ...string) {
|
||||
s.Table.AfterMigrate(m, arg...)
|
||||
s.SettingCreate(m, "auth", "title", "项目权限", "", "999")
|
||||
s.SettingCreate(m, "auth", html.TITLE, "项目权限", "", "999")
|
||||
s.SettingCreate(m, LEADER_APPROVED, "", "允许管理人员审批项目", api.CREATOR, "1000")
|
||||
s.SettingCreate(m, LEADER_FINISH, "", "允许管理人员验收项目", api.CREATOR, "1001")
|
||||
s.SettingCreate(m, LEADER_PAYFOR, "", "允许管理人员支付项目", api.CREATOR, "1002")
|
||||
s.SettingCreate(m, LEADER_PROGRAM, "", "允许管理人员本地开发", api.TECH, "1003")
|
||||
s.SettingCreate(m, CREATOR_PROGRAM, "", "允许创建人本地开发", api.TECH, "1004")
|
||||
s.SettingCreate(m, ISSUE_MAX_CREATE, "input", "每个人最多有多少个项目待审批", api.LEADER, "1005", "2")
|
||||
s.SettingCreate(m, ISSUE_MAX_CREATE, html.INPUT, "每个人最多有多少个项目待审批", api.LEADER, "1005", "2")
|
||||
s.SettingCreate(m, "date", html.TITLE, "约会配置", api.LEADER, "1010")
|
||||
s.SettingCreate(m, DATE_START_HOURS, html.INPUT, "会议预约开始时间", api.LEADER, "1011", "14")
|
||||
s.SettingCreate(m, DATE_STOP_HOURS, html.INPUT, "会议预约结束时间", api.LEADER, "1012", "24")
|
||||
s.SettingCreate(m, DATE_BEGIN_DAYS, html.INPUT, "会议预约开始日期", api.LEADER, "1013", "2")
|
||||
s.SettingCreate(m, DATE_END_DAYS, html.INPUT, "会议预约结束日期", api.LEADER, "1014", "3")
|
||||
}
|
||||
func (s Portal) AfterPlaceAuth(m *ice.Message, arg ...string) {
|
||||
if m.PrefixKey() != ice.GetTypeKey(s) {
|
||||
@ -44,4 +50,8 @@ const (
|
||||
LEADER_PROGRAM = "leader_program"
|
||||
CREATOR_PROGRAM = "creator_program"
|
||||
ISSUE_MAX_CREATE = "issue_max_create"
|
||||
DATE_START_HOURS = "date_start_hours"
|
||||
DATE_STOP_HOURS = "date_stop_hours"
|
||||
DATE_BEGIN_DAYS = "date_begin_days"
|
||||
DATE_END_DAYS = "date_end_days"
|
||||
)
|
||||
|
@ -1,2 +1,4 @@
|
||||
Volcanos(chat.ONIMPORT, {
|
||||
})
|
||||
Volcanos(chat.ONACTION, {
|
||||
})
|
@ -5,17 +5,14 @@
|
||||
"process": "开始", "submit": "提交", "reback": "返工", "finish": "完成",
|
||||
"issueCreate": "原型设计", "designCreate": "界面设计", "taskCreate": "开发任务", "caseCreate": "测试用例",
|
||||
"issueList": "原型设计", "designList": "界面设计", "taskList": "开发任务", "caseList": "测试用例",
|
||||
"program": "编程", "discuss": "约会", "payfor": "支付", "setType": "设置类型", "bindPlan": "绑定计划",
|
||||
"note": "备注",
|
||||
"program": "编程", "discuss": "约会", "payfor": "支付", "bindPlan": "绑定计划",
|
||||
"note": "验收备注",
|
||||
"addNote": "备注",
|
||||
"noteList": "备注列表", "fileList": "附件列表", "meetList": "会议安排", "dealList": "支付记录",
|
||||
"noteList": "验收备注", "fileList": "附件列表", "meetList": "会议安排", "dealList": "支付记录",
|
||||
"planList": "迭代计划",
|
||||
"style": {
|
||||
"preview": "notice",
|
||||
"program": "notice",
|
||||
"discuss": "notice",
|
||||
"setScore": "notice",
|
||||
"payfor": "notice",
|
||||
"process": "notice",
|
||||
"submit": "notice",
|
||||
"reback": "danger",
|
||||
@ -109,8 +106,7 @@
|
||||
"solution": "方案型",
|
||||
"style": {
|
||||
"func": "danger",
|
||||
"matrix": "danger",
|
||||
"solution": "danger"
|
||||
"matrix": "danger"
|
||||
}
|
||||
},
|
||||
"plan_status": {
|
||||
|
@ -9,8 +9,11 @@ import (
|
||||
|
||||
type Stat struct {
|
||||
Tables
|
||||
order string `data:"8"`
|
||||
role string `data:"leader,worker"`
|
||||
order string `data:"8"`
|
||||
role string `data:"leader,worker"`
|
||||
main string `name:"main" help:"主页" style:"notice" role:"void"`
|
||||
info string `name:"info" help:"详情" style:"notice" role:"void"`
|
||||
member string `name:"member" help:"成员" style:"notice" role:"void"`
|
||||
}
|
||||
|
||||
func (s Stat) List(m *ice.Message, arg ...string) {
|
||||
@ -70,6 +73,7 @@ func (s Stat) List(m *ice.Message, arg ...string) {
|
||||
kit.If(kit.Int(value["price"]) > 0, func() { good++ })
|
||||
})
|
||||
m.Push("已入门", good)
|
||||
m.PushButton(s.Member, s.Info, s.Main)
|
||||
})
|
||||
stat := map[string]int{}
|
||||
m.Table(func(value ice.Maps) { kit.For(value, func(key, value string) { stat[key] += kit.Int(value) }) })
|
||||
@ -91,5 +95,8 @@ func (s Table) Count(m *ice.Message, target ice.Any, field string, arg ...string
|
||||
m.Cmd(target, s.Select, arg).Table(func(value ice.Maps) { stats[value[field]] = value[model.COUNT] })
|
||||
return stats
|
||||
}
|
||||
func (s Stat) Member(m *ice.Message, arg ...string) {}
|
||||
func (s Stat) Info(m *ice.Message, arg ...string) {}
|
||||
func (s Stat) Main(m *ice.Message, arg ...string) {}
|
||||
|
||||
func init() { ice.TeamCtxCmd(Stat{}) }
|
||||
|
@ -15,7 +15,16 @@ Volcanos(chat.ONIMPORT, {
|
||||
can.onimport.unitView(can, value, "界面设计中", "个"),
|
||||
]},
|
||||
] }, function(event, value) { if (value.story_uid == "0") { return }
|
||||
can.onimport.myStory(can, {index: "web.team.production.portal", args: [value.story_uid]})
|
||||
can.onimport._story(can.request(event, value), can, "web.team.production.portal")
|
||||
})
|
||||
},
|
||||
_story: function(event, can, index) {
|
||||
var msg = can.request(event); can.page.ClassList.del(can, can._fields, "_process")
|
||||
can.onimport.myStory(can, {index: index, args: [msg.Option("story_uid")]})
|
||||
},
|
||||
})
|
||||
Volcanos(chat.ONACTION, {
|
||||
main: function(event, can) { can.onimport._story(event, can, "web.team.production.portal") },
|
||||
info: function(event, can) { can.onimport._story(event, can, "web.team.production.issue") },
|
||||
member: function(event, can) { can.onimport._story(event, can, "web.team.production.member") },
|
||||
})
|
@ -1,9 +1,11 @@
|
||||
$output>div.tabs>div.item.select.PM待评审 { border-top:var(--box-danger) !important; }
|
||||
$output>div.tabs>div.item.select.PM待提交 { border-top:var(--box-danger) !important; }
|
||||
$output>div.tabs>div.item.select.PM待审批 { border-top:var(--box-danger) !important; }
|
||||
$output>div.tabs>div.item.select.PM待验收 { border-top:var(--box-danger) !important; }
|
||||
$output>div.tabs>div.item.select.UI待评审 { border-top:var(--box-danger) !important; }
|
||||
$output>div.tabs>div.item.select.UI待提交 { border-top:var(--box-danger) !important; }
|
||||
$output>div.tabs>div.item.select.UI待审批 { border-top:var(--box-danger) !important; }
|
||||
$output>div.tabs>div.item.select.UI待验收 { border-top:var(--box-danger) !important; }
|
||||
$output>div.tabs>div.item.select.RD可接单 { border-top:var(--box-danger) !important; }
|
||||
$output>div.tabs>div.item.select.RD可编程 { border-top:var(--box-danger) !important; }
|
||||
$output>div.tabs>div.item.select.QA可测试 { border-top:var(--box-danger) !important; }
|
||||
$output div.item.card span.status.PM待审批 { color:var(--danger-bg-color); }
|
||||
$output div.item.card span.status.PM待验收 { color:var(--danger-bg-color); }
|
||||
$output div.item.card span.status.UI待审批 { color:var(--danger-bg-color); }
|
||||
$output div.item.card span.status.UI待验收 { color:var(--danger-bg-color); }
|
||||
$output div.item.card span.status.RD可编程 { color:var(--danger-bg-color); }
|
@ -26,9 +26,10 @@ func (s take) List(m *ice.Message, arg ...string) {
|
||||
}
|
||||
push := func(val ice.Maps, t string) {
|
||||
m.Push(model.UPDATED_AT, kit.Select(val[model.CREATED_AT], val[model.UPDATED_AT]))
|
||||
m.Push(model.TYPE, t)
|
||||
m.Push(model.STATUS, t)
|
||||
m.Push(model.UID, val[model.UID])
|
||||
m.Push(model.TITLE, val[model.TITLE])
|
||||
m.Push(model.SCORE, val[model.SCORE])
|
||||
m.Push(model.CONTENT, kit.Select(val[model.CONTENT], val[model.ISSUE_CONTENT], val[model.DESIGN_CONTENT]))
|
||||
m.Push(model.LINK, val[model.LINK])
|
||||
m.Push(model.STORY_NAME, value[model.NAME])
|
||||
@ -95,16 +96,16 @@ func (s take) List(m *ice.Message, arg ...string) {
|
||||
})
|
||||
}
|
||||
})
|
||||
m.Display("").DisplayCSS("").Sort(kit.Fields(model.TYPE, model.UPDATED_AT), []string{
|
||||
m.Display("").DisplayCSS("").Sort(kit.Fields(model.STATUS, model.SCORE, model.UPDATED_AT), []string{
|
||||
"PM可接单", "UI可接单", "PM优秀项目", "UI优秀项目",
|
||||
"PM待审批", "PM待提交", "PM待验收",
|
||||
"UI待审批", "UI待提交", "UI待验收",
|
||||
"RD可接单", "RD可编程", "QA可测试",
|
||||
}, ice.STR_R)
|
||||
}, ice.INT_R, ice.STR_R)
|
||||
}
|
||||
func (s take) Info(m *ice.Message, arg ...string) {
|
||||
var target ice.Any
|
||||
switch m.Option(model.TYPE) {
|
||||
switch m.Option(model.STATUS) {
|
||||
case "PM可接单", "RD可接单":
|
||||
target = Plan{}
|
||||
case "UI可接单", "PM优秀项目", "PM待审批", "PM待提交", "PM待验收":
|
||||
|
@ -1,11 +1,14 @@
|
||||
Volcanos(chat.ONIMPORT, {
|
||||
_init: function(can, msg) {
|
||||
can.onimport.myViewTabs(can, TYPE, msg, function(value) { return [
|
||||
{view: html.TITLE, list: [value.story_name, value.title, can.onimport.textView(can, value, TYPE, STATUS)]},
|
||||
can.onimport.myViewTabs(can, STATUS, msg, function(value) { return [
|
||||
{view: html.TITLE, list: [value.story_name, value.title,
|
||||
can.onimport.unitView(can, value, "score", "星"),
|
||||
can.onimport.textView(can, value, STATUS),
|
||||
]},
|
||||
{view: html.STATUS, list: [can.onimport.uidView(can, value), can.onimport.timeView(can, value), value.user_name]},
|
||||
{view: html.OUTPUT, list: [value.content]}, can.onimport.titleAction(can, value),
|
||||
value.content && {view: html.OUTPUT, list: [value.content]}, can.onimport.titleAction(can, value),
|
||||
] }, function(event, value) { var index = "web.team.production.issue"
|
||||
switch (value.type) {
|
||||
switch (value.status) {
|
||||
case "PM可接单":
|
||||
case "RD可接单": index = "web.team.production.plan"; break
|
||||
case "UI优秀项目":
|
||||
|
@ -11,11 +11,11 @@ type Task struct {
|
||||
Table
|
||||
order string `data:"4"`
|
||||
role string `data:"leader,worker"`
|
||||
fields string `data:"title,content,status,space,path,case_count AS case_count,begin_time,end_time,process_time,finish_time,issue_uid,plan_uid,story_uid,user_uid"`
|
||||
fields string `data:"title,content,status,score,space,path,case_count AS case_count,begin_time,end_time,process_time,finish_time,issue_uid,plan_uid,story_uid,user_uid"`
|
||||
create string `name:"create issue_uid*:select title* content* space:select path:select begin_time:select@date end_time:select@date" role:"worker"`
|
||||
modify string `name:"modify title* content* space:select path:select begin_time*:select@date end_time*:select@date" role:"worker"`
|
||||
finish string `name:"finish" role:"worker"`
|
||||
caseCreate string `name:"caseCreate title* content* space:select index:select" role:"worker"`
|
||||
caseCreate string `name:"caseCreate title* content* space:select index:select" role:"leader"`
|
||||
}
|
||||
|
||||
func (s Task) Create(m *ice.Message, arg ...string) {
|
||||
@ -28,15 +28,22 @@ func (s Task) Remove(m *ice.Message, arg ...string) {
|
||||
s.issueCount(m).DashboardUpdate(m)
|
||||
}
|
||||
func (s Task) List(m *ice.Message, arg ...string) {
|
||||
defer kit.If(!s.IsLeader(m), func() { m.Action() })
|
||||
s.Orders(m, model.STATUS, model.CASE_COUNT, s.Desc(model.CREATED_AT)).Limit(m, 300)
|
||||
s.ValueList(m, arg)
|
||||
s.SelectJoinPlan(m)
|
||||
m.Table(func(value ice.Maps) {
|
||||
if IssueStatus(kit.Int(value[model.STATUS])) == IssueFinish {
|
||||
s.PushTaskButton(m, value, s.Program)
|
||||
} else {
|
||||
s.PushTaskButton(m, value, s.Program, s.CaseCreate)
|
||||
button := []ice.Any{}
|
||||
if s.IsLeader(m) || value[model.USER_UID] == m.Option(ice.MSG_USERUID) {
|
||||
button = append(button, s.Program)
|
||||
}
|
||||
if IssueStatus(kit.Int(value[model.STATUS])) != IssueFinish {
|
||||
button = append(button, s.CaseCreate)
|
||||
}
|
||||
if s.IsLeader(m) {
|
||||
button = append(button, s.SetScore)
|
||||
}
|
||||
s.PushTaskButton(m, value, button...)
|
||||
}).RenameAppend(model.STATUS, model.TASK_STATUS).Display("")
|
||||
s.OtherListCmd(m, s.IssueList, s.DesignList, s.CaseList)
|
||||
}
|
||||
|
@ -1,6 +1,6 @@
|
||||
Volcanos(chat.ONIMPORT, {
|
||||
_init: function(can, msg) {
|
||||
can.onimport.myView(can, msg, function(value) { return [
|
||||
can.onimport.myViewTabs(can, "task_status", msg, function(value) { return [
|
||||
{view: html.TITLE, list: [value.title, can.onimport.textView(can, value, "task_status")]},
|
||||
{view: html.STATUS, list: [
|
||||
(value.process_time||value.begin_time).split(" ")[0],
|
||||
@ -9,5 +9,14 @@ Volcanos(chat.ONIMPORT, {
|
||||
]},
|
||||
{view: html.OUTPUT, list: [value.content]}, can.onimport.titleAction(can, value),
|
||||
] })
|
||||
return
|
||||
if (msg.IsDetail()) {
|
||||
can.onappend.plugin(can, {
|
||||
height: can.ConfHeight()/2,
|
||||
space: msg.Append(web.SPACE),
|
||||
index: "web.team.production.coder",
|
||||
args: [msg.Append(nfs.PATH), "portal.go"],
|
||||
})
|
||||
}
|
||||
},
|
||||
})
|
@ -1,16 +0,0 @@
|
||||
{
|
||||
"70a1cbbc2ad42c73827cea5880e9ce86": {
|
||||
"meta": {
|
||||
"short": "name",
|
||||
"time": "2024-09-03 10:06:26.534",
|
||||
"vendor": "ssh.cloud.aliyun.ecs.launchTemplate"
|
||||
}
|
||||
},
|
||||
"c770a202d6983cfb80421fb6da92c750": {
|
||||
"meta": {
|
||||
"short": "name",
|
||||
"time": "2024-09-03 10:06:26.538",
|
||||
"vendor": "ssh.cloud.tencent.cvm.launchTemplate"
|
||||
}
|
||||
}
|
||||
}
|
@ -1,16 +0,0 @@
|
||||
{
|
||||
"1283d685cf3a8c277411c2ff203cdc54": {
|
||||
"meta": {
|
||||
"short": "domain",
|
||||
"time": "2024-09-03 10:06:26.533",
|
||||
"vendor": "ssh.cloud.aliyun.dns.domain"
|
||||
}
|
||||
},
|
||||
"6981b0dd2b1888d56dcaa61a2acb3ae8": {
|
||||
"meta": {
|
||||
"short": "domain",
|
||||
"time": "2024-09-03 10:06:26.539",
|
||||
"vendor": "ssh.cloud.tencent.domain.domain"
|
||||
}
|
||||
}
|
||||
}
|
@ -1,23 +0,0 @@
|
||||
{
|
||||
"0f1ee3476ccc863f5337d3d058bcb87f": {
|
||||
"meta": {
|
||||
"short": "instanceId",
|
||||
"time": "2024-09-03 10:06:26.538",
|
||||
"vendor": "ssh.cloud.tencent.cvm.instance"
|
||||
}
|
||||
},
|
||||
"7afa2eaccff223b089b1eb40bb03259a": {
|
||||
"meta": {
|
||||
"short": "instanceId",
|
||||
"time": "2024-09-03 10:06:26.540",
|
||||
"vendor": "ssh.cloud.tencent.lighthouse.instance"
|
||||
}
|
||||
},
|
||||
"8d704a3116531e1fcc00aa403fc34225": {
|
||||
"meta": {
|
||||
"short": "instanceId",
|
||||
"time": "2024-09-03 10:06:26.534",
|
||||
"vendor": "ssh.cloud.aliyun.ecs.instance"
|
||||
}
|
||||
}
|
||||
}
|
@ -1,34 +1,162 @@
|
||||
{
|
||||
"3a5880f6ddd07eb9fe27b3cb3afb3f7e": {
|
||||
"08b0f5fa3ccb3e2a769db220bc18bb04": {
|
||||
"meta": {
|
||||
"icon": "usr/icons/Calendar.png",
|
||||
"index": "web.team.plan",
|
||||
"name": "Calendar",
|
||||
"time": "2024-09-13 23:06:56.597"
|
||||
"args": "6475467d3f049066e57823836d6290b3",
|
||||
"icon": "/p/usr/avatar/7c8d151fed4a1ca06a45d2d16254a1fe.jpeg?pod=20240724-community",
|
||||
"index": "web.team.production.portal",
|
||||
"name": "portal",
|
||||
"score": "20000",
|
||||
"text": "ContextOS 云教育",
|
||||
"time": "2025-06-30 13:00:18.472"
|
||||
}
|
||||
},
|
||||
"adf694a4d378bcc855218c464fecb7d9": {
|
||||
"17775e747bb3dbfe964b2fed6fdbfc70": {
|
||||
"meta": {
|
||||
"icon": "usr/icons/Messages.png",
|
||||
"index": "web.chat.message",
|
||||
"name": "Messages",
|
||||
"time": "2024-09-13 23:06:56.597"
|
||||
"args": "44b87405ed5decd0620622d3bf777e2c",
|
||||
"icon": "/p/usr/avatar/3c3bc3f41832877413982558fbb73652.jpeg?pod=20240724-community",
|
||||
"index": "web.team.production.portal",
|
||||
"name": "portal",
|
||||
"score": "20000",
|
||||
"text": "ContextOS 云农业",
|
||||
"time": "2025-06-30 13:00:25.555"
|
||||
}
|
||||
},
|
||||
"c6365efa0c8373fcf2bc8d44618ad782": {
|
||||
"1fad4dd78b2de20b490375b76262ee8e": {
|
||||
"meta": {
|
||||
"icon": "usr/icons/Books.png",
|
||||
"index": "web.wiki.word",
|
||||
"name": "Books",
|
||||
"time": "2024-09-13 23:06:56.596"
|
||||
"args": "589c5de1aafb889f80b38d43efcf208b",
|
||||
"icon": "/p/usr/avatar/9eda30cf6aba517f357dd0ed5bd3a66e.jpeg?pod=20240724-community",
|
||||
"index": "web.team.production.portal",
|
||||
"name": "portal",
|
||||
"score": "20000",
|
||||
"text": "ContextOS 云健康",
|
||||
"time": "2025-06-30 12:59:51.307"
|
||||
}
|
||||
},
|
||||
"dc16860f819eb7f8ab85aee004508337": {
|
||||
"27eb7c9991a133da605bb766447cb3ea": {
|
||||
"meta": {
|
||||
"icon": "usr/icons/Photos.png",
|
||||
"index": "web.wiki.feel",
|
||||
"name": "Photos",
|
||||
"time": "2024-09-13 23:06:56.597"
|
||||
"score": "3",
|
||||
"text": "相册",
|
||||
"time": "2025-06-30 12:59:08.254"
|
||||
}
|
||||
},
|
||||
"2b0146f9da4607fcb2b27b784ad06b45": {
|
||||
"meta": {
|
||||
"args": "ecbedd0751caf9fd2f40b7bb71100c13",
|
||||
"icon": "/p/usr/avatar/c0c24165b7329f027b2a13c39a45ac45.jpeg?pod=20240724-community",
|
||||
"index": "web.team.production.portal",
|
||||
"name": "portal",
|
||||
"score": "20000",
|
||||
"text": "ContextOS 云研发",
|
||||
"time": "2025-06-30 13:00:05.187"
|
||||
}
|
||||
},
|
||||
"3b1b88442481cd8978be81a83b60e01c": {
|
||||
"meta": {
|
||||
"icon": "usr/icons/Messages.png",
|
||||
"index": "web.chat.message",
|
||||
"name": "Messages",
|
||||
"score": "1",
|
||||
"text": "消息",
|
||||
"time": "2025-06-30 12:59:08.254"
|
||||
}
|
||||
},
|
||||
"408f26cb38390e41100355cbf8473558": {
|
||||
"meta": {
|
||||
"icon": "src/main.jpg",
|
||||
"index": "web.team.production.portal",
|
||||
"name": "production.portal",
|
||||
"score": "10000",
|
||||
"text": "产品迭代",
|
||||
"time": "2025-06-30 12:59:16.511"
|
||||
}
|
||||
},
|
||||
"5aa5dd75035a98b79d5c05686588903c": {
|
||||
"meta": {
|
||||
"icon": "usr/icons/Calendar.png",
|
||||
"index": "web.team.plan",
|
||||
"name": "Calendar",
|
||||
"score": "2",
|
||||
"text": "日历",
|
||||
"time": "2025-06-30 12:59:08.254"
|
||||
}
|
||||
},
|
||||
"758ca692d288783f9a6f93cc2b136edf": {
|
||||
"meta": {
|
||||
"args": "7d3880d3f70acec5337d5f832ef71103",
|
||||
"icon": "/p/usr/avatar/548ed570567a0a6205c42f5100603032.jpeg?pod=20240724-community",
|
||||
"index": "web.team.production.portal",
|
||||
"name": "portal",
|
||||
"score": "20000",
|
||||
"text": "ContextOS 云社区",
|
||||
"time": "2025-06-30 12:59:37.580"
|
||||
}
|
||||
},
|
||||
"8bcfd0f8f9cd93d3bc68d776c5d89db6": {
|
||||
"meta": {
|
||||
"args": "073568d2c9d9a4d3940f9d750426c89f",
|
||||
"icon": "/p/usr/avatar/577f219db67f5a4e1993ff6a8a3ceadf.jpeg?pod=20240724-community",
|
||||
"index": "web.team.production.portal",
|
||||
"name": "portal",
|
||||
"score": "20000",
|
||||
"text": "ContextOS 云公益",
|
||||
"time": "2025-06-30 13:00:31.807"
|
||||
}
|
||||
},
|
||||
"8d5ca45b9930c78a2b8d300588b09180": {
|
||||
"meta": {
|
||||
"args": "3b0bb16110d0409974aa458b4d42ed22",
|
||||
"icon": "/p/usr/avatar/6a3385f9a40eb22e9360fcec0cb7a1bf.jpeg?pod=20240724-community",
|
||||
"index": "web.team.production.portal",
|
||||
"name": "portal",
|
||||
"score": "20000",
|
||||
"text": "ContextOS 云工业",
|
||||
"time": "2025-06-30 12:59:57.938"
|
||||
}
|
||||
},
|
||||
"b3daa01556623771aa7b915ae309e9f1": {
|
||||
"meta": {
|
||||
"args": "99d4760114fd0793a5d227bc2ac425e2",
|
||||
"icon": "/p/usr/avatar/caa5cb0d94c956e2eeca7b3e6a46cdce.jpeg?pod=20240724-community",
|
||||
"index": "web.team.production.portal",
|
||||
"name": "portal",
|
||||
"score": "20000",
|
||||
"text": "ContextOS 云知识",
|
||||
"time": "2025-06-30 12:59:29.636"
|
||||
}
|
||||
},
|
||||
"b46472e8729819949e021546bd3a939e": {
|
||||
"meta": {
|
||||
"icon": "usr/icons/Books.png",
|
||||
"index": "web.wiki.word",
|
||||
"name": "Books",
|
||||
"score": "4",
|
||||
"text": "文档",
|
||||
"time": "2025-06-30 12:59:08.254"
|
||||
}
|
||||
},
|
||||
"bd76751c3f793c52c974516d368d4177": {
|
||||
"meta": {
|
||||
"args": "38bf9b1f9ca309e54bc2fe1c3e8a21d2",
|
||||
"icon": "/p/usr/avatar/efc308186a68e411082ec43f4e5f26c0.jpeg?pod=20240724-community",
|
||||
"index": "web.team.production.portal",
|
||||
"name": "portal",
|
||||
"score": "20000",
|
||||
"text": "ContextOS 云办公",
|
||||
"time": "2025-06-30 13:00:12.793"
|
||||
}
|
||||
},
|
||||
"be0d8e9eb83b8c7ea0cc8288c8337ebd": {
|
||||
"meta": {
|
||||
"args": "97935dd7f5bdc181f67992da0cada756",
|
||||
"icon": "/p/usr/avatar/a1e84384ae350473443cba2b996e79ba.jpeg?pod=20240724-community",
|
||||
"index": "web.team.production.portal",
|
||||
"name": "portal",
|
||||
"score": "20000",
|
||||
"text": "ContextOS 云文旅",
|
||||
"time": "2025-06-30 12:59:44.470"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -4,7 +4,8 @@
|
||||
"icon": "usr/icons/Safari.png",
|
||||
"index": "web.chat.iframe",
|
||||
"name": "Safari",
|
||||
"time": "2024-09-13 23:06:56.598"
|
||||
"score": "2",
|
||||
"time": "2025-06-30 12:59:08.255"
|
||||
}
|
||||
},
|
||||
"514d8a494f087c0d549b9536c2ef3bd9": {
|
||||
@ -12,7 +13,8 @@
|
||||
"icon": "usr/icons/Terminal.png",
|
||||
"index": "web.code.xterm",
|
||||
"name": "Terminal",
|
||||
"time": "2024-09-13 23:06:56.599"
|
||||
"score": "5",
|
||||
"time": "2025-06-30 12:59:08.255"
|
||||
}
|
||||
},
|
||||
"a5255f07d36fc90fe78a719b0bdb943b": {
|
||||
@ -20,7 +22,8 @@
|
||||
"icon": "usr/icons/vimer.png",
|
||||
"index": "web.code.vimer",
|
||||
"name": "vimer",
|
||||
"time": "2024-09-13 23:06:56.599"
|
||||
"score": "3",
|
||||
"time": "2025-06-30 12:59:08.255"
|
||||
}
|
||||
},
|
||||
"ba9f11ecc3497d9993b933fdc2bd61e5": {
|
||||
@ -28,7 +31,8 @@
|
||||
"icon": "usr/icons/git.png",
|
||||
"index": "web.code.git.status",
|
||||
"name": "git",
|
||||
"time": "2024-09-13 23:06:56.599"
|
||||
"score": "4",
|
||||
"time": "2025-06-30 12:59:08.255"
|
||||
}
|
||||
},
|
||||
"d151508da8d36994e1635f7875594424": {
|
||||
@ -36,7 +40,8 @@
|
||||
"icon": "usr/icons/Finder.png",
|
||||
"index": "web.chat.macos.finder",
|
||||
"name": "Finder",
|
||||
"time": "2024-09-13 23:06:56.598"
|
||||
"score": "1",
|
||||
"time": "2025-06-30 12:59:08.255"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -129,7 +129,7 @@
|
||||
"meta": {
|
||||
"icons": "/p/src/gonganxitong/credit.png?pod=20240724-community",
|
||||
"index": "web.team.dashboard.credit",
|
||||
"name": "用户名片",
|
||||
"name": "服务名片",
|
||||
"order": "101",
|
||||
"time": "2025-06-04 13:58:49.123"
|
||||
}
|
||||
|
@ -32,7 +32,7 @@
|
||||
"meta": {
|
||||
"icons": "/p/src/gonganxitong/credit.png?pod=20240724-community",
|
||||
"index": "web.team.development.credit",
|
||||
"name": "用户名片",
|
||||
"name": "服务名片",
|
||||
"order": "101",
|
||||
"time": "2025-06-04 13:58:49.117"
|
||||
}
|
||||
|
@ -8,6 +8,16 @@
|
||||
"time": "2025-06-04 13:58:49.089"
|
||||
}
|
||||
},
|
||||
"1cfd36a7b8906ba77781b4f85d0a6190": {
|
||||
"meta": {
|
||||
"icons": "bi bi-people",
|
||||
"index": "web.team.gonganxitong.sess",
|
||||
"name": "会话管理",
|
||||
"order": "605",
|
||||
"role": "tech",
|
||||
"time": "2025-06-16 08:33:01.769"
|
||||
}
|
||||
},
|
||||
"27c6988eeb07c78cbb49aa15c577cfa4": {
|
||||
"meta": {
|
||||
"icons": "bi bi-pencil-square",
|
||||
@ -56,6 +66,26 @@
|
||||
"time": "2025-06-04 13:58:49.091"
|
||||
}
|
||||
},
|
||||
"b07b1f652f5b2557c0b20e813fcf99d2": {
|
||||
"meta": {
|
||||
"icons": "bi bi-buildings",
|
||||
"index": "web.team.gonganxitong.street",
|
||||
"name": "街道管理",
|
||||
"order": "601",
|
||||
"role": "tech",
|
||||
"time": "2025-06-16 08:33:01.775"
|
||||
}
|
||||
},
|
||||
"ba00879066bbcea83e30cda292d28a91": {
|
||||
"meta": {
|
||||
"icons": "bi bi-people",
|
||||
"index": "web.team.gonganxitong.user",
|
||||
"name": "用户管理",
|
||||
"order": "604",
|
||||
"role": "tech",
|
||||
"time": "2025-06-16 08:33:01.775"
|
||||
}
|
||||
},
|
||||
"bdec92d5849b2a60a8811cff494f2391": {
|
||||
"meta": {
|
||||
"icons": "bi bi-calendar4-week",
|
||||
@ -85,11 +115,21 @@
|
||||
"time": "2025-06-04 13:58:49.092"
|
||||
}
|
||||
},
|
||||
"d8443c1034bfe5917c52126a3306c328": {
|
||||
"meta": {
|
||||
"icons": "bi bi-buildings",
|
||||
"index": "web.team.gonganxitong.city",
|
||||
"name": "城市管理",
|
||||
"order": "602",
|
||||
"role": "tech",
|
||||
"time": "2025-06-16 08:33:01.772"
|
||||
}
|
||||
},
|
||||
"d86e4e63183c8fae4ceb50498b0bcfde": {
|
||||
"meta": {
|
||||
"icons": "bi bi-grid-3x2-gap",
|
||||
"index": "web.team.gonganxitong.domain",
|
||||
"name": "领域分类",
|
||||
"name": "领域管理",
|
||||
"order": "508",
|
||||
"role": "tech",
|
||||
"time": "2025-06-04 13:58:49.093"
|
||||
|
@ -56,7 +56,7 @@
|
||||
"meta": {
|
||||
"icons": "/p/src/gonganxitong/credit.png?pod=20240724-community",
|
||||
"index": "web.team.guanlixitong.credit",
|
||||
"name": "用户名片",
|
||||
"name": "服务名片",
|
||||
"order": "101",
|
||||
"time": "2025-06-04 13:58:49.085"
|
||||
}
|
||||
|
@ -79,7 +79,7 @@
|
||||
"meta": {
|
||||
"icons": "/p/src/gonganxitong/credit.png?pod=20240724-community",
|
||||
"index": "web.team.operation.credit",
|
||||
"name": "用户名片",
|
||||
"name": "服务名片",
|
||||
"order": "101",
|
||||
"time": "2025-06-04 13:58:49.012"
|
||||
}
|
||||
|
@ -189,7 +189,7 @@
|
||||
"meta": {
|
||||
"icons": "/p/src/gonganxitong/credit.png?pod=20240724-community",
|
||||
"index": "web.team.production.credit",
|
||||
"name": "用户名片",
|
||||
"name": "服务名片",
|
||||
"order": "101",
|
||||
"time": "2025-06-04 13:58:48.975"
|
||||
}
|
||||
|
@ -12,7 +12,7 @@
|
||||
"26c6b80577a23afcd2c10fcfea0c0f63": {
|
||||
"meta": {
|
||||
"auth": "issued",
|
||||
"icons": "https://img.icons8.com/officel/80/id-verified.png",
|
||||
"icons": "/p/usr/local/work/20240724-community/src/renzhengshouquan/transition.png",
|
||||
"index": "web.team.renzhengshouquan.transition",
|
||||
"name": "账单",
|
||||
"order": "5",
|
||||
@ -23,7 +23,7 @@
|
||||
"2a065e0a48b909ae79fbb3dd750e1eb5": {
|
||||
"meta": {
|
||||
"auth": "issued",
|
||||
"icons": "https://img.icons8.com/officel/80/id-verified.png",
|
||||
"icons": "/p/usr/local/work/20240724-community/src/renzhengshouquan/auth.png",
|
||||
"index": "web.team.renzhengshouquan.auth",
|
||||
"name": "认证授权",
|
||||
"order": "2",
|
||||
@ -82,7 +82,7 @@
|
||||
},
|
||||
"79283d05c3eb6007da9adcdc9751f68d": {
|
||||
"meta": {
|
||||
"icons": "https://img.icons8.com/officel/80/structured-document-data.png",
|
||||
"icons": "/p/usr/local/work/20240724-community/src/renzhengshouquan/admin.png",
|
||||
"index": "web.team.renzhengshouquan.admin",
|
||||
"name": "管理后台",
|
||||
"order": "51",
|
||||
@ -102,7 +102,7 @@
|
||||
},
|
||||
"89cf6f6cc69c13b7d541a0d61eae66e1": {
|
||||
"meta": {
|
||||
"icons": "https://img.icons8.com/officel/80/identification-documents--v2.png",
|
||||
"icons": "/p/usr/local/work/20240724-community/src/renzhengshouquan/cert.png",
|
||||
"index": "web.team.renzhengshouquan.cert",
|
||||
"name": "上传证件",
|
||||
"order": "1",
|
||||
@ -131,7 +131,7 @@
|
||||
"ab4f65f30762aeef9edb568315551be9": {
|
||||
"meta": {
|
||||
"auth": "issued",
|
||||
"icons": "https://img.icons8.com/officel/80/id-verified.png",
|
||||
"icons": "/p/usr/local/work/20240724-community/src/renzhengshouquan/account.png",
|
||||
"index": "web.team.renzhengshouquan.account",
|
||||
"name": "账户",
|
||||
"order": "4",
|
||||
@ -181,7 +181,7 @@
|
||||
"meta": {
|
||||
"icons": "/p/src/gonganxitong/credit.png?pod=20240724-community",
|
||||
"index": "web.team.renzhengshouquan.credit",
|
||||
"name": "用户名片",
|
||||
"name": "服务名片",
|
||||
"order": "101",
|
||||
"time": "2025-06-04 13:58:48.970"
|
||||
}
|
||||
|
@ -118,7 +118,7 @@
|
||||
"meta": {
|
||||
"icons": "/p/src/gonganxitong/credit.png?pod=20240724-community",
|
||||
"index": "web.team.storage.credit",
|
||||
"name": "用户名片",
|
||||
"name": "服务名片",
|
||||
"order": "101",
|
||||
"time": "2025-06-04 13:58:48.895"
|
||||
}
|
||||
|
16
usr/local/export/web.team.task/zone.json
Normal file
16
usr/local/export/web.team.task/zone.json
Normal file
@ -0,0 +1,16 @@
|
||||
{
|
||||
"4da463dcb391d40ec0352edd2e42b2d2": {
|
||||
"hash": {},
|
||||
"meta": {
|
||||
"time": "2025-06-21 17:14:37.142",
|
||||
"zone": "apply"
|
||||
}
|
||||
},
|
||||
"8812662dcf3e5db0247c0f85909363fc": {
|
||||
"hash": {},
|
||||
"meta": {
|
||||
"time": "2025-03-14 22:10:36.544",
|
||||
"zone": "dream"
|
||||
}
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user