高级排程
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.

227 lines
6.9 KiB

package service
import (
"LAPP_AS/common"
om_model "LAPP_AS/models/om"
"strconv"
"strings"
"time"
)
// 订单工序对象
type OperationSrv struct{
OperationNr int // 工序号
SplitNr int // 工序拆分号
OrderId string // 订单号
SchedStatus int // 在内存中的调度状态:0:未调度;1:已调度
Status int // 工序状态
WorkPlaceGrpId string // 对应资源组号
WorkPlaceId string // 计划工位号
PlanQty float32
ToolGrpId string // todo 按一组处理
PlanToolId string
PlanWorkPlaceId string
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[string]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 {
ToolGrpId string
ReqQty float64
Operation *OperationSrv
}
// 工序的物料需求
type OpArticleDemandSrv struct {
ArtId string
ReqQty float64
Operation *OperationSrv
}
// 工序的物料产出(中间品)
type OpArticleYieldSrv struct {
ArtId string
YieldQty float64
Operation *OperationSrv
}
// 工序的技能需求
type OpSkillDemandSrv struct {
SkillNr int
ReqQty float64
Operation *OperationSrv
DemandPeriod string // 需求时段:SETUP / PROD / AFTERPROCESS
}
// 工序的次要资源需求
type OpSecResourceDemandSrv struct {
ResourceId string
ReqQty float64
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[string]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 om_model.WOOperation){
var (
optooltab om_model.WOOperationToolLst
oparttab om_model.WOOperationArtLst
opyieldtab om_model.WOOperationYieldLst
oprestab om_model.WOOperationResourceLst
opskilltab om_model.WOOperationSkillLst
optoolsrv OpToolDemandSrv
opskillsrv OpSkillDemandSrv
opartsrv OpArticleDemandSrv
opressrv OpSecResourceDemandSrv
opyieldsrv OpArticleYieldSrv
)
ops.OrderId = optab.WorkOrderId
ops.OperationNr = optab.OperationNr
ops.SplitNr = optab.SplitNr
ops.WorkPlaceGrpId = optab.WorkPlaceGrpId
ops.WorkPlaceId = optab.WorkPlaceId
ops.PrevOpDict = make(map[string]OperationRelSrv)
ops.NextOpDict = make(map[string]OperationRelSrv)
ops.AttributeDict = make(map[int]OpAttributeSrv)
ops.ToolDemandDict = make(map[string]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)
//todo
perItemSeconds := float64(optab.OpTimePerItem) * GetTimeUomSeconds(optab.DurationUomId)
ops.PlanDuration = time.Duration(float64(optab.SetupDuration)*perItemSeconds) * time.Second
// 加载工具需求
for _, optooltab = range optab.Toollst {
optoolsrv = OpToolDemandSrv{Operation: ops}
optoolsrv.ToolGrpId = optooltab.ToolGrpId
optoolsrv.ReqQty = optooltab.PlanQty
ops.ToolDemandDict[optoolsrv.ToolGrpId] = optoolsrv
//todo
ops.ToolGrpId = optooltab.ToolGrpId
}
// 加载物料需求
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.ResourceId = oprestab.ResourceId
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)
}
// 基于时间单位获取秒数
func GetTimeUomSeconds(uomId string)(seconds float64){
seconds = 0
switch strings.ToUpper(uomId) {
case common.TIME_UOM_WEEK:
seconds = 7 * 24 * 3600
case common.TIME_UOM_DAY:
seconds = 24 * 3600
case common.TIME_UOM_HOUR:
seconds = 3600
case common.TIME_UOM_MINUTE:
seconds = 60
case common.TIME_UOM_SECOND:
seconds = 1
}
return
}