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 }