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