123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230 |
- package service
- import (
- "dy-admin/internal/pcmserver/bus/cabinet_pkg"
- "dy-admin/internal/pcmserver/bus/model"
- "dy-admin/internal/pcmserver/global"
- "dy-admin/internal/pcmserver/utils"
- "dy-admin/pkg/log"
- "fmt"
- "go.uber.org/zap"
- "gorm.io/gorm"
- "time"
- )
- type WorkTimeCronJob struct {
- }
- func (job *WorkTimeCronJob) Run() {
- var err error
- var execRes = "定时任务已执行,执行信息: "
- now := time.Now()
- defer func() {
- // 记录执行日志
- err := global.DB.Create(&model.CronLog{
- ExecTime: now,
- CronName: "work_time",
- CronRes: execRes,
- }).Error
- if err != nil {
- log.Error("create cron log err", zap.Error(err))
- }
- }()
- datetimeString := utils.FormatMinuteTime(&now)
- cond, _ := utils.ParseMinuteTime(datetimeString)
- timeString := utils.FormatTime(&now)
- chWeekDay := utils.ParseChWeekDay(&now)
- // 找到例外时间 例外时间 非工作日: 开始-可以开 结束-不允许开 工作日:相反
- specTime := &model.SpecialTime{}
- err = global.DB.Where("start_time <= ?", cond).Where("end_time >= ?", cond).First(specTime).Error
- if err != nil && err != gorm.ErrRecordNotFound {
- log.Error("find spec time err", zap.Error(err))
- }
- // 内存中拿到所有的柜子信息
- cabinets := cabinet_pkg.GetCabinets()
- workTimeCabinets := make([]int, 0, len(cabinets))
- for _, cabinet := range cabinets {
- // 1. 从柜子时间管理中找,如果有单独柜子时间管理。优先柜子时间管理的规则,此处不处理
- var cabinetTimeCount int64
- err = global.DB.Model(&model.CabinetTime{}).Where("cabinet_id = ?", cabinet.CabinetID).Where("use_rule = ?", "启用").Count(&cabinetTimeCount).Error
- if err != nil {
- log.Error("get cabinetTimeCount err", zap.Error(err))
- continue
- }
- if cabinetTimeCount > 0 {
- // 柜子单独的时间管理规则优先。
- log.Info("cabinetTimeCount > 0,top Level,do nothing", zap.Int("cabinetId", cabinet.CabinetID), zap.Int64("cabinetTimeCount", cabinetTimeCount))
- continue
- }
- workTimeCabinets = append(workTimeCabinets, cabinet.CabinetID)
- }
- if len(workTimeCabinets) != 0 {
- // 2. 如果当前时间在例外时间段内,根据例外时间的 工作日还是非工作日进行处理。优先级第二高
- if specTime.ID != 0 {
- execRes += processSpecTime(workTimeCabinets, specTime, datetimeString)
- } else {
- // 3. 如果当前时间不在例外时间段内。根据当前日期为星期几模糊匹配。如果点数相同,看是工作日还是非工作日。下发指令
- execRes += processWorkTime(workTimeCabinets, chWeekDay, timeString)
- }
- } else {
- execRes += "没有符合条件的柜子"
- }
- }
- func processSpecTime(cabinetIds []int, specTime *model.SpecialTime, nowDataTime string) string {
- var (
- isStart, isEnd, isWork bool
- errs []error
- execRes string
- )
- // 例外时间的开始时间=当前时间
- if specTime.StartTimeStr == nowDataTime {
- isStart = true
- }
- if specTime.EndTimeStr == nowDataTime {
- isEnd = true
- }
- if specTime.WorkDay == "工作日" {
- isWork = true
- }
- if isStart {
- if isWork {
- // 开始时间 工作日 不允许开
- errs = DisableCabinets(cabinetIds)
- } else {
- // 开始时间 非工作日 允许开
- errs = EnableCabinets(cabinetIds)
- }
- }
- if isEnd {
- if isWork {
- // 结束时间 工作日 允许开
- errs = EnableCabinets(cabinetIds)
- } else {
- // 结束时间 非工作日 不允许开
- errs = DisableCabinets(cabinetIds)
- }
- }
- if len(errs) != 0 {
- for _, err := range errs {
- if err != nil {
- execRes = fmt.Sprintf("processSpecTime err.isStart:%t,isEnd:%t,isWork:%t,cabinetIds:%v,specTime.StartTimeStr:%s,nowDataTime:%s,specTime.WorkDay:%s,err:%s",
- isStart, isEnd, isWork, cabinetIds, specTime.StartTimeStr, nowDataTime, specTime.WorkDay, err.Error())
- log.Error(execRes)
- }
- }
- return execRes
- }
- if isStart || isEnd {
- execRes = fmt.Sprintf("processSpecTime success.isStart:%t,isEnd:%t,isWork:%t,cabinetIds:%v,specTime.StartTimeStr:%s,nowDataTime:%s,specTime.WorkDay:%s",
- isStart, isEnd, isWork, cabinetIds, specTime.StartTimeStr, nowDataTime, specTime.WorkDay)
- return execRes
- }
- execRes = fmt.Sprintf("processSpecTime do nothing.isStart:%t,isEnd:%t,isWork:%t,cabinetIds:%v,nowDataTime:%s", isStart, isEnd, isWork, cabinetIds, nowDataTime)
- return execRes
- }
- func processWorkTime(cabinetIds []int, weekDay string, timeStr string) string {
- // 模糊查询星期
- var workTimes []model.WorkTime
- var err error
- var errs []error
- var execRes string
- err = global.DB.Where("week_day like ?", weekDay+"%").Find(&workTimes).Error
- if err != nil {
- log.Error("find workTime err", zap.Error(err))
- return err.Error()
- }
- var (
- isStart, isEnd, isWork bool
- )
- for _, workTime := range workTimes {
- // 小时分钟是否相等
- if workTime.StartTimeStr == timeStr {
- isStart = true
- }
- if workTime.EndTimeStr == timeStr {
- isEnd = true
- }
- if workTime.WorkDay == "禁止开" {
- isWork = true
- }
- }
- if isEnd {
- if isWork {
- // 结束时间 工作日 允许开
- errs = EnableCabinets(cabinetIds)
- } else {
- // 结束时间 非工作日 不允许开
- errs = DisableCabinets(cabinetIds)
- }
- }
- if isStart {
- if isWork {
- // 开始时间 工作日 不允许开
- errs = DisableCabinets(cabinetIds)
- } else {
- // 开始时间 非工作日 允许开
- errs = EnableCabinets(cabinetIds)
- }
- }
- if len(errs) != 0 {
- for _, err := range errs {
- if err != nil {
- execRes = fmt.Sprintf("processWorkTime err.isStart:%t,isEnd:%t,isWork:%t,cabinetIds:%v,weekDay:%s,timeStr:%s,err:%s",
- isStart, isEnd, isWork, cabinetIds, weekDay, timeStr, err.Error())
- log.Error(execRes)
- return execRes
- }
- }
- }
- if isStart || isEnd {
- execRes = fmt.Sprintf("processWorkTime success.isStart:%t,isEnd:%t,isWork:%t,cabinetIds:%v,weekDay:%s,timeStr:%s",
- isStart, isEnd, isWork, cabinetIds, weekDay, timeStr)
- return execRes
- }
- execRes = fmt.Sprintf("processWorkTime do nothing.isStart:%t,isEnd:%t,isWork:%t,cabinetIds:%v,weekDay:%s,timeStr:%s",
- isStart, isEnd, isWork, cabinetIds, weekDay, timeStr)
- return execRes
- }
- func EnableCabinets(cabinetIds []int) (errs []error) {
- for _, cabinetId := range cabinetIds {
- err := ServicesGroupApp.CabinetService.ChangeCabinetStatus(cabinetId, "允许开启")
- if err != nil {
- errs = append(errs, err)
- }
- }
- return
- }
- func DisableCabinets(cabinetIds []int) (errs []error) {
- for _, cabinetId := range cabinetIds {
- err := ServicesGroupApp.CabinetService.ChangeCabinetStatus(cabinetId, "禁止开启")
- if err != nil {
- errs = append(errs, err)
- }
- }
- return
- }
|