2023-12-20 14:44:27 +08:00
|
|
|
package repository
|
|
|
|
|
|
|
|
import "joylink.club/rtsssimulation/repository/model/proto"
|
|
|
|
|
|
|
|
// ISCS模型仓库构建
|
|
|
|
func buildIscsModels(source *proto.Repository, repository *Repository) error {
|
|
|
|
//ISCS管线
|
|
|
|
for _, protoData := range source.Pipes {
|
2023-12-20 15:22:36 +08:00
|
|
|
m := NewPipe(protoData.Id, protoData.Code, protoData.PipeType)
|
|
|
|
repository.PipeMap[m.Id()] = m
|
2023-12-20 14:44:27 +08:00
|
|
|
}
|
|
|
|
//ISCS管件
|
|
|
|
for _, protoData := range source.PipeFittings {
|
|
|
|
m := NewPipeFitting(protoData.Id, protoData.Code, int8(protoData.Sum))
|
2023-12-20 15:22:36 +08:00
|
|
|
repository.PipeFittingMap[m.Id()] = m
|
2023-12-20 14:44:27 +08:00
|
|
|
}
|
|
|
|
//ISCS断路器
|
|
|
|
for _, protoData := range source.CircuitBreakers {
|
|
|
|
m := NewCircuitBreaker(protoData.Id, protoData.Code)
|
2023-12-20 15:22:36 +08:00
|
|
|
repository.CircuitBreakerMap[m.Id()] = m
|
2023-12-20 14:44:27 +08:00
|
|
|
}
|
|
|
|
//ISCS三工位开关
|
|
|
|
for _, protoData := range source.ThreePositionSwitches {
|
|
|
|
m := NewThreePositionSwitch(protoData.Id, protoData.Code)
|
2023-12-20 15:22:36 +08:00
|
|
|
repository.ThreePositionSwitchMap[m.Id()] = m
|
2023-12-20 14:44:27 +08:00
|
|
|
}
|
|
|
|
//ISCS手车
|
|
|
|
for _, protoData := range source.HandcartSwitches {
|
|
|
|
m := NewHandcartSwitch(protoData.Id, protoData.Code)
|
2023-12-20 15:22:36 +08:00
|
|
|
repository.HandcartSwitchMap[m.Id()] = m
|
2023-12-20 14:44:27 +08:00
|
|
|
}
|
|
|
|
//ISCS整流器
|
|
|
|
for _, protoData := range source.Rectifiers {
|
|
|
|
m := NewRectifier(protoData.Id, protoData.Code)
|
2023-12-20 15:22:36 +08:00
|
|
|
repository.RectifierMap[m.Id()] = m
|
2023-12-20 14:44:27 +08:00
|
|
|
}
|
|
|
|
//ISCS隔离开关
|
|
|
|
for _, protoData := range source.Disconnectors {
|
|
|
|
m := NewDisconnector(protoData.Id, protoData.Code)
|
2023-12-20 15:22:36 +08:00
|
|
|
repository.DisconnectorMap[m.Id()] = m
|
2023-12-20 14:44:27 +08:00
|
|
|
}
|
|
|
|
//ISCS变压器
|
|
|
|
for _, protoData := range source.VoltageTransformers {
|
2023-12-20 16:50:51 +08:00
|
|
|
m := NewVoltageTransformer(protoData.Id, protoData.Code, protoData.E1, protoData.E2)
|
2023-12-20 15:22:36 +08:00
|
|
|
repository.VoltageTransformerMap[m.Id()] = m
|
2023-12-20 14:44:27 +08:00
|
|
|
}
|
|
|
|
//ISCS电源
|
|
|
|
for _, protoData := range source.PowerSources {
|
2023-12-20 16:01:08 +08:00
|
|
|
m := NewPowerSource(protoData.Id, protoData.Code, protoData.Ac, protoData.Voltage)
|
2023-12-20 15:22:36 +08:00
|
|
|
repository.PowerSourceMap[m.Id()] = m
|
2023-12-20 14:44:27 +08:00
|
|
|
}
|
2023-12-22 10:57:43 +08:00
|
|
|
//ISCS避雷器
|
|
|
|
for _, protoData := range source.LightningArresters {
|
|
|
|
m := NewLightningArrester(protoData.Id, protoData.Code)
|
|
|
|
repository.LightningArresterMap[m.Id()] = m
|
|
|
|
}
|
2023-12-22 13:20:06 +08:00
|
|
|
//ISCS接地装置
|
|
|
|
for _, protoData := range source.EarthingDevices {
|
|
|
|
m := NewEarthingDevice(protoData.Id, protoData.Code)
|
|
|
|
repository.EarthingDeviceMap[m.Id()] = m
|
|
|
|
}
|
2023-12-22 15:29:57 +08:00
|
|
|
//ISCS网络交换机
|
|
|
|
for _, protoData := range source.NetworkSwitches {
|
|
|
|
m := NewNetworkSwitch(protoData.Id, protoData.Code)
|
|
|
|
repository.NetworkSwitchMap[m.Id()] = m
|
|
|
|
}
|
|
|
|
//ISCS线柜
|
|
|
|
for _, protoData := range source.WireCabinets {
|
|
|
|
m := NewWireCabinet(protoData.Id, protoData.Code)
|
|
|
|
repository.WireCabinetMap[m.Id()] = m
|
|
|
|
}
|
2023-12-25 14:09:29 +08:00
|
|
|
//ISCS风亭
|
|
|
|
for _, protoData := range source.AirPavilions {
|
|
|
|
m := NewAirPavilion(protoData.Id, protoData.Code, protoData.PavilionType)
|
|
|
|
repository.AirPavilionMap[m.Id()] = m
|
|
|
|
}
|
|
|
|
//ISCS阀门
|
|
|
|
for _, protoData := range source.Valves {
|
|
|
|
m := NewValve(protoData.Id, protoData.Code, protoData.ValveType)
|
|
|
|
repository.ValveMap[m.Id()] = m
|
|
|
|
}
|
|
|
|
//ISCS 混合室静压箱
|
|
|
|
for _, protoData := range source.GasMixingChambers {
|
|
|
|
m := NewGasMixingChamber(protoData.Id, protoData.Code)
|
|
|
|
repository.GasMixingChamberMap[m.Id()] = m
|
|
|
|
}
|
|
|
|
//ISCS组合式空调
|
|
|
|
for _, protoData := range source.CombinationAirConditioners {
|
|
|
|
m := NewCombinationAirConditioner(protoData.Id, protoData.Code)
|
|
|
|
repository.CombinationAirConditionerMap[m.Id()] = m
|
|
|
|
}
|
|
|
|
//ISCS净化装置
|
|
|
|
for _, protoData := range source.AirPurificationDevices {
|
|
|
|
m := NewAirPurificationDevice(protoData.Id, protoData.Code)
|
|
|
|
repository.AirPurificationDeviceMap[m.Id()] = m
|
|
|
|
}
|
|
|
|
//ISCS空气幕
|
|
|
|
for _, protoData := range source.AirCurtains {
|
|
|
|
m := NewAirCurtain(protoData.Id, protoData.Code)
|
|
|
|
repository.AirCurtainMap[m.Id()] = m
|
|
|
|
}
|
|
|
|
//ISCS风机
|
|
|
|
for _, protoData := range source.Fans {
|
2023-12-25 17:31:35 +08:00
|
|
|
m := NewFan(protoData.Id, protoData.Code, protoData.FanType)
|
2023-12-25 14:09:29 +08:00
|
|
|
repository.FanMap[m.Id()] = m
|
|
|
|
}
|
2023-12-29 17:00:26 +08:00
|
|
|
//ISCS环境
|
2023-12-25 14:09:29 +08:00
|
|
|
for _, protoData := range source.GasEnvironments {
|
2023-12-29 17:00:26 +08:00
|
|
|
m := NewEnvironment(protoData.Id, protoData.Code)
|
|
|
|
repository.EnvironmentMap[m.Id()] = m
|
2023-12-25 14:09:29 +08:00
|
|
|
}
|
2023-12-20 14:44:27 +08:00
|
|
|
//
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
// ISCS模型关系构建
|
|
|
|
func buildIscsModelRelationship(source *proto.Repository, repository *Repository) error {
|
|
|
|
if e := buildIscsPipeModelRelationship(source, repository); e != nil {
|
|
|
|
return e
|
|
|
|
}
|
|
|
|
//
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
// ISCS模型关系构建---构建与管线Pipe相关的关系
|
|
|
|
func buildIscsPipeModelRelationship(source *proto.Repository, repository *Repository) error {
|
|
|
|
//PSCADA一次图关系数据都在proto管线中
|
|
|
|
for _, protoPipe := range source.Pipes {
|
|
|
|
pipeA := protoPipe.PortA
|
|
|
|
pipeB := protoPipe.PortB
|
|
|
|
pipeModel := (repository.FindById(source.Id)).(*Pipe)
|
|
|
|
//pipeModel的端口pipePort连接设备的端口portRelatedDevice
|
|
|
|
buildRelationship := func(pipePort proto.Port, portRelatedDevice *proto.DevicePort) error {
|
|
|
|
relatedDevice, e := repository.FindModel(portRelatedDevice.DeviceId, portRelatedDevice.DeviceType)
|
|
|
|
if e != nil {
|
|
|
|
return e
|
|
|
|
}
|
|
|
|
var pipePortRelatedDevice DevicePort
|
|
|
|
switch portRelatedDevice.DeviceType {
|
2023-12-25 14:40:15 +08:00
|
|
|
case proto.DeviceType_DeviceType_AirPavilion: //管线关联风亭
|
|
|
|
{
|
|
|
|
airPavilion := relatedDevice.(*AirPavilion)
|
|
|
|
pipePortRelatedDevice = &AirPavilionPort{port: portRelatedDevice.Port, device: airPavilion}
|
|
|
|
airPavilion.PortA = &PipePort{port: pipePort, pipe: pipeModel}
|
|
|
|
}
|
|
|
|
case proto.DeviceType_DeviceType_Valve: //管线关联风阀
|
|
|
|
{
|
|
|
|
valve := relatedDevice.(*Valve)
|
|
|
|
pipePortRelatedDevice = &ValvePort{port: portRelatedDevice.Port, device: valve}
|
|
|
|
switch portRelatedDevice.Port {
|
|
|
|
case proto.Port_A:
|
|
|
|
valve.PortA = &PipePort{port: pipePort, pipe: pipeModel}
|
|
|
|
case proto.Port_B:
|
|
|
|
valve.PortB = &PipePort{port: pipePort, pipe: pipeModel}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
case proto.DeviceType_DeviceType_GasMixingChamber:
|
|
|
|
{
|
|
|
|
gasMixingChamber := relatedDevice.(*GasMixingChamber)
|
|
|
|
pipePortRelatedDevice = &GasMixingChamberPort{port: portRelatedDevice.Port, device: gasMixingChamber}
|
|
|
|
switch portRelatedDevice.Port {
|
|
|
|
case proto.Port_A:
|
2023-12-29 17:00:26 +08:00
|
|
|
gasMixingChamber.PortsA = append(gasMixingChamber.PortsA, &PipePort{port: pipePort, pipe: pipeModel})
|
2023-12-25 14:40:15 +08:00
|
|
|
case proto.Port_B:
|
2023-12-29 17:00:26 +08:00
|
|
|
gasMixingChamber.PortsB = append(gasMixingChamber.PortsB, &PipePort{port: pipePort, pipe: pipeModel})
|
2023-12-25 14:40:15 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
case proto.DeviceType_DeviceType_CombinationAirConditioner:
|
|
|
|
{
|
|
|
|
combinationAirConditioner := relatedDevice.(*CombinationAirConditioner)
|
|
|
|
pipePortRelatedDevice = &CombinationAirConditionerPort{port: portRelatedDevice.Port, device: combinationAirConditioner}
|
|
|
|
switch portRelatedDevice.Port {
|
|
|
|
case proto.Port_A:
|
|
|
|
combinationAirConditioner.PortA = &PipePort{port: pipePort, pipe: pipeModel}
|
|
|
|
case proto.Port_B:
|
|
|
|
combinationAirConditioner.PortB = &PipePort{port: pipePort, pipe: pipeModel}
|
|
|
|
case proto.Port_C:
|
|
|
|
combinationAirConditioner.PortC = &PipePort{port: pipePort, pipe: pipeModel}
|
|
|
|
case proto.Port_D:
|
|
|
|
combinationAirConditioner.PortD = &PipePort{port: pipePort, pipe: pipeModel}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
case proto.DeviceType_DeviceType_AirPurificationDevice:
|
|
|
|
{
|
|
|
|
airPurificationDevice := relatedDevice.(*AirPurificationDevice)
|
|
|
|
pipePortRelatedDevice = &AirPurificationDevicePort{port: portRelatedDevice.Port, device: airPurificationDevice}
|
|
|
|
switch portRelatedDevice.Port {
|
|
|
|
case proto.Port_A:
|
|
|
|
airPurificationDevice.PortA = &PipePort{port: pipePort, pipe: pipeModel}
|
|
|
|
case proto.Port_B:
|
|
|
|
airPurificationDevice.PortB = &PipePort{port: pipePort, pipe: pipeModel}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
case proto.DeviceType_DeviceType_Fan:
|
|
|
|
{
|
|
|
|
fan := relatedDevice.(*Fan)
|
|
|
|
pipePortRelatedDevice = &FanPort{port: portRelatedDevice.Port, device: fan}
|
|
|
|
switch portRelatedDevice.Port {
|
|
|
|
case proto.Port_A:
|
|
|
|
fan.PortA = &PipePort{port: pipePort, pipe: pipeModel}
|
|
|
|
case proto.Port_B:
|
|
|
|
fan.PortB = &PipePort{port: pipePort, pipe: pipeModel}
|
|
|
|
}
|
|
|
|
}
|
2023-12-29 17:00:26 +08:00
|
|
|
case proto.DeviceType_DeviceType_Environment:
|
2023-12-25 14:40:15 +08:00
|
|
|
{
|
2023-12-29 17:00:26 +08:00
|
|
|
gasEnvironment := relatedDevice.(*Environment)
|
|
|
|
pipePortRelatedDevice = &EnvironmentPort{port: portRelatedDevice.Port, device: gasEnvironment}
|
2023-12-25 14:40:15 +08:00
|
|
|
switch portRelatedDevice.Port {
|
|
|
|
case proto.Port_A:
|
|
|
|
gasEnvironment.PortsA = append(gasEnvironment.PortsA, &PipePort{port: pipePort, pipe: pipeModel})
|
|
|
|
case proto.Port_B:
|
|
|
|
gasEnvironment.PortsB = append(gasEnvironment.PortsB, &PipePort{port: pipePort, pipe: pipeModel})
|
|
|
|
}
|
|
|
|
}
|
2023-12-20 14:44:27 +08:00
|
|
|
case proto.DeviceType_DeviceType_PipeFitting:
|
|
|
|
{
|
|
|
|
pipeFitting := relatedDevice.(*PipeFitting)
|
|
|
|
pipePortRelatedDevice = &PipeFittingPort{port: portRelatedDevice.Port, pipeFitting: pipeFitting}
|
|
|
|
//构建管件pipeFitting与管线的关系
|
|
|
|
switch portRelatedDevice.Port {
|
|
|
|
case proto.Port_A:
|
|
|
|
pipeFitting.PortA = &PipePort{port: pipePort, pipe: pipeModel}
|
|
|
|
case proto.Port_B:
|
|
|
|
pipeFitting.PortB = &PipePort{port: pipePort, pipe: pipeModel}
|
|
|
|
case proto.Port_C:
|
|
|
|
pipeFitting.PortC = &PipePort{port: pipePort, pipe: pipeModel}
|
|
|
|
case proto.Port_D:
|
|
|
|
pipeFitting.PortD = &PipePort{port: pipePort, pipe: pipeModel}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
case proto.DeviceType_DeviceType_CircuitBreaker:
|
|
|
|
{
|
|
|
|
circuitBreaker := relatedDevice.(*CircuitBreaker)
|
|
|
|
pipePortRelatedDevice = &CircuitBreakerPort{port: portRelatedDevice.Port, breaker: circuitBreaker}
|
|
|
|
switch portRelatedDevice.Port {
|
|
|
|
case proto.Port_A:
|
|
|
|
circuitBreaker.PortA = &PipePort{port: pipePort, pipe: pipeModel}
|
|
|
|
case proto.Port_B:
|
|
|
|
circuitBreaker.PortB = &PipePort{port: pipePort, pipe: pipeModel}
|
|
|
|
}
|
|
|
|
}
|
2023-12-22 10:57:43 +08:00
|
|
|
case proto.DeviceType_DeviceType_LightningArrester:
|
|
|
|
{
|
|
|
|
lightningArrester := relatedDevice.(*LightningArrester)
|
|
|
|
pipePortRelatedDevice = &LightningArresterPort{port: portRelatedDevice.Port, arrester: lightningArrester}
|
|
|
|
switch portRelatedDevice.Port {
|
|
|
|
case proto.Port_A:
|
|
|
|
lightningArrester.PortA = &PipePort{port: pipePort, pipe: pipeModel}
|
|
|
|
case proto.Port_B:
|
|
|
|
lightningArrester.PortB = &PipePort{port: pipePort, pipe: pipeModel}
|
|
|
|
}
|
|
|
|
}
|
2023-12-20 14:44:27 +08:00
|
|
|
case proto.DeviceType_DeviceType_ThreePositionSwitch:
|
|
|
|
{
|
|
|
|
tps := relatedDevice.(*ThreePositionSwitch)
|
|
|
|
pipePortRelatedDevice = &ThreePositionSwitchPort{port: portRelatedDevice.Port, breaker: tps}
|
|
|
|
switch portRelatedDevice.Port {
|
|
|
|
case proto.Port_A:
|
|
|
|
tps.PortA = &PipePort{port: pipePort, pipe: pipeModel}
|
|
|
|
case proto.Port_B:
|
|
|
|
tps.PortB = &PipePort{port: pipePort, pipe: pipeModel}
|
|
|
|
case proto.Port_C:
|
|
|
|
tps.PortC = &PipePort{port: pipePort, pipe: pipeModel}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
case proto.DeviceType_DeviceType_HandcartSwitch:
|
|
|
|
{
|
|
|
|
hs := relatedDevice.(*HandcartSwitch)
|
|
|
|
pipePortRelatedDevice = &HandcartSwitchPort{port: portRelatedDevice.Port, breaker: hs}
|
|
|
|
switch portRelatedDevice.Port {
|
|
|
|
case proto.Port_A:
|
|
|
|
hs.PortA = &PipePort{port: pipePort, pipe: pipeModel}
|
|
|
|
case proto.Port_B:
|
|
|
|
hs.PortB = &PipePort{port: pipePort, pipe: pipeModel}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
case proto.DeviceType_DeviceType_Rectifier:
|
|
|
|
{
|
|
|
|
rectifier := relatedDevice.(*Rectifier)
|
|
|
|
pipePortRelatedDevice = &RectifierPort{port: portRelatedDevice.Port, rectifier: rectifier}
|
|
|
|
switch portRelatedDevice.Port {
|
|
|
|
case proto.Port_A:
|
|
|
|
rectifier.PortA = &PipePort{port: pipePort, pipe: pipeModel}
|
|
|
|
case proto.Port_B:
|
|
|
|
rectifier.PortB = &PipePort{port: pipePort, pipe: pipeModel}
|
|
|
|
case proto.Port_C:
|
|
|
|
rectifier.PortC = &PipePort{port: pipePort, pipe: pipeModel}
|
|
|
|
case proto.Port_D:
|
|
|
|
rectifier.PortD = &PipePort{port: pipePort, pipe: pipeModel}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
case proto.DeviceType_DeviceType_Disconnector:
|
|
|
|
{
|
|
|
|
disconnecter := relatedDevice.(*Disconnector)
|
|
|
|
pipePortRelatedDevice = &DisconnectorPort{port: portRelatedDevice.Port, breaker: disconnecter}
|
|
|
|
switch portRelatedDevice.Port {
|
|
|
|
case proto.Port_A:
|
|
|
|
disconnecter.PortA = &PipePort{port: pipePort, pipe: pipeModel}
|
|
|
|
case proto.Port_B:
|
|
|
|
disconnecter.PortB = &PipePort{port: pipePort, pipe: pipeModel}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
case proto.DeviceType_DeviceType_VoltageTransformer:
|
|
|
|
{
|
|
|
|
vt := relatedDevice.(*VoltageTransformer)
|
|
|
|
pipePortRelatedDevice = &VoltageTransformerPort{port: portRelatedDevice.Port, vt: vt}
|
|
|
|
switch portRelatedDevice.Port {
|
|
|
|
case proto.Port_A:
|
|
|
|
vt.PortA = &PipePort{port: pipePort, pipe: pipeModel}
|
|
|
|
case proto.Port_B:
|
|
|
|
vt.PortB = &PipePort{port: pipePort, pipe: pipeModel}
|
|
|
|
case proto.Port_C:
|
|
|
|
vt.PortC = &PipePort{port: pipePort, pipe: pipeModel}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
case proto.DeviceType_DeviceType_PowerSource:
|
|
|
|
{
|
|
|
|
ps := relatedDevice.(*PowerSource)
|
|
|
|
pipePortRelatedDevice = &PowerSourcePort{ps: ps}
|
|
|
|
ps.PortA = &PipePort{port: pipePort, pipe: pipeModel}
|
|
|
|
}
|
2023-12-22 13:20:06 +08:00
|
|
|
case proto.DeviceType_DeviceType_EarthingDevice:
|
|
|
|
{
|
|
|
|
ed := relatedDevice.(*EarthingDevice)
|
|
|
|
ed.PortA = &PipePort{port: pipePort, pipe: pipeModel}
|
|
|
|
pipePortRelatedDevice = &EarthingDevicePort{ed: ed}
|
|
|
|
}
|
2023-12-20 14:44:27 +08:00
|
|
|
}
|
|
|
|
if pipePortRelatedDevice != nil {
|
|
|
|
if pipePort == proto.Port_A {
|
|
|
|
pipeModel.PortA = pipePortRelatedDevice
|
|
|
|
} else {
|
|
|
|
pipeModel.PortB = pipePortRelatedDevice
|
|
|
|
}
|
|
|
|
}
|
|
|
|
//
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
//
|
|
|
|
if pipeA != nil {
|
|
|
|
if e := buildRelationship(proto.Port_A, pipeA); e != nil {
|
|
|
|
return e
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if pipeB != nil {
|
|
|
|
if e := buildRelationship(proto.Port_B, pipeB); e != nil {
|
|
|
|
return e
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
//
|
|
|
|
return nil
|
|
|
|
}
|