diff --git a/src/dashboard/common.go b/src/dashboard/common.go index bba9a8b..67cd746 100644 --- a/src/dashboard/common.go +++ b/src/dashboard/common.go @@ -5,11 +5,11 @@ import ( kit "shylinux.com/x/toolkits" "shylinux.com/x/operation/src/dashboard/model" - "shylinux.com/x/operation/src/operation" + "shylinux.com/x/operation/src/production" ) type Table struct { - operation.Table + production.Table list string `name:"list dashboard_uid uid auto" role:"leader,worker,server"` } diff --git a/src/dashboard/portal.go b/src/dashboard/portal.go index ceb7d35..89d3ce0 100644 --- a/src/dashboard/portal.go +++ b/src/dashboard/portal.go @@ -2,14 +2,14 @@ package dashboard import ( "shylinux.com/x/community/src/gonganxitong" - "shylinux.com/x/operation/src/operation" + "shylinux.com/x/operation/src/production" ) type Portal struct { - operation.Portal + production.Portal placeCreate string `name:"placeCreate city_name* company_name* dashboard_name* dashboard_type:select" role:"void"` } func init() { - gonganxitong.PortalCmd(Portal{Portal: operation.NewPortal(userDashboard{}, dashboard{})}) + gonganxitong.PortalCmd(Portal{Portal: production.NewPortal(userDashboard{}, dashboard{})}) } diff --git a/src/dashboard/userDashboard.go b/src/dashboard/userDashboard.go index b86d834..423dfbb 100644 --- a/src/dashboard/userDashboard.go +++ b/src/dashboard/userDashboard.go @@ -3,13 +3,13 @@ package dashboard import ( "shylinux.com/x/ice" - "shylinux.com/x/operation/src/operation" + "shylinux.com/x/operation/src/production" ) type userDashboard struct{ Table } func init() { ice.TeamCtxCmd(userDashboard{}) } -type UserDashboardRole = operation.UserCloudRole +type UserDashboardRole = production.UserStoryRole -var UserDashboardRoleList = operation.UserCloudRoleList +var UserDashboardRoleList = production.UserStoryRoleList diff --git a/src/development/common.go b/src/development/common.go index cbd8d1f..d625962 100644 --- a/src/development/common.go +++ b/src/development/common.go @@ -9,11 +9,11 @@ import ( kit "shylinux.com/x/toolkits" "shylinux.com/x/operation/src/development/model" - "shylinux.com/x/operation/src/operation" + "shylinux.com/x/operation/src/production" ) type Table struct { - operation.Table + production.Table list string `name:"list repos_uid uid auto" role:"void"` } diff --git a/src/development/portal.go b/src/development/portal.go index 150ecf8..3c7616d 100644 --- a/src/development/portal.go +++ b/src/development/portal.go @@ -8,11 +8,11 @@ import ( "shylinux.com/x/community/src/gonganxitong" "shylinux.com/x/operation/src/development/model" - "shylinux.com/x/operation/src/operation" + "shylinux.com/x/operation/src/production" ) type Portal struct { - operation.Portal + production.Portal placeCreate string `name:"placeCreate city_name* company_name* repos_type*:select repos_name* repos_link" role:"void"` } @@ -27,4 +27,4 @@ func (s Portal) PlaceCreate(m *ice.Message, arg ...string) { s.Portal.PlaceCreate(m, arg...) } -func init() { gonganxitong.PortalCmd(Portal{Portal: operation.NewPortal(userRepos{}, repos{})}) } +func init() { gonganxitong.PortalCmd(Portal{Portal: production.NewPortal(userRepos{}, repos{})}) } diff --git a/src/development/userRepos.go b/src/development/userRepos.go index feea3ec..6369bf9 100644 --- a/src/development/userRepos.go +++ b/src/development/userRepos.go @@ -3,13 +3,13 @@ package development import ( "shylinux.com/x/ice" - "shylinux.com/x/operation/src/operation" + "shylinux.com/x/operation/src/production" ) type userRepos struct{ Table } func init() { ice.TeamCtxCmd(userRepos{}) } -type UserReposRole = operation.UserCloudRole +type UserReposRole = production.UserStoryRole -var UserReposRoleList = operation.UserCloudRoleList +var UserReposRoleList = production.UserStoryRoleList diff --git a/src/operation/common.go b/src/operation/common.go index afbeadd..1319474 100644 --- a/src/operation/common.go +++ b/src/operation/common.go @@ -4,13 +4,12 @@ import ( "shylinux.com/x/ice" kit "shylinux.com/x/toolkits" - "shylinux.com/x/community/src/gonganxitong" - "shylinux.com/x/enterprise/src/guanlixitong" "shylinux.com/x/operation/src/operation/model" + "shylinux.com/x/operation/src/production" ) type Table struct { - guanlixitong.Table + production.Table list string `name:"list cloud_uid uid auto" role:"void"` } @@ -44,15 +43,7 @@ func (s Table) RewriteAppend(m *ice.Message, arg ...string) *ice.Message { }) return s.Table.RewriteAppend(m) } -func (s Table) CheckRole(m *ice.Message, arg ...string) { - role := UserCloudRole(s.UserPlaceRole(m)) - m.WarnNotRight(!kit.IsIn(role.String(), append(arg, UserCloudCreator.String())...), role.String()) -} type Tables struct{ Table } func (s Tables) BeforeMigrate(m *ice.Message, arg ...string) {} - -func NewPortal(userPlace gonganxitong.UserPlacer, place gonganxitong.Placer) Portal { - return Portal{Portal: guanlixitong.NewPortal(userPlace, place)} -} diff --git a/src/operation/userCloud.go b/src/operation/userCloud.go index 4aaf27a..e10b3fc 100644 --- a/src/operation/userCloud.go +++ b/src/operation/userCloud.go @@ -1,27 +1,15 @@ package operation -import "shylinux.com/x/ice" +import ( + "shylinux.com/x/ice" + + "shylinux.com/x/operation/src/production" +) type userCloud struct{ Table } func init() { ice.TeamCtxCmd(userCloud{}) } -type UserCloudRole int +type UserCloudRole = production.UserStoryRole -const ( - UserCloudVisitor UserCloudRole = iota - UserCloudCreator - UserCloudLeader - UserCloudWorker - UserCloudServer -) - -var UserCloudRoleList = map[UserCloudRole]string{ - UserCloudVisitor: "visitor", - UserCloudCreator: "creator", - UserCloudLeader: "leader", - UserCloudWorker: "worker", - UserCloudServer: "server", -} - -func (s UserCloudRole) String() string { return UserCloudRoleList[s] } +var UserCloudRoleList = production.UserStoryRoleList diff --git a/src/production/care.go b/src/production/care.go index ceaa85d..45c810d 100644 --- a/src/production/care.go +++ b/src/production/care.go @@ -2,8 +2,9 @@ package production import ( "shylinux.com/x/ice" - "shylinux.com/x/operation/src/production/model" kit "shylinux.com/x/toolkits" + + "shylinux.com/x/operation/src/production/model" ) type care struct { @@ -14,9 +15,8 @@ type care struct { } func (s care) SetInfo(m *ice.Message, arg ...string) { - msg := m.Cmd(userStory{}, s.Select, model.STORY_UID, m.Option(model.STORY_UID), model.USER_UID, m.Option(model.UID)) - m.Option(model.UID, msg.Append(model.UID)) - m.Cmdy(s.PrefixMember(m), m.ActionKey(), arg) + 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) diff --git a/src/production/case.go b/src/production/case.go index 8578aeb..d15cfa1 100644 --- a/src/production/case.go +++ b/src/production/case.go @@ -2,7 +2,6 @@ package production import ( "shylinux.com/x/ice" - "shylinux.com/x/icebergs/base/web" kit "shylinux.com/x/toolkits" "shylinux.com/x/operation/src/production/model" @@ -27,12 +26,16 @@ func (s Case) Remove(m *ice.Message, arg ...string) { s.ValueRemove(m, arg...) s.taskCount(m) } +func (s Case) Cancel(m *ice.Message, arg ...string) { + s.ChangeStatus(m, int(IssueProcess), int(IssueCancel)) + s.taskCount(m) +} func (s Case) List(m *ice.Message, arg ...string) { 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[web.SPACE] == "" { + if value[model.SPACE] == "" { s.PushTaskButton(m, value) } else { s.PushTaskButton(m, value, s.Preview) diff --git a/src/production/coder.go b/src/production/coder.go index 7082115..d046682 100644 --- a/src/production/coder.go +++ b/src/production/coder.go @@ -11,14 +11,14 @@ import ( type coder struct { Tables list string `name:"list path file line auto" help:"编辑器" role:"void"` - render string `name:"render" 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"` } -func (s coder) Render(m *ice.Message, arg ...string) { m.Cmdy(code.VIMER, m.ActionKey(), arg) } 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) } @@ -31,9 +31,9 @@ func (s coder) cmd(m *ice.Message, arg ...string) { func (s coder) check(m *ice.Message, arg ...string) bool { 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)) - if m.Option("creator_program") == "on" && msg.Append("role") == "1" { + if s.SettingIsOn(m, CREATOR_PROGRAM) && msg.Append(model.ROLE) == "1" { return true - } else if m.Option("leader_program") == "on" && msg.Append("role") == "2" { + } else if s.SettingIsOn(m, LEADER_PROGRAM) && msg.Append(model.ROLE) == "2" { return true } else { m.WarnNotRight(true) diff --git a/src/production/common.go b/src/production/common.go index 1ea56c5..d4c266c 100644 --- a/src/production/common.go +++ b/src/production/common.go @@ -12,12 +12,13 @@ import ( "shylinux.com/x/icebergs/base/web" kit "shylinux.com/x/toolkits" - "shylinux.com/x/operation/src/operation" + "shylinux.com/x/community/src/gonganxitong" + "shylinux.com/x/enterprise/src/guanlixitong" "shylinux.com/x/operation/src/production/model" ) type Table struct { - operation.Table + guanlixitong.Table remove string `name:"remove" role:"worker"` reject string `name:"reject" role:"leader"` approve string `name:"approve" role:"leader"` @@ -130,18 +131,21 @@ func (s Table) RewriteAppend(m *ice.Message, arg ...string) *ice.Message { }) return s.Table.RewriteAppend(m) } +func (s Table) CheckRole(m *ice.Message, arg ...string) { + role := UserStoryRole(s.UserPlaceRole(m)) + m.WarnNotRight(!kit.IsIn(role.String(), append(arg, UserStoryCreator.String())...), role.String()) +} func (s Table) DateInsert(m *ice.Message, arg ...string) { m.ProcessField(Date{}, []string{m.Option(model.STORY_UID)}, m.OptionSimple(model.ISSUE_UID)...) } func (s Table) PushIssueButton(m *ice.Message, value ice.Maps, arg ...ice.Any) { user_uid := m.Option(ice.MSG_USERUID) - // button := []ice.Any{s.Remove} button := []ice.Any{} defer func() { m.PushButton(button...) }() isCreator, isLeader, isWorker := s.IsCreator(m), s.IsLeader(m), s.IsWorker(m) - isLeaderApproved := isCreator || (isLeader && m.Option("leader_approved") == "on") - isLeaderFinish := isCreator || (isLeader && m.Option("leader_finish") == "on") - isLeaderPayfor := isCreator || (isLeader && m.Option("leader_payfor") == "on") + isLeaderApproved := isCreator || (isLeader && s.SettingIsOn(m, LEADER_APPROVED)) + isLeaderFinish := isCreator || (isLeader && s.SettingIsOn(m, LEADER_FINISH)) + isLeaderPayfor := isCreator || (isLeader && s.SettingIsOn(m, LEADER_PAYFOR)) kit.If(value[model.PLAN_TITLE] == "", func() { button = append(button, s.BindPlan) }) switch IssueStatus(kit.Int(value[model.STATUS])) { case IssueCreate: @@ -226,7 +230,8 @@ func (s Table) PushTaskButton(m *ice.Message, value ice.Maps, arg ...ice.Any) { user_uid := m.Option(ice.MSG_USERUID) button := []ice.Any{} defer func() { m.PushButton(button...) }() - isWorker := s.IsWorker(m) + isCreator, isLeader, isWorker := s.IsCreator(m), s.IsLeader(m), s.IsWorker(m) + isLeaderFinish := isCreator || (isLeader && s.SettingIsOn(m, LEADER_FINISH)) switch IssueStatus(kit.Int(value[model.STATUS])) { case IssueCreate: if user_uid == value[model.USER_UID] { @@ -239,6 +244,9 @@ func (s Table) PushTaskButton(m *ice.Message, value ice.Maps, arg ...ice.Any) { if user_uid == value[model.USER_UID] { button = append(button, s.Finish) } + if isLeaderFinish { + button = append(button, s.Cancel) + } case IssueFinish: if isWorker { button = append(button, arg...) @@ -258,21 +266,6 @@ func (s Table) StatusPrice(m *ice.Message, arg ...string) { }) } } -func (s Table) StatusCount(m *ice.Message, arg ...string) { - if m.Length() > 0 && len(arg) < 2 { - msg := m.Spawn() - s.Fields(msg, "status, count(*) AS count").Groups(msg, model.STATUS).Orders(msg, model.STATUS) - s.Select(msg, model.STORY_UID, arg[0]).Table(func(value ice.Maps) { - switch status := kit.Int(value[model.STATUS]); m.CommandKey() { - case "plan": - m.Echo(PlanStatus(status).String()).Echo(": ") - case "issue", "design", "task", "case": - m.Echo(IssueStatus(status).String()).Echo(": ") - } - m.Echo(value[model.COUNT]).Echo("\n") - }) - } -} func (s Table) UserInfo(m *ice.Message, arg ...string) { m.ProcessField(care{}, []string{m.Option(model.STORY_UID), m.Option(model.UID)}, arg...) } @@ -301,10 +294,6 @@ func (s Table) Reback(m *ice.Message, arg ...string) { s.ChangeStatus(m, int(IssueSubmit), int(IssueProcess)) s.sendTemplate(m, "", "", "") } -func (s Table) sendTemplate(m *ice.Message, from, to, title string, arg ...string) { - msg := s.Select(m.Spawn(), m.OptionSimple(model.UID)...) - s.SendTemplate(m, from, msg.Append(model.USER_UID), title, arg...) -} func (s Table) Cancel(m *ice.Message, arg ...string) { s.ChangeStatus(m, int(IssueProcess), int(IssueCancel)) s.sendTemplate(m, "", "", "") @@ -316,6 +305,10 @@ 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)))) } +func (s Table) sendTemplate(m *ice.Message, from, to, title string, arg ...string) { + msg := s.Select(m.Spawn(), m.OptionSimple(model.UID)...) + 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"), @@ -477,3 +470,7 @@ func (s Table) taskCount(m *ice.Message) Table { return s.addCount(m, Task{}) } type Tables struct{ Table } func (s Tables) BeforeMigrate(m *ice.Message, arg ...string) {} + +func NewPortal(userPlace gonganxitong.UserPlacer, place gonganxitong.Placer) Portal { + return Portal{Portal: guanlixitong.NewPortal(userPlace, place)} +} diff --git a/src/production/date.go b/src/production/date.go index 3e1aa77..13df3fd 100644 --- a/src/production/date.go +++ b/src/production/date.go @@ -1,10 +1,12 @@ package production import ( - "shylinux.com/x/ice" - "shylinux.com/x/operation/src/production/model" - kit "shylinux.com/x/toolkits" "strings" + + "shylinux.com/x/ice" + kit "shylinux.com/x/toolkits" + + "shylinux.com/x/operation/src/production/model" ) type Date struct { @@ -18,7 +20,7 @@ func (s Date) Inputs(m *ice.Message, arg ...string) { switch arg[0] { case model.ISSUE_UID: args := m.OptionSimple(model.STORY_UID) - switch MeetType(kit.Int(m.Option("meet_type"))) { + switch MeetType(kit.Int(m.Option(model.MEET_TYPE))) { case MeetTalk: args = append(args, model.STATUS, kit.Format(IssueCreate)) case MeetValue: @@ -59,11 +61,11 @@ func init() { ice.TeamCtxCmd(Date{}) } func (s Date) head(m *ice.Message, arg ...string) { head := []string{} - for i := -kit.Int(m.OptionDefault("date_begin", kit.Select("0", "2", !m.IsMobileUA()))); i < kit.Int(m.OptionDefault("date_end", "3")); i++ { + for i := -kit.Int(m.OptionDefault("date_begin", kit.Select("2", "0", m.IsMobileUA()))); i < kit.Int(m.OptionDefault("date_end", "3")); i++ { head = append(head, strings.Split(m.Time(kit.Format("%dh", i*24)), " ")[0]) } list := []string{} - for i := kit.Int(m.OptionDefault("date_start", "18")); i < kit.Int(m.OptionDefault("date_stop", "48")); i++ { + for i := kit.Int(m.OptionDefault("date_start", "20")); i < kit.Int(m.OptionDefault("date_stop", "46")); i++ { if i%2 == 0 { list = append(list, kit.Format("%2d:00", i/2)) } else { diff --git a/src/production/deal.go b/src/production/deal.go index 5bea88c..d8c9e7f 100644 --- a/src/production/deal.go +++ b/src/production/deal.go @@ -2,8 +2,9 @@ package production import ( "shylinux.com/x/ice" - "shylinux.com/x/operation/src/production/model" kit "shylinux.com/x/toolkits" + + "shylinux.com/x/operation/src/production/model" ) type Deal struct { diff --git a/src/production/model/model.go b/src/production/model/model.go index 8a25fd7..908e7cb 100644 --- a/src/production/model/model.go +++ b/src/production/model/model.go @@ -58,6 +58,7 @@ const ( TO_USER_UID = "to_user_uid" BEGIN_TIME = "begin_time" END_TIME = "end_time" + SPACE = "space" ) type UserStory struct { @@ -107,6 +108,27 @@ type Case struct { Space string `gorm:"type:varchar(64)"` Index string `gorm:"type:varchar(64)"` } + +type Note struct { + db.ModelContent + CompanyUID string `gorm:"type:char(32);index"` + StoryUID string `gorm:"type:char(32);index"` + PlanUID string `gorm:"type:char(32);index"` + IssueUID string `gorm:"type:char(32);index"` + FromUserUID string `gorm:"type:char(32);index"` + ToUserUID string `gorm:"type:char(32);index"` +} +type File struct { + db.ModelContent + CompanyUID string `gorm:"type:char(32);index"` + StoryUID string `gorm:"type:char(32);index"` + PlanUID string `gorm:"type:char(32);index"` + IssueUID string `gorm:"type:char(32);index"` + Link string `gorm:"type:varchar(255)"` + Name string `gorm:"type:varchar(128)"` + Type uint8 `gorm:"default:0"` + Size int `gorm:"default:0"` +} type Meet struct { db.ModelContent CompanyUID string `gorm:"type:char(32);index"` @@ -130,29 +152,9 @@ type Deal struct { ToUserUID string `gorm:"type:char(32);index"` Price int `gorm:"default:0"` } -type File struct { - db.ModelContent - CompanyUID string `gorm:"type:char(32);index"` - StoryUID string `gorm:"type:char(32);index"` - PlanUID string `gorm:"type:char(32);index"` - IssueUID string `gorm:"type:char(32);index"` - Link string `gorm:"type:varchar(255)"` - Name string `gorm:"type:varchar(128)"` - Type uint8 `gorm:"default:0"` - Size int `gorm:"default:0"` -} -type Note struct { - db.ModelContent - CompanyUID string `gorm:"type:char(32);index"` - StoryUID string `gorm:"type:char(32);index"` - PlanUID string `gorm:"type:char(32);index"` - IssueUID string `gorm:"type:char(32);index"` - FromUserUID string `gorm:"type:char(32);index"` - ToUserUID string `gorm:"type:char(32);index"` -} func init() { - db.CmdModels("", &UserStory{}, &Story{}, &Plan{}, &Issue{}, &Design{}, &Task{}, &Case{}, &Meet{}, &Deal{}, &File{}, &Note{}) + db.CmdModels("", &UserStory{}, &Story{}, &Plan{}, &Issue{}, &Design{}, &Task{}, &Case{}, &Note{}, &File{}, &Meet{}, &Deal{}) } type Common struct { diff --git a/src/production/note.go b/src/production/note.go index a1ad5dd..af54b33 100644 --- a/src/production/note.go +++ b/src/production/note.go @@ -14,9 +14,8 @@ func (s Note) Create(m *ice.Message, arg ...string) { s.SendTemplate(m, "", "", "") } func (s Note) List(m *ice.Message, arg ...string) { - s.ValueList(m, arg) + s.ValueList(m, arg).PushAction() s.OtherListCmd(m, s.IssueList, s.DesignList) - // s.ValueList(m, arg).Display("") } func init() { ice.TeamCtxCmd(Note{}) } diff --git a/src/production/plan.css b/src/production/plan.css index d600c17..b7dfb5c 100644 --- a/src/production/plan.css +++ b/src/production/plan.css @@ -1,3 +1,2 @@ -// $output div.item.card>div.output span.status.create { color:var(--danger-bg-color); } 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; } \ No newline at end of file diff --git a/src/production/plan.go b/src/production/plan.go index 143d273..43a3705 100644 --- a/src/production/plan.go +++ b/src/production/plan.go @@ -11,11 +11,12 @@ type Plan struct { Table order string `data:"1"` fields string `data:"updated_at,title,content,version,plan_type,plan_status,issue_count,begin_time,end_time,process_time,finish_time,story_uid,user_uid"` - create string `name:"create title* content version:select begin_time:select@date end_time:select@date" role:"leader"` - modify string `name:"modify title* content version:select begin_time:select@date end_time:select@date" role:"leader"` + 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:"交接"` issueCreate string `name:"issueCreate title* issue_content* price=1000 begin_time:select@date end_time:select@date" role:"worker"` } @@ -45,7 +46,7 @@ func (s Plan) List(m *ice.Message, arg ...string) { switch PlanStatus(kit.Int(value[model.PLAN_STATUS])) { case PlanCreate: if isLeader { - button = append(button, s.Process, s.Modify, s.Remove) + button = append(button, s.Process, s.Handover, s.Modify, s.Remove) } case PlanProcess: if isWorker && kit.Int(value[model.ISSUE_COUNT]) == 0 { @@ -57,6 +58,9 @@ func (s Plan) List(m *ice.Message, arg ...string) { if isCreator { button = append(button, s.SetType) } + if isLeader { + button = append(button, s.Handover) + } if isLeader && kit.Int(value[model.ISSUE_COUNT]) > 0 { button = append(button, s.Finish) } @@ -64,6 +68,9 @@ func (s Plan) List(m *ice.Message, arg ...string) { button = append(button, s.Remove) } case PlanFinish: + if isLeader { + button = append(button, s.Handover) + } if isCreator { button = append(button, s.SetType) } @@ -87,7 +94,15 @@ 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)...) } -func (s Plan) IssueCreate(m *ice.Message, arg ...string) { s.commonOtherCreate(m, Issue{}, arg...) } +func (s Plan) Handover(m *ice.Message, arg ...string) { + m.OptionDefault(model.TO_USER_UID, m.Option(ice.MSG_USERUID)) + s.Modify(m, model.USER_UID, m.Option(model.TO_USER_UID)) + s.SendTemplate(m, "", "", "") + m.ProcessHold() +} +func (s Plan) IssueCreate(m *ice.Message, arg ...string) { + s.commonOtherCreate(m, Issue{}, arg...) +} func init() { ice.TeamCtxCmd(Plan{}) } diff --git a/src/production/portal.go b/src/production/portal.go index 42a7018..7878b08 100644 --- a/src/production/portal.go +++ b/src/production/portal.go @@ -3,6 +3,7 @@ package production import ( "shylinux.com/x/ice" + "shylinux.com/x/community/src/api" "shylinux.com/x/community/src/gonganxitong" "shylinux.com/x/enterprise/src/guanlixitong" "shylinux.com/x/operation/src/production/model" @@ -15,13 +16,16 @@ type Portal struct { func (s Plan) AfterMigrate(m *ice.Message, arg ...string) { s.Table.AfterMigrate(m, arg...) - s.SettingCreate(m, "leader_approved", "", "允许管理人员审批项目", "creator", "100") - s.SettingCreate(m, "leader_finish", "", "允许管理人员验收项目", "creator", "101") - s.SettingCreate(m, "leader_payfor", "", "允许管理人员支付项目", "creator", "102") - s.SettingCreate(m, "leader_program", "", "允许管理人员本地开发", "tech", "103") - s.SettingCreate(m, "creator_program", "", "允许创建人本地开发", "tech", "104") + s.SettingCreate(m, LEADER_APPROVED, "", "允许管理人员审批项目", api.CREATOR, "100") + s.SettingCreate(m, LEADER_FINISH, "", "允许管理人员验收项目", api.CREATOR, "101") + s.SettingCreate(m, LEADER_PAYFOR, "", "允许管理人员支付项目", api.CREATOR, "102") + s.SettingCreate(m, LEADER_PROGRAM, "", "允许管理人员本地开发", api.TECH, "103") + s.SettingCreate(m, CREATOR_PROGRAM, "", "允许创建人本地开发", api.TECH, "104") } func (s Portal) AfterPlaceAuth(m *ice.Message, arg ...string) { + if m.PrefixKey() != ice.GetTypeKey(s) { + return + } 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) @@ -30,3 +34,11 @@ func (s Portal) AfterPlaceAuth(m *ice.Message, arg ...string) { } func init() { gonganxitong.PortalCmd(Portal{Portal: guanlixitong.NewPortal(userStory{}, story{})}) } + +const ( + LEADER_APPROVED = "leader_approved" + LEADER_FINISH = "leader_finish" + LEADER_PAYFOR = "leader_payfor" + LEADER_PROGRAM = "leader_program" + CREATOR_PROGRAM = "creator_program" +) diff --git a/src/production/portal.js b/src/production/portal.js index 925f336..06b2bd2 100644 --- a/src/production/portal.js +++ b/src/production/portal.js @@ -1,5 +1,2 @@ Volcanos(chat.ONIMPORT, { - beginTime: function(can, value) { - return (value.process_time||value.begin_time).split(" ")[0]+" ~ "+(value.finish_time||value.end_time).split(" ")[0] - }, }) \ No newline at end of file diff --git a/src/production/stat.go b/src/production/stat.go index df6c8b6..347bc36 100644 --- a/src/production/stat.go +++ b/src/production/stat.go @@ -2,8 +2,9 @@ package production import ( "shylinux.com/x/ice" - "shylinux.com/x/operation/src/production/model" kit "shylinux.com/x/toolkits" + + "shylinux.com/x/operation/src/production/model" ) type Stat struct { diff --git a/src/production/stat.js b/src/production/stat.js index 968e5e8..fe50378 100644 --- a/src/production/stat.js +++ b/src/production/stat.js @@ -1,7 +1,5 @@ Volcanos(chat.ONIMPORT, { _init: function(can, msg) { - // msg.Dump(can) - // return can.onimport.myView(can, msg, function(value) { return [ {view: html.TITLE, list: [ value.name, value["已入门"]+"人"+" / "+value["成员人数"]+"人", diff --git a/src/production/task.js b/src/production/task.js index 802cd1d..4a4f847 100644 --- a/src/production/task.js +++ b/src/production/task.js @@ -3,7 +3,6 @@ Volcanos(chat.ONIMPORT, { can.onimport.myView(can, msg, function(value) { return [ {view: html.TITLE, list: [value.title, can.onimport.textView(can, value, "task_status")]}, {view: html.STATUS, list: [ - // can.onimport.beginTime(can, value), (value.process_time||value.begin_time).split(" ")[0], can.onimport.unitView(can, value, "plan_title"), can.onimport.unitView(can, value, "case_count", "个"), diff --git a/src/production/userStory.go b/src/production/userStory.go index c084ec9..b24e861 100644 --- a/src/production/userStory.go +++ b/src/production/userStory.go @@ -2,14 +2,28 @@ package production import ( "shylinux.com/x/ice" - - "shylinux.com/x/operation/src/operation" ) type userStory struct{ Table } func init() { ice.TeamCtxCmd(userStory{}) } -type UserStoryRole = operation.UserCloudRole +type UserStoryRole int -var UserStoryRoleList = operation.UserCloudRoleList +const ( + UserStoryVisitor UserStoryRole = iota + UserStoryCreator + UserStoryLeader + UserStoryWorker + UserStoryServer +) + +var UserStoryRoleList = map[UserStoryRole]string{ + UserStoryVisitor: "visitor", + UserStoryCreator: "creator", + UserStoryLeader: "leader", + UserStoryWorker: "worker", + UserStoryServer: "server", +} + +func (s UserStoryRole) String() string { return UserStoryRoleList[s] } diff --git a/src/storage/common.go b/src/storage/common.go index 1d284a3..7578323 100644 --- a/src/storage/common.go +++ b/src/storage/common.go @@ -4,12 +4,12 @@ import ( "shylinux.com/x/ice" kit "shylinux.com/x/toolkits" - "shylinux.com/x/enterprise/src/guanlixitong" + "shylinux.com/x/operation/src/production" "shylinux.com/x/operation/src/storage/model" ) type Table struct { - guanlixitong.Table + production.Table list string `name:"list storage_uid uid auto" role:"void"` } diff --git a/src/storage/portal.go b/src/storage/portal.go index 4c7bc1f..7629824 100644 --- a/src/storage/portal.go +++ b/src/storage/portal.go @@ -4,11 +4,11 @@ import ( "shylinux.com/x/ice" "shylinux.com/x/community/src/gonganxitong" - "shylinux.com/x/enterprise/src/guanlixitong" + "shylinux.com/x/operation/src/production" ) type Portal struct { - guanlixitong.Portal + production.Portal placeCreate string `name:"placeCreate city_name* company_name* storage_name* storage_type:select" role:"void"` } @@ -18,4 +18,4 @@ func (s Portal) AfterPlaceAuth(m *ice.Message, arg ...string) { s.DashboardInsert(m, 2, "文件大小", "size", file{}, "SUM(size)") } -func init() { gonganxitong.PortalCmd(Portal{Portal: guanlixitong.NewPortal(userStorage{}, storage{})}) } +func init() { gonganxitong.PortalCmd(Portal{Portal: production.NewPortal(userStorage{}, storage{})}) } diff --git a/src/storage/userStorage.go b/src/storage/userStorage.go index 2bd4ab4..86d5b75 100644 --- a/src/storage/userStorage.go +++ b/src/storage/userStorage.go @@ -3,13 +3,13 @@ package storage import ( "shylinux.com/x/ice" - "shylinux.com/x/enterprise/src/guanlixitong" + "shylinux.com/x/operation/src/production" ) type userStorage struct{ Table } func init() { ice.TeamCtxCmd(userStorage{}) } -type UserStorageRole = guanlixitong.UserGroupRole +type UserStorageRole = production.UserStoryRole -var UserStorageRoleList = guanlixitong.UserGroupRoleList \ No newline at end of file +var UserStorageRoleList = production.UserStoryRoleList