|
|
@ -1,6 +1,7 @@ |
|
|
|
package service |
|
|
|
|
|
|
|
import ( |
|
|
|
"leit.com/aps_engine/models" |
|
|
|
"strconv" |
|
|
|
"time" |
|
|
|
) |
|
|
@ -10,74 +11,159 @@ type OperationSrv struct{ |
|
|
|
OperationNr int // 工序号
|
|
|
|
SplitNr int // 工序拆分号
|
|
|
|
OrderId string // 订单号
|
|
|
|
SchedStatus int // 在内存中的调度状态:0:未调度;1:已调度
|
|
|
|
Status int // 工序状态
|
|
|
|
WorkPlaceGrpNr int // 对应资源组号
|
|
|
|
ToolGrpNr int // 对应工具组号
|
|
|
|
WorkPlaceNr int // 计划工位号
|
|
|
|
PlanQty float32 |
|
|
|
PlanDuration time.Duration // 计划工时
|
|
|
|
|
|
|
|
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 // 计划后处理结束
|
|
|
|
PlanWorkPlaceNr int // 计划工位号
|
|
|
|
PlanToolNr int |
|
|
|
PrevOpDict map[string]OperationRelSrv // 前工序
|
|
|
|
NextOpDict map[string]OperationRelSrv // 后工序
|
|
|
|
AttributeDict map[int]OpAttribute // 工序分配的属性
|
|
|
|
ToolDemandDict map[int]OpToolDemand // 工序的工具需求
|
|
|
|
ArtChangeDict map[string]OpArticleChange // 工序的物料变化
|
|
|
|
SkillDemandDict map[int]OpSkillDemand // 工序的技能需求
|
|
|
|
SecResDemandDict map[int]OpSecResourceDemand // 工序的次要资源需求
|
|
|
|
|
|
|
|
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 OpAttribute struct { |
|
|
|
type OpAttributeSrv struct { |
|
|
|
AttributeNr int |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
// 工序的工具需求
|
|
|
|
type OpToolDemand struct { |
|
|
|
ToolNr int |
|
|
|
ReqQty int |
|
|
|
type OpToolDemandSrv struct { |
|
|
|
ToolGrpNr int |
|
|
|
ReqQty float32 |
|
|
|
Operation *OperationSrv |
|
|
|
} |
|
|
|
// 工序的物料需求
|
|
|
|
type OpArticleChange struct { |
|
|
|
type OpArticleDemandSrv struct { |
|
|
|
ArtId string |
|
|
|
ChangeMode int |
|
|
|
ChangeQty float64 |
|
|
|
Operation *OperationSrv |
|
|
|
ReqQty float32 |
|
|
|
Operation *OperationSrv |
|
|
|
} |
|
|
|
// 工序的物料产出(中间品)
|
|
|
|
type OpArticleYieldSrv struct { |
|
|
|
ArtId string |
|
|
|
YieldQty float32 |
|
|
|
Operation *OperationSrv |
|
|
|
} |
|
|
|
// 工序的技能需求
|
|
|
|
type OpSkillDemand struct { |
|
|
|
type OpSkillDemandSrv struct { |
|
|
|
SkillNr int |
|
|
|
ReqQty int |
|
|
|
ReqQty float32 |
|
|
|
Operation *OperationSrv |
|
|
|
DemandPeriod string // 需求时段:SETUP / PROD / AFTERPROCESS
|
|
|
|
} |
|
|
|
// 工序的次要资源需求
|
|
|
|
type OpSecResourceDemand struct { |
|
|
|
type OpSecResourceDemandSrv struct { |
|
|
|
ResourceNr int |
|
|
|
ReqQty int |
|
|
|
ReqQty float32 |
|
|
|
Operation *OperationSrv |
|
|
|
DemandPeriod string // 需求时段:SETUP / PROD / AFTERPROCESS
|
|
|
|
} |
|
|
|
|
|
|
|
// 获取工序键值:工序号-工序拆分号
|
|
|
|
func(ops *OperationSrv)GetKey()(string){ |
|
|
|
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]OpAttribute) |
|
|
|
ops.ToolDemandDict = make(map[int]OpToolDemand) |
|
|
|
ops.SkillDemandDict = make(map[int]OpSkillDemand) |
|
|
|
ops.ArtChangeDict = make(map[string]OpArticleChange) |
|
|
|
ops.SecResDemandDict= make(map[int]OpSecResourceDemand) |
|
|
|
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 |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
// 获取任务计划开始事件
|
|
|
|