package menus import ( "appPlatform/middleware/grocerystore" "appPlatform/models/modelshr" "appPlatform/models/teamlog" "appPlatform/overall" "appPlatform/overall/publicmethod" "encoding/json" "fmt" "sort" "strconv" "time" ) /* * @ 作者: 秦东 @ 时间: 2025-01-21 08:52:46 @ 功能: 原点日期排班设定 @ 参数 #dataInfo 当前日期属性 #timeVal 当天日期参数 #zuoXiTime 作息时间 #lunXunShiXu 轮询列表 #RedisKey说明 SchedulingTeam:StartingPoint_行政组织_年月日_倒班制度 @ 返回值 #logMap 当天安排 @ 方法原型 # */ func (g *GenesInfo) TeamsYuanDianRunNew(dataInfo CalendarStructure, timeVal publicmethod.DateTimeTotimes, zuoXiTime []modelshr.WorkingTimePeriod, lunXunShiXu []modelshr.PollingRules) (logMap []map[string]interface{}) { dayRedisKey := fmt.Sprintf("SchedulingTeam:StartingPoint_%v_%v%v%v_%v", g.OrgId, timeVal.Years, timeVal.Months, timeVal.Days, g.TypeId) redisClient := grocerystore.RunRedis(overall.CONSTANT_REDIS2) isTrue, logContent := redisClient.Get(dayRedisKey) var dayTimeLog []teamlog.TeamsLog if isTrue { //redis存在获取redis数据 json.Unmarshal([]byte(logContent), &logMap) json.Unmarshal([]byte(logContent), &dayTimeLog) // fmt.Printf("Step1: %v\n", logContent) } else { //redis不存在从数据库中获取数据 overall.CONSTANT_DB_TeamsLog.Model(&teamlog.TeamsLog{}).Where("`orgId` = ? AND `years` = ? AND `months` = ? AND `days` = ? AND `ismId` = ?", g.OrgId, timeVal.Years, timeVal.Months, timeVal.Days, g.TypeId).Order("`sort` ASC").Find(&logMap) if len(logMap) > 0 { redisClient.SetRedisTime(5256000) jsonVal, _ := json.Marshal(logMap) redisClient.Set(dayRedisKey, string(jsonVal)) json.Unmarshal([]byte(jsonVal), &dayTimeLog) // fmt.Printf("Step2: %v\n", string(jsonVal)) } else { //数据库中不存在开始计算 // fmt.Printf("Step3: %v\n", zuoXiTime) //按时间先后将工作时段进行排序排序 sort.Slice(zuoXiTime, func(i, j int) bool { return zuoXiTime[i].StartTime < zuoXiTime[j].StartTime }) zouXinAllNum := len(zuoXiTime) //获取作息时间总长度 yuanDianWeizhi := 1 //原点在数组中的索引位置 for i := 0; i < zouXinAllNum; i++ { if zuoXiTime[i].Id == g.PeriodId { yuanDianWeizhi = i } zuoXiTime[i].Sort = i + 1 } // for i, v := range zuoXiTime { // if v.Id == g.PeriodId { // yuanDianWeizhi = i // } // v.Sort = i + 1 // } // fmt.Printf("%v-%v\n", yuanDianWeizhi, zuoXiTime) //判断所在数组位置前边是否有数据 if yuanDianWeizhi > 0 { for i := yuanDianWeizhi - 1; i >= 0; i-- { creeLunXun := LunXunGuiZe(lunXunShiXu, g.Rules, i, 1) var logInfo teamlog.TeamsLog overall.CONSTANT_DB_TeamsLog.Where("`orgId` = ? AND `years` = ? AND `months` = ? AND `days` = ? AND `ismId` = ? AND `rankId` = ? AND `rulesId` = ? AND `teamsId` = ?", g.OrgId, timeVal.Years, timeVal.Months, timeVal.Days, g.TypeId, zuoXiTime[i].Id, creeLunXun.Id, creeLunXun.Id).Order("`sort` ASC").First(&logInfo) if logInfo.Id == 0 { // var logInfo teamlog.TeamsLog logInfo.OrgId = g.OrgId //班组ID"` logInfo.TeamsTime = timeVal.AllTime //日期"` logInfo.IsmId = g.TypeId //制度ID"` logInfo.RankId = zuoXiTime[i].Id //班次"` logInfo.RulesId = creeLunXun.Id //轮询规则Id"` logInfo.Days, _ = strconv.Atoi(timeVal.Days) //日"` logInfo.Months, _ = strconv.Atoi(timeVal.Months) //月"` logInfo.Years, _ = strconv.Atoi(timeVal.Years) //年"` logInfo.Time = time.Now().Unix() //编辑时间"` logInfo.IsmName = g.TypeName logInfo.RankName = zuoXiTime[i].Name logInfo.RulesName = creeLunXun.TeamName logInfo.Sort = zuoXiTime[i].Sort logInfo.TeamsId = creeLunXun.Id logInfo.StartTime = zuoXiTime[i].StartTime logInfo.EndTime = zuoXiTime[i].EndTime overall.CONSTANT_DB_TeamsLog.Create(&logInfo) } dayTimeLog = append(dayTimeLog, logInfo) jsonVal, _ := json.Marshal(logInfo) valMap := publicmethod.MapOut[string]() json.Unmarshal(jsonVal, &valMap) logMap = append(logMap, valMap) } } //计算原点位置 var logInfoYuan teamlog.TeamsLog overall.CONSTANT_DB_TeamsLog.Where("`orgId` = ? AND `years` = ? AND `months` = ? AND `days` = ? AND `ismId` = ? AND `rankId` = ? AND `rulesId` = ? AND `teamsId` = ?", g.OrgId, timeVal.Years, timeVal.Months, timeVal.Days, g.TypeId, g.PeriodId, g.Rules, g.Rules).Order("`sort` ASC").First(&logInfoYuan) if logInfoYuan.Id == 0 { logInfoYuan.OrgId = g.OrgId //班组ID"` logInfoYuan.TeamsTime = timeVal.AllTime //日期"` logInfoYuan.IsmId = g.TypeId //制度ID"` logInfoYuan.RankId = g.PeriodId //班次"` logInfoYuan.RulesId = g.Rules //轮询规则Id"` logInfoYuan.Days, _ = strconv.Atoi(timeVal.Days) //日"` logInfoYuan.Months, _ = strconv.Atoi(timeVal.Months) //月"` logInfoYuan.Years, _ = strconv.Atoi(timeVal.Years) //年"` logInfoYuan.Time = time.Now().Unix() //编辑时间"` logInfoYuan.IsmName = g.TypeName logInfoYuan.RankName = g.PeriodName logInfoYuan.RulesName = g.RulesName logInfoYuan.Sort = zuoXiTime[yuanDianWeizhi].Sort logInfoYuan.TeamsId = g.Rules logInfoYuan.StartTime = zuoXiTime[yuanDianWeizhi].StartTime logInfoYuan.EndTime = zuoXiTime[yuanDianWeizhi].EndTime overall.CONSTANT_DB_TeamsLog.Create(&logInfoYuan) } dayTimeLog = append(dayTimeLog, logInfoYuan) jsonValYuan, _ := json.Marshal(logInfoYuan) valMapYuan := publicmethod.MapOut[string]() json.Unmarshal(jsonValYuan, &valMapYuan) logMap = append(logMap, valMapYuan) //计算源点后边得数据 for j := yuanDianWeizhi + 1; j < zouXinAllNum; j++ { creeLunXun := LunXunGuiZe(lunXunShiXu, g.Rules, j-1, 2) var logInfo teamlog.TeamsLog overall.CONSTANT_DB_TeamsLog.Where("`orgId` = ? AND `years` = ? AND `months` = ? AND `days` = ? AND `ismId` = ? AND `rankId` = ? AND `rulesId` = ? AND `teamsId` = ?", g.OrgId, timeVal.Years, timeVal.Months, timeVal.Days, g.TypeId, zuoXiTime[j].Id, creeLunXun.Id, creeLunXun.Id).Order("`sort` ASC").First(&logInfo) if logInfo.Id == 0 { logInfo.OrgId = g.OrgId //班组ID"` logInfo.TeamsTime = timeVal.AllTime //日期"` logInfo.IsmId = g.TypeId //制度ID"` logInfo.RankId = zuoXiTime[j].Id //班次"` logInfo.RulesId = creeLunXun.Id //轮询规则Id"` logInfo.Days, _ = strconv.Atoi(timeVal.Days) //日"` logInfo.Months, _ = strconv.Atoi(timeVal.Months) //月"` logInfo.Years, _ = strconv.Atoi(timeVal.Years) //年"` logInfo.Time = time.Now().Unix() //编辑时间"` logInfo.IsmName = g.TypeName logInfo.RankName = zuoXiTime[j].Name logInfo.RulesName = creeLunXun.TeamName logInfo.Sort = zuoXiTime[j].Sort logInfo.TeamsId = creeLunXun.Id logInfo.StartTime = zuoXiTime[j].StartTime logInfo.EndTime = zuoXiTime[j].EndTime overall.CONSTANT_DB_TeamsLog.Create(&logInfo) } dayTimeLog = append(dayTimeLog, logInfo) jsonVal, _ := json.Marshal(logInfo) valMap := publicmethod.MapOut[string]() json.Unmarshal(jsonVal, &valMap) logMap = append(logMap, valMap) } redisClient.SetRedisTime(5256000) jsonVal, _ := json.Marshal(logMap) redisClient.Set(dayRedisKey, string(jsonVal)) } } if len(dayTimeLog) > 0 { allRulesLog = dayTimeLog[len(dayTimeLog)-1] } return } /* * @ 作者: 秦东 @ 时间: 2025-01-20 10:14:52 @ 功能: 获取指定日期班组情况 @ 参数 #dataInfo 当前日期属性 #timeVal 当天日期参数 #zuoXiTime 作息时间 #lunXunShiXu 轮询列表 @ 返回值 #logMap 当天安排 @ 方法原型 # */ func (g *GenesInfo) SpecifyDateTeams(dataInfo CalendarStructure, timeVal publicmethod.DateTimeTotimes, zuoXiTime []modelshr.WorkingTimePeriod, lunXunShiXu []modelshr.PollingRules) (logMap []map[string]interface{}) { if len(zuoXiTime) < 1 && len(lunXunShiXu) < 1 { //没有设置工作时间段,也没有轮询规则 return } else if len(zuoXiTime) == 1 && len(lunXunShiXu) == 1 { //单一工作段,单一轮询规则 //判断当前日期是不是周末 if dataInfo.IsWeek { //为周末;默认双休 if dataInfo.IsWorks { //是不是周末补班 var logInfo teamlog.TeamsLog logInfo.OrgId = g.OrgId //行政组织ID"` logInfo.TeamsTime = timeVal.AllTime //日期"` logInfo.IsmId = g.TypeId //制度ID"` logInfo.RankId = zuoXiTime[0].Id //班次"` logInfo.RulesId = lunXunShiXu[0].Id //轮询规则Id"` logInfo.Years, _ = strconv.Atoi(timeVal.Years) //日"` logInfo.Months, _ = strconv.Atoi(timeVal.Months) //月"` logInfo.Days, _ = strconv.Atoi(timeVal.Days) //年"` logInfo.Time = time.Now().Unix() //编辑时间"` logInfo.RankName = zuoXiTime[0].Name //执行倒班名称 logInfo.RulesName = lunXunShiXu[0].TeamName //当天班组或休班 logInfo.IsmName = g.TypeName //执行倒班制度名称 logInfo.TeamsId = lunXunShiXu[0].Teamid //班组ID"` logInfo.Sort = lunXunShiXu[0].Sort //排序 logInfo.StartTime = zuoXiTime[0].StartTime //作业开始时间 logInfo.EndTime = zuoXiTime[0].EndTime //作业结束时间 jsonVal, _ := json.Marshal(logInfo) valMap := publicmethod.MapOut[string]() json.Unmarshal(jsonVal, &valMap) logMap = append(logMap, valMap) } else { var logInfo teamlog.TeamsLog logInfo.OrgId = g.OrgId //行政组织ID"` logInfo.TeamsTime = timeVal.AllTime //日期"` logInfo.IsmId = g.TypeId //制度ID"` logInfo.RankId = zuoXiTime[0].Id //班次"` logInfo.RulesId = 0 //轮询规则Id"` logInfo.Years, _ = strconv.Atoi(timeVal.Years) //日"` logInfo.Months, _ = strconv.Atoi(timeVal.Months) //月"` logInfo.Days, _ = strconv.Atoi(timeVal.Days) //年"` logInfo.Time = time.Now().Unix() //编辑时间"` logInfo.RankName = zuoXiTime[0].Name //执行倒班名称 logInfo.RulesName = "休" //当天班组或休班 logInfo.IsmName = g.TypeName //执行倒班制度名称 logInfo.TeamsId = 0 //班组ID"` logInfo.Sort = 0 //排序 logInfo.StartTime = zuoXiTime[0].StartTime //作业开始时间 logInfo.EndTime = zuoXiTime[0].EndTime //作业结束时间 jsonVal, _ := json.Marshal(logInfo) valMap := publicmethod.MapOut[string]() json.Unmarshal(jsonVal, &valMap) logMap = append(logMap, valMap) } } else if dataInfo.IsHolidays { //为假期;默认按国家法定节假日 var logInfo teamlog.TeamsLog logInfo.OrgId = g.OrgId //行政组织ID"` logInfo.TeamsTime = timeVal.AllTime //日期"` logInfo.IsmId = g.TypeId //制度ID"` logInfo.RankId = zuoXiTime[0].Id //班次"` logInfo.RulesId = 0 //轮询规则Id"` logInfo.Years, _ = strconv.Atoi(timeVal.Years) //日"` logInfo.Months, _ = strconv.Atoi(timeVal.Months) //月"` logInfo.Days, _ = strconv.Atoi(timeVal.Days) //年"` logInfo.Time = time.Now().Unix() //编辑时间"` logInfo.RankName = zuoXiTime[0].Name //执行倒班名称 logInfo.RulesName = "休" //当天班组或休班 logInfo.IsmName = g.TypeName //执行倒班制度名称 logInfo.TeamsId = 0 //班组ID"` logInfo.Sort = 0 //排序 logInfo.StartTime = zuoXiTime[0].StartTime //作业开始时间 logInfo.EndTime = zuoXiTime[0].EndTime //作业结束时间 jsonVal, _ := json.Marshal(logInfo) valMap := publicmethod.MapOut[string]() json.Unmarshal(jsonVal, &valMap) logMap = append(logMap, valMap) } else { var logInfo teamlog.TeamsLog logInfo.OrgId = g.OrgId //行政组织ID"` logInfo.TeamsTime = timeVal.AllTime //日期"` logInfo.IsmId = g.TypeId //制度ID"` logInfo.RankId = zuoXiTime[0].Id //班次"` logInfo.RulesId = lunXunShiXu[0].Id //轮询规则Id"` logInfo.Years, _ = strconv.Atoi(timeVal.Years) //日"` logInfo.Months, _ = strconv.Atoi(timeVal.Months) //月"` logInfo.Days, _ = strconv.Atoi(timeVal.Days) //年"` logInfo.Time = time.Now().Unix() //编辑时间"` logInfo.RankName = zuoXiTime[0].Name //执行倒班名称 logInfo.RulesName = lunXunShiXu[0].TeamName //当天班组或休班 logInfo.IsmName = g.TypeName //执行倒班制度名称 logInfo.TeamsId = lunXunShiXu[0].Teamid //班组ID"` logInfo.Sort = lunXunShiXu[0].Sort //排序 logInfo.StartTime = zuoXiTime[0].StartTime //作业开始时间 logInfo.EndTime = zuoXiTime[0].EndTime //作业结束时间 jsonVal, _ := json.Marshal(logInfo) valMap := publicmethod.MapOut[string]() json.Unmarshal(jsonVal, &valMap) logMap = append(logMap, valMap) } } else { teamSpan := 1 //班组跨度 teamSpanStep := 1 //班组临时跨度 lxSum := len(lunXunShiXu) if lxSum > 1 { for i := 0; i < lxSum-1; i++ { if i+1 <= lxSum-1 { if lunXunShiXu[i].Teamid == lunXunShiXu[i+1].Teamid { teamSpanStep++ } else { teamSpanStep = 1 } if teamSpanStep >= teamSpan { teamSpan = teamSpanStep } } } } AnalysisWorkRule(timeVal, zuoXiTime) fmt.Printf("连续跨度:%v\n", teamSpan) //根据班组连续跨度进行班组安排 switch teamSpan { case 2: //一班同一工作段上连续两天 case 3: //一班同一工作段上连续三天 case 4: //一班同一工作段上连续四天 case 5: //一班同一工作段上连续五天 case 6: //一班同一工作段上连续六天 case 7: //一班同一工作段上连续七天 default: //班组没有连续跨度,单一顺班 } } return } /* * @ 作者: 秦东 @ 时间: 2025-01-20 14:00:11 @ 功能: 计算当前工作时间段在当天还是明天及所在工作段顺位 #timeVal 当前时间 #zuoXiTime 工作时段 */ func AnalysisWorkRule(timeVal publicmethod.DateTimeTotimes, zuoXiTime []modelshr.WorkingTimePeriod) []modelshr.WorkingTimePeriod { if len(zuoXiTime) <= 2 { //根据现实生产逻辑。当一天轮询工作时间不超过2个时间段的时候。不会产生快日期排班情况 return zuoXiTime } else { sort.Slice(zuoXiTime, func(i, j int) bool { return zuoXiTime[i].StartTime < zuoXiTime[j].StartTime }) // for i, v := range zuoXiTime { // canji := v.Sort - i // fmt.Printf("%v------------------> %v\n", canji, v) // } } return zuoXiTime } /* * @ 作者: 秦东 @ 时间: 2025-01-20 16:03:42 @ 功能: 计算返回轮询规则信息 #lunXunShiXu 轮询规则 #startId 开始的点位 #step 执行几步 #posNeg 前进还是后退 1:前进,2:后退 */ func LunXunGuiZe(lunXunShiXu []modelshr.PollingRules, startId int64, step, posNeg int) (lunXunGuiZe modelshr.PollingRules) { creetStep := 0 for i, v := range lunXunShiXu { if v.Id == startId { creetStep = i } } // creetStep = creetStep fallNum := len(lunXunShiXu) //总共多少步伐 sendNum := 0 if posNeg == 1 { //前进 sendNum = ((creetStep-step)%fallNum+fallNum)%fallNum - 1 if sendNum < 0 { sendNum = fallNum - 1 } fmt.Printf("前进---->%v\n", sendNum) fmt.Printf("前进---->%v---->%v---->%v\n", creetStep, step, fallNum) } else { sendNum = (creetStep + step) % fallNum fmt.Printf("后退---->%v---->%v---->%v---->%v\n", sendNum, creetStep, step, fallNum) } lunXunGuiZe = lunXunShiXu[sendNum] return } /* * @ 作者: 秦东 @ 时间: 2025-01-24 09:35:42 @ 功能: 长白班解析 @ 参数 # @ 返回值 # @ 方法原型 # */ func (g *GenesInfo) changBaiBan(WeekAllDay []CalendarStructure, zuoXiTimeOne modelshr.WorkingTimePeriod, lunXunShiXu []modelshr.TeamsRules) map[string]interface{} { isWeek := publicmethod.MapOut[string]() if len(WeekAllDay) < 1 { return isWeek } var dayTimeLog []teamlog.TeamsLog for i, v := range WeekAllDay { var logMap []map[string]interface{} var timeVal publicmethod.DateTimeTotimes timeVal.BaisStrToTime(v.Date) dayRedisKey := fmt.Sprintf("SchedulingTeam:StartingPoint_%v_%v%v%v_%v_2", g.OrgId, timeVal.Years, timeVal.Months, timeVal.Days, g.TypeId) redisClient := grocerystore.RunRedis(overall.CONSTANT_REDIS2) isTrue, logContent := redisClient.Get(dayRedisKey) if isTrue { //redis存在获取redis数据 json.Unmarshal([]byte(logContent), &logMap) json.Unmarshal([]byte(logContent), &dayTimeLog) // fmt.Printf("Step1: %v\n", logContent) } else { //redis不存在从数据库中获取数据 overall.CONSTANT_DB_TeamsLog.Model(&teamlog.TeamsLog{}).Where("`orgId` = ? AND `years` = ? AND `months` = ? AND `days` = ? AND `ismId` = ?", g.OrgId, timeVal.Years, timeVal.Months, timeVal.Days, g.TypeId).Order("`sort` ASC").Find(&logMap) if len(logMap) > 0 { //数据库中存在直接用数据的数据 redisClient.SetRedisTime(5256000) jsonVal, _ := json.Marshal(logMap) redisClient.Set(dayRedisKey, string(jsonVal)) json.Unmarshal([]byte(jsonVal), &dayTimeLog) } else { //数据库中不存在开始计算 var logInfo teamlog.TeamsLog overall.CONSTANT_DB_TeamsLog.Where("`orgId` = ? AND `years` = ? AND `months` = ? AND `days` = ? AND `ismId` = ? AND `rankId` = ? AND `rulesId` = ? AND `teamsId` = ?", g.OrgId, timeVal.Years, timeVal.Months, timeVal.Days, g.TypeId, zuoXiTimeOne.Id, lunXunShiXu[i].TeamsId, lunXunShiXu[i].TeamsId).Order("`sort` ASC").First(&logInfo) if logInfo.Id == 0 { logInfo.OrgId = g.OrgId //班组ID"` logInfo.TeamsTime = timeVal.AllTime //日期"` logInfo.IsmId = g.TypeId //制度ID"` logInfo.RankId = zuoXiTimeOne.Id //班次"` if lunXunShiXu[i].CycleWorkTime != 0 { logInfo.RulesId = lunXunShiXu[i].TeamsId //轮询规则Id"` } logInfo.Days, _ = strconv.Atoi(timeVal.Days) //日"` logInfo.Months, _ = strconv.Atoi(timeVal.Months) //月"` logInfo.Years, _ = strconv.Atoi(timeVal.Years) //年"` logInfo.Time = time.Now().Unix() //编辑时间"` logInfo.IsmName = g.TypeName logInfo.RankName = zuoXiTimeOne.Name if !v.IsHolidays { if lunXunShiXu[i].CycleWorkTime != 0 { logInfo.RulesName = lunXunShiXu[i].TeamsName fmt.Printf("i ----1---->: %v\n", i) } else { if v.IsWorks { //是不是周末补班 logInfo.RulesName = "补" fmt.Printf("i ----2---->: %v\n", i) } else { if lunXunShiXu[i].CycleWorkName == "" { logInfo.RulesName = "休" fmt.Printf("i ----3---->: %v\n", i) } else { logInfo.RulesName = lunXunShiXu[i].CycleWorkName fmt.Printf("i ----4---->: %v\n", i) } } } } else { logInfo.RulesName = "假日" } logInfo.Sort = zuoXiTimeOne.Sort if lunXunShiXu[i].CycleWorkTime != 0 { logInfo.TeamsId = lunXunShiXu[i].TeamsId } logInfo.StartTime = zuoXiTimeOne.StartTime logInfo.EndTime = zuoXiTimeOne.EndTime overall.CONSTANT_DB_TeamsLog.Create(&logInfo) } dayTimeLog = append(dayTimeLog, logInfo) jsonVal, _ := json.Marshal(logInfo) valMap := publicmethod.MapOut[string]() json.Unmarshal(jsonVal, &valMap) logMap = append(logMap, valMap) redisClient.SetRedisTime(5256000) jsonValLog, _ := json.Marshal(logMap) redisClient.Set(dayRedisKey, string(jsonValLog)) } } isWeek[v.Date] = logMap jscvv, _ := json.Marshal(lunXunShiXu) fmt.Printf("\n\n\n\n\n\ni%v--------->v:%v----->lx:%v----->lx:%v\n\n\n\n\n\n", i, v, lunXunShiXu[i], string(jscvv)) } if len(dayTimeLog) > 0 { allRulesLog = dayTimeLog[len(dayTimeLog)-1] } return isWeek }