Skip to content

Commit 40200c8

Browse files
Merge branch 'dev'
添加工作日和节假日判断功能
2 parents c7b1573 + 13e60f1 commit 40200c8

File tree

6 files changed

+306
-3
lines changed

6 files changed

+306
-3
lines changed

README.md

Lines changed: 107 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,9 @@ Golang + Beego编写, 提供一些开发/运维常见操作的HTTP API接口,
44

55
# 主要功能
66

7+
- 工作日节假日判断
78
- 微信报警
8-
- 发送钉钉报警
9+
- 钉钉报警
910
- 2步验证(Google Authenticator验证)
1011
- 密码存储
1112
- 发送邮件
@@ -19,6 +20,9 @@ Golang + Beego编写, 提供一些开发/运维常见操作的HTTP API接口,
1920
- [安装使用](#安装使用)
2021
- [依赖](#依赖)
2122
- [功能列表](#功能列表)
23+
- [工作日节假日判断](#工作日节假日判断)
24+
- [设置节假日和工作日](#设置节假日和工作日)
25+
- [判断给定的日期是节假日/工作日/周末](#判断给定的日期是节假日工作日周末)
2226
- [微信报警](#微信报警)
2327
- [发送微信消息](#发送微信消息)
2428
- [钉钉报警](#钉钉报警)
@@ -133,17 +137,118 @@ Golang + Beego编写, 提供一些开发/运维常见操作的HTTP API接口,
133137
```go
134138
go get github.com/astaxie/beego
135139
go get github.com/robfig/cron
136-
go get github.com/chanyipiaomiao/hltool
137140
go get gopkg.in/alecthomas/kingpin.v2
138141
go get github.com/satori/go.uuid
139142
go get github.com/sec51/twofactor
143+
go get github.com/tidwall/gjson
144+
go get github.com/chanyipiaomiao/hltool
140145
go get github.com/chanyipiaomiao/weixin-kit
146+
go get github.com/chanyipiaomiao/cal
141147
```
142148

143149
[返回到目录](#目录)
144150

145151
# API
146152

153+
## 工作日节假日判断
154+
155+
#### 设置节假日和工作日
156+
157+
```sh
158+
POST /api/v1/holiworkday
159+
160+
设置头部: Content-Type: application/json
161+
162+
内容: 参考下面的模板
163+
```
164+
节假日和工作日模板json, 每年都要根据国内的放假安排提前做一下设置,毕竟国内放假安排不是固定的,日期不足2位必须补0
165+
166+
workday 是指放假安排中的调整上班的日期
167+
168+
```sh
169+
{
170+
"year": "2018",
171+
"holiday": [
172+
{
173+
"name": "yuandan",
174+
"zh_name": "元旦",
175+
"start_time": "2018-01-01",
176+
"end_time": "2018-01-01"
177+
},
178+
{
179+
"name": "chunjie",
180+
"zh_name": "春节",
181+
"start_time": "2018-02-15",
182+
"end_time": "2018-02-21"
183+
},
184+
{
185+
"name": "qingming",
186+
"zh_name": "清明节",
187+
"start_time": "2018-04-05",
188+
"end_time": "2018-04-07"
189+
},
190+
{
191+
"name": "laodong",
192+
"zh_name": "劳动节",
193+
"start_time": "2018-04-29",
194+
"end_time": "2018-05-01"
195+
},
196+
{
197+
"name": "duanwu",
198+
"zh_name": "端午节",
199+
"start_time": "2018-06-16",
200+
"end_time": "2018-06-18"
201+
},
202+
{
203+
"name": "zhongqiu",
204+
"zh_name": "中秋节",
205+
"start_time": "2018-09-22",
206+
"end_time": "2018-09-24"
207+
},
208+
{
209+
"name": "guoqing",
210+
"zh_name": "国庆节",
211+
"start_time": "2018-10-01",
212+
"end_time": "2018-10-07"
213+
}
214+
],
215+
"workday": [
216+
"2018-02-11",
217+
"2018-02-24",
218+
"2018-04-08",
219+
"2018-04-28",
220+
"2018-09-29",
221+
"2018-09-30"
222+
]
223+
}
224+
```
225+
226+
[返回到目录](#目录)
227+
228+
#### 判断给定的日期是节假日工作日周末
229+
230+
```sh
231+
GET /api/v1/holiworkday?date=2018-10-08
232+
233+
date: 判断的日期, 日期格式不足2位必须补0
234+
```
235+
236+
返回:
237+
```sh
238+
{
239+
"date": "2018-10-08",
240+
"dateType": "workday",
241+
"entryType": "judgment holiday/workday",
242+
"errmsg": "",
243+
"requestID": "2a0cb77a-f622-4f75-b5e4-e574c015f6f6",
244+
"statuscode": 0
245+
}
246+
247+
dateType: 有3种 workday: 工作日 holiday: 节假日 weekend: 周末
248+
```
249+
250+
[返回到目录](#目录)
251+
147252
## 微信报警
148253

149254
点击查看设置[微信报警流程](/doc/weixin.md)

common/holiday.go

Lines changed: 128 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,128 @@
1+
package common
2+
3+
import (
4+
"encoding/json"
5+
"fmt"
6+
"strconv"
7+
"time"
8+
9+
"github.com/chanyipiaomiao/cal"
10+
"github.com/chanyipiaomiao/hltool"
11+
"github.com/tidwall/gjson"
12+
)
13+
14+
const (
15+
holiworkdayTableName = "holiworkday"
16+
dateTemplate = "2006-01-02"
17+
)
18+
19+
// ReqHoliday 请求过来的节假日和工作日设置
20+
type ReqHoliday struct {
21+
Holiday []struct {
22+
EndTime string `json:"end_time"`
23+
Name string `json:"name"`
24+
StartTime string `json:"start_time"`
25+
ZhName string `json:"zh_name"`
26+
} `json:"holiday"`
27+
Workday []string `json:"workday"`
28+
Year string `json:"year"`
29+
}
30+
31+
// HoliWorkday 节假日和工作日
32+
type HoliWorkday struct{}
33+
34+
// 解析工作日节假日json字符串
35+
func (h *HoliWorkday) parse(jsonstr []byte) (*cal.Calendar, error) {
36+
37+
r := new(ReqHoliday)
38+
err := json.Unmarshal(jsonstr, r)
39+
if err != nil {
40+
return nil, err
41+
}
42+
43+
calendar := cal.NewCalendar()
44+
45+
for _, v := range r.Holiday {
46+
endTime, _ := time.Parse(dateTemplate, v.EndTime)
47+
startTime, _ := time.Parse(dateTemplate, v.StartTime)
48+
calendar.AddHoliday(cal.NewHolidayExact(startTime.Month(), startTime.Day(), startTime.Year()))
49+
sub := endTime.Sub(startTime).Hours() / 24
50+
for i := 1; i < int(sub); i++ {
51+
t := startTime.AddDate(0, 0, i)
52+
calendar.AddHoliday(cal.NewHolidayExact(t.Month(), t.Day(), t.Year()))
53+
}
54+
calendar.AddHoliday(cal.NewHolidayExact(endTime.Month(), endTime.Day(), endTime.Year()))
55+
}
56+
57+
for _, v := range r.Workday {
58+
t, _ := time.Parse(dateTemplate, v)
59+
calendar.AddExtraWorkday(t)
60+
}
61+
62+
calendar.Observed = cal.ObservedExact
63+
64+
return calendar, nil
65+
}
66+
67+
// Setting 保存节假日和工作日设置
68+
func (h *HoliWorkday) Setting(reqBody []byte) error {
69+
70+
db, err := hltool.NewBoltDB(DBPath, holiworkdayTableName)
71+
if err != nil {
72+
return err
73+
}
74+
75+
year := gjson.Get(string(reqBody), "year").String()
76+
err = db.Set(map[string][]byte{
77+
year: reqBody,
78+
})
79+
80+
if err != nil {
81+
return err
82+
}
83+
84+
return nil
85+
}
86+
87+
// IsHoliWorkday 检查给定的日期是工作日还是节假日
88+
func (h *HoliWorkday) IsHoliWorkday(date string) (string, error) {
89+
90+
t, err := time.Parse(dateTemplate, date)
91+
if err != nil {
92+
return "", err
93+
}
94+
95+
db, err := hltool.NewBoltDB(DBPath, holiworkdayTableName)
96+
if err != nil {
97+
return "", err
98+
}
99+
100+
year := strconv.Itoa(t.Year())
101+
102+
result, err := db.Get([]string{year})
103+
if err != nil {
104+
return "", err
105+
}
106+
if result[year] == nil {
107+
return "", fmt.Errorf("%s year holiday setting not in db, please setting", year)
108+
}
109+
110+
calendar, err := h.parse(result[year])
111+
if err != nil {
112+
return "", err
113+
}
114+
115+
if calendar.IsExtraWorkday(t) {
116+
return "workday", nil
117+
}
118+
119+
if calendar.IsWorkday(t) {
120+
return "workday", nil
121+
}
122+
123+
if calendar.IsHoliday(t) {
124+
return "holiday", nil
125+
}
126+
127+
return "weekend", nil
128+
}

common/twostep.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ func (t *TwoStepAuth) Enable() (map[string]interface{}, error) {
122122
return nil, err
123123
}
124124
}
125-
return nil, fmt.Errorf("%s aleady exist.", t.Username)
125+
return nil, fmt.Errorf("%s aleady exist", t.Username)
126126
}
127127
otp, err = twofactor.NewTOTP(t.Username, t.Issuer, crypto.SHA1, TwoStepAuthDigits)
128128
if err != nil {

controllers/common.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,3 +129,8 @@ type WeixinController struct {
129129
type DingdingController struct {
130130
BaseController
131131
}
132+
133+
// HolidayController 节假日工作日判断
134+
type HolidayController struct {
135+
BaseController
136+
}

controllers/holiday.go

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
package controllers
2+
3+
import (
4+
"fmt"
5+
6+
"devops-api/common"
7+
)
8+
9+
// Post 接收中国的节假日安排, 为判断节假日和工作日准备
10+
func (h *HolidayController) Post() {
11+
requestID := h.Data["RequestID"].(string)
12+
holidayLog := map[string]interface{}{
13+
"entryType": "setting holiday/workday",
14+
"requestID": requestID,
15+
}
16+
holiday := &common.HoliWorkday{}
17+
err := holiday.Setting(h.Ctx.Input.RequestBody)
18+
if err != nil {
19+
holidayLog["statuscode"] = 1
20+
holidayLog["errmsg"] = fmt.Sprintf("%s", err)
21+
holidayLog["result"] = "error"
22+
common.GetLogger().Error(holidayLog, "设置节假日和工作日")
23+
h.Data["json"] = holidayLog
24+
h.ServeJSON()
25+
return
26+
}
27+
28+
holidayLog["statuscode"] = 0
29+
holidayLog["errmsg"] = ""
30+
holidayLog["result"] = "ok"
31+
common.GetLogger().Info(holidayLog, "设置节假日和工作日")
32+
h.Data["json"] = holidayLog
33+
h.ServeJSON()
34+
}
35+
36+
// Get 接收一个日期,判断是节假日还是工作日
37+
func (h *HolidayController) Get() {
38+
requestID := h.Data["RequestID"].(string)
39+
holidayLog := map[string]interface{}{
40+
"entryType": "judgment holiday/workday",
41+
"requestID": requestID,
42+
}
43+
date := h.GetString("date")
44+
holiworkday := &common.HoliWorkday{}
45+
r, err := holiworkday.IsHoliWorkday(date)
46+
if err != nil {
47+
holidayLog["statuscode"] = 1
48+
holidayLog["errmsg"] = fmt.Sprintf("%s", err)
49+
common.GetLogger().Error(holidayLog, "判断节假日和工作日")
50+
h.Data["json"] = holidayLog
51+
h.ServeJSON()
52+
return
53+
}
54+
55+
holidayLog["statuscode"] = 0
56+
holidayLog["errmsg"] = ""
57+
holidayLog["date"] = date
58+
holidayLog["dateType"] = r
59+
common.GetLogger().Info(holidayLog, "判断节假日和工作日")
60+
h.Data["json"] = holidayLog
61+
h.ServeJSON()
62+
}

routers/router.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,9 @@ func init() {
3838
beego.NSRouter("/delete", &controllers.StorePasswordController{}, "get:Delete"),
3939
beego.NSRouter("/get", &controllers.StorePasswordController{}, "get:Get"),
4040
),
41+
beego.NSNamespace("/holiworkday",
42+
beego.NSRouter("", &controllers.HolidayController{}),
43+
),
4144
),
4245
)
4346
beego.AddNamespace(apins)

0 commit comments

Comments
 (0)