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