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