第二代基于事件的高级计划排程引擎
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 

199 lines
6.1 KiB

package service
import (
"leit.com/aps_engine/models"
"strconv"
"time"
)
// 订单工序对象
type OperationSrv struct{
OperationNr int // 工序号
SplitNr int // 工序拆分号
OrderId string // 订单号
SchedStatus int // 在内存中的调度状态:0:未调度;1:已调度
Status int // 工序状态
WorkPlaceGrpNr int // 对应资源组号
WorkPlaceNr int // 计划工位号
PlanQty float32
ToolGrpNr int
PlanToolNr int
PlanWorkPlaceNr int
SetupDuration time.Duration // 换型工时
SetupStartTime time.Time // 换型开始
SetupEndTime time.Time // 换型结束
PlanDuration time.Duration // 计划工时
PlanStartTime time.Time // 计划生产开始
PlanEndTime time.Time // 计划生产结束
PostDuration time.Duration // 后处理工时
PostStartTime time.Time // 计划后处理开始
PostEndTime time.Time // 计划后处理结束
PrevOpDict map[string]OperationRelSrv // 前工序
NextOpDict map[string]OperationRelSrv // 后工序
AttributeDict map[int]OpAttributeSrv // 工序分配的属性
ToolDemandDict map[int]OpToolDemandSrv // 工序的工具需求
ArtDemandDict map[string]OpArticleDemandSrv // 工序的物料需求
SkillDemandDict map[int]OpSkillDemandSrv // 工序的技能需求
SecResDemandDict map[int]OpSecResourceDemandSrv // 工序的次要资源需求
ArtYieldDict map[string]OpArticleYieldSrv // 工序的物料产出
}
// 工序分配的属性,用于匹配计划设备
type OpAttributeSrv struct {
AttributeNr int
}
// 工序的工具需求
type OpToolDemandSrv struct {
ToolGrpNr int
ReqQty float32
Operation *OperationSrv
}
// 工序的物料需求
type OpArticleDemandSrv struct {
ArtId string
ReqQty float32
Operation *OperationSrv
}
// 工序的物料产出(中间品)
type OpArticleYieldSrv struct {
ArtId string
YieldQty float32
Operation *OperationSrv
}
// 工序的技能需求
type OpSkillDemandSrv struct {
SkillNr int
ReqQty float32
Operation *OperationSrv
DemandPeriod string // 需求时段:SETUP / PROD / AFTERPROCESS
}
// 工序的次要资源需求
type OpSecResourceDemandSrv struct {
ResourceNr int
ReqQty float32
Operation *OperationSrv
DemandPeriod string // 需求时段:SETUP / PROD / AFTERPROCESS
}
// 获取工序键值:工序号-工序拆分号
func(ops *OperationSrv)GetOpKey()(string){
return strconv.Itoa(ops.OperationNr) + "-" + strconv.Itoa(ops.SplitNr)
}
// 获取工序键值:工序号-工序拆分号
func(ops *OperationSrv)GetOrdOpKey()(string){
return ops.OrderId + "-" + strconv.Itoa(ops.OperationNr) + "-" + strconv.Itoa(ops.SplitNr)
}
// 初始化
func(ops *OperationSrv)Init(){
ops.PrevOpDict = make(map[string]OperationRelSrv)
ops.NextOpDict = make(map[string]OperationRelSrv)
ops.AttributeDict = make(map[int]OpAttributeSrv)
ops.ToolDemandDict = make(map[int]OpToolDemandSrv)
ops.SkillDemandDict = make(map[int]OpSkillDemandSrv)
ops.ArtDemandDict = make(map[string]OpArticleDemandSrv)
ops.SecResDemandDict= make(map[int]OpSecResourceDemandSrv)
ops.ArtYieldDict = make(map[string]OpArticleYieldSrv)
}
// 创建工序对象
func(ops *OperationSrv)Create(optab models.OmWooperation){
var (
optooltab models.OmWooperationtoollst
oparttab models.OmWooperationartlst
opyieldtab models.OmWooperationyieldlst
oprestab models.OmWooperationresourcelst
opskilltab models.OmWooperationskilllst
optoolsrv OpToolDemandSrv
opskillsrv OpSkillDemandSrv
opartsrv OpArticleDemandSrv
opressrv OpSecResourceDemandSrv
opyieldsrv OpArticleYieldSrv
)
ops.OrderId = optab.Workorderid
ops.OperationNr = optab.Operationnr
ops.SplitNr = optab.Splitnr
ops.WorkPlaceGrpNr = optab.Workplacegrpnr
ops.WorkPlaceNr = optab.Workplacenr
ops.PrevOpDict = make(map[string]OperationRelSrv)
ops.NextOpDict = make(map[string]OperationRelSrv)
ops.AttributeDict = make(map[int]OpAttributeSrv)
ops.ToolDemandDict = make(map[int]OpToolDemandSrv)
ops.SkillDemandDict = make(map[int]OpSkillDemandSrv)
ops.ArtDemandDict = make(map[string]OpArticleDemandSrv)
ops.SecResDemandDict= make(map[int]OpSecResourceDemandSrv)
ops.ArtYieldDict = make(map[string]OpArticleYieldSrv)
// 加载工具需求
for _, optooltab = range optab.Toollst {
optoolsrv = OpToolDemandSrv{Operation: ops}
optoolsrv.ToolGrpNr = optooltab.Toolgrpnr
optoolsrv.ReqQty = optooltab.Planqty
ops.ToolDemandDict[optoolsrv.ToolGrpNr] = optoolsrv
}
// 加载物料需求
for _, oparttab = range optab.Artlst {
opartsrv = OpArticleDemandSrv{Operation: ops}
opartsrv.ArtId = oparttab.Artid
opartsrv.ReqQty = oparttab.Planqty
ops.ArtDemandDict[opartsrv.ArtId] = opartsrv
}
// 加载物料产出
for _, opyieldtab = range optab.Yieldlst {
opyieldsrv = OpArticleYieldSrv{Operation: ops}
opyieldsrv.ArtId = opyieldtab.Artid
opyieldsrv.YieldQty = opyieldtab.Planqty
ops.ArtYieldDict[opartsrv.ArtId] = opyieldsrv
}
// 加载技能需求,需要区分需求时段
for _, opskilltab = range optab.Skilllst {
opskillsrv = OpSkillDemandSrv{Operation: ops}
opskillsrv.SkillNr = opskilltab.Skillnr
opskillsrv.ReqQty = opskilltab.Planqty
opskillsrv.DemandPeriod = opskilltab.Opdemandperiod
}
// 加载次要资源需求,需要区分需求时段
for _, oprestab = range optab.Resourcelst {
opressrv = OpSecResourceDemandSrv{Operation: ops}
opressrv.ResourceNr = oprestab.Resourcenr
opressrv.ReqQty = oprestab.Planqty
opressrv.DemandPeriod = oprestab.Opdemandperiod
}
}
// 获取任务计划开始事件
func(ops *OperationSrv)GetPlanStartEvent(t time.Time)(SchedEvent){
var(
opet OperationEvent
)
opet = OperationEvent{TriggerTime: t, EventType: EVENT_OBJ_OPTASK, Event: EVENT_TASK_PLANBEG}
opet.OrderId = ops.OrderId
opet.OperationNr = ops.OperationNr
opet.SplitNr = ops.SplitNr
return SchedEvent(opet)
}
// 获取任务计划结束事件
func(ops *OperationSrv)GetPlanEndEvent(t time.Time)(SchedEvent){
var(
opet OperationEvent
)
opet = OperationEvent{TriggerTime: t, EventType: EVENT_OBJ_OPTASK, Event: EVENT_TASK_PLANEND}
opet.OrderId = ops.OrderId
opet.OperationNr = ops.OperationNr
opet.SplitNr = ops.SplitNr
return SchedEvent(opet)
}