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