Commit c71bc406 authored by Peter Cheng's avatar Peter Cheng

追加時間進位

parent 606b13d2
...@@ -4,6 +4,7 @@ import ( ...@@ -4,6 +4,7 @@ import (
"log" "log"
"net/http" "net/http"
"strconv" "strconv"
"strings"
"time" "time"
"unicode/utf8" "unicode/utf8"
...@@ -38,9 +39,9 @@ func CalcTime(c *gin.Context) { ...@@ -38,9 +39,9 @@ func CalcTime(c *gin.Context) {
if isSameDay(params) { //只請當天 if isSameDay(params) { //只請當天
if beginTime < 1200 && endTime > 1330 { //有跨午休 if beginTime < 1200 && endTime > 1330 { //有跨午休
diffHour, diffMinute = calcTimeBlock(beginHour, endHour, beginMinute, endMinute, true) diffHour, diffMinute = calcTime(beginHour, endHour, beginMinute, endMinute, true)
} else { //沒跨午休 } else { //沒跨午休
diffHour, diffMinute = calcTimeBlock(beginHour, endHour, beginMinute, endMinute, false) diffHour, diffMinute = calcTime(beginHour, endHour, beginMinute, endMinute, false)
} }
_beginMonth := appendZero(beginMonth) _beginMonth := appendZero(beginMonth)
_beginDay := appendZero(beginDay) _beginDay := appendZero(beginDay)
...@@ -53,33 +54,50 @@ func CalcTime(c *gin.Context) { ...@@ -53,33 +54,50 @@ func CalcTime(c *gin.Context) {
_diffHour := 0 _diffHour := 0
_diffMinute := 0 _diffMinute := 0
if beginTime < 1200 { //有跨午休 if beginTime < 1200 { //有跨午休
_diffHour, _diffMinute = calcTimeBlock(beginHour, "18", beginMinute, "0", true) _diffHour, _diffMinute = calcTime(beginHour, "18", beginMinute, "0", true)
} else { //沒跨午休 } else { //沒跨午休
_diffHour, _diffMinute = calcTimeBlock(beginHour, "18", beginMinute, "0", false) _diffHour, _diffMinute = calcTime(beginHour, "18", beginMinute, "0", false)
} }
diffDay = calcDate(beginYear, beginMonth, beginDay, endYear, endMonth, endDay) diffDay = calcDate(beginYear, beginMonth, beginDay, endYear, endMonth, endDay)
if endTime < 1200 { //有跨午休 if endTime < 1200 { //有跨午休
diffHour, diffMinute = calcTimeBlock("8", endHour, "30", endMinute, true) diffHour, diffMinute = calcTime("8", endHour, "30", endMinute, true)
} else { //沒跨午休 } else { //沒跨午休
diffHour, diffMinute = calcTimeBlock("8", endHour, "30", endMinute, false) diffHour, diffMinute = calcTime("8", endHour, "30", endMinute, false)
} }
diffHour = diffHour + _diffHour diffHour = diffHour + _diffHour
diffMinute = diffMinute + _diffMinute diffMinute = diffMinute + _diffMinute
} }
diffDay, diffHour, diffMinute = setCarry(diffDay, diffHour, diffMinute)
c.JSON(http.StatusOK, gin.H{"diffDay": diffDay, "diffHour": diffHour, "diffMinute": diffMinute}) c.JSON(http.StatusOK, gin.H{"diffDay": diffDay, "diffHour": diffHour, "diffMinute": diffMinute})
} }
//setCarry 設定進位
func setCarry(diffDay int, diffHour int, diffMinute int) (_diffDay int, _diffHour int, _diffMinute int) {
_diffDay = diffDay
_diffHour = diffHour
_diffMinute = diffMinute
_diffHour = diffMinute/60 + _diffHour
_diffMinute = diffMinute % 60
_diffDay = _diffHour/8 + _diffDay
_diffHour = _diffHour % 8
return _diffDay, _diffHour, _diffMinute
}
//getHoliday 取得休假日期
func getHoliday() map[string]int { func getHoliday() map[string]int {
cfg := env.GetEnv() cfg := env.GetEnv()
list := models.GetHoliday() list := models.GetHoliday()
data := make(map[string]int) data := make(map[string]int)
for _, item := range list { for _, item := range list {
key := item.Date.Format(cfg.TimeFormat) datetime := item.Date.Format(cfg.TimeFormat)
date := strings.Split(datetime, " ")[0]
key := date
data[key] = 1 data[key] = 1
} }
return data return data
} }
//appendZero 給不足二位數的數字前面加零
func appendZero(value string) string { func appendZero(value string) string {
if 2 > utf8.RuneCountInString(value) { if 2 > utf8.RuneCountInString(value) {
value = "0" + value value = "0" + value
...@@ -87,18 +105,18 @@ func appendZero(value string) string { ...@@ -87,18 +105,18 @@ func appendZero(value string) string {
return value return value
} }
//isHoliday 判斷是否為假期
func isHoliday(year string, month string, day string) bool { func isHoliday(year string, month string, day string) bool {
cfg := env.GetEnv()
list := getHoliday() list := getHoliday()
checkTime := year + "-" + month + "-" + day + " 00:00:00" checkTime := year + "-" + month + "-" + day
begin, _ := time.ParseInLocation(cfg.TimeFormat, checkTime, time.Local) _, ok := list[checkTime]
_, ok := list[begin.Format(cfg.TimeFormat)]
if ok { if ok {
return true return true
} }
return false return false
} }
//calcDate 計算跨日天數
func calcDate(beginYear string, beginMonth string, beginDay string, endYear string, endMonth string, endDay string) int { func calcDate(beginYear string, beginMonth string, beginDay string, endYear string, endMonth string, endDay string) int {
cfg := env.GetEnv() cfg := env.GetEnv()
diffDay := 0 diffDay := 0
...@@ -112,7 +130,10 @@ func calcDate(beginYear string, beginMonth string, beginDay string, endYear stri ...@@ -112,7 +130,10 @@ func calcDate(beginYear string, beginMonth string, beginDay string, endYear stri
end, _ := time.ParseInLocation(cfg.TimeFormat, checkTime, time.Local) end, _ := time.ParseInLocation(cfg.TimeFormat, checkTime, time.Local)
if begin.Before(end) { if begin.Before(end) {
for { for {
if isHoliday(beginYear, _beginMonth, _beginDay) { now := begin.Format(cfg.TimeFormat)
nowDate := strings.Split(now, " ")[0]
nowArr := strings.Split(nowDate, "-")
if isHoliday(nowArr[0], nowArr[1], nowArr[2]) {
add, _ := time.ParseDuration("24h") add, _ := time.ParseDuration("24h")
begin = begin.Add(add) begin = begin.Add(add)
continue continue
...@@ -129,7 +150,8 @@ func calcDate(beginYear string, beginMonth string, beginDay string, endYear stri ...@@ -129,7 +150,8 @@ func calcDate(beginYear string, beginMonth string, beginDay string, endYear stri
return diffDay return diffDay
} }
func calcTimeBlock(beginHour string, endHour string, beginMinute string, endMinute string, haveLunchTime bool) (diffHour int, diffMinute int) { //calcTimeBlock 計算時間區間,並扣除午休
func calcTime(beginHour string, endHour string, beginMinute string, endMinute string, haveLunchTime bool) (diffHour int, diffMinute int) {
_beginHour, _ := strconv.Atoi(beginHour) _beginHour, _ := strconv.Atoi(beginHour)
_endHour, _ := strconv.Atoi(endHour) _endHour, _ := strconv.Atoi(endHour)
_beginMinute, _ := strconv.Atoi(beginMinute) _beginMinute, _ := strconv.Atoi(beginMinute)
...@@ -144,6 +166,7 @@ func calcTimeBlock(beginHour string, endHour string, beginMinute string, endMinu ...@@ -144,6 +166,7 @@ func calcTimeBlock(beginHour string, endHour string, beginMinute string, endMinu
return diffHour, diffMinute return diffHour, diffMinute
} }
//changeToLunchTime 當請假起迄日為午休區間時,置換為午休結束
func changeToLunchTime(beginTime int, endTime int, beginHour string, beginMinute string, endHour string, endMinute string) (string, string, string, string) { func changeToLunchTime(beginTime int, endTime int, beginHour string, beginMinute string, endHour string, endMinute string) (string, string, string, string) {
if beginTime >= 1200 && beginTime <= 1330 { //當啟始時間於午休區間時 if beginTime >= 1200 && beginTime <= 1330 { //當啟始時間於午休區間時
beginHour = "13" beginHour = "13"
...@@ -156,12 +179,14 @@ func changeToLunchTime(beginTime int, endTime int, beginHour string, beginMinute ...@@ -156,12 +179,14 @@ func changeToLunchTime(beginTime int, endTime int, beginHour string, beginMinute
return beginHour, beginMinute, endHour, endMinute return beginHour, beginMinute, endHour, endMinute
} }
//isSameDay 判斷二個時間區間是否為同一天
func isSameDay(pc *beans.Punchclock) bool { func isSameDay(pc *beans.Punchclock) bool {
begin := pc.GetBegin().GetYear() + pc.GetBegin().GetMonth() + pc.GetBegin().GetDay() begin := pc.GetBegin().GetYear() + pc.GetBegin().GetMonth() + pc.GetBegin().GetDay()
end := pc.GetEnd().GetYear() + pc.GetEnd().GetMonth() + pc.GetEnd().GetDay() end := pc.GetEnd().GetYear() + pc.GetEnd().GetMonth() + pc.GetEnd().GetDay()
return begin == end return begin == end
} }
//getPunchclockParams 取得HTTP POST帶過來之參數
func getPunchclockParams(c *gin.Context) *beans.Punchclock { func getPunchclockParams(c *gin.Context) *beans.Punchclock {
params := &beans.Punchclock{} params := &beans.Punchclock{}
err := c.BindJSON(params) err := c.BindJSON(params)
......
...@@ -20,7 +20,7 @@ type Holiday struct { ...@@ -20,7 +20,7 @@ type Holiday struct {
//GetHoliday 取得休假日資料 //GetHoliday 取得休假日資料
func GetHoliday() []*Holiday { func GetHoliday() []*Holiday {
list := []*Holiday{} list := []*Holiday{}
err := db.Db.Where("is_holiday = ?", 1).Find(&list).Error err := db.Db.Where("is_holiday = ?", 1).Order("date desc").Find(&list).Error
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment