From 091d9bf7acb1dc6d6c0b22b690614e267aa662a5 Mon Sep 17 00:00:00 2001 From: "leo.xue@le-it.com.cn" Date: Thu, 8 Apr 2021 21:41:56 +0800 Subject: [PATCH] LEO commit --- schedule/Schedule_test.go | 38 +++++++++++++++----------- schedule/Scheduler.Ctrl.go | 55 +++++++++++++++++++++++++++----------- schedule/WorkLine.Ctrl.go | 19 ++++++++++++- 3 files changed, 79 insertions(+), 33 deletions(-) diff --git a/schedule/Schedule_test.go b/schedule/Schedule_test.go index 111ba8a..6d684d8 100644 --- a/schedule/Schedule_test.go +++ b/schedule/Schedule_test.go @@ -1,8 +1,6 @@ package schedule import ( - "fmt" - "leit.com/LAPP_GAAS_GFrame/models" "testing" "time" ) @@ -14,29 +12,37 @@ func TestScheduler(t *testing.T) { m1 time.Month schedeng SchedulerSrv startDate, endDate time.Time + worklinetype string ) + + // 建立数据库连接 + // 初始化scheduler,默认从当天起计划5天 y1,m1,d1 = time.Now().Date() startDate = time.Date(y1, m1, d1, 0, 0, 0, 0, time.UTC) endDate = startDate.Add(24*5*time.Hour) schedeng = SchedulerSrv{StartDate: startDate,EndDate: endDate} + // 指定加载的产线类型 + worklinetype= "" - // 加载主数据 - schedeng.LoadWorklineData() + // 加载激活的项目主数据 + schedeng.LoadProjectData() + // 加载时间模型,基于调度引擎指定的时间区间 schedeng.LoadTimemodelData() + // 加载产品换型主数据 schedeng.LoadSetupData() - - // 加载工单数据 + // 加载产线主数据 + schedeng.LoadWorklineData(worklinetype) + // 加载产线班组计划出勤数据 + schedeng.LoadWorkLineWorkShiftData() + // 生成产线的时间曲线 + schedeng.GenerateWorkLineTimeCurve() + // 加载工单数据(调度任务) schedeng.LoadSchedTaskData() - - // 优先处理生产中、已派工和已计划的工单 - + // 对调度任务进行排序 + schedeng.SortUnplannedTask() // 依次调度未计划工单 - -} - -func TestLastModify(t *testing.T) { - prodtab := models.OmProdorder{} - SetTableLastModify(&prodtab,prodtab, MODIFY_MODE_CREATE, "leo") - fmt.Println(prodtab.Lastuser, prodtab.Createtime) + schedeng.AutoSchedule() + // 输出排程结果 + schedeng.PrintScheduleResult() } diff --git a/schedule/Scheduler.Ctrl.go b/schedule/Scheduler.Ctrl.go index 00c115e..6c6f09b 100644 --- a/schedule/Scheduler.Ctrl.go +++ b/schedule/Scheduler.Ctrl.go @@ -22,6 +22,27 @@ type SchedulerSrv struct { UnPlannedTaskArray []TaskSrv // 未计划的任务队列 } +// 加载激活的项目 +func(schedsrv *SchedulerSrv)LoadProjectData()(err error){ + var( + i int + projtab models.MeProject + projtablst []models.MeProject + ) + // 初始化 + schedsrv.ProjDict = make(map[string]models.MeProject) + // 读取激活的项目数据 + projtab = models.MeProject{Plantnr: schedsrv.PlantNr} + if projtablst, err = projtab.SelectActiveProjects(); err != nil{ + err = errors.New(fmt.Sprintf("获取工厂%d的激活的项目失败%v !", schedsrv.PlantNr, err)) + return + } + // 加载项目 + for i = 0; i < len(projtablst); i++ { + schedsrv.ProjDict[projtablst[i].Projectid] = projtablst[i] + } + return +} // 加载产线及其相关数据 func(schedsrv *SchedulerSrv)LoadWorklineData(wltype string)(err error){ var( @@ -95,25 +116,17 @@ func(schedsrv *SchedulerSrv)LoadSetupData()(err error){ return } -// 加载激活的项目 -func(schedsrv *SchedulerSrv)LoadProjectData()(err error){ +// 生成产线的调度曲线 +func(schedsrv *SchedulerSrv)GenerateWorkLineTimeCurve()(err error){ var( - i int - projtab models.MeProject - projtablst []models.MeProject + wlsrv *WorklineSrv ) - // 初始化 - schedsrv.ProjDict = make(map[string]models.MeProject) - // 读取激活的项目数据 - projtab = models.MeProject{Plantnr: schedsrv.PlantNr} - if projtablst, err = projtab.SelectActiveProjects(); err != nil{ - err = errors.New(fmt.Sprintf("获取工厂%d的激活的项目失败%v !", schedsrv.PlantNr, err)) - return - } - // 加载项目 - for i = 0; i < len(projtablst); i++ { - schedsrv.ProjDict[projtablst[i].Projectid] = projtablst[i] + // 遍历产线 + for _, wlsrv = range schedsrv.WorklineDict { + // 基于产线的时间模型和排班获取产线在指定时间区间内的时间线集合 + } + return } // 加载调度任务 @@ -770,4 +783,14 @@ func(schedsrv *SchedulerSrv)SortUnplannedTask(){ j := v.FieldByName("Create_time") return i.String() < j.String() }) +} +// 调度引擎自动排程 +func(schedsrv *SchedulerSrv)AutoSchedule()(err error){ + + return +} +// 打印调度引擎排程结果 +func(schedsrv *SchedulerSrv)PrintScheduleResult()(err error){ + + return } \ No newline at end of file diff --git a/schedule/WorkLine.Ctrl.go b/schedule/WorkLine.Ctrl.go index e16ecd9..eddbcfb 100644 --- a/schedule/WorkLine.Ctrl.go +++ b/schedule/WorkLine.Ctrl.go @@ -43,7 +43,7 @@ func(wlsrv *WorklineSrv)Init(wltab models.Workline){ wlsrv.WorkLoadArray = []WorkLoadSrv{} } -// 加载指定时段内的班次实际出勤数据 +// 加载指定时段内的排班表:班次计划出勤数据 func(wlsrv *WorklineSrv)LoadWorkShiftData(startdate, enddate time.Time)(err error){ var( i int @@ -285,4 +285,21 @@ func(wlsrv *WorklineSrv)CalHourlyWorkload(){ } } +// 基于产线排班信息获取指定日期和班次的班次效率,如果不存在则返回班次标准效率1.0 +func(wlsrv *WorklineSrv)GetWorkShiftEff(day string, wsnr int)(eff float32){ + var ( + key string + ok bool + perqty int + wlwsefftab models.Worklineworkshiftlst + ) + eff = 1.0 + key = day + strconv.Itoa(wsnr) + if wlwsefftab, ok = wlsrv.WorkShiftEffDict[key]; ok { + perqty = wlwsefftab.Personqty + + } + return +} +