Browse Source

调班处理

li_v1
hreenshan112 9 months ago
parent
commit
da6b52e671
  1. 7
      .vscode/launch.json
  2. 72
      api/shiyan/maptostruct/shiyan.go
  3. 128
      api/version1/customerApp/runAppControll.go
  4. 22
      api/version1/customerApp/type.go
  5. 68
      api/version1/customerform/formTable.go
  6. 416
      api/version1/menus/menus.go
  7. 500
      api/version1/menus/temas.go
  8. 62
      api/version1/menus/type.go
  9. 866
      api/version1/menus/workTems.go
  10. 32
      api/version1/taskplatform/taskmanagement/ruanTask.go
  11. 2
      apirouter/apishiyan/maptostruct.go
  12. 3
      apirouter/v1/customerformrouter/router.go
  13. 9
      apirouter/v1/menusRouters/pc.go
  14. 73
      models/customerForm/diaoBanSetup.go
  15. 66
      models/modelshr/teams_rules.go
  16. 2
      models/teamlog/teamslog.go

7
.vscode/launch.json

@ -0,0 +1,7 @@
{
// 使 IntelliSense
//
// 访: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": []
}

72
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
}

128
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)
}

22
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
}

68
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)

416
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 {

500
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
}

62
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"` //工作时间段名称
}

866
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)
}

32
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)
}

2
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) {

3
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) //设定取值
}
}

9
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) //解析日历生成排班顺序(新版本)
}
}

73
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
}

66
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
}

2
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 {

Loading…
Cancel
Save