package model import ( "fmt" "log/slog" ) // 区段 type Section interface { RtssModel } // 物理区段(非道岔区段) // 用于和道岔连接构成轨道网络 // 然后使用轨道网络构建link和linkNode形成新的以道岔岔心为节点的网络,用于路径计算等 type PhysicalSection interface { TwoPortsPipeElement // 获取A端和B端的公里标 GetPaKm() *KilometerMark GetPbKm() *KilometerMark // 计算各个端口到岔心的距离 CalculateDistance(calculateKmDistance func(km1, km2 *KilometerMark) (int64, error)) error GetLength() int64 } // 道岔区段(道岔物理区段) // 道岔处的由至少3个及以上的计轴或绝缘节所确定的区段 type TurnoutSection interface { Section // 获取关联的道岔列表 GetTurnouts() []Turnout // 添加关联道岔 AddTurnout(turnout Turnout) } // 逻辑区段 // 是在物理区段基础上进一步细分的区段,为了相对更精细的列车追踪和进路触发等控制 // 最终映射到link上,做相应的逻辑处理 type LogicalSection interface { Section // 所属物理区段(可能是一般物理区段也可能是道岔区段) BelongSection() Section // 获取A端和B端的公里标 GetPaKm() *KilometerMark GetPbKm() *KilometerMark } type PhysicalSectionImpl struct { *TwoPortsPipeElementImpl PaKm *KilometerMark PbKm *KilometerMark len int64 } var _ PhysicalSection = (*PhysicalSectionImpl)(nil) func NewPhysicalSection(uid string) *PhysicalSectionImpl { return &PhysicalSectionImpl{ TwoPortsPipeElementImpl: &TwoPortsPipeElementImpl{ uid: uid, }, } } func (s *PhysicalSectionImpl) GetLength() int64 { return s.len } func (s *PhysicalSectionImpl) CalculateDistance(calculateKmDistance func(km1, km2 *KilometerMark) (int64, error)) error { if s.PaKm == nil || s.PbKm == nil { return fmt.Errorf("区段公里标不能为空") } var err error s.len, err = calculateKmDistance(s.PaKm, s.PbKm) slog.Debug("计算物理区段公里标距离", "uid", s.Uid(), "length", s.len) return err } func (s *PhysicalSectionImpl) GetPaKm() *KilometerMark { return s.PaKm } func (s *PhysicalSectionImpl) GetPbKm() *KilometerMark { return s.PbKm } type SectionImpl struct { uid string } func (s *SectionImpl) Uid() string { return s.uid } var _ TurnoutSection = (*TurnoutSectionImpl)(nil) type TurnoutSectionImpl struct { *SectionImpl Turnouts []Turnout } func NewTurnoutSection(uid string) *TurnoutSectionImpl { return &TurnoutSectionImpl{ SectionImpl: &SectionImpl{ uid: uid, }, Turnouts: make([]Turnout, 0), } } func (t *TurnoutSectionImpl) AddTurnout(turnout Turnout) { for _, exist := range t.Turnouts { if exist.Uid() == turnout.Uid() { return } } t.Turnouts = append(t.Turnouts, turnout) } func (t *TurnoutSectionImpl) GetTurnouts() []Turnout { return t.Turnouts }