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