123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104 |
- // finish
- package finishtime
- import (
- qu "qfw/util"
- "strings"
- "time"
- )
- var workfig map[string]map[string]string
- var morning_on, morning_off, afternoon_on, afternoon_off string
- func init() {
- qu.ReadConfig("./worktime.json", &workfig)
- morning_on = workfig["morning"]["on"]
- morning_off = workfig["morning"]["off"]
- afternoon_on = workfig["afternoon"]["on"]
- afternoon_off = workfig["afternoon"]["off"]
- }
- //获取完成时间
- func CompleteTime(urgent string) int64 {
- duration := workfig["urgency"][urgent]
- do := int64(0)
- if strings.Contains(duration, "h") { //单位为小时,需要计算
- do = qu.Int64All(strings.Replace(duration, "h", "", -1)) * int64(3600)
- } else {
- return 0
- }
- endtime := time.Now()
- for i := 0; i < 100; i++ { //轮询调度直到,剩余工时为零
- if do > 0 {
- do, endtime = getWorkTime(do, endtime)
- } else {
- break
- }
- }
- return endtime.Unix()
- }
- /*计算剩余工时,和完成时间
- do:工时
- t:时间
- spare:剩余工时
- endtime:完成时间
- */
- func getWorkTime(do int64, t time.Time) (spare int64, endtime time.Time) {
- mon, _ := time.ParseInLocation(qu.Date_Full_Layout, t.Format(qu.Date_Short_Layout)+" "+morning_on+":00", time.Local)
- moff, _ := time.ParseInLocation(qu.Date_Full_Layout, t.Format(qu.Date_Short_Layout)+" "+morning_off+":00", time.Local)
- aon, _ := time.ParseInLocation(qu.Date_Full_Layout, t.Format(qu.Date_Short_Layout)+" "+afternoon_on+":00", time.Local)
- aoff, _ := time.ParseInLocation(qu.Date_Full_Layout, t.Format(qu.Date_Short_Layout)+" "+afternoon_off+":00", time.Local)
- if t.Unix() <= mon.Unix() {
- //早上上班前
- work := moff.Unix() - mon.Unix()
- if work >= do {
- spare = 0
- endtime = mon.Add(time.Duration(do) * time.Second)
- } else {
- spare = do - work
- endtime = moff
- }
- } else if t.Unix() >= mon.Unix() && t.Unix() < moff.Unix() {
- //中午下班前
- work := moff.Unix() - t.Unix()
- if work >= do {
- spare = 0
- endtime = t.Add(time.Duration(do) * time.Second)
- } else {
- spare = do - work
- endtime = moff
- }
- } else if t.Unix() >= moff.Unix() && t.Unix() < aon.Unix() {
- //下午上班前
- work := aoff.Unix() - aon.Unix()
- if work >= do {
- spare = 0
- endtime = aon.Add(time.Duration(do) * time.Second)
- } else {
- spare = do - work
- endtime = aoff
- }
- } else if t.Unix() >= aon.Unix() && t.Unix() <= aoff.Unix() {
- //下午下班前
- work := aoff.Unix() - t.Unix()
- if work >= do {
- spare = 0
- endtime = t.Add(time.Duration(do) * time.Second)
- } else {
- spare = do - work
- endtime = mon.AddDate(0, 0, 1)
- }
- } else {
- //下午下班
- endtime = mon.AddDate(0, 0, 1)
- }
- //判断星期天
- if endtime.Weekday().String() == "Sunday" {
- endtime = endtime.AddDate(0, 0, 1)
- } else if endtime.Weekday().String() == "Saturday" {
- endtime = endtime.AddDate(0, 0, 2)
- }
- return spare, endtime
- }
|