mirror of
https://github.com/ZSCNetSupportDept/scheduler.git
synced 2025-10-28 04:25:03 +08:00
修改
This commit is contained in:
@@ -0,0 +1,5 @@
|
||||
<html>
|
||||
<body>
|
||||
<h1 align=center>管理</h1>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
<html>
|
||||
<body>
|
||||
<div>
|
||||
<h1 align=center>今日值班表</h1>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -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" #开始值班的日期
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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())
|
||||
// }
|
||||
|
||||
@@ -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)
|
||||
// }
|
||||
|
||||
6
doc/assignment_test.csv
Normal file
6
doc/assignment_test.csv
Normal file
@@ -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
|
||||
|
5
doc/换班补班的业务描述.md
Normal file
5
doc/换班补班的业务描述.md
Normal file
@@ -0,0 +1,5 @@
|
||||
# 业务描述
|
||||
这里是业务描述备忘录
|
||||
## 换班
|
||||
首先,由换班的发起人填写
|
||||
为
|
||||
10
doc/排班算法.md
Normal file
10
doc/排班算法.md
Normal file
@@ -0,0 +1,10 @@
|
||||
# 描述
|
||||
网络维护科(简称为网维)是学校中负责修理同学们网络问题的公益性组织,由大二,大三的正式成员和大一的实习成员组成。
|
||||
|
||||
每天,网维都会去学校里的各个宿舍片区修理同学们上报的网络问题(称之为值班),每个片区由一个片区负责人所统领值班,这个负责人必须是正式成员。其余的人员为正式成员或者实习成员。每个成员每周只用值班1天,每天只会在某个具体的片区值班,具体是哪一天取决于他们的空闲时间。
|
||||
|
||||
网维所负责值班的片区一共有6个,称为1-6号,其中1-3号为女生片区,4-6号为男生片区。由于网维男生的数量远多于女生,所以必须要让男生进入女生宿舍片区值班,但是,女生会被优先安排在女生宿舍值班,换句话说,女生只可以出现在女生片区。
|
||||
|
||||
为了让实习成员熟悉每一个片区,每两周都会轮换值班每位成员负责值班的的片区,片区的轮换遵守上面的规则,也就是说,女生只会在女生片区内轮换,男生则会在全部的片区内轮换。
|
||||
|
||||
一个学期值班的周数不确定,但是一般不会少于12周,即可以轮换到每个成员。
|
||||
2
go.mod
2
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
|
||||
|
||||
4
go.sum
4
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=
|
||||
|
||||
104
handler/assignments.go
Normal file
104
handler/assignments.go
Normal file
@@ -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
|
||||
}
|
||||
10
main.go
10
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)
|
||||
}
|
||||
|
||||
101
member.csv
Executable file
101
member.csv
Executable file
@@ -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
|
||||
|
@@ -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 //前成员
|
||||
|
||||
9
model/zones.go
Normal file
9
model/zones.go
Normal file
@@ -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 //歧头
|
||||
12
route/middleware.go
Normal file
12
route/middleware.go
Normal file
@@ -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())
|
||||
}
|
||||
16
route/route.go
Normal file
16
route/route.go
Normal file
@@ -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)
|
||||
}
|
||||
12
signals/table.go
Normal file
12
signals/table.go
Normal file
@@ -0,0 +1,12 @@
|
||||
package signals
|
||||
|
||||
import (
|
||||
"github.com/golang-module/carbon/v2"
|
||||
)
|
||||
|
||||
type TablePrototype struct {
|
||||
LastUpdated carbon.Carbon //值班表最后更新的时间
|
||||
NeedUpdate bool //值班表是否需要更新
|
||||
}
|
||||
|
||||
var Table TablePrototype
|
||||
Reference in New Issue
Block a user