Browse Source

生产排程功能开发调试

pull/203/head
娄文智 3 years ago
parent
commit
11f17dc47f
3 changed files with 40 additions and 23 deletions
  1. +1
    -1
      dao/om/implments/WorkOrder.dao.impl.go
  2. +22
    -4
      services/schedule/Schedule_test.go
  3. +17
    -18
      services/schedule/Scheduler.Ctrl.go

+ 1
- 1
dao/om/implments/WorkOrder.dao.impl.go View File

@ -370,7 +370,7 @@ func (impl *WorkOrderDAOImplement) SelectPlannedTasks(startTime, endTime time.Ti
session := impl.session.Table(impl.meta.TableName)
if err = session.Join("INNER", "OM_WorkOrderStatus",
"OM_WorkOrderStatus.PlantNr = OM_WorkOrder.PlantNr and OM_WorkOrderStatus.WorkOrderId = OM_WorkOrder.WorkOrderId").Join("INNER", "OM_WorkOrderQty",
"OM_WorkOrderQty.PlantNr = OM_WorkOrder.PlantNr and OM_WorkOrderQty.WorkOrderId = OM_WorkOrder.WorkOrderId").Where("OM_WorkOrder.PlantNr = ? and OM_WorkOrderStatus.Status >= ? and OM_WorkOrderStatus.Status < ? and (OM_WorkOrder.ActStartTime >= ? and OM_WorkOrder.ActEndTime <= ?)", impl.plantNr, common.WO_STATUS_PLANNED, common.WO_STATUS_INTERRUPT, startData, endData).Find(&vdatalst); err != nil {
"OM_WorkOrderQty.PlantNr = OM_WorkOrder.PlantNr and OM_WorkOrderQty.WorkOrderId = OM_WorkOrder.WorkOrderId").Where("OM_WorkOrder.PlantNr = ? and OM_WorkOrderStatus.Status >= ? and OM_WorkOrderStatus.Status < ? and (OM_WorkOrder.PlanStartTime >= ? and OM_WorkOrder.PlanEndTime <= ?)", impl.plantNr, common.WO_STATUS_PLANNED, common.WO_STATUS_INTERRUPT, startData, endData).Find(&vdatalst); err != nil {
return
}
datalst = make([]model.WorkOrder, 0)


+ 22
- 4
services/schedule/Schedule_test.go View File

@ -93,8 +93,13 @@ func TestScheduler(t *testing.T) {
if err !=nil{
t.Error(err.Error())
}
fmt.Println()
fmt.Printf("LoadWorklineData:%v",schedeng.WorklineDict)
fmt.Println()
fmt.Printf("RB:%v",schedeng.WorklineDict["RB"])
fmt.Println()
fmt.Printf("RBC:%v",schedeng.WorklineDict["RBC"])
// 加载产线班组计划出勤数据
err = schedeng.LoadWorkLineWorkShiftData()
if err !=nil{
@ -102,6 +107,8 @@ func TestScheduler(t *testing.T) {
}
fmt.Println()
fmt.Printf("LoadWorkLineWorkShiftData:%v",schedeng.WorklineDict)
fmt.Println()
fmt.Printf("RB:%v",schedeng.WorklineDict["RB"])
// 生成产线的时间曲线
err = schedeng.GenerateWorkLineTimeCurve()
if err !=nil{
@ -145,10 +152,21 @@ func TestScheduler(t *testing.T) {
if err !=nil{
t.Error(err.Error())
}
//fmt.Println("11111111111")
//fmt.Printf("排程结果:%v",schedeng.WorklineDict["RB"].SchedTaskArray)
//fmt.Println()
//fmt.Printf("排程结果:%v",schedeng.WorklineDict["RB"].SchedTimeCurve)
fmt.Printf("WorkShiftDict:%v",schedeng.WorklineDict)
fmt.Println("RB")
fmt.Printf("RB Task:%v",schedeng.WorklineDict["RB"].SchedTaskArray)
fmt.Println()
fmt.Printf("RB TimeCurve:%v",schedeng.WorklineDict["RB"].TimeCurve)
fmt.Println()
fmt.Printf("RB SchedTimeCurve:%v",schedeng.WorklineDict["RB"].SchedTimeCurve)
fmt.Println()
// 排程任务
fmt.Println("排程任务:")
for i := 0; i < len(schedeng.WorklineDict["RB"].SchedTaskArray); i++ {
fmt.Println(i, " -- ", fmt.Sprintf("生产订单:%s 计划产线:%s 计划开始时间:%v 计划结束时间:%v ",
schedeng.WorklineDict["RB"].SchedTaskArray[i].TaskId, schedeng.WorklineDict["RB"].SchedTaskArray[i].SchedResId,
schedeng.WorklineDict["RB"].SchedTaskArray[i].SchedStartTime, schedeng.WorklineDict["RB"].SchedTaskArray[i].SchedEndTime))
}
fmt.Println()
// 输出排程结果
err = schedeng.PrintScheduleResult()


+ 17
- 18
services/schedule/Scheduler.Ctrl.go View File

@ -62,7 +62,6 @@ func (schedsrv *SchedulerSrv) LoadWorklineData(wltype string) (err error) {
var (
i int
wltablst []base.WorkLine
wlsrv WorklineSrv
)
// 初始化
schedsrv.WorklineDict = make(map[string]*WorklineSrv)
@ -77,7 +76,7 @@ func (schedsrv *SchedulerSrv) LoadWorklineData(wltype string) (err error) {
}
// 生成产线对象
for i = 0; i < len(wltablst); i++ {
wlsrv = WorklineSrv{}
wlsrv := WorklineSrv{}
wlsrv.Init(wltablst[i])
schedsrv.WorklineDict[wlsrv.WorklineId] = &wlsrv
}
@ -102,11 +101,8 @@ func (schedsrv *SchedulerSrv) LoadTimemodelData() {
// 加载产线班次的实际出勤数据,指定时段,没有按班次指定的默认值填充
func (schedsrv *SchedulerSrv) LoadWorkLineWorkShiftData() (err error) {
var (
wlsrv *WorklineSrv
)
// 遍历产线
for _, wlsrv = range schedsrv.WorklineDict {
for _, wlsrv := range schedsrv.WorklineDict {
// 加载产线指定时段内的实际出勤数据
if err = wlsrv.LoadWorkShiftData(schedsrv.StartDate, schedsrv.EndDate); err != nil {
err = errors.New(fmt.Sprintf("加载产线%s的排班数据出错%v!", wlsrv.WorklineId, err))
@ -147,11 +143,8 @@ func (schedsrv *SchedulerSrv) LoadSetupData() (err error) {
// 生成产线的调度曲线
func (schedsrv *SchedulerSrv) GenerateWorkLineTimeCurve() (err error) {
var (
wlsrv *WorklineSrv
)
// 遍历产线
for _, wlsrv = range schedsrv.WorklineDict {
for _, wlsrv := range schedsrv.WorklineDict {
// 基于产线的时间模型和排班获取产线在指定时间区间内的时间线集合
err := wlsrv.GetWorkDayList(&schedsrv.Tmsrv)
if err != nil {
@ -260,7 +253,6 @@ func (schedsrv *SchedulerSrv) GetSetupDuration(stpsrv SetupSrv) time.Duration {
// 调度任务到产线,对不同状态的任务分别处理,调度后将任务添加到产线的调度任务列表
func (schedsrv *SchedulerSrv) ScheduleTask(worklineid string, task *TaskSrv) (err error) {
var (
wlsrv *WorklineSrv
iLen int
startTime, endTime time.Time
setupsrv SetupSrv
@ -269,7 +261,8 @@ func (schedsrv *SchedulerSrv) ScheduleTask(worklineid string, task *TaskSrv) (er
)
// 获取产线对象
if wlsrv, ok = schedsrv.WorklineDict[worklineid]; !ok {
wlsrv, ok := schedsrv.WorklineDict[worklineid]
if !ok {
err = errors.New(fmt.Sprintf("产线%s不存在!", worklineid))
return
}
@ -335,16 +328,21 @@ func (schedsrv *SchedulerSrv) ScheduleTask(worklineid string, task *TaskSrv) (er
task.SchedResId = wlsrv.WorklineId
wlsrv.SchedTaskArray = append(wlsrv.SchedTaskArray, *task)
// 更新产线的时间线
wlsrv.SchedTimeCurve.SubTimeLine(tlinesrv)
err = wlsrv.SchedTimeCurve.SubTimeLine(tlinesrv)
if err != nil{
return
}
if wlsrv.SchedTimeCurve.TimeLineList == nil{
return
}
wlsrv.SchedTimeCurve.GetLineArray()
//负载
return
}
// 修复产线的调度计划,生产中的结束时间、未开始的任务的计划开始和结束时间的重新计算
func (schedsrv *SchedulerSrv) RepairSchedule(worklineid string) (err error) {
var (
wlsrv *WorklineSrv
setupsrv SetupSrv
tlinesrv TimeLineSrv
i int
@ -353,7 +351,8 @@ func (schedsrv *SchedulerSrv) RepairSchedule(worklineid string) (err error) {
)
// 获取产线对象
if wlsrv, ok = schedsrv.WorklineDict[worklineid]; !ok {
wlsrv, ok := schedsrv.WorklineDict[worklineid]
if !ok {
err = errors.New(fmt.Sprintf("产线%s不存在!", worklineid))
return
}
@ -578,7 +577,6 @@ func (schedsrv *SchedulerSrv) ReleaseSchedule(worklineid string) (err error) {
innerLog, err := logger.NewLogger("scheduler", "scheduler")
fmt.Println("error:", err)
var (
wlsrv *WorklineSrv
ok bool
dura time.Duration
i, j, wipqty, totalrelqty, relqty int
@ -586,7 +584,8 @@ func (schedsrv *SchedulerSrv) ReleaseSchedule(worklineid string) (err error) {
)
// 获取产线对象
if wlsrv, ok = schedsrv.WorklineDict[worklineid]; !ok {
wlsrv, ok := schedsrv.WorklineDict[worklineid]
if !ok {
err = errors.New(fmt.Sprintf("产线%s不存在!", worklineid))
return err
}


Loading…
Cancel
Save