diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..f980ab9 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,7 @@ +{ + // 使用 IntelliSense 了解相关属性。 + // 悬停以查看现有属性的描述。 + // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [] +} \ No newline at end of file diff --git a/api/shiyan/maptostruct/shiyan.go b/api/shiyan/maptostruct/shiyan.go index 9e3a873..dac522e 100644 --- a/api/shiyan/maptostruct/shiyan.go +++ b/api/shiyan/maptostruct/shiyan.go @@ -843,3 +843,75 @@ func (a *ApiMethod) SetUpWorkWatch(c *gin.Context) { send["wechatCont"] = wechatCont publicmethod.Result(0, send, c) } + +// 工作段排序 +// type Shift struct { +// Name string +// Start time.Time +// End time.Time +// } + +func (a *ApiMethod) WorkTimeSortTP(c *gin.Context) { + // var requestData publicmethod.PublicId + // c.ShouldBindJSON(&requestData) + // sendData := publicmethod.MapOut[string]() + // var eorkPerList []modelshr.WorkingTimePeriod + // overall.CONSTANT_DB_HR.Model(&modelshr.WorkingTimePeriod{}).Where("`state` = 1 AND `type_id` = ?", requestData.Id).Order("sort ASC").Find(&eorkPerList) + // sendData["old"] = eorkPerList + // sort.Slice(eorkPerList, func(i, j int) bool { + // return eorkPerList[i].StartTime < eorkPerList[j].StartTime + // }) + // for i, v := range eorkPerList { + // canji := v.Sort - i + // fmt.Printf("%v------------------> %v\n", canji, v) + // } + // sendData["new"] = eorkPerList + // publicmethod.Result(0, sendData, c) + // 获取当前日期 + startDate := time.Date(2025, 1, 1, 0, 0, 0, 0, time.Local) + numDays := 7 // 生成 7 天的排班表 + schedule := generateSchedule(startDate, numDays) + for _, shift := range schedule { + fmt.Printf("日期: %s, 班次: %s, 班组: %s, 时间从 %s 到 %s\n", + shift.StartTime.Format("2006-01-02"), shift.ShiftName, shift.Team, + shift.StartTime.Format("15:04"), shift.EndTime.Format("15:04")) + } + +} + +type Shift struct { + ShiftName string + StartTime time.Time + EndTime time.Time + Team string +} + +func generateSchedule(startDate time.Time, numDays int) []Shift { + shifts := []Shift{} + teams := []string{"甲班", "乙班", "丙班", "丁班"} + for i := 0; i < numDays; i++ { + day := startDate.AddDate(0, 0, i) + for j, shiftName := range []string{"早班", "中班", "晚班"} { + teamIndex := ((i*len(teams) + j) % len(teams)) + var startTime, endTime time.Time + switch shiftName { + case "早班": + startTime = time.Date(day.Year(), day.Month(), day.Day(), 8, 0, 0, 0, day.Location()) + endTime = time.Date(day.Year(), day.Month(), day.Day(), 16, 0, 0, 0, day.Location()) + case "中班": + startTime = time.Date(day.Year(), day.Month(), day.Day(), 16, 0, 0, 0, day.Location()) + endTime = time.Date(day.Year(), day.Month(), day.Day(), 24, 0, 0, 0, day.Location()) + case "晚班": + startTime = time.Date(day.Year(), day.Month(), day.Day()+1, 0, 0, 0, 0, day.Location()) + endTime = time.Date(day.Year(), day.Month(), day.Day()+1, 8, 0, 0, 0, day.Location()) + } + shifts = append(shifts, Shift{ + ShiftName: shiftName, + StartTime: startTime, + EndTime: endTime, + Team: teams[teamIndex], + }) + } + } + return shifts +} diff --git a/api/version1/customerApp/runAppControll.go b/api/version1/customerApp/runAppControll.go index 38a79fa..7b36721 100644 --- a/api/version1/customerApp/runAppControll.go +++ b/api/version1/customerApp/runAppControll.go @@ -8,10 +8,12 @@ import ( "appPlatform/models/modelshr" "appPlatform/overall" "appPlatform/overall/publicmethod" + "encoding/json" "fmt" "sort" "strconv" "strings" + "time" "github.com/gin-gonic/gin" ) @@ -772,3 +774,129 @@ func (a *ApiMethod) GainDataStorceAllField(c *gin.Context) { } publicmethod.Result(0, fieldList, c) } + +/* +* +@ 作者: 秦东 +@ 时间: 2025-02-18 09:42:49 +@ 功能: 获取所有自定义App +@ 参数 + + # + +@ 返回值 + + # + +@ 方法原型 + + # +*/ +func (a *ApiMethod) GaveAllApp(c *gin.Context) { + var list []modelAppPlatform.CustomerForm + overall.CONSTANT_DB_AppPlatform.Where("`classify` = 3 AND `states` = 1").Find(&list) + var sendData []DiaobanTable + if len(list) > 0 { + for _, v := range list { + var sendInfo DiaobanTable + sendInfo.AppId = strconv.FormatInt(v.Id, 10) + sendInfo.AppName = v.Name + sendInfo.List = GetAppForm(v.SignCode, 2) + sendInfo.SignCode = strconv.FormatInt(v.SignCode, 10) + sendData = append(sendData, sendInfo) + } + } + publicmethod.Result(0, sendData, c) +} + +/* +* +@ 作者: 秦东 +@ 时间: 2025-02-18 10:20:51 +@ 功能: 获取流程表单 +*/ +func GetAppForm(appId int64, types int) (tableForm []TableInfo) { + var formVersion []modelAppPlatform.CustomerFormView + overall.CONSTANT_DB_AppPlatform.Where("`classify` = ? AND `states` = 1 AND `groupid` = ?", types, appId).Find(&formVersion) + for _, v := range formVersion { + if v.MastesFormJson != "" { + var formJsonCont customerform.CustomerFormMaster + json.Unmarshal([]byte(v.MastesFormJson), &formJsonCont) + var tableFormInfo TableInfo + tableFormInfo.SqlType = formJsonCont.Form.DataSourceConfig.DSN.SqlType + tableFormInfo.Ip = formJsonCont.Form.DataSourceConfig.DSN.Ip + tableFormInfo.DataBaseName = formJsonCont.Form.DataSourceConfig.DSN.DataBaseName + tableFormInfo.Port = formJsonCont.Form.DataSourceConfig.DSN.Port + tableFormInfo.UserName = formJsonCont.Form.DataSourceConfig.DSN.UserName + tableFormInfo.Password = formJsonCont.Form.DataSourceConfig.DSN.Password + tableFormInfo.DataSource = formJsonCont.Form.DataSource //是不是引用外部数据源 + tableFormInfo.TableName = v.Name //数据表名称 + tableFormInfo.TableKey = v.TableKey + tableFormInfo.SourceId = formJsonCont.Form.DataSourceConfig.Id + tableForm = append(tableForm, tableFormInfo) + } + } + + return +} + +/* +* +@ 作者: 秦东 +@ 时间: 2025-02-18 13:28:32 +@ 功能: 获取已经设定好的参数 +@ 参数 + + # + +@ 返回值 + + # + +@ 方法原型 + + # +*/ +func (a *ApiMethod) GinTeamRule(c *gin.Context) { + var dbSetupInfo customerForm.DiaoBanSetup + overall.CONSTANT_DB_AppPlatform.First(&dbSetupInfo) + publicmethod.Result(0, dbSetupInfo, c) +} + +/* +* +@ 作者: 秦东 +@ 时间: 2025-02-18 13:52:46 +@ 功能: 设定取值 +@ 参数 + + # + +@ 返回值 + + # + +@ 方法原型 + + # +*/ +func (a *ApiMethod) SetupRulerForm(c *gin.Context) { + var requestData TableFormDnsConfig + c.ShouldBindJSON(&requestData) + overall.CONSTANT_DB_AppPlatform.Exec("TRUNCATE diaoBanSetup") + var diaoIno customerForm.DiaoBanSetup + diaoIno.Appid, _ = strconv.ParseInt(requestData.AppId, 10, 64) //归属哪个app"` + diaoIno.Source = requestData.DataSource //是否引用数据源(yes ; no)"` + diaoIno.Ip = requestData.Ip //数据源地址"` + diaoIno.DataBaseName = requestData.DataBaseName //是否引用数据源(yes ; no)"` + diaoIno.SqlType = requestData.SqlType //数据库类型"`:数据表名称"` + diaoIno.UserName = requestData.UserName //';comment:数据库用户名"` + diaoIno.Pwd = requestData.Password //数据库密码"` + diaoIno.Time = time.Now().Unix() //not null;comment:创建时间"` + diaoIno.TableKey = requestData.TableKey + diaoIno.TableNames = requestData.TableName + diaoIno.SourceId = requestData.SourceId + diaoIno.Port = requestData.Port + overall.CONSTANT_DB_AppPlatform.Create(&diaoIno) + publicmethod.Result(0, requestData, c) +} diff --git a/api/version1/customerApp/type.go b/api/version1/customerApp/type.go index 5ae8613..56931a1 100644 --- a/api/version1/customerApp/type.go +++ b/api/version1/customerApp/type.go @@ -1,6 +1,7 @@ package customerApp import ( + "appPlatform/api/version1/customerform" "appPlatform/api/version1/publicapi" "appPlatform/models/modelAppPlatform" "appPlatform/models/modelshr" @@ -278,3 +279,24 @@ type DatabaseConfig struct { User string `json:"user"` Password string `json:"pwd"` } + +// 调班使用得应用列表 +type DiaobanTable struct { + AppId string `json:"app_id"` + AppName string `json:"app_name"` + SignCode string `json:"sign_code"` + List []TableInfo `json:"list"` +} + +type TableInfo struct { + SourceId string `json:"source_id"` + DataSource string `json:"data_source"` //是不是引用外部数据源 + TableName string `json:"table_name"` //数据表名称 + TableKey string `json:"table_key"` + customerform.DsnConfig +} + +type TableFormDnsConfig struct { + AppId string `json:"appid"` + TableInfo +} diff --git a/api/version1/customerform/formTable.go b/api/version1/customerform/formTable.go index 6414121..6ddcac2 100644 --- a/api/version1/customerform/formTable.go +++ b/api/version1/customerform/formTable.go @@ -1401,40 +1401,60 @@ func (a *ApiMethod) GainFormPageListCont(c *gin.Context) { //获取任务状态 for i, v := range formList { formList[i]["isRetract"] = false - if mastrKey, ok := v["runFlowId"]; ok { - // fmt.Printf("masters_key----------->%v\n", v["masters_key"]) - mastrKeyInt, _ := publicmethod.StringToInt64(mastrKey) - if mastrKeyInt != 0 { - var runFlowInfo customerForm.RunWorkflow - runFlowInfo.GetCont(map[string]interface{}{"`id`": mastrKey}, "`id`", "`current_step`", "`next_step`") - formList[i]["runFlowInfo"] = runFlowInfo.Id - // fmt.Printf("runFlowInfo----------->%v--------->%v\n", runFlowInfo, v["taskStatus"]) - if stateVal, ok := v["taskStatus"]; ok { - // fmt.Printf("NextStep----------->%T----------->%v--------->%v--------->%v\n", stateVal, stateVal, runFlowInfo.NextStep, runFlowInfo.CurrentStep) - if stauval, ok := stateVal.(string); ok { - if stauval == "3" && runFlowInfo.NextStep != 0 { + if mastrKeyVal, isOk := v["masters_key"]; isOk { - if runFlowInfo.CurrentStep == 1 { - if createrName, ok := formList[i]["creater"].(string); ok { - if createrName == userCont.Name { - formList[i]["isRetract"] = true - } + if mastrKeyUint64, ok := mastrKeyVal.(uint64); ok { + formList[i]["masters_key"] = strconv.FormatUint(mastrKeyUint64, 10) + } + var taskInfo customerForm.TaskRecord + overall.CONSTANT_DB_CustomerForm.Where("`masters_key` = ?", mastrKeyVal).First(&taskInfo) + formList[i]["runFlowId"] = strconv.FormatInt(taskInfo.RunFlowId, 10) + if mastrKey, ok := formList[i]["runFlowId"]; ok { + // fmt.Printf("masters_key----------->%v\n", v["masters_key"]) + mastrKeyInt, _ := publicmethod.StringToInt64(mastrKey) + if mastrKeyInt != 0 { + var runFlowInfo customerForm.RunWorkflow + runFlowInfo.GetCont(map[string]interface{}{"`id`": mastrKey}, "`id`", "`current_step`", "`next_step`") + formList[i]["runFlowInfo"] = strconv.FormatInt(runFlowInfo.Id, 10) + // fmt.Printf("runFlowInfo----------->%v--------->%v\n", runFlowInfo, v["taskStatus"]) + if taskInfo.Status == 3 && runFlowInfo.NextStep != 0 { + if runFlowInfo.CurrentStep == 1 { + if createrName, ok := formList[i]["creater"].(string); ok { + if createrName == userCont.Name { + formList[i]["isRetract"] = true } - } + } } + // if stateVal, ok := v["taskStatus"]; ok { + // // fmt.Printf("NextStep----------->%T----------->%v--------->%v--------->%v\n", stateVal, stateVal, runFlowInfo.NextStep, runFlowInfo.CurrentStep) + // if stauval, ok := stateVal.(string); ok { + // if stauval == "3" && runFlowInfo.NextStep != 0 { + + // if runFlowInfo.CurrentStep == 1 { + // if createrName, ok := formList[i]["creater"].(string); ok { + // if createrName == userCont.Name { + // formList[i]["isRetract"] = true + // } + // } + + // } + // } + // } + + // } } - } - } - if mastrKeyVal, ok := v["masters_key"]; ok { - // fmt.Printf("mastrKeyVal----------->%T----------->%v\n", mastrKeyVal, mastrKeyVal) - if mastrKeyUint64, ok := mastrKeyVal.(uint64); ok { - formList[i]["masters_key"] = strconv.FormatUint(mastrKeyUint64, 10) } } + // if mastrKeyVal, ok := v["masters_key"]; ok { + // // fmt.Printf("mastrKeyVal----------->%T----------->%v\n", mastrKeyVal, mastrKeyVal) + // if mastrKeyUint64, ok := mastrKeyVal.(uint64); ok { + // formList[i]["masters_key"] = strconv.FormatUint(mastrKeyUint64, 10) + // } + // } } // publicmethod.Result(100, formList, c) diff --git a/api/version1/menus/menus.go b/api/version1/menus/menus.go index 0edff4e..5c78d17 100644 --- a/api/version1/menus/menus.go +++ b/api/version1/menus/menus.go @@ -49,7 +49,9 @@ func (a *ApiMethod) GetMenusThree(c *gin.Context) { // sort.Slice(menusList, func(i, j int) bool { // return menusList[i].Sort > menusList[j].Sort // }) + routerThree := publicmethod.GetMenuRouterThree(0, menusList) + publicmethod.Result(0, routerThree, c) } @@ -953,7 +955,9 @@ func (a *ApiMethod) AnalysisMonthRulers(c *gin.Context) { menuCont.RulesSort = starTeam.Sort var wtpInfo modelshr.WorkingTimePeriod wtpInfo.GetCont(map[string]interface{}{"`id`": menuCont.PeriodId}, " `name`", " `sort`", "`start_time` ", "`end_time`") - menuCont.PeriodName = fmt.Sprintf("%v(%v - %v)", wtpInfo.Name, wtpInfo.StartTime, wtpInfo.EndTime) + menuCont.PeriodName = wtpInfo.Name + menuCont.StartTimeStr = wtpInfo.StartTime + menuCont.EndTimeStr = wtpInfo.EndTime //作息时间 var zuoXiTime []modelshr.WorkingTimePeriod overall.CONSTANT_DB_HR.Model(&modelshr.WorkingTimePeriod{}).Where("`state` = 1 AND `type_id` = ?", menuCont.TypeId).Order("`sort` ASC").Find(&zuoXiTime) @@ -968,6 +972,9 @@ func (a *ApiMethod) AnalysisMonthRulers(c *gin.Context) { publicmethod.Result(200, sendMonthList, c) return } + + fmt.Printf("menuCont时间差:%v\n", menuCont) + //Step 4: 计算当前时间段与原点关系 lastDayNumber := 0 var starTemasTime publicmethod.DateTimeTotimes @@ -978,18 +985,19 @@ func (a *ApiMethod) AnalysisMonthRulers(c *gin.Context) { var wvTimeAll publicmethod.DateTimeTotimes wvTimeAll.BaisStrToTime(wv.Date) sjc := wvTimeAll.AllTime - starTemasTime.AllTime - fmt.Printf("%v - %v - %v 时间差:%v\n", wv.Date, wvTimeAll.AllTime, starTemasTime.AllTime, sjc) + // fmt.Printf("%v - %v - %v 时间差:%v\n", wv.Date, wvTimeAll.AllTime, starTemasTime.AllTime, sjc) if sjc >= 0 { if sjc == 0 { - listAry := menuCont.TeamsYuanDianRun(wv, wvTimeAll, zuoXiTime, lunXunShiXu) + // listAry := menuCont.TeamsYuanDianRun(wv, wvTimeAll, zuoXiTime, lunXunShiXu) + listAry := menuCont.TeamsYuanDianRunNew(wv, wvTimeAll, zuoXiTime, lunXunShiXu) inDate := publicmethod.MapOut[string]() inDate[wv.Date] = listAry listSynv.List = append(listSynv.List, inDate) } else { - listAry := menuCont.TeamsRun(wv, wvTimeAll, zuoXiTime, lunXunShiXu) - + // listAry := menuCont.TeamsRun(wv, wvTimeAll, zuoXiTime, lunXunShiXu) + listAry := menuCont.SpecifyDateTeams(wv, wvTimeAll, zuoXiTime, lunXunShiXu) inDate := publicmethod.MapOut[string]() inDate[wv.Date] = listAry listSynv.List = append(listSynv.List, inDate) @@ -1011,7 +1019,7 @@ func (a *ApiMethod) AnalysisMonthRulers(c *gin.Context) { //获取上个月最后一天 // lastMonthStart, lastMonthEnd := publicmethod.GetLastMonthStartEnd(creTimeAll.AllTimeString) - + // fmt.Printf("------------------>%v\n", allRulesLog) publicmethod.Result(0, sendMonthList, c) } @@ -1032,9 +1040,9 @@ func (g *GenesInfo) TeamsYuanDianRun(dataInfo CalendarStructure, timeVal publicm dayRedisKey := fmt.Sprintf("SchedulingTeam:StartingPoint_%v_%v_%v_%v", g.OrgId, g.TypeId, g.PeriodId, g.Rules) redisClient := grocerystore.RunRedis(overall.CONSTANT_REDIS2) isTrue, logContent := redisClient.Get(dayRedisKey) - var logInfo teamlog.TeamsLog + isTrue = false if isTrue { - json.Unmarshal([]byte(logContent), &logInfo) + json.Unmarshal([]byte(logContent), &logMap) valMap := publicmethod.MapOut[string]() json.Unmarshal([]byte(logContent), &valMap) // valueOfExample := reflect.ValueOf(logInfo) @@ -1044,216 +1052,260 @@ func (g *GenesInfo) TeamsYuanDianRun(dataInfo CalendarStructure, timeVal publicm // } // } // logList = append(logList, logInfo) - logMap = append(logMap, valMap) - allRulesLog = logInfo + // logMap = append(logMap, valMap) + // allRulesLog = logInfo } else { - logInfo.OrgId = g.OrgId //班组ID"` - logInfo.TeamsTime = timeVal.AllTime //日期"` - logInfo.IsmId = g.TypeId //制度ID"` - logInfo.RankId = g.PeriodId //班次"` - logInfo.RulesId = g.Rules //轮询规则Id"` - logInfo.Days, _ = strconv.Atoi(timeVal.Years) //日"` - logInfo.Months, _ = strconv.Atoi(timeVal.Months) //月"` - logInfo.Years, _ = strconv.Atoi(timeVal.Days) //年"` - logInfo.Time = time.Now().Unix() //编辑时间"` - logInfo.IsmName = g.TypeName - logInfo.RankName = g.PeriodName - logInfo.RulesName = g.RulesTime - logInfo.Sort = g.RulesSort - logInfo.TeamsId = g.Rules - overall.CONSTANT_DB_TeamsLog.Create(&logInfo) + // var logInfo teamlog.TeamsLog + // logInfo.OrgId = g.OrgId //班组ID"` + // logInfo.TeamsTime = timeVal.AllTime //日期"` + // logInfo.IsmId = g.TypeId //制度ID"` + // logInfo.RankId = g.PeriodId //班次"` + // logInfo.RulesId = g.Rules //轮询规则Id"` + // logInfo.Days, _ = strconv.Atoi(timeVal.Years) //日"` + // logInfo.Months, _ = strconv.Atoi(timeVal.Months) //月"` + // logInfo.Years, _ = strconv.Atoi(timeVal.Days) //年"` + // logInfo.Time = time.Now().Unix() //编辑时间"` + // logInfo.IsmName = g.TypeName + // logInfo.RankName = g.PeriodName + // logInfo.RulesName = g.RulesTime + // logInfo.Sort = g.RulesSort + // logInfo.TeamsId = g.Rules + // overall.CONSTANT_DB_TeamsLog.Create(&logInfo) // logList = append(logList, logInfo) - allRulesLog = logInfo - redisClient.SetRedisTime(5256000) - jsonVal, _ := json.Marshal(logInfo) - redisClient.Set(dayRedisKey, string(jsonVal)) - valMap := publicmethod.MapOut[string]() - json.Unmarshal(jsonVal, &valMap) - logMap = append(logMap, valMap) - } - - return -} - -/* -* -@ 作者: 秦东 -@ 时间: 2025-01-18 09:26:03 -@ 功能: 解析排班规则 -@ 参数 - - #dataInfo 当前日期属性 - #timeVal 当前时间 - #zuoXiTime 作息时间段 - #lunXunShiXu 轮询规则 -*/ -func (g *GenesInfo) TeamsRun(dataInfo CalendarStructure, timeVal publicmethod.DateTimeTotimes, zuoXiTime []modelshr.WorkingTimePeriod, lunXunShiXu []modelshr.PollingRules) (logMap []map[string]interface{}) { - - // var logList []teamlog.TeamsLog - if len(zuoXiTime) < 1 && len(lunXunShiXu) < 1 { - return - } else if len(zuoXiTime) == 1 && len(lunXunShiXu) == 1 { - if dataInfo.IsWorks { - for _, v := range zuoXiTime { + // allRulesLog = logInfo + // redisClient.SetRedisTime(5256000) + // jsonVal, _ := json.Marshal(logInfo) + // redisClient.Set(dayRedisKey, string(jsonVal)) + // valMap := publicmethod.MapOut[string]() + // json.Unmarshal(jsonVal, &valMap) + // logMap = append(logMap, valMap) + + //按时间排序 + sort.Slice(zuoXiTime, func(i, j int) bool { + return zuoXiTime[i].StartTime < zuoXiTime[j].StartTime + }) + fmt.Printf("更改排序后---------->%v\n", zuoXiTime) + + fmt.Printf("更改排序后----g------>%v\n", g) + + //判断起始地点前边有多少数据 + tianZhenghouNum := 0 + for i, v := range zuoXiTime { + if v.Id == g.PeriodId { + tianZhenghouNum = i + 1 + } + } + //安排定点前边的排班结果 + if tianZhenghouNum > 0 { + for i := tianZhenghouNum - 1; i > 0; i-- { + creeLunXun := LunXunGuiZe(lunXunShiXu, g.Rules, i, 1) var logInfo teamlog.TeamsLog logInfo.OrgId = g.OrgId //班组ID"` logInfo.TeamsTime = timeVal.AllTime //日期"` logInfo.IsmId = g.TypeId //制度ID"` - logInfo.RankId = v.Id //班次"` - logInfo.RulesId = 0 //轮询规则Id"` + logInfo.RankId = zuoXiTime[i].Id //班次"` + logInfo.RulesId = creeLunXun.Id //轮询规则Id"` logInfo.Days, _ = strconv.Atoi(timeVal.Years) //日"` logInfo.Months, _ = strconv.Atoi(timeVal.Months) //月"` logInfo.Years, _ = strconv.Atoi(timeVal.Days) //年"` logInfo.Time = time.Now().Unix() //编辑时间"` logInfo.IsmName = g.TypeName - logInfo.RankName = fmt.Sprintf("%v(%v - %v)", v.Name, v.StartTime, v.EndTime) //v.Name - logInfo.RulesName = "休" - logInfo.TeamsId = 0 - logInfo.Sort = 0 - // logList = append(logList, logInfo) + logInfo.RankName = zuoXiTime[i].Name + logInfo.RulesName = creeLunXun.TeamName + logInfo.Sort = creeLunXun.Sort + logInfo.TeamsId = creeLunXun.Id + logInfo.StartTime = zuoXiTime[i].StartTime + logInfo.EndTime = zuoXiTime[i].EndTime + overall.CONSTANT_DB_TeamsLog.Create(&logInfo) + jsonVal, _ := json.Marshal(logInfo) valMap := publicmethod.MapOut[string]() json.Unmarshal(jsonVal, &valMap) logMap = append(logMap, valMap) } - - } else { - for _, v := range zuoXiTime { + } + //计算原点位置 + var logInfoYuan teamlog.TeamsLog + logInfoYuan.OrgId = g.OrgId //班组ID"` + logInfoYuan.TeamsTime = timeVal.AllTime //日期"` + logInfoYuan.IsmId = g.TypeId //制度ID"` + logInfoYuan.RankId = zuoXiTime[tianZhenghouNum-1].Id //班次"` + logInfoYuan.RulesId = g.Rules //轮询规则Id"` + logInfoYuan.Days, _ = strconv.Atoi(timeVal.Years) //日"` + logInfoYuan.Months, _ = strconv.Atoi(timeVal.Months) //月"` + logInfoYuan.Years, _ = strconv.Atoi(timeVal.Days) //年"` + logInfoYuan.Time = time.Now().Unix() //编辑时间"` + logInfoYuan.IsmName = g.TypeName + logInfoYuan.RankName = zuoXiTime[tianZhenghouNum-1].Name + logInfoYuan.RulesName = g.RulesTime + logInfoYuan.Sort = g.RulesSort + logInfoYuan.TeamsId = g.Rules + logInfoYuan.StartTime = zuoXiTime[tianZhenghouNum-1].StartTime + logInfoYuan.EndTime = zuoXiTime[tianZhenghouNum-1].EndTime + overall.CONSTANT_DB_TeamsLog.Create(&logInfoYuan) + jsonValYuan, _ := json.Marshal(logInfoYuan) + valMapYuan := publicmethod.MapOut[string]() + json.Unmarshal(jsonValYuan, &valMapYuan) + logMap = append(logMap, valMapYuan) + //计算后边有几个排班 + lastNum := len(zuoXiTime) - (tianZhenghouNum) + + if lastNum > 0 { + for i := 1; i <= lastNum; i++ { + creeLunXun := LunXunGuiZe(lunXunShiXu, g.Rules, i, 2) var logInfo teamlog.TeamsLog logInfo.OrgId = g.OrgId //班组ID"` logInfo.TeamsTime = timeVal.AllTime //日期"` logInfo.IsmId = g.TypeId //制度ID"` - logInfo.RankId = v.Id //班次"` - logInfo.RulesId = zuoXiTime[0].Id //轮询规则Id"` + logInfo.RankId = zuoXiTime[i].Id //班次"` + logInfo.RulesId = creeLunXun.Id //轮询规则Id"` logInfo.Days, _ = strconv.Atoi(timeVal.Years) //日"` logInfo.Months, _ = strconv.Atoi(timeVal.Months) //月"` logInfo.Years, _ = strconv.Atoi(timeVal.Days) //年"` logInfo.Time = time.Now().Unix() //编辑时间"` logInfo.IsmName = g.TypeName - logInfo.RankName = fmt.Sprintf("%v(%v - %v)", v.Name, v.StartTime, v.EndTime) //v.Name - logInfo.RulesName = lunXunShiXu[0].TeamName - logInfo.TeamsId = lunXunShiXu[0].Teamid - logInfo.Sort = lunXunShiXu[0].Sort - // logList = append(logList, logInfo) + logInfo.RankName = zuoXiTime[i].Name + logInfo.RulesName = creeLunXun.TeamName + logInfo.Sort = creeLunXun.Sort + logInfo.TeamsId = creeLunXun.Id + overall.CONSTANT_DB_TeamsLog.Create(&logInfo) + jsonVal, _ := json.Marshal(logInfo) valMap := publicmethod.MapOut[string]() json.Unmarshal(jsonVal, &valMap) logMap = append(logMap, valMap) } } - } else { - //判断轮询规制(是两天一换还是一天一换) - var lunXunChuchong []int64 - maxSort := 0 //最大排序 - for _, v := range lunXunShiXu { - if !publicmethod.IsInTrue[int64](v.Teamid, lunXunChuchong) { - lunXunChuchong = append(lunXunChuchong, v.Teamid) - } - if maxSort <= v.Sort { - maxSort = v.Sort - } - } - //基于上个日期班组定位顺序 - lastStep := 0 - startStep := 0 //起始步伐 - workTimeNum := len(zuoXiTime) //一天拍几个班 - for _, v := range zuoXiTime { - if allRulesLog.RankId == v.Id { - lastStep = len(zuoXiTime) - v.Sort - startStep = v.Sort - } - } - if startStep <= 0 { - startStep = 1 - } - beiChuShu := 1 - if len(lunXunChuchong) > 0 { - beiChuShu = len(lunXunChuchong) - } - yuanDianDay := fmt.Sprintf("%v-%v-%v", allRulesLog.Years, allRulesLog.Months, allRulesLog.Days) - xiangChaJitian, err := publicmethod.DayBetweenDate(dataInfo.Date, yuanDianDay) //与上一个排班相差几天 - if err != nil { - xiangChaJitian = 1 - } - - switch len(lunXunShiXu) / beiChuShu { - case 2: - case 3: - case 4: - case 5: - case 6: - case 7: - default: - dayRedisKey := fmt.Sprintf("SchedulingTeam:StartingPoint_%v_%v_%v_%v", g.OrgId, g.TypeId, g.PeriodId, g.Rules) - redisClient := grocerystore.RunRedis(overall.CONSTANT_REDIS2) - - stepAll := xiangChaJitian*workTimeNum + lastStep //一共要走的步数 - for i := 1; i <= stepAll; i++ { - startStep++ - if startStep > workTimeNum { - startStep = 1 - } - // for _, zv := range zuoXiTime { - if i > lastStep { - for _, v := range lunXunShiXu { - if v.Sort == startStep { - fmt.Printf("") - - workInfoDuan := PaiBanSunXu(startStep, zuoXiTime) - var logInfo teamlog.TeamsLog - logInfo.GetCont(map[string]interface{}{"`orgId`": g.OrgId, "`years`": timeVal.Years, "`months`": timeVal.Months, "`days`": timeVal.Days, "`ismId`": g.TypeId, "`rulesId`": g.PeriodId, "`teamsId`": v.Teamid}) - if logInfo.Id != 0 { - editInfo := publicmethod.MapOut[string]() - editInfo["rulesName"] = v.TeamName - editInfo["time"] = time.Now().Unix() - logInfo.EiteCont(map[string]interface{}{"`id`": logInfo.Id}, editInfo) - // logList = append(logList, logInfo) - jsonVal, _ := json.Marshal(logInfo) - valMap := publicmethod.MapOut[string]() - json.Unmarshal(jsonVal, &valMap) - logMap = append(logMap, valMap) - redisClient.SetRedisTime(5256000) - // jsonVal, _ := json.Marshal(logInfo) - redisClient.Set(dayRedisKey, string(jsonVal)) - } else { - logInfo.OrgId = g.OrgId //班组ID"` - logInfo.TeamsTime = timeVal.AllTime //日期"` - logInfo.IsmId = g.TypeId //制度ID"` - logInfo.RankId = workInfoDuan.Id //g.PeriodId //班次"` - logInfo.RulesId = g.Rules //轮询规则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 = fmt.Sprintf("%v(%v - %v)", workInfoDuan.Name, workInfoDuan.StartTime, workInfoDuan.EndTime) //workInfoDuan.Name //g.PeriodName - logInfo.RulesName = v.TeamName - logInfo.TeamsId = v.Teamid - logInfo.Sort = g.RulesSort - overall.CONSTANT_DB_TeamsLog.Create(&logInfo) - // logList = append(logList, logInfo) - jsonVal, _ := json.Marshal(logInfo) - valMap := publicmethod.MapOut[string]() - json.Unmarshal(jsonVal, &valMap) - logMap = append(logMap, valMap) - redisClient.SetRedisTime(5256000) - // jsonVal, _ := json.Marshal(logInfo) - redisClient.Set(dayRedisKey, string(jsonVal)) - - } - - } - - } - } - // } + // allRulesLogMap := logMap[len(logMap)-1] + // if lmStr,isOk := allRulesLogMap.(string);isOk { - } - } + // } + // json.Unmarshal() + slogMapVal, _ := json.Marshal(logMap) + redisClient.Set(dayRedisKey, string(slogMapVal)) } + return } +/* +* +@ 作者: 秦东 +@ 时间: 2025-01-18 09:26:03 +@ 功能: 解析排班规则 +@ 参数 + + #dataInfo 当前日期属性 + #timeVal 当前时间 + #zuoXiTime 作息时间段 + #lunXunShiXu 轮询规则 +// */ +// func (g *GenesInfo) TeamsRun(dataInfo CalendarStructure, timeVal publicmethod.DateTimeTotimes, zuoXiTime []modelshr.WorkingTimePeriod, lunXunShiXu []modelshr.PollingRules) (logMap []map[string]interface{}) { + +// // var logList []teamlog.TeamsLog +// if len(zuoXiTime) < 1 && len(lunXunShiXu) < 1 { //没有设置工作时间段,也没有轮询规则 +// return +// } else if len(zuoXiTime) == 1 && len(lunXunShiXu) == 1 { //单一工作段,单一轮询规则 +// if dataInfo.IsWorks { //判断当前是不是周末。是周末的话俺休班计算。 +// for _, v := range zuoXiTime { +// var logInfo teamlog.TeamsLog +// logInfo.OrgId = g.OrgId //班组ID"` +// logInfo.TeamsTime = timeVal.AllTime //日期"` +// logInfo.IsmId = g.TypeId //制度ID"` +// logInfo.RankId = v.Id //班次"` +// logInfo.RulesId = 0 //轮询规则Id"` +// logInfo.Days, _ = strconv.Atoi(timeVal.Years) //日"` +// logInfo.Months, _ = strconv.Atoi(timeVal.Months) //月"` +// logInfo.Years, _ = strconv.Atoi(timeVal.Days) //年"` +// logInfo.Time = time.Now().Unix() //编辑时间"` +// logInfo.IsmName = g.TypeName +// logInfo.RankName = fmt.Sprintf("%v(%v - %v)", v.Name, v.StartTime, v.EndTime) //v.Name +// logInfo.RulesName = "休" +// logInfo.TeamsId = 0 +// logInfo.Sort = 0 +// // logList = append(logList, logInfo) +// jsonVal, _ := json.Marshal(logInfo) +// valMap := publicmethod.MapOut[string]() +// json.Unmarshal(jsonVal, &valMap) +// logMap = append(logMap, valMap) +// } + +// } else { //不是周末正常上班 +// for _, v := range zuoXiTime { +// var logInfo teamlog.TeamsLog +// logInfo.OrgId = g.OrgId //班组ID"` +// logInfo.TeamsTime = timeVal.AllTime //日期"` +// logInfo.IsmId = g.TypeId //制度ID"` +// logInfo.RankId = v.Id //班次"` +// logInfo.RulesId = zuoXiTime[0].Id //轮询规则Id"` +// logInfo.Days, _ = strconv.Atoi(timeVal.Years) //日"` +// logInfo.Months, _ = strconv.Atoi(timeVal.Months) //月"` +// logInfo.Years, _ = strconv.Atoi(timeVal.Days) //年"` +// logInfo.Time = time.Now().Unix() //编辑时间"` +// logInfo.IsmName = g.TypeName +// logInfo.RankName = fmt.Sprintf("%v(%v - %v)", v.Name, v.StartTime, v.EndTime) //v.Name +// logInfo.RulesName = lunXunShiXu[0].TeamName +// logInfo.TeamsId = lunXunShiXu[0].Teamid +// logInfo.Sort = lunXunShiXu[0].Sort +// // logList = append(logList, logInfo) +// jsonVal, _ := json.Marshal(logInfo) +// valMap := publicmethod.MapOut[string]() +// json.Unmarshal(jsonVal, &valMap) +// logMap = append(logMap, valMap) +// } +// } +// } else { +// //判断轮询规制(是两天一换还是一天一换) +// var lunXunChuchong []int64 +// maxSort := 0 //最大排序 +// for _, v := range lunXunShiXu { +// if !publicmethod.IsInTrue[int64](v.Teamid, lunXunChuchong) { +// lunXunChuchong = append(lunXunChuchong, v.Teamid) +// } +// if maxSort <= v.Sort { +// maxSort = v.Sort +// } +// } +// //基于上个日期班组定位顺序 +// lastStep := 0 +// startStep := 0 //起始步伐 +// workTimeNum := len(zuoXiTime) //一天拍几个班 +// for _, v := range zuoXiTime { +// if allRulesLog.RankId == v.Id { +// lastStep = len(zuoXiTime) - v.Sort +// startStep = v.Sort +// } +// } +// if startStep <= 0 { +// startStep = 1 +// } +// beiChuShu := 1 +// if len(lunXunChuchong) > 0 { +// beiChuShu = len(lunXunChuchong) +// } +// yuanDianDay := fmt.Sprintf("%v-%v-%v", allRulesLog.Years, allRulesLog.Months, allRulesLog.Days) +// xiangChaJitian, err := publicmethod.DayBetweenDate(dataInfo.Date, yuanDianDay) //与上一个排班相差几天 +// if err != nil { +// xiangChaJitian = 1 +// } + +// switch len(lunXunShiXu) / beiChuShu { +// case 2: +// case 3: +// case 4: +// case 5: +// case 6: +// case 7: +// default: +// dayRedisKey := fmt.Sprintf("SchedulingTeam:StartingPoint_%v_%v_%v_%v", g.OrgId, g.TypeId, g.PeriodId, g.Rules) +// redisClient := grocerystore.RunRedis(overall.CONSTANT_REDIS2) + +// // , +// } +// } +// return +// } + // 获取排班顺序 func PaiBanSunXu(step int, zuoXiTime []modelshr.WorkingTimePeriod) (zxsj modelshr.WorkingTimePeriod) { for _, v := range zuoXiTime { diff --git a/api/version1/menus/temas.go b/api/version1/menus/temas.go new file mode 100644 index 0000000..e82e938 --- /dev/null +++ b/api/version1/menus/temas.go @@ -0,0 +1,500 @@ +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 +} diff --git a/api/version1/menus/type.go b/api/version1/menus/type.go index 4ee674d..7fc13ea 100644 --- a/api/version1/menus/type.go +++ b/api/version1/menus/type.go @@ -88,13 +88,15 @@ type RolePostIsChnature struct { // 输出排班周期及源点 type GenesInfo struct { modelshr.Genesis - TypeIdStr string `json:"typeIdStr" gorm:"-"` //排班类型 - TypeName string `json:"typeName" gorm:"-"` //排班类型 - PeriodName string `json:"periodName" gorm:"-"` //工作时段 - RulesTime string `json:"rulesTime" gorm:"-"` //轮询起点 - RulesName string `json:"rulesName" gorm:"-"` //轮询起点名称 - RulesSort int `json:"rulesSort" gorm:"-"` //轮询起点排序 - BegainTime string `json:"begainTime" gorm:"-"` //源点时间 + TypeIdStr string `json:"typeIdStr" gorm:"-"` //排班类型 + TypeName string `json:"typeName" gorm:"-"` //排班类型 + PeriodName string `json:"periodName" gorm:"-"` //工作时段 + RulesTime string `json:"rulesTime" gorm:"-"` //轮询起点 + RulesName string `json:"rulesName" gorm:"-"` //轮询起点名称 + RulesSort int `json:"rulesSort" gorm:"-"` //轮询起点排序 + BegainTime string `json:"begainTime" gorm:"-"` //源点时间 + StartTimeStr string `json:"startTime" gorm:"-"` // + EndTimeStr string `json:"endTime" gorm:"-"` // } // 输出排班类别及轮询制度 @@ -116,7 +118,8 @@ type CalendarStructure struct { Title int `json:"title"` //"日期值(公历)":13, IsCurrent bool `json:"isCurrent"` //"当前":true, IsHolidays bool `json:"isHolidays"` //"是否为假期":false, - IsWorks bool `json:"isWork"` //"是工作日":false, + IsWorks bool `json:"isWorks"` //"是工补作日":false, + IsWeek bool `json:"isWeek"` //"是周末 Date string `json:"date"` //"当前日期":"2025-01-13", Lunars string `json:"lunars"` //"阴历日期":"2024-12-14", LunarsChinese string `json:"lunarsChinese"` //"中国阴历日期":"腊月十四", @@ -152,3 +155,46 @@ type AnDayPaiBan struct { type CalendarList struct { List []map[string]interface{} } + +// 添加工作时间段 +type SetWorkTime struct { + Name string `json:"name"` //名称 + List []TemaTimes `json:"list"` // 班次安排 +} + +// 通用班次时间 +type TemaTime struct { + Title string `json:"title"` //班次名称 + StartTime string `json:"startTime"` //开始时间 + EndTime string `json:"endTime"` //结束时间 +} +type EditWorkTimeConts struct { + Id string `json:"id"` // + SetWorkTime +} +type TemaTimes struct { + Id string `json:"id"` + Title string `json:"title"` //班次名称 + StartTime string `json:"startTime"` //开始时间 + EndTime string `json:"endTime"` //结束时间 +} + +// 接收轮询规则 +type JieShoeTeamsRules struct { + publicmethod.PublicId //规则ID + publicmethod.PublicName //规则名称 + Cycle int `json:"cycle"` //循环周期 + List []RulesInfo `json:"list"` //班组周期列表 +} + +type RulesInfo struct { + publicmethod.CommonId[string] //班组ID + publicmethod.PublicName //班组名称 + List []CycleRulesInfo `json:"list"` //周期列表 +} +type CycleRulesInfo struct { + publicmethod.CommonId[int64] //周期顺序 + publicmethod.PublicName //周期名称 + Value string `json:"value"` //工作时间段ID + Days string `json:"days"` //工作时间段名称 +} diff --git a/api/version1/menus/workTems.go b/api/version1/menus/workTems.go new file mode 100644 index 0000000..0c30bd6 --- /dev/null +++ b/api/version1/menus/workTems.go @@ -0,0 +1,866 @@ +package menus + +import ( + "appPlatform/middleware/grocerystore" + "appPlatform/models/modelshr" + "appPlatform/models/teamlog" + "appPlatform/overall" + "appPlatform/overall/publicmethod" + "encoding/json" + "fmt" + "sort" + "strconv" + "time" + + "github.com/gin-gonic/gin" +) + +/* +* +@ 作者: 秦东 +@ 时间: 2025-01-21 15:41:06 +@ 功能: 添加工作时间设置 +@ 参数 + + # + +@ 返回值 + + # + +@ 方法原型 + + # +*/ +func (a *ApiMethod) AddTeamTime(c *gin.Context) { + var requestData SetWorkTime + err := c.ShouldBindJSON(&requestData) + if err != nil { + publicmethod.Result(100, err, c) + return + } + if requestData.Name == "" { + publicmethod.Result(101, requestData, c) + return + } + if len(requestData.List) < 1 { + publicmethod.Result(1, requestData, c, "没有划分工作时间段!") + return + } + isTrue := true + for _, v := range requestData.List { + if v.Title == "" || v.StartTime == "" || v.EndTime == "" { + isTrue = false + } + } + if !isTrue { + publicmethod.Result(1, requestData, c, "您划分的工作时间段,有不符合规定的!请改正!") + return + } + timeKey := publicmethod.GetUUid(5) + //工作时间段类型 + var workTimeType modelshr.WorkTimeType + //判断是否有同类型的安排 + err = workTimeType.GetCont(map[string]interface{}{"`name`": requestData.Name}, "`id`") + if err == nil { + publicmethod.Result(1, requestData, c, "该名称已经存在!请不要重复添加!") + return + } + workTimeType.Id = timeKey + workTimeType.Name = requestData.Name //type:string comment:类型名称 version:2022-11-13 16:57 + workTimeType.State = 1 //类型:(1:启用;2:禁用;3:删除) version:2022-11-13 16:57 + workTimeType.Time = time.Now().Unix() + //工作时段 + var workTimeList []modelshr.WorkingTimePeriod + for i, lv := range requestData.List { + var workTimeCont modelshr.WorkingTimePeriod + workTimeCont.Name = lv.Title //type:string comment:工作时间段名称 version:2022-11-13 16:59 + workTimeCont.Time = time.Now().Unix() //type:int64 comment:编辑时间;0 version:2022-11-13 16:59 + workTimeCont.TypeId = timeKey //type:int64 comment:类型 version:2022-11-13 16:59 + workTimeCont.StartTime = lv.StartTime //type:string comment:开始时间 version:2022-11-13 16:59 + workTimeCont.EndTime = lv.EndTime //type:string comment:结束时间 version:2022-11-13 16:59 + workTimeCont.State = 1 + workTimeCont.Sort = i + 1 + workTimeList = append(workTimeList, workTimeCont) + } + err = overall.CONSTANT_DB_HR.Create(&workTimeType).Error + if err != nil { + publicmethod.Result(104, requestData, c) + return + } + WriteWorkTime(timeKey, workTimeList) + publicmethod.Result(0, requestData, c) +} + +/* +* +@ 作者: 秦东 +@ 时间: 2022-12-13 18:06:08 +@ 功能: 写入工作时段 +@ 参数 + + #key 类型ID + #workTimeList 时段列表 + +@ 返回值 + + #err 返回状态 + +@ 方法原型 + + # WriteWorkTime(key int64, workTimeList []modelshr.WorkingTimePeriod) (err error) +*/ +func WriteWorkTime(key int64, workTimeList []modelshr.WorkingTimePeriod) (err error) { + var workTimeCont modelshr.WorkingTimePeriod + workTimeCont.DelCont(map[string]interface{}{"`type_id`": key}) + err = overall.CONSTANT_DB_HR.Create(&workTimeList).Error + return +} + +/* +* +@ 作者: 秦东 +@ 时间: 2022-12-14 09:20:07 +@ 功能: 编辑时间段 +@ 参数 + + # + +@ 返回值 + + # + +@ 方法原型 + + # +*/ +func (a *ApiMethod) EditWorkTimeCont(c *gin.Context) { + var requestData EditWorkTimeConts + err := c.ShouldBindJSON(&requestData) + if err != nil { + publicmethod.Result(100, err, c) + return + } + if requestData.Id == "" { + publicmethod.Result(101, requestData, c) + return + } + if requestData.Name == "" { + publicmethod.Result(101, requestData, c) + return + } + + if len(requestData.List) < 1 { + publicmethod.Result(1, requestData, c, "没有划分工作时间段!") + return + } + isTrue := true + for _, v := range requestData.List { + if v.Title == "" || v.StartTime == "" || v.EndTime == "" { + isTrue = false + } + // beginTime := fmt.Sprintf("%v",) + } + if !isTrue { + publicmethod.Result(1, requestData, c, "您划分的工作时间段,有不符合规定的!请改正!") + return + } + wher := publicmethod.MapOut[string]() + wher["id"] = requestData.Id + var oldCont modelshr.WorkTimeType + err = oldCont.GetCont(wher) + if err != nil { + publicmethod.Result(107, err, c) + return + } + editCont := publicmethod.MapOut[string]() + editCont["name"] = requestData.Name + // editCont["rule"] = requestData.Rule + editCont["time"] = time.Now().Unix() + + err = oldCont.EiteCont(wher, editCont) + if err != nil { + publicmethod.Result(106, err, c) + return + } + + //工作时段 + EditPeriodTime(oldCont.Id, requestData.List) + + publicmethod.Result(0, err, c) +} + +/* +* +@ 作者: 秦东 +@ 时间: 2022-12-16 17:10:13 +@ 功能: 编辑工作时段 +@ 参数 + + #typeId 类型识别符 + #ruleList 分班时间表 + +@ 返回值 + + # + +@ 方法原型 + + # +*/ +func EditPeriodTime(typeId int64, ruleList []TemaTimes) { + var workTimeCont modelshr.WorkingTimePeriod + workTimeListCont, _ := workTimeCont.ContMap(map[string]interface{}{"`type_id`": typeId}) + var editId []string + var saveData []modelshr.WorkingTimePeriod + for i, v := range ruleList { + if v.Id != "" { + var workTimeContJudge modelshr.WorkingTimePeriod + err := workTimeContJudge.GetCont(map[string]interface{}{"`id`": v.Id}) + if err == nil { + if publicmethod.IsInTrue[string](v.Id, editId) == false { + editId = append(editId, v.Id) + } + + editCont := publicmethod.MapOut[string]() + editCont["`sort`"] = i + 1 + editCont["`state`"] = 1 + editCont["`name`"] = v.Title + editCont["`time`"] = time.Now().Unix() + editCont["`start_time`"] = v.StartTime + editCont["`end_time`"] = v.EndTime + var workTimeContEs modelshr.WorkingTimePeriod + workTimeContEs.EiteCont(map[string]interface{}{"`id`": v.Id}, editCont) + } else { + var workTimeContAdd modelshr.WorkingTimePeriod + workTimeContAdd.Sort = i + 1 + workTimeContAdd.Name = v.Title //type:string comment:工作时间段名称 version:2022-11-13 16:59 + workTimeContAdd.Time = time.Now().Unix() //type:int64 comment:编辑时间;0 version:2022-11-13 16:59 + workTimeContAdd.TypeId = typeId //type:int64 comment:类型 version:2022-11-13 16:59 + workTimeContAdd.StartTime = v.StartTime //type:string comment:开始时间 version:2022-11-13 16:59 + workTimeContAdd.EndTime = v.EndTime //type:string comment:结束时间 version:2022-11-13 16:59 + saveData = append(saveData, workTimeContAdd) + } + } else { + var workTimeContAdd modelshr.WorkingTimePeriod + workTimeContAdd.Name = v.Title //type:string comment:工作时间段名称 version:2022-11-13 16:59 + workTimeContAdd.Time = time.Now().Unix() //type:int64 comment:编辑时间;0 version:2022-11-13 16:59 + workTimeContAdd.TypeId = typeId //type:int64 comment:类型 version:2022-11-13 16:59 + workTimeContAdd.StartTime = v.StartTime //type:string comment:开始时间 version:2022-11-13 16:59 + workTimeContAdd.EndTime = v.EndTime //type:string comment:结束时间 version:2022-11-13 16:59 + workTimeContAdd.Sort = i + 1 + saveData = append(saveData, workTimeContAdd) + } + } + //将不在使用的项目删除 + for _, dv := range workTimeListCont { + idStr := strconv.FormatInt(dv.Id, 10) + if publicmethod.IsInTrue[string](idStr, editId) == false { + editCont := publicmethod.MapOut[string]() + editCont["`state`"] = 3 + editCont["`time`"] = time.Now().Unix() + var workTimeContEss modelshr.WorkingTimePeriod + workTimeContEss.EiteCont(map[string]interface{}{"`id`": dv.Id}, editCont) + } + } + if len(saveData) > 0 { + overall.CONSTANT_DB_HR.Create(&saveData) + } +} + +/* +* +@ 作者: 秦东 +@ 时间: 2025-01-23 09:41:25 +@ 功能: 编辑制度轮询规则 +@ 参数 + + # + +@ 返回值 + + # + +@ 方法原型 + + # +*/ +func (a *ApiMethod) SaveCycleRules(c *gin.Context) { + var requestData JieShoeTeamsRules + c.ShouldBindJSON(&requestData) + if requestData.Id == "" { + publicmethod.Result(101, requestData, c) + return + } + if len(requestData.List) <= 0 { + publicmethod.Result(101, requestData, c) + return + } + teamIsOk := true + cycleIsOk := false + for _, v := range requestData.List { + if v.Id == "" || len(v.List) <= 0 { + teamIsOk = false + } + for _, lv := range v.List { + if lv.Id != 0 { + cycleIsOk = true + } + } + } + if !teamIsOk || !cycleIsOk { + publicmethod.Result(101, requestData, c) + return + } + var teamsRulesInfo modelshr.TeamsRules + teamsRulesInfo.DelCont(map[string]interface{}{"`ruleTypeId`": requestData.Id}) + + var sendMap []interface{} + for _, v := range requestData.List { + + for _, lv := range v.List { + var teamsRulesInfoNew modelshr.TeamsRules + teamsRulesInfoNew.RuleTypeId, _ = strconv.ParseInt(requestData.Id, 10, 64) + teamsRulesInfoNew.RuleTypeName = requestData.Name + teamsRulesInfoNew.Cycle = requestData.Cycle + teamsRulesInfoNew.TeamsId, _ = strconv.ParseInt(v.Id, 10, 64) + teamsRulesInfoNew.TeamsName = v.Name + + teamsRulesInfoNew.CycleSort = lv.Id + teamsRulesInfoNew.CycleName = lv.Name + teamsRulesInfoNew.CycleWorkTime, _ = strconv.ParseInt(lv.Value, 10, 64) + if lv.Value != "" { + teamsRulesInfoNew.CycleWorkName = lv.Days + } + teamsRulesInfoNew.Time = time.Now().Unix() + sendMap = append(sendMap, teamsRulesInfoNew) + overall.CONSTANT_DB_HR.Create(&teamsRulesInfoNew) + } + } + publicmethod.Result(0, sendMap, c) +} + +/* +* +@ 作者: 秦东 +@ 时间: 2025-01-23 10:49:25 +@ 功能: 获取轮询规则 +@ 参数 + + # + +@ 返回值 + + # + +@ 方法原型 + + # +*/ +func (a *ApiMethod) GainCycleRule(c *gin.Context) { + var requestData publicmethod.PublicId + err := c.ShouldBindJSON(&requestData) + var sendData JieShoeTeamsRules + if err != nil { + publicmethod.Result(200, sendData, c) + return + } + if requestData.Id == "" { + publicmethod.Result(200, sendData, c) + return + } + var teamsRulesList []modelshr.TeamsRules + overall.CONSTANT_DB_HR.Where("`ruleTypeId` = ?", requestData.Id).Find(&teamsRulesList) + if len(teamsRulesList) < 1 { + publicmethod.Result(200, sendData, c) + return + } + + var workTimeTypeInfo modelshr.WorkTimeType + err = workTimeTypeInfo.GetCont(map[string]interface{}{"`id`": requestData.Id}, "`name`") + if err != nil { + publicmethod.Result(200, sendData, c) + return + } + sendData.Id = requestData.Id + sendData.Name = workTimeTypeInfo.Name + + // var workPeriodList []modelshr.WorkingTimePeriod + // overall.CONSTANT_DB_HR.Where("`type_id` = ?", requestData.Id).Find(&workPeriodList) + // if len(workPeriodList) < 1 { + // publicmethod.Result(200, sendData, c) + // return + // } + var teamIdAry []int64 + var teamsAry []RulesInfo + for _, v := range teamsRulesList { + if !publicmethod.IsInTrue[int64](v.TeamsId, teamIdAry) { + teamIdAry = append(teamIdAry, v.TeamsId) + var teamsInfo RulesInfo + teamsInfo.Id = strconv.FormatInt(v.TeamsId, 10) + teamsInfo.Name = v.TeamsName + teamsAry = append(teamsAry, teamsInfo) + } + } + if len(teamsAry) < 1 { + publicmethod.Result(200, sendData, c) + return + } + for i, v := range teamsAry { + for _, tv := range teamsRulesList { + tvId := strconv.FormatInt(tv.TeamsId, 10) + // fmt.Printf("%v------%v\n", tvId, v.Id) + if tvId == v.Id { + var cycleInfo CycleRulesInfo + cycleInfo.Id = tv.CycleSort + cycleInfo.Name = tv.CycleName + if tv.CycleWorkTime != 0 { + cycleInfo.Value = strconv.FormatInt(tv.CycleWorkTime, 10) + } + fmt.Printf("%v------%v------%v\n", tvId, tv.CycleWorkTime, cycleInfo.Value) + cycleInfo.Days = tv.CycleWorkName + sendData.Cycle = tv.Cycle + teamsAry[i].List = append(teamsAry[i].List, cycleInfo) + } + } + } + sendData.List = teamsAry + publicmethod.Result(0, sendData, c) +} + +/* +* +@ 作者: 秦东 +@ 时间: 2025-01-23 14:47:50 +@ 功能: 解析日历生成排班顺序(新版本) +@ 参数 + + # + +@ 返回值 + + # + +@ 方法原型 + + # +*/ +func (a *ApiMethod) AnalysisMonthRulersNews(c *gin.Context) { + var requestData AnYuePaiBan + c.ShouldBindJSON(&requestData) + if requestData.OrgId == "" { + publicmethod.Result(1, requestData, c, "未知行政单位") + return + } + var sendMonthList []interface{} + orgIdInt, _ := strconv.ParseInt(requestData.OrgId, 10, 64) + menuCont, cureeOrgId, err := CureeRunRules(orgIdInt) + fmt.Printf("%v\n", cureeOrgId) + if err != nil { + publicmethod.Result(200, sendMonthList, c) + return + } + //获取源点起始工作时间段 + menuCont.BegainTime = publicmethod.UnixTimeToDay(menuCont.StartTime, 14) + menuCont.TypeIdStr = strconv.FormatInt(menuCont.TypeId, 10) + //获取倒班规则 + var paiBanType modelshr.WorkTimeType + paiBanType.GetCont(map[string]interface{}{"`id`": menuCont.TypeId}, " `name`") + menuCont.TypeName = paiBanType.Name + + //作息时间 + var zuoXiTime []modelshr.WorkingTimePeriod + overall.CONSTANT_DB_HR.Where("`state` = 1 AND `type_id` = ?", menuCont.TypeId).Order("`sort` ASC").Find(&zuoXiTime) + //轮询规则 + + var lunXunShiXu []modelshr.TeamsRules + overall.CONSTANT_DB_HR.Where("`ruleTypeId` = ?", menuCont.TypeId).Find(&lunXunShiXu) + if len(zuoXiTime) < 1 || len(lunXunShiXu) < 1 { + for _, v := range requestData.MonthAllDay { + var listSynv CalendarList + sendMonthList = append(sendMonthList, TimeHaveAry(v, listSynv.List)) + } + publicmethod.Result(200, sendMonthList, c) + return + } + cycle := 1 + for _, v := range lunXunShiXu { + cycle = v.Cycle + } + // val,_:=json.Marshal(menuCont) + // sendMa := publicmethod.MapOut[string]() + // sendMa["menuCont"] = menuCont + // sendMa["lunXunShiXu"] = lunXunShiXu + // sendMa["orgIdInt"] = orgIdInt + // publicmethod.Result(200, sendMa, c) + // return + //Step 4: 计算当前时间段与原点关系 + switch cycle { + case 2: + //作息时间 + var zuoXiTimeOne modelshr.WorkingTimePeriod + overall.CONSTANT_DB_HR.Where("`state` = 1 AND `type_id` = ?", menuCont.TypeId).Order("`sort` ASC").First(&zuoXiTimeOne) + for _, v := range requestData.MonthAllDay { + var listSynv CalendarList + inDate := menuCont.changBaiBan(v, zuoXiTimeOne, lunXunShiXu) + listSynv.List = append(listSynv.List, inDate) + sendMonthList = append(sendMonthList, TimeHaveAry(v, listSynv.List)) + } + default: + lastDayNumber := 0 + var starTemasTime publicmethod.DateTimeTotimes + starTemasTime.BaisStrToTime(menuCont.BegainTime) + for _, v := range requestData.MonthAllDay { + var listSynv CalendarList + for _, wv := range v { + var wvTimeAll publicmethod.DateTimeTotimes + wvTimeAll.BaisStrToTime(wv.Date) + if wvTimeAll.AllTime < starTemasTime.AllTime { + lastDayNumber++ + } else if wvTimeAll.AllTime == starTemasTime.AllTime { + listAry := menuCont.RuleYuanDianRunNew(wv, wvTimeAll, zuoXiTime, lunXunShiXu) + inDate := publicmethod.MapOut[string]() + inDate[wv.Date] = listAry + listSynv.List = append(listSynv.List, inDate) + } else { + sjc := ((wvTimeAll.AllTime - starTemasTime.AllTime) / 86400) + 1 + listAry := menuCont.SpecifyDateTeamsNew(wv, wvTimeAll, zuoXiTime, lunXunShiXu, sjc) + inDate := publicmethod.MapOut[string]() + inDate[wv.Date] = listAry + listSynv.List = append(listSynv.List, inDate) + } + + } + sendMonthList = append(sendMonthList, TimeHaveAry(v, listSynv.List)) + } + } + + publicmethod.Result(0, sendMonthList, c) +} + +/* +* +@ 作者: 秦东 +@ 时间: 2025-01-21 08:52:46 +@ 功能: 原点日期排班设定 +@ 参数 + + #dataInfo 当前日期属性 + #timeVal 当天日期参数 + #zuoXiTime 作息时间 + #lunXunShiXu 轮询列表 + + + #RedisKey说明 SchedulingTeam:StartingPoint_行政组织_年月日_倒班制度 + +@ 返回值 + + #logMap 当天安排 + +@ 方法原型 + + # +*/ +func (g *GenesInfo) RuleYuanDianRunNew(dataInfo CalendarStructure, timeVal publicmethod.DateTimeTotimes, zuoXiTime []modelshr.WorkingTimePeriod, lunXunShiXu []modelshr.TeamsRules) (logMap []map[string]interface{}) { + dayRedisKey := fmt.Sprintf("SchedulingTeam:StartingPoint_%v_%v%v%v_%v_1", 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) + } else { //数据库中不存在开始计算 + sort.Slice(zuoXiTime, func(i, j int) bool { + return zuoXiTime[i].StartTime < zuoXiTime[j].StartTime + }) + + for _, v := range zuoXiTime { + cyclesInfo := GainRuleCycleTeams(lunXunShiXu, 1, v.Id) + fmt.Printf("cyclesInfo--->%v\n", cyclesInfo) + 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, v.Id, cyclesInfo.TeamsId, cyclesInfo.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 = v.Id //班次"` + logInfo.RulesId = cyclesInfo.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 = v.Name + logInfo.RulesName = cyclesInfo.TeamsName + logInfo.Sort = v.Sort + logInfo.TeamsId = cyclesInfo.TeamsId + logInfo.StartTime = v.StartTime + logInfo.EndTime = v.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-23 16:03:33 +@ 功能: 获取轮询中的班组 +#lunXunShiXu 轮询规则 +#sort 第几步 +#cycleWorkTime 工作段Id +*/ +func GainRuleCycleTeams(lunXunShiXu []modelshr.TeamsRules, sort int64, cycleWorkTime int64) (cycleInfo modelshr.TeamsRules) { + fmt.Printf("\n\n\n\n\n 获取轮询中的班组---------sort:%v--------cycleWorkTime:%v----lunXunShiXu:%v--》\n\n\n\n\n ", sort, cycleWorkTime, lunXunShiXu) + for _, v := range lunXunShiXu { + if v.CycleSort == sort && v.CycleWorkTime == cycleWorkTime { + cycleInfo = v + } + } + return +} + +/* +* +@ 作者: 秦东 +@ 时间: 2025-01-23 16:27:05 +@ 功能: +@ 参数 + + # + +@ 返回值 + + # + +@ 方法原型 + + # +*/ +func (g *GenesInfo) SpecifyDateTeamsNew(dataInfo CalendarStructure, timeVal publicmethod.DateTimeTotimes, zuoXiTime []modelshr.WorkingTimePeriod, lunXunShiXu []modelshr.TeamsRules, differeTime int64) (logMap []map[string]interface{}) { + // differeTime = differeTime + 1 + fmt.Printf("\n\n\n\n\ndataInfo---1---->%v---->%v---->%v\n\n\n\n\n", timeVal.Years, timeVal.Months, timeVal.Days) + dayRedisKey := fmt.Sprintf("SchedulingTeam:StartingPoint_%v_%v%v%v_%v_1", 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 + // isTrue = false + if isTrue { //redis存在获取redis数据 + json.Unmarshal([]byte(logContent), &logMap) + json.Unmarshal([]byte(logContent), &dayTimeLog) + // fmt.Printf("Step1: %v\n", logContent) + } else { //redis不存在从数据库中获取数据 + var teamIdAry []int64 + for _, v := range lunXunShiXu { + if !publicmethod.IsInTrue[int64](v.CycleWorkTime, teamIdAry) { + teamIdAry = append(teamIdAry, v.CycleWorkTime) + } + } + teamMap := make(map[int64][]modelshr.TeamsRules) + + fmt.Printf("teanAry---3---->%v\n", teamIdAry) + + for _, v := range teamIdAry { + var teanAry []modelshr.TeamsRules + for _, tv := range lunXunShiXu { + if v == tv.CycleWorkTime { + teanAry = append(teanAry, tv) + } + } + fmt.Printf("teanAry------->%v\n", teanAry) + if len(teanAry) > 0 { + teamMap[v] = append(teamMap[v], teanAry...) + } + fmt.Printf("teanAry---1---->%v\n", teamMap) + } + 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 { //数据库中不存在开始计算 + sort.Slice(zuoXiTime, func(i, j int) bool { + return zuoXiTime[i].StartTime < zuoXiTime[j].StartTime + }) + for _, v := range zuoXiTime { + var ruleStep int64 = 1 + if workVal, isOk := teamMap[v.Id]; isOk { + lenNunm := len(workVal) + if differeTime > int64(lenNunm) { + + ruleStep = int64(differeTime) % int64(lenNunm) + if ruleStep == 0 { + ruleStep = int64(lenNunm) + } + } else { + ruleStep = int64(differeTime) + } + fmt.Printf("\n\n\n\ncyclesInfo--->%v--->%v\n\n\n\n", lenNunm, differeTime) + } + cyclesInfo := GainRuleCycleTeams(lunXunShiXu, ruleStep, v.Id) + fmt.Printf("\n\n\n\ncyclesInfo--->%v--->%v\n\n\n\n", cyclesInfo, ruleStep) + 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, v.Id, cyclesInfo.TeamsId, cyclesInfo.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 = v.Id //班次"` + logInfo.RulesId = cyclesInfo.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 = v.Name + logInfo.RulesName = cyclesInfo.TeamsName + logInfo.Sort = v.Sort + logInfo.TeamsId = cyclesInfo.TeamsId + logInfo.StartTime = v.StartTime + logInfo.EndTime = v.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-24 11:35:54 +@ 功能: +@ 参数 + + # + +@ 返回值 + + # + +@ 方法原型 + + # +*/ +func (a *ApiMethod) AnalysisWeekRulers(c *gin.Context) { + var requestData AnZhouPaiBan + c.ShouldBindJSON(&requestData) + if requestData.OrgId == "" { + publicmethod.Result(1, requestData, c, "未知行政单位") + return + } + var sendMonthList interface{} + orgIdInt, _ := strconv.ParseInt(requestData.OrgId, 10, 64) + menuCont, cureeOrgId, err := CureeRunRules(orgIdInt) + fmt.Printf("%v\n", cureeOrgId) + if err != nil { + publicmethod.Result(200, sendMonthList, c) + return + } + //获取源点起始工作时间段 + menuCont.BegainTime = publicmethod.UnixTimeToDay(menuCont.StartTime, 14) + menuCont.TypeIdStr = strconv.FormatInt(menuCont.TypeId, 10) + //获取倒班规则 + var paiBanType modelshr.WorkTimeType + paiBanType.GetCont(map[string]interface{}{"`id`": menuCont.TypeId}, " `name`") + menuCont.TypeName = paiBanType.Name + + //作息时间 + var zuoXiTime []modelshr.WorkingTimePeriod + overall.CONSTANT_DB_HR.Where("`state` = 1 AND `type_id` = ?", menuCont.TypeId).Order("`sort` ASC").Find(&zuoXiTime) + //轮询规则 + + var lunXunShiXu []modelshr.TeamsRules + overall.CONSTANT_DB_HR.Where("`ruleTypeId` = ?", menuCont.TypeId).Find(&lunXunShiXu) + if len(zuoXiTime) < 1 || len(lunXunShiXu) < 1 { + var listSynv CalendarList + sendMonthList = TimeHaveAry(requestData.WeekAllDay, listSynv.List) + publicmethod.Result(200, sendMonthList, c) + return + } + cycle := 1 + for _, v := range lunXunShiXu { + cycle = v.Cycle + } + var sendCont []CalendarStructure + + switch cycle { + case 2: + var zuoXiTimeOne modelshr.WorkingTimePeriod + overall.CONSTANT_DB_HR.Where("`state` = 1 AND `type_id` = ?", menuCont.TypeId).Order("`sort` ASC").First(&zuoXiTimeOne) + var listSynv CalendarList + inDate := menuCont.changBaiBan(requestData.WeekAllDay, zuoXiTimeOne, lunXunShiXu) + listSynv.List = append(listSynv.List, inDate) + sendCont = TimeHaveAry(requestData.WeekAllDay, listSynv.List) + default: + lastDayNumber := 0 + var starTemasTime publicmethod.DateTimeTotimes + starTemasTime.BaisStrToTime(menuCont.BegainTime) + var listSynv CalendarList + for _, wv := range requestData.WeekAllDay { + var wvTimeAll publicmethod.DateTimeTotimes + wvTimeAll.BaisStrToTime(wv.Date) + if wvTimeAll.AllTime < starTemasTime.AllTime { + lastDayNumber++ + } else if wvTimeAll.AllTime == starTemasTime.AllTime { + listAry := menuCont.RuleYuanDianRunNew(wv, wvTimeAll, zuoXiTime, lunXunShiXu) + inDate := publicmethod.MapOut[string]() + inDate[wv.Date] = listAry + listSynv.List = append(listSynv.List, inDate) + } else { + sjc := ((wvTimeAll.AllTime - starTemasTime.AllTime) / 86400) + 1 + listAry := menuCont.SpecifyDateTeamsNew(wv, wvTimeAll, zuoXiTime, lunXunShiXu, sjc) + inDate := publicmethod.MapOut[string]() + inDate[wv.Date] = listAry + listSynv.List = append(listSynv.List, inDate) + } + + } + sendCont = TimeHaveAry(requestData.WeekAllDay, listSynv.List) + } + if len(sendCont) == 1 { + var onInfo CalendarStructure + for _, v := range sendCont { + onInfo = v + } + publicmethod.Result(0, onInfo, c) + return + } + sendMonthList = sendCont + publicmethod.Result(0, sendMonthList, c) +} diff --git a/api/version1/taskplatform/taskmanagement/ruanTask.go b/api/version1/taskplatform/taskmanagement/ruanTask.go index 4cd1f1f..edc2d52 100644 --- a/api/version1/taskplatform/taskmanagement/ruanTask.go +++ b/api/version1/taskplatform/taskmanagement/ruanTask.go @@ -1632,6 +1632,7 @@ func (n *NodePublicInfo) CircularParsing(step int, creater modelshr.ManCont, org } } } + fmt.Printf("获取到的人员-->\n\n\n%v\n\n\n", userNumber) if len(userNumber) > 0 { nodeInfo.Operator = GainUserCode(userNumber) } @@ -2454,23 +2455,24 @@ func (a *ApiMethod) RealTimeUpdateFlow(c *gin.Context) { userCont.GetLoginCont(context) //获取当前操作人 workFlowInfo := flowCont.NodeConfig.CircularParsing(1, userCont, userCont.AdminOrg, requestData.ConditionList, requestData.NodelPeople) - // fmt.Printf("workFlowInfo--->%v\n", workFlowInfo) + fmt.Printf("workFlowInfo--->%v\n", workFlowInfo) sendInfo.Step = requestData.Step sendInfo.NodeKey, sendInfo.NextStep, sendInfo.FlowList = ReformFlow(requestData.Step, workFlowInfo) - - if len(sendInfo.FlowList) > 0 && len(requestData.OldFlow) > 0 { - for i, v := range sendInfo.FlowList { - for _, ov := range requestData.OldFlow { - if v.NodeKey == ov.NodeKey { - if len(v.Operator) < 1 && len(ov.Operator) > 0 { - sendInfo.FlowList[i].Operator = ov.Operator - } else if len(v.Operator) > 0 && len(ov.Operator) > 0 { - sendInfo.FlowList[i].Operator = SlicingAndDeduplication(v.Operator, ov.Operator) - } - } - } - } - } + fmt.Printf("sendInfo.FlowList --->%v\n", sendInfo.FlowList) + // if len(sendInfo.FlowList) > 0 && len(requestData.OldFlow) > 0 { + // for i, v := range sendInfo.FlowList { + // for _, ov := range requestData.OldFlow { + // if v.NodeKey == ov.NodeKey { + // if len(v.Operator) < 1 && len(ov.Operator) > 0 { + // sendInfo.FlowList[i].Operator = ov.Operator + // } else if len(v.Operator) > 0 && len(ov.Operator) > 0 { + // // fmt.Printf("获取当前操作人:%v================>%v\n", v.Operator, ov.Operator) + // sendInfo.FlowList[i].Operator = SlicingAndDeduplication(v.Operator, ov.Operator) + // } + // } + // } + // } + // } publicmethod.Result(0, sendInfo, c) } diff --git a/apirouter/apishiyan/maptostruct.go b/apirouter/apishiyan/maptostruct.go index c01d8eb..7a19026 100644 --- a/apirouter/apishiyan/maptostruct.go +++ b/apirouter/apishiyan/maptostruct.go @@ -46,6 +46,8 @@ func (a *ApiRouter) RouterGroup(router *gin.RouterGroup) { apiRouter.POST("setUpWorkWatch", methodBinding.SetUpWorkWatch) //测试通过企业微信获取人员 + apiRouter.POST("workTimeSortTP", methodBinding.WorkTimeSortTP) //工作段排序 + } } func (a *ApiRouter) RouterGroupVerify(router *gin.RouterGroup) { diff --git a/apirouter/v1/customerformrouter/router.go b/apirouter/v1/customerformrouter/router.go index fd0e789..6ef7579 100644 --- a/apirouter/v1/customerformrouter/router.go +++ b/apirouter/v1/customerformrouter/router.go @@ -103,5 +103,8 @@ func (a *ApiRouter) RouterGroupPc(router *gin.RouterGroup) { appApiRouter.POST("gainDataStorceAllField", methodAppHand.GainDataStorceAllField) //获取有源数据表字段 + appApiRouter.POST("gaveAllApp", methodAppHand.GaveAllApp) //获取所有自定义App + appApiRouter.POST("ginTeamRule", methodAppHand.GinTeamRule) //获取已经设定好的参数 + appApiRouter.POST("setupRulerForm", methodAppHand.SetupRulerForm) //设定取值 } } diff --git a/apirouter/v1/menusRouters/pc.go b/apirouter/v1/menusRouters/pc.go index ffc145b..a8d8a09 100644 --- a/apirouter/v1/menusRouters/pc.go +++ b/apirouter/v1/menusRouters/pc.go @@ -27,5 +27,14 @@ func (a *ApiRouter) RouterGroupPc(router *gin.RouterGroup) { apiRouter.POST("gainTemsTypeAndRuler", methodBinding.GainTemsTypeAndRuler) //获取排班类别及轮询制度 apiRouter.POST("analysisMonthRulers", methodBinding.AnalysisMonthRulers) //解析日历生成排班顺序 + apiRouter.POST("amrn", methodBinding.AnalysisMonthRulersNews) //解析日历生成排班顺序(新版本) + + apiRouter.POST("addTeamTime", methodBinding.AddTeamTime) //添加工作时间段设定 + apiRouter.POST("editWorkTimeCont", methodBinding.EditWorkTimeCont) //编辑工作时间段内容 + + apiRouter.POST("saveCycleRules", methodBinding.SaveCycleRules) //编辑制度轮询规则 + apiRouter.POST("gainCycleRule", methodBinding.GainCycleRule) //获取制度轮询规则 + + apiRouter.POST("amrnWeek", methodBinding.AnalysisWeekRulers) //解析日历生成排班顺序(新版本) } } diff --git a/models/customerForm/diaoBanSetup.go b/models/customerForm/diaoBanSetup.go new file mode 100644 index 0000000..798b196 --- /dev/null +++ b/models/customerForm/diaoBanSetup.go @@ -0,0 +1,73 @@ +package customerForm + +import ( + "appPlatform/overall" + "strings" +) + +/* +* +@ 作者: 秦东 +@ 时间: 2024-03-06 13:23:03 +@ 功能: 自定义表单分组 +*/ +type DiaoBanSetup struct { + Id int64 `json:"id" gorm:"primaryKey;column:id;type:int(5) unsigned;not null;comment:Id;index"` + Appid int64 `json:"appid" gorm:"column:appid;type:bigint(20) unsigned;default:0;not null;comment:归属哪个app"` + Source string `json:"source" gorm:"column:source;type:varchar(255) unsigned;default:'';not null;comment:是否引用数据源(yes ; no)"` + Ip string `json:"ip" gorm:"column:ip;type:varchar(255) unsigned;default:'';not null;comment:数据源地址"` + DataBaseName string `json:"dataBaseName" gorm:"column:dataBaseName;type:varchar(255) unsigned;default:'';not null;comment:是否引用数据源(yes ; no)"` + SqlType string `json:"sqlType" gorm:"column:sqlType;type:varchar(255) unsigned;default:'';not null;comment:数据库类型"` + Port int64 `json:"port" gorm:"column:port;type:int(7) unsigned;default:50;not null;comment:端口"` + TableKey string `json:"tableKey" gorm:"column:tableKey;type:varchar(255);default:'';comment:数据表标识"` + TableNames string `json:"tableName" gorm:"column:tableName;type:varchar(255);default:'';comment:数据表名称"` + UserName string `json:"userName" gorm:"column:userName;type:varchar(255);default:'';comment:数据库用户名"` + Pwd string `json:"pwd" gorm:"column:pwd;type:varchar(255);default:'';comment:数据库密码"` + Time int64 `json:"time" gorm:"column:time;type:bigint(20) unsigned;default:0;not null;comment:创建时间"` + SourceId string `json:"sourceId" gorm:"column:sourceId;type:varchar(255);default:'';comment:所愿"` +} + +func (DiaoBanSetup *DiaoBanSetup) TableName() string { + return "diaoBanSetup" +} + +// 编辑内容 +func (cont *DiaoBanSetup) EiteCont(whereMap interface{}, saveData interface{}) (err error) { + err = overall.CONSTANT_DB_AppPlatform.Model(&cont).Where(whereMap).Updates(saveData).Error + return +} + +// 获取内容 +func (cont *DiaoBanSetup) GetCont(whereMap interface{}, field ...string) (err error) { + gormDb := overall.CONSTANT_DB_AppPlatform.Model(&cont) + if len(field) > 0 { + fieldStr := strings.Join(field, ",") + gormDb = gormDb.Select(fieldStr) + } + gormDb = gormDb.Where(whereMap) + err = gormDb.First(&cont).Error + return +} + +// 根据条件获取总数 +func (cont *DiaoBanSetup) CountCont(whereMap interface{}) (countId int64) { + overall.CONSTANT_DB_AppPlatform.Model(&cont).Where(whereMap).Count(&countId) + return +} + +// 读取全部信息 +func (cont *DiaoBanSetup) ContMap(whereMap interface{}, field ...string) (countAry []DiaoBanSetup, err error) { + gormDb := overall.CONSTANT_DB_AppPlatform.Model(&cont) + if len(field) > 0 { + fieldStr := strings.Join(field, ",") + gormDb = gormDb.Select(fieldStr) + } + err = gormDb.Where(whereMap).Find(&countAry).Error + return +} + +// 删除内容 +func (cont *DiaoBanSetup) DelCont(whereMap interface{}) (err error) { + err = overall.CONSTANT_DB_AppPlatform.Where(whereMap).Delete(&cont).Error + return +} diff --git a/models/modelshr/teams_rules.go b/models/modelshr/teams_rules.go new file mode 100644 index 0000000..92df3f0 --- /dev/null +++ b/models/modelshr/teams_rules.go @@ -0,0 +1,66 @@ +package modelshr + +import ( + "appPlatform/overall" + "strings" +) + +// 排班记录 +type TeamsRules struct { + Id int64 `json:"id" gorm:"primaryKey;column:id;type:bigint(20) unsigned;not null;index"` + RuleTypeId int64 `json:"ruleTypeId" gorm:"column:ruleTypeId;type:bigint(20) unsigned;default:0;not null;comment:排班制度ID"` + RuleTypeName string `json:"ruleTypeName" gorm:"column:ruleTypeName;type:varchar(255);comment:制度名称"` + Cycle int `json:"cycle" gorm:"column:cycle;type:int(4) unsigned;default:1;not null;comment:周期类型"` + TeamsId int64 `json:"teamsId" gorm:"column:teamsId;type:bigint(20) unsigned;default:0;not null;comment:班组Id"` + TeamsName string `json:"teamsName" gorm:"column:teamsName;type:varchar(255);comment:班组姓名"` + CycleSort int64 `json:"cycleSort" gorm:"column:cycleSort;type:int(4) unsigned;default:1;not null;comment:周期排序"` + CycleName string `json:"cycleName" gorm:"column:cycleName;type:varchar(255);comment:周期名称"` + CycleWorkTime int64 `json:"cycleWorkTime" gorm:"column:cycleWorkTime;type:bigint(20) unsigned;default:0;not null;comment:工作时间段Id"` + CycleWorkName string `json:"cycleWorkName" gorm:"column:cycleWorkName;type:varchar(255);comment:工作时间段名称"` + Time int64 `json:"time" gorm:"column:time;type:bigint(20) unsigned;default:0;not null;comment:编辑时间"` +} + +func (TeamsRules *TeamsRules) TableName() string { + return "teams_rules" +} + +// 编辑内容 +func (cont *TeamsRules) EiteCont(whereMap interface{}, saveData interface{}) (err error) { + err = overall.CONSTANT_DB_HR.Model(&cont).Where(whereMap).Updates(saveData).Error + return +} + +// 获取内容 +func (cont *TeamsRules) GetCont(whereMap interface{}, field ...string) (err error) { + gormDb := overall.CONSTANT_DB_HR.Model(&cont) + if len(field) > 0 { + fieldStr := strings.Join(field, ",") + gormDb = gormDb.Select(fieldStr) + } + gormDb = gormDb.Where(whereMap) + err = gormDb.First(&cont).Error + return +} + +// 根据条件获取总数 +func (cont *TeamsRules) CountCont(whereMap interface{}) (countId int64) { + overall.CONSTANT_DB_HR.Model(&cont).Where(whereMap).Count(&countId) + return +} + +// 读取全部信息 +func (cont *TeamsRules) ContMap(whereMap interface{}, field ...string) (countAry []TeamsRules, err error) { + gormDb := overall.CONSTANT_DB_HR.Model(&cont) + if len(field) > 0 { + fieldStr := strings.Join(field, ",") + gormDb = gormDb.Select(fieldStr) + } + err = gormDb.Where(whereMap).Find(&countAry).Error + return +} + +// 删除内容 +func (cont *TeamsRules) DelCont(whereMap interface{}) (err error) { + err = overall.CONSTANT_DB_HR.Where(whereMap).Delete(&cont).Error + return +} diff --git a/models/teamlog/teamslog.go b/models/teamlog/teamslog.go index 24d29f1..cee0e4e 100644 --- a/models/teamlog/teamslog.go +++ b/models/teamlog/teamslog.go @@ -22,6 +22,8 @@ type TeamsLog struct { RankName string `json:"rankName" gorm:"column:rankName;type:varchar(255);comment:班次名称"` RulesName string `json:"rulesName" gorm:"column:rulesName;type:varchar(255);comment:轮询班组"` Sort int `json:"sort" gorm:"column:sort;type:int(6) unsigned;default:0;not null;comment:轮询排序"` + StartTime string `gorm:"column:start_time;type:varchar(255);comment:开始时间" json:"starttime"` //type:string comment:开始时间 version:2022-11-13 16:59 + EndTime string `gorm:"column:end_time;type:varchar(255);comment:结束时间" json:"endtime"` //type:string comment:结束时间 version:2022-11-13 16:59 } func (TeamsLog *TeamsLog) TableName() string {