diff --git a/FrontEnd/admin.html b/FrontEnd/admin.html index e69de29..c7ae2e3 100644 --- a/FrontEnd/admin.html +++ b/FrontEnd/admin.html @@ -0,0 +1,5 @@ + + +

管理

+ + diff --git a/FrontEnd/assignment.html b/FrontEnd/assignment.html index e69de29..125b341 100644 --- a/FrontEnd/assignment.html +++ b/FrontEnd/assignment.html @@ -0,0 +1,7 @@ + + +
+

今日值班表

+
+ + diff --git a/config.yaml b/config.yaml index 92cd2a8..feffc28 100644 --- a/config.yaml +++ b/config.yaml @@ -7,8 +7,7 @@ DB: User: "" # not need if use SQLite Password: "" # not need if use SQLite Name: "" # not need if use SQLite - -[business] +#[business] Session: "2024-2025" #学年 Semester: 1 #学期,1 或 2 StartTime: "2024-9-14" #开始值班的日期 diff --git a/config/config.go b/config/config.go index 325cf89..355a9f0 100644 --- a/config/config.go +++ b/config/config.go @@ -2,6 +2,7 @@ package config import ( "fmt" + "github.com/golang-module/carbon/v2" "github.com/spf13/viper" "os" ) @@ -22,6 +23,13 @@ func Load() { handleArguments() } + carbon.SetDefault(carbon.Default{ + Layout: carbon.DateTimeLayout, + Timezone: carbon.PRC, + WeekStartsAt: carbon.Sunday, + Locale: "zh-CN", // 取值范围:lang 目录下翻译文件名,不包含文件后缀 + }) + } func check() { diff --git a/config/middleware.go b/config/middleware.go index 2193924..6e1b628 100644 --- a/config/middleware.go +++ b/config/middleware.go @@ -1,12 +1,13 @@ package config -import ( - "github.com/labstack/echo/v4" - "github.com/labstack/echo/v4/middleware" -) - -func Middleware(app *echo.Echo) { - //here are middlewares we use - app.Use(middleware.Logger()) - app.Use(middleware.Recover()) -} +// +// import ( +// "github.com/labstack/echo/v4" +// "github.com/labstack/echo/v4/middleware" +// ) +// +// func Middleware(app *echo.Echo) { +// //here are middlewares we use +// app.Use(middleware.Logger()) +// app.Use(middleware.Recover()) +// } diff --git a/config/route.go b/config/route.go index 028eed2..2bd1302 100644 --- a/config/route.go +++ b/config/route.go @@ -1,12 +1,17 @@ package config -import ( - "github.com/labstack/echo/v4" - "github.com/labstack/echo/v4/middleware" -) - -func Route(app *echo.Echo) { - // here is the route for our site - staticFiles := app.Group("/") - staticFiles.Use(middleware.Static("./FrontEnd")) -} +// +// import ( +// "github.com/labstack/echo/v4" +// "github.com/labstack/echo/v4/middleware" +// "zsxyww.com/scheduler/handler" +// ) +// +// func Route(app *echo.Echo) { +// // here is the route for our site +// staticFiles := app.Group("/") +// staticFiles.Use(middleware.Static("./FrontEnd")) +// +// api := app.Group("/api/") +// api.GET("/getAssignment", handler.GetAssignment) +// } diff --git a/doc/assignment_test.csv b/doc/assignment_test.csv new file mode 100644 index 0000000..c519df9 --- /dev/null +++ b/doc/assignment_test.csv @@ -0,0 +1,6 @@ +姓名,工号,性别,权限,有空 +aaa,2301,1,6,1 +bbb,2303,0,6,1 +ccc,2303,1,6,1 +mam,2304,1,6,5 +waw,2305,0,6,5 diff --git a/doc/换班补班的业务描述.md b/doc/换班补班的业务描述.md new file mode 100644 index 0000000..04970bb --- /dev/null +++ b/doc/换班补班的业务描述.md @@ -0,0 +1,5 @@ +# 业务描述 +这里是业务描述备忘录 +## 换班 +首先,由换班的发起人填写 +为 diff --git a/doc/排班算法.md b/doc/排班算法.md new file mode 100644 index 0000000..2ea4fa3 --- /dev/null +++ b/doc/排班算法.md @@ -0,0 +1,10 @@ +# 描述 +网络维护科(简称为网维)是学校中负责修理同学们网络问题的公益性组织,由大二,大三的正式成员和大一的实习成员组成。 + +每天,网维都会去学校里的各个宿舍片区修理同学们上报的网络问题(称之为值班),每个片区由一个片区负责人所统领值班,这个负责人必须是正式成员。其余的人员为正式成员或者实习成员。每个成员每周只用值班1天,每天只会在某个具体的片区值班,具体是哪一天取决于他们的空闲时间。 + +网维所负责值班的片区一共有6个,称为1-6号,其中1-3号为女生片区,4-6号为男生片区。由于网维男生的数量远多于女生,所以必须要让男生进入女生宿舍片区值班,但是,女生会被优先安排在女生宿舍值班,换句话说,女生只可以出现在女生片区。 + +为了让实习成员熟悉每一个片区,每两周都会轮换值班每位成员负责值班的的片区,片区的轮换遵守上面的规则,也就是说,女生只会在女生片区内轮换,男生则会在全部的片区内轮换。 + +一个学期值班的周数不确定,但是一般不会少于12周,即可以轮换到每个成员。 diff --git a/go.mod b/go.mod index 5284429..cca53eb 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,9 @@ go 1.23.2 require ( github.com/fsnotify/fsnotify v1.7.0 // indirect + github.com/gocarina/gocsv v0.0.0-20240520201108-78e41c74b4b1 // indirect github.com/golang-jwt/jwt v3.2.2+incompatible // indirect + github.com/golang-module/carbon/v2 v2.4.1 // indirect github.com/hashicorp/hcl v1.0.0 // indirect github.com/jinzhu/inflection v1.0.0 // indirect github.com/jinzhu/now v1.1.5 // indirect diff --git a/go.sum b/go.sum index e7072b4..78b0de4 100644 --- a/go.sum +++ b/go.sum @@ -2,8 +2,12 @@ github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= +github.com/gocarina/gocsv v0.0.0-20240520201108-78e41c74b4b1 h1:FWNFq4fM1wPfcK40yHE5UO3RUdSNPaBC+j3PokzA6OQ= +github.com/gocarina/gocsv v0.0.0-20240520201108-78e41c74b4b1/go.mod h1:5YoVOkjYAQumqlV356Hj3xeYh4BdZuLE0/nRkf2NKkI= github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY= github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= +github.com/golang-module/carbon/v2 v2.4.1 h1:cYUD8T+rHeX+qIybGYpnJ8I90F10dvyEF67VNOO+zZM= +github.com/golang-module/carbon/v2 v2.4.1/go.mod h1:1jP9AZ4k2+lmfgY/wZgmtsN52VcHC5YuPM6varKDTkM= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= diff --git a/handler/assignments.go b/handler/assignments.go new file mode 100644 index 0000000..2ff66a8 --- /dev/null +++ b/handler/assignments.go @@ -0,0 +1,104 @@ +package handler + +import ( + "fmt" + "github.com/gocarina/gocsv" + "github.com/golang-module/carbon/v2" + "github.com/labstack/echo/v4" + "net/http" + "os" + "zsxyww.com/scheduler/config" + "zsxyww.com/scheduler/model" + "zsxyww.com/scheduler/signals" +) + +func GetAssignment(i echo.Context) error { + if (carbon.Now().ToDateString() != signals.Table.LastUpdated.ToDateString()) || signals.Table.NeedUpdate == true { + fmt.Printf("At %v:start regenerate table", carbon.Now()) + err := generateTable() + if err != nil { + i.String(http.StatusInternalServerError, err.Error()) + return echo.ErrInternalServerError + } + return nil + } + return nil +} +func generateTable() error { + + table := [7][]string{} //结果放入这里 + members := []*model.Member{} //包含所有成员信息的切片 + + err := readTableData(&members) + if err != nil { + return err + } + + dayOfWeek := carbon.Now().DayOfWeek() //今天星期几 + today := []*model.Member{} //今天值班的人 + female := []*model.Member{} //今天的女生 + male := []*model.Member{} //今天的男生 + + for _, i := range members { + if i.FreeDay == dayOfWeek { + today = append(today, i) + } + } + + for _, i := range today { + if i.Sex == false { + female = append(female, i) + } else if i.Sex == true { + male = append(male, i) + } + } + //为女生宿舍分配负责人: + for i := 0; i < 4; i++ { + for _, x := range female { + if (x.Arranged == false) && (x.Access < model.FRESH) { + table[i] = append(table[i], x.Name) + x.Arranged = true + } + } + } + //男生负责人: + for i := 0; i < 7; i++ { + for _, x := range male { + if (x.Arranged == false) && (x.Access < model.FRESH) { + table[i] = append(table[i], x.Name) + x.Arranged = true + } + } + } + //女生成员 + for c, i := range female { + if i.Arranged == false { + table[(c % 4)] = append(table[(c%4)], i.Name) + } + } + //男生成员 + for c, i := range male { + if i.Arranged == false { + table[(c % 7)] = append(table[(c%7)], i.Name) + } + } + fmt.Printf("today:%v\n", today) + fmt.Printf("table:%v\n", table) + return nil +} +func readTableData(m *[]*model.Member) error { + data, err := os.OpenFile(config.File, os.O_RDWR|os.O_CREATE, os.ModePerm) + if err != nil { + return err + } + defer data.Close() + + err = gocsv.UnmarshalFile(data, m) + if err != nil { + return err + } + for index, member := range *m { + fmt.Printf("%v:%v\n", index, member) // for debug concerns + } + return nil +} diff --git a/main.go b/main.go index 2d129bf..2fe62f8 100644 --- a/main.go +++ b/main.go @@ -1,9 +1,11 @@ package main import ( + "fmt" "github.com/labstack/echo/v4" "zsxyww.com/scheduler/config" "zsxyww.com/scheduler/database" + "zsxyww.com/scheduler/route" ) func main() { @@ -13,8 +15,12 @@ func main() { app := echo.New() register(app) + + listenAddress := fmt.Sprintf(":%d", config.ListenPort) + + app.Logger.Fatal(app.Start(listenAddress)) } func register(app *echo.Echo) { - config.Route(app) - config.Middleware(app) + route.Route(app) + route.Middleware(app) } diff --git a/member.csv b/member.csv new file mode 100755 index 0000000..75896e9 --- /dev/null +++ b/member.csv @@ -0,0 +1,101 @@ +姓名,工号,性别,权限,有空 +王小明,10001,1,7,1 +李芳,10002,1,6,2 +张强,10003,0,3,5 +赵丽,10004,1,3,4 +孙浩,10005,1,7,5 +刘芳,10006,1,6,6 +陈伟,10007,1,6,7 +杨磊,10008,1,7,1 +张晓婷,10009,1,6,2 +王志,10010,1,6,3 +李军,10011,1,7,4 +赵玉,10012,0,2,5 +马琳,10013,1,7,6 +高飞,10014,1,7,7 +王凯,10015,1,6,1 +陈颖,10016,1,3,2 +刘宁,10017,1,6,3 +孙伟,10018,1,7,4 +周杰,10019,1,6,5 +张丽,10020,1,7,6 +李明,10021,1,6,7 +陈强,10022,0,3,5 +王芳,10023,1,7,2 +赵强,10024,1,7,3 +李欣,10025,1,7,4 +刘强,10026,1,6,5 +张飞,10027,1,7,6 +陈飞,10028,0,6,5 +李刚,10029,1,7,1 +赵勇,10030,1,6,2 +孙明,10031,1,7,3 +周飞,10032,1,6,4 +高伟,10033,1,7,5 +张晓明,10034,1,3,6 +赵伟,10035,1,7,7 +孙丽,10036,1,6,1 +王晓,10037,1,7,2 +陈霞,10038,0,2,3 +赵华,10039,1,7,4 +杨伟,10040,1,6,5 +张浩,10041,1,7,6 +李霞,10042,1,6,7 +刘伟,10043,1,7,1 +张伟,10044,1,6,2 +陈军,10045,1,6,3 +周丽,10046,1,7,4 +王宁,10047,0,2,5 +刘丽,10048,1,7,6 +赵强,10049,1,7,7 +孙宁,10050,1,6,1 +李丽,10051,1,7,2 +陈宁,10052,1,6,3 +赵明,10053,1,7,4 +高霞,10054,1,7,5 +张凯,10055,0,1,6 +孙霞,10056,1,7,7 +陈宁,10057,1,6,1 +刘军,10058,1,7,2 +王飞,10059,1,7,3 +张杰,10060,1,6,4 +赵刚,10061,1,7,5 +李晓明,10062,1,6,6 +高明,10063,1,7,7 +杨霞,10064,1,7,1 +王军,10065,1,6,2 +张霞,10066,1,6,3 +孙勇,10067,1,7,4 +赵丽华,10068,1,7,5 +刘伟华,10069,1,6,6 +杨强,10070,0,3,7 +李军华,10071,1,7,1 +张飞翔,10072,1,7,2 +陈小明,10073,1,6,3 +王志华,10074,1,7,4 +李浩,10075,1,6,5 +赵宁,10076,1,7,6 +刘宁华,10077,1,7,7 +孙杰,10078,1,6,1 +高磊,10079,1,7,2 +张宁,10080,1,6,3 +杨宁,10081,1,7,4 +陈丽,10082,0,3,5 +王丽,10083,1,7,6 +赵志华,10084,1,6,7 +孙丽华,10085,1,7,1 +刘志,10086,1,6,2 +张霞华,10087,1,7,3 +王磊,10088,1,7,4 +陈小杰,10089,1,6,5 +李宁华,10090,1,7,6 +赵丽杰,10091,1,7,7 +孙军,10092,1,6,1 +高志,10093,1,7,2 +张霞明,10094,1,6,3 +赵明华,10095,0,0,4 +陈志华,10096,1,6,5 +王丽华,10097,1,7,6 +李强,10098,1,7,7 +赵晓,10099,1,6,1 +杨磊明,10100,1,7,2 diff --git a/model/member.go b/model/member.go index d6f3a88..43dc46d 100644 --- a/model/member.go +++ b/model/member.go @@ -1,9 +1,20 @@ package model type Member struct { - ID int //工号 - Name string - Sex bool //不要把女生安排进男生宿舍,male=True - FreeDay int //哪天有空 - access int // 遵循报修系统的access enum ,用来标注管理层 + ID int `csv:"工号"` //工号 + Name string `csv:"姓名"` + Sex bool `csv:"性别"` //不要把女生安排进男生宿舍,male=True + FreeDay int `csv:"有空"` //哪天有空 + Access int `csv:"权限"` //遵循报修系统的access enum ,用来标注管理层 + Arranged bool `csv:"-"` //供分配程序使用的字段 } + +// 权限: + +const DEV = 0 //开发组 +const HEAD = 1 //科长 +const API = 2 //API +const GROUP = 3 //组长 +const FORMAL = 4 //正式成员 +const FRESH = 5 //实习成员 +const PRE = 6 //前成员 diff --git a/model/zones.go b/model/zones.go new file mode 100644 index 0000000..8165369 --- /dev/null +++ b/model/zones.go @@ -0,0 +1,9 @@ +package model + +const FX = 0 //凤翔 +const ZH = 1 //朝晖 +const XH_AB = 2 //香晖AB +const XH_CD = 3 //香晖CD, +const DM = 4 //东门 +const BM = 5 //北门 +const QT = 6 //歧头 diff --git a/route/middleware.go b/route/middleware.go new file mode 100644 index 0000000..3befaca --- /dev/null +++ b/route/middleware.go @@ -0,0 +1,12 @@ +package route + +import ( + "github.com/labstack/echo/v4" + "github.com/labstack/echo/v4/middleware" +) + +func Middleware(app *echo.Echo) { + //here are middlewares we use + app.Use(middleware.Logger()) + app.Use(middleware.Recover()) +} diff --git a/route/route.go b/route/route.go new file mode 100644 index 0000000..30f88c1 --- /dev/null +++ b/route/route.go @@ -0,0 +1,16 @@ +package route + +import ( + "github.com/labstack/echo/v4" + "github.com/labstack/echo/v4/middleware" + "zsxyww.com/scheduler/handler" +) + +func Route(app *echo.Echo) { + // here is the route for our site + staticFiles := app.Group("/") + staticFiles.Use(middleware.Static("./FrontEnd")) + + api := app.Group("/api/") + api.GET("/getAssignment", handler.GetAssignment) +} diff --git a/signals/table.go b/signals/table.go new file mode 100644 index 0000000..5ef5663 --- /dev/null +++ b/signals/table.go @@ -0,0 +1,12 @@ +package signals + +import ( + "github.com/golang-module/carbon/v2" +) + +type TablePrototype struct { + LastUpdated carbon.Carbon //值班表最后更新的时间 + NeedUpdate bool //值班表是否需要更新 +} + +var Table TablePrototype