You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

168 lines
5.1 KiB

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