Skip to content

Commit

Permalink
Merge branch 'dev'
Browse files Browse the repository at this point in the history
添加工作日和节假日判断功能
  • Loading branch information
chanyipiaomiao committed Mar 28, 2018
2 parents c7b1573 + 13e60f1 commit 40200c8
Show file tree
Hide file tree
Showing 6 changed files with 306 additions and 3 deletions.
109 changes: 107 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,9 @@ Golang + Beego编写, 提供一些开发/运维常见操作的HTTP API接口,

# 主要功能

- 工作日节假日判断
- 微信报警
- 发送钉钉报警
- 钉钉报警
- 2步验证(Google Authenticator验证)
- 密码存储
- 发送邮件
Expand All @@ -19,6 +20,9 @@ Golang + Beego编写, 提供一些开发/运维常见操作的HTTP API接口,
- [安装使用](#安装使用)
- [依赖](#依赖)
- [功能列表](#功能列表)
- [工作日节假日判断](#工作日节假日判断)
- [设置节假日和工作日](#设置节假日和工作日)
- [判断给定的日期是节假日/工作日/周末](#判断给定的日期是节假日工作日周末)
- [微信报警](#微信报警)
- [发送微信消息](#发送微信消息)
- [钉钉报警](#钉钉报警)
Expand Down Expand Up @@ -133,17 +137,118 @@ Golang + Beego编写, 提供一些开发/运维常见操作的HTTP API接口,
```go
go get github.com/astaxie/beego
go get github.com/robfig/cron
go get github.com/chanyipiaomiao/hltool
go get gopkg.in/alecthomas/kingpin.v2
go get github.com/satori/go.uuid
go get github.com/sec51/twofactor
go get github.com/tidwall/gjson
go get github.com/chanyipiaomiao/hltool
go get github.com/chanyipiaomiao/weixin-kit
go get github.com/chanyipiaomiao/cal
```

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

# API

## 工作日节假日判断

#### 设置节假日和工作日

```sh
POST /api/v1/holiworkday

设置头部: Content-Type: application/json

内容: 参考下面的模板
```
节假日和工作日模板json, 每年都要根据国内的放假安排提前做一下设置,毕竟国内放假安排不是固定的,日期不足2位必须补0

workday 是指放假安排中的调整上班的日期

```sh
{
"year": "2018",
"holiday": [
{
"name": "yuandan",
"zh_name": "元旦",
"start_time": "2018-01-01",
"end_time": "2018-01-01"
},
{
"name": "chunjie",
"zh_name": "春节",
"start_time": "2018-02-15",
"end_time": "2018-02-21"
},
{
"name": "qingming",
"zh_name": "清明节",
"start_time": "2018-04-05",
"end_time": "2018-04-07"
},
{
"name": "laodong",
"zh_name": "劳动节",
"start_time": "2018-04-29",
"end_time": "2018-05-01"
},
{
"name": "duanwu",
"zh_name": "端午节",
"start_time": "2018-06-16",
"end_time": "2018-06-18"
},
{
"name": "zhongqiu",
"zh_name": "中秋节",
"start_time": "2018-09-22",
"end_time": "2018-09-24"
},
{
"name": "guoqing",
"zh_name": "国庆节",
"start_time": "2018-10-01",
"end_time": "2018-10-07"
}
],
"workday": [
"2018-02-11",
"2018-02-24",
"2018-04-08",
"2018-04-28",
"2018-09-29",
"2018-09-30"
]
}
```

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

#### 判断给定的日期是节假日工作日周末

```sh
GET /api/v1/holiworkday?date=2018-10-08

date: 判断的日期, 日期格式不足2位必须补0
```

返回:
```sh
{
"date": "2018-10-08",
"dateType": "workday",
"entryType": "judgment holiday/workday",
"errmsg": "",
"requestID": "2a0cb77a-f622-4f75-b5e4-e574c015f6f6",
"statuscode": 0
}

dateType: 有3种 workday: 工作日 holiday: 节假日 weekend: 周末
```

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

## 微信报警

点击查看设置[微信报警流程](/doc/weixin.md)
Expand Down
128 changes: 128 additions & 0 deletions common/holiday.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,128 @@
package common

import (
"encoding/json"
"fmt"
"strconv"
"time"

"github.com/chanyipiaomiao/cal"
"github.com/chanyipiaomiao/hltool"
"github.com/tidwall/gjson"
)

const (
holiworkdayTableName = "holiworkday"
dateTemplate = "2006-01-02"
)

// ReqHoliday 请求过来的节假日和工作日设置
type ReqHoliday struct {
Holiday []struct {
EndTime string `json:"end_time"`
Name string `json:"name"`
StartTime string `json:"start_time"`
ZhName string `json:"zh_name"`
} `json:"holiday"`
Workday []string `json:"workday"`
Year string `json:"year"`
}

// HoliWorkday 节假日和工作日
type HoliWorkday struct{}

// 解析工作日节假日json字符串
func (h *HoliWorkday) parse(jsonstr []byte) (*cal.Calendar, error) {

r := new(ReqHoliday)
err := json.Unmarshal(jsonstr, r)
if err != nil {
return nil, err
}

calendar := cal.NewCalendar()

for _, v := range r.Holiday {
endTime, _ := time.Parse(dateTemplate, v.EndTime)
startTime, _ := time.Parse(dateTemplate, v.StartTime)
calendar.AddHoliday(cal.NewHolidayExact(startTime.Month(), startTime.Day(), startTime.Year()))
sub := endTime.Sub(startTime).Hours() / 24
for i := 1; i < int(sub); i++ {
t := startTime.AddDate(0, 0, i)
calendar.AddHoliday(cal.NewHolidayExact(t.Month(), t.Day(), t.Year()))
}
calendar.AddHoliday(cal.NewHolidayExact(endTime.Month(), endTime.Day(), endTime.Year()))
}

for _, v := range r.Workday {
t, _ := time.Parse(dateTemplate, v)
calendar.AddExtraWorkday(t)
}

calendar.Observed = cal.ObservedExact

return calendar, nil
}

// Setting 保存节假日和工作日设置
func (h *HoliWorkday) Setting(reqBody []byte) error {

db, err := hltool.NewBoltDB(DBPath, holiworkdayTableName)
if err != nil {
return err
}

year := gjson.Get(string(reqBody), "year").String()
err = db.Set(map[string][]byte{
year: reqBody,
})

if err != nil {
return err
}

return nil
}

// IsHoliWorkday 检查给定的日期是工作日还是节假日
func (h *HoliWorkday) IsHoliWorkday(date string) (string, error) {

t, err := time.Parse(dateTemplate, date)
if err != nil {
return "", err
}

db, err := hltool.NewBoltDB(DBPath, holiworkdayTableName)
if err != nil {
return "", err
}

year := strconv.Itoa(t.Year())

result, err := db.Get([]string{year})
if err != nil {
return "", err
}
if result[year] == nil {
return "", fmt.Errorf("%s year holiday setting not in db, please setting", year)
}

calendar, err := h.parse(result[year])
if err != nil {
return "", err
}

if calendar.IsExtraWorkday(t) {
return "workday", nil
}

if calendar.IsWorkday(t) {
return "workday", nil
}

if calendar.IsHoliday(t) {
return "holiday", nil
}

return "weekend", nil
}
2 changes: 1 addition & 1 deletion common/twostep.go
Original file line number Diff line number Diff line change
Expand Up @@ -122,7 +122,7 @@ func (t *TwoStepAuth) Enable() (map[string]interface{}, error) {
return nil, err
}
}
return nil, fmt.Errorf("%s aleady exist.", t.Username)
return nil, fmt.Errorf("%s aleady exist", t.Username)
}
otp, err = twofactor.NewTOTP(t.Username, t.Issuer, crypto.SHA1, TwoStepAuthDigits)
if err != nil {
Expand Down
5 changes: 5 additions & 0 deletions controllers/common.go
Original file line number Diff line number Diff line change
Expand Up @@ -129,3 +129,8 @@ type WeixinController struct {
type DingdingController struct {
BaseController
}

// HolidayController 节假日工作日判断
type HolidayController struct {
BaseController
}
62 changes: 62 additions & 0 deletions controllers/holiday.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
package controllers

import (
"fmt"

"devops-api/common"
)

// Post 接收中国的节假日安排, 为判断节假日和工作日准备
func (h *HolidayController) Post() {
requestID := h.Data["RequestID"].(string)
holidayLog := map[string]interface{}{
"entryType": "setting holiday/workday",
"requestID": requestID,
}
holiday := &common.HoliWorkday{}
err := holiday.Setting(h.Ctx.Input.RequestBody)
if err != nil {
holidayLog["statuscode"] = 1
holidayLog["errmsg"] = fmt.Sprintf("%s", err)
holidayLog["result"] = "error"
common.GetLogger().Error(holidayLog, "设置节假日和工作日")
h.Data["json"] = holidayLog
h.ServeJSON()
return
}

holidayLog["statuscode"] = 0
holidayLog["errmsg"] = ""
holidayLog["result"] = "ok"
common.GetLogger().Info(holidayLog, "设置节假日和工作日")
h.Data["json"] = holidayLog
h.ServeJSON()
}

// Get 接收一个日期,判断是节假日还是工作日
func (h *HolidayController) Get() {
requestID := h.Data["RequestID"].(string)
holidayLog := map[string]interface{}{
"entryType": "judgment holiday/workday",
"requestID": requestID,
}
date := h.GetString("date")
holiworkday := &common.HoliWorkday{}
r, err := holiworkday.IsHoliWorkday(date)
if err != nil {
holidayLog["statuscode"] = 1
holidayLog["errmsg"] = fmt.Sprintf("%s", err)
common.GetLogger().Error(holidayLog, "判断节假日和工作日")
h.Data["json"] = holidayLog
h.ServeJSON()
return
}

holidayLog["statuscode"] = 0
holidayLog["errmsg"] = ""
holidayLog["date"] = date
holidayLog["dateType"] = r
common.GetLogger().Info(holidayLog, "判断节假日和工作日")
h.Data["json"] = holidayLog
h.ServeJSON()
}
3 changes: 3 additions & 0 deletions routers/router.go
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,9 @@ func init() {
beego.NSRouter("/delete", &controllers.StorePasswordController{}, "get:Delete"),
beego.NSRouter("/get", &controllers.StorePasswordController{}, "get:Get"),
),
beego.NSNamespace("/holiworkday",
beego.NSRouter("", &controllers.HolidayController{}),
),
),
)
beego.AddNamespace(apins)
Expand Down

0 comments on commit 40200c8

Please sign in to comment.