package console import ( "time" "yunyan/comm" "yunyan/lego/sys/postgres" "yunyan/pb" "github.com/gin-gonic/gin" ) // ============================ 通话翻译配置域 (calltranslate) ============================ // // 移植自 deep_server modules/console/api_calltranslate.go,适配 yunyan-sas 的 postgres 封装与本地 struct。 // 数据存 console 主库(postgres.GetSys())。每条记录定义一个区域下"源→目标语言"的翻译服务编排, // 按 (region, src_lang, dst_lang) 唯一。 // getCallTranslatePairs 列出通话翻译语言对;region>0 按区域过滤,否则全量。 func (this *serverComp) getCallTranslatePairs(c *gin.Context) { var req struct { Region int32 `json:"region"` } _ = c.ShouldBindJSON(&req) items := make([]*CallTranslatePair, 0) var err error if req.Region > 0 { err = postgres.Find(comm.TableCallTranslatePair, &items, "region=?", req.Region) } else { err = postgres.Find(comm.TableCallTranslatePair, &items, "") } if err != nil { writeErr(c, pb.ErrorCode_DBError, err.Error()) return } writeOK(c, gin.H{"items": items}) } // saveCallTranslatePair 新增或更新语言对(按 region+src_lang+dst_lang 判重)。 // id=0 时检查唯一索引,存在则更新,不存在则新建;id>0 时直接 Save。 func (this *serverComp) saveCallTranslatePair(c *gin.Context) { var m CallTranslatePair if err := c.ShouldBindJSON(&m); err != nil { writeErr(c, pb.ErrorCode_ReqParameterError, err.Error()) return } if m.Region == 0 || m.SrcLang == "" || m.DstLang == "" { writeErr(c, pb.ErrorCode_ReqParameterError, "region/src_lang/dst_lang 必填") return } now := time.Now().UnixMilli() if m.Id == 0 { // 按唯一键查重 old := &CallTranslatePair{} if err := postgres.FindOne(comm.TableCallTranslatePair, old, "region=? AND src_lang=? AND dst_lang=?", m.Region, m.SrcLang, m.DstLang); err == nil { // 已存在 → 更新 m.Id = old.Id m.Createtime = old.Createtime } else { m.Createtime = now } } else { old := &CallTranslatePair{} if err := postgres.FindOne(comm.TableCallTranslatePair, old, "id=?", m.Id); err == nil { m.Createtime = old.Createtime } else { m.Createtime = now } } m.Updatetime = now var err error if m.Id == 0 { err = postgres.Insert(comm.TableCallTranslatePair, &m) } else { err = postgres.Save(comm.TableCallTranslatePair, &m) } if err != nil { writeErr(c, pb.ErrorCode_DBError, err.Error()) return } broadcastConfigChanged(comm.ConfigKindCallTranslate, "update", m.Region) writeOK(c, gin.H{"id": m.Id}) } // delCallTranslatePair 按 id 删除语言对(支持批量)。 func (this *serverComp) delCallTranslatePair(c *gin.Context) { var req struct { Ids []uint64 `json:"ids"` } if err := c.ShouldBindJSON(&req); err != nil || len(req.Ids) == 0 { writeErr(c, pb.ErrorCode_ReqParameterError, "ids 必填") return } if err := postgres.Delete(comm.TableCallTranslatePair, "id IN ?", req.Ids); err != nil { writeErr(c, pb.ErrorCode_DBError, err.Error()) return } broadcastConfigChanged(comm.ConfigKindCallTranslate, "delete", 0) writeOK(c, gin.H{"deleted": len(req.Ids)}) } // syncCallTranslatePairs 把指定语言对(by ids)复制到多个目标区域。 // 目标区域已有相同 (src_lang, dst_lang) 的记录则覆盖;无则新建。源区域自身跳过。 func (this *serverComp) syncCallTranslatePairs(c *gin.Context) { var req struct { PairIds []uint64 `json:"pair_ids"` TargetRegions []int32 `json:"target_regions"` } if err := c.ShouldBindJSON(&req); err != nil || len(req.PairIds) == 0 { writeErr(c, pb.ErrorCode_ReqParameterError, "pair_ids 必填") return } if len(req.TargetRegions) == 0 { writeOK(c, gin.H{"synced": 0}) return } // 加载源语言对 srcPairs := make([]*CallTranslatePair, 0, len(req.PairIds)) if err := postgres.Find(comm.TableCallTranslatePair, &srcPairs, "id IN ?", req.PairIds); err != nil { writeErr(c, pb.ErrorCode_DBError, err.Error()) return } now := time.Now().UnixMilli() synced := 0 for _, pair := range srcPairs { for _, tgt := range req.TargetRegions { if pair.Region == tgt { continue // 跳过源区域自身 } // 查目标区域是否已有相同语言对 old := &CallTranslatePair{} _ = postgres.FindOne(comm.TableCallTranslatePair, old, "region=? AND src_lang=? AND dst_lang=?", tgt, pair.SrcLang, pair.DstLang) m := &CallTranslatePair{ Id: old.Id, Region: tgt, SrcLang: pair.SrcLang, DstLang: pair.DstLang, Bidir: pair.Bidir, Mode: pair.Mode, AsrSvcId: pair.AsrSvcId, MtSvcId: pair.MtSvcId, TtsSvcId: pair.TtsSvcId, AstSvcId: pair.AstSvcId, Enable: pair.Enable, Updatetime: now, } if old.Id == 0 { m.Createtime = now if err := postgres.Insert(comm.TableCallTranslatePair, m); err == nil { synced++ } } else { m.Createtime = old.Createtime if err := postgres.Save(comm.TableCallTranslatePair, m); err == nil { synced++ } } } } if synced > 0 { for _, tgt := range req.TargetRegions { broadcastConfigChanged(comm.ConfigKindCallTranslate, "update", tgt) } } writeOK(c, gin.H{"synced": synced}) }