package seq
|
|
|
|
import (
|
|
"fmt"
|
|
"leit.com/leit_seat_aps/common"
|
|
"leit.com/leit_seat_aps/db"
|
|
"leit.com/leit_seat_aps/glog"
|
|
"leit.com/leit_seat_aps/service"
|
|
"strings"
|
|
"time"
|
|
)
|
|
|
|
/**
|
|
基于产线排序派工下达逻辑
|
|
1. 按产线启动 Go Routine
|
|
2. 按产线加载未下达已计划的生产订单
|
|
3. 对于非混线的产线,按照指定规则对订单队列排序(按SEQ或SWET)
|
|
4. 按照产线指定规则下达生产订单并同步更新客户订单状态
|
|
**/
|
|
func RunScheduler() (err error) {
|
|
var (
|
|
se service.SchedEngine
|
|
bl_wl service.BL_Workline
|
|
i int
|
|
)
|
|
|
|
se = service.SchedEngine{}
|
|
se.PlanMode = common.LINE_PLAN_IN_SEQ
|
|
se.LineTypes = append(se.LineTypes, "A", "M", "V")
|
|
|
|
// 加载排序产线
|
|
if err = se.LoadMasterData(); err != nil {
|
|
return
|
|
}
|
|
|
|
// 按产线启动排序派工服务
|
|
for i = 0; i < len(se.Wltablst); i++ {
|
|
fmt.Println("Start line:", bl_wl.WorklineId, " schedule service!")
|
|
bl_wl = service.BL_Workline{}
|
|
bl_wl.PickTmpDict = make(map[string]service.BL_PickingTemplate)
|
|
bl_wl.WorklineId = se.Wltablst[i].Worklineid
|
|
bl_wl.SortMode = se.Wltablst[i].Taskqueuesortway
|
|
if se.Wltablst[i].Multiqueuemixsort == 1 {
|
|
bl_wl.MixSort = true
|
|
bl_wl.MixSortMode = se.Wltablst[i].Taskqueuemixsortway
|
|
bl_wl.MixSortRule = se.Wltablst[i].Mixsortlogic
|
|
} else {
|
|
bl_wl.MixSort = false
|
|
}
|
|
bl_wl.ReleaseMode = se.Wltablst[i].Taskreleaseway
|
|
bl_wl.ReleaseValue = se.Wltablst[i].Releaseparameter
|
|
bl_wl.Worklinetab = se.Wltablst[i]
|
|
|
|
go ScheduleTaskToRelease(bl_wl, &se)
|
|
}
|
|
|
|
// 循环避免主函数退出
|
|
for {
|
|
time.Sleep(1 * time.Hour)
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
// 产线的排序派工服务
|
|
// 1. 读取调度到产线的生产订单,状态 = 20
|
|
// 2. 按照 swet 和 Oemseq 排序
|
|
// 3. 根据指定规则下达生产订单
|
|
func ScheduleTaskToRelease(bl_wl service.BL_Workline, se *service.SchedEngine) {
|
|
var (
|
|
err error
|
|
workline db.Workline
|
|
)
|
|
// 循环加载产线的待派工的任务,并依次处理
|
|
for {
|
|
//查询产线信息
|
|
if workline, err = bl_wl.SelectWorkline(); err != nil {
|
|
glog.InfoExtln("排序调度", "LoadPlannedTask err: ", err)
|
|
// 报错并返回
|
|
return
|
|
}
|
|
bl_wl.SortMode = workline.Taskqueuesortway
|
|
if workline.Multiqueuemixsort == 1 {
|
|
bl_wl.MixSort = true
|
|
bl_wl.MixSortMode = workline.Taskqueuemixsortway
|
|
bl_wl.MixSortRule = workline.Mixsortlogic
|
|
} else {
|
|
bl_wl.MixSort = false
|
|
}
|
|
bl_wl.ReleaseMode = workline.Taskreleaseway
|
|
bl_wl.ReleaseValue = workline.Releaseparameter
|
|
bl_wl.Worklinetab = workline
|
|
// 基于产线的派工策略获取派工订单
|
|
bl_wolst := make([]service.BL_WorkOrder,0)
|
|
switch bl_wl.ReleaseMode {
|
|
case common.LINE_REL_BY_QTY:
|
|
if bl_wolst,err = bl_wl.GetTaskToReleaseByQty(); err != nil {
|
|
glog.InfoExtln("排序调度", "GetTaskToReleaseByQty1 err: ", err)
|
|
errstr := err.Error()
|
|
if ok := strings.Contains(errstr, "mssql: Transaction (Process ID"); ok {
|
|
glog.InfoExtln("排序调度", "GetTaskToReleaseByQty2 err: ", err)
|
|
time.Sleep(5 * time.Second)
|
|
continue
|
|
}
|
|
// 报错并返回
|
|
return
|
|
}
|
|
// 派工订单
|
|
if err = bl_wl.ReleaseTasks(bl_wolst, se); err != nil {
|
|
glog.InfoExtln("排序调度", "ReleaseTasks err: ", err)
|
|
errstr := err.Error()
|
|
if ok := strings.Contains(errstr, "mssql: Transaction (Process ID"); ok {
|
|
time.Sleep(1 * time.Second)
|
|
continue
|
|
}
|
|
// 报错并返回
|
|
return
|
|
}
|
|
case common.LINE_REL_BY_OEMSEQ:
|
|
if bl_wolst,err = bl_wl.GetTaskToReleaseByTime(); err != nil {
|
|
glog.InfoExtln("排序调度", "GetTaskToReleaseByTime err: ", err)
|
|
// 报错并返回
|
|
return
|
|
}
|
|
// 派工订单
|
|
if err = bl_wl.ReleaseTasks(bl_wolst, se); err != nil {
|
|
glog.InfoExtln("排序调度", "ReleaseTasks err: ", err)
|
|
errstr := err.Error()
|
|
if ok := strings.Contains(errstr, "mssql: Transaction (Process ID"); ok {
|
|
time.Sleep(1 * time.Second)
|
|
continue
|
|
}
|
|
// 报错并返回
|
|
return
|
|
}
|
|
case common.LINE_REL_BY_DURATION:
|
|
if err = bl_wl.GetTaskToReleaseByDuration(&bl_wolst); err != nil {
|
|
glog.InfoExtln("排序调度", "GetTaskToReleaseByDuration err: ", err)
|
|
// 报错并返回
|
|
return
|
|
}
|
|
// 派工订单
|
|
if err = bl_wl.ReleaseTasks(bl_wolst, se); err != nil {
|
|
glog.InfoExtln("排序调度", "ReleaseTasks err: ", err)
|
|
errstr := err.Error()
|
|
if ok := strings.Contains(errstr, "mssql: Transaction (Process ID"); ok {
|
|
time.Sleep(1 * time.Second)
|
|
continue
|
|
}
|
|
// 报错并返回
|
|
return
|
|
}
|
|
}
|
|
|
|
time.Sleep(2 * time.Second)
|
|
}
|
|
}
|