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.
209 lines
7.2 KiB
209 lines
7.2 KiB
package echomeet
|
|
|
|
import (
|
|
"yunyan/comm"
|
|
"yunyan/lego/core"
|
|
"yunyan/lego/core/cbase"
|
|
"yunyan/lego/sys/mysql"
|
|
"yunyan/lego/sys/postgres"
|
|
"yunyan/pb"
|
|
"fmt"
|
|
"path/filepath"
|
|
"runtime"
|
|
|
|
"gorm.io/gorm/clause"
|
|
)
|
|
|
|
// 代理模型
|
|
type modelComp struct {
|
|
cbase.ModuleCompBase
|
|
module *Echomeet
|
|
}
|
|
|
|
// 组件初始化接口
|
|
func (this *modelComp) Init(service core.IService, module core.IModule, comp core.IModuleComp, opt core.IModuleOptions) (err error) {
|
|
this.ModuleCompBase.Init(service, module, comp, opt)
|
|
this.module = module.(*Echomeet)
|
|
err = mysql.CreateTable(comm.TableEchomeetTemplate, &pb.DBEchoMeetTemplate{})
|
|
err = mysql.CreateTable(comm.TableEchomeetRecord, &pb.DBEchoMeetRecord{})
|
|
return
|
|
}
|
|
|
|
func (this *modelComp) getuser(uid string) (user *pb.DBUser, err error) {
|
|
user = &pb.DBUser{}
|
|
err = mysql.FindOne(comm.TableUser, user, "uid=?", uid)
|
|
return
|
|
}
|
|
|
|
func (this *modelComp) updateuser(user *pb.DBUser) (err error) {
|
|
err = mysql.Save(comm.TableUser, user)
|
|
return
|
|
}
|
|
|
|
// d读取模版
|
|
func (this *modelComp) getcommtemplates(language string) (models []*pb.DBEchoMeetTemplate, err error) {
|
|
models = make([]*pb.DBEchoMeetTemplate, 0)
|
|
if language == "" {
|
|
err = postgres.Find(comm.TableEchomeetTemplate, &models, "source = ?", "public")
|
|
} else {
|
|
err = postgres.Find(comm.TableEchomeetTemplate, &models, "source = ? AND language = ?", "public", language)
|
|
}
|
|
return
|
|
}
|
|
|
|
// 读取模版
|
|
func (this *modelComp) gettemplates(uid string, language string) (models []*pb.DBEchoMeetTemplate, err error) {
|
|
models = make([]*pb.DBEchoMeetTemplate, 0)
|
|
if language == "" {
|
|
err = mysql.Find(comm.TableEchomeetTemplate, &models, "source = ?", uid)
|
|
} else {
|
|
err = mysql.Find(comm.TableEchomeetTemplate, &models, "source = ? AND language = ?", uid, language)
|
|
}
|
|
return
|
|
}
|
|
|
|
/*
|
|
根据id读取模版
|
|
id 小于 10000 从设备数据库读取
|
|
id 大于等于 10000 从管理员数据库读取
|
|
*/
|
|
// gettemplateforid 按主键查找模板(用于用户自定义模板)
|
|
func (this *modelComp) gettemplateforid(id uint64) (template *pb.DBEchoMeetTemplate, err error) {
|
|
template = &pb.DBEchoMeetTemplate{}
|
|
err = postgres.FindOne(comm.TableEchomeetTemplate, template, "id=?", id)
|
|
if err == nil {
|
|
return
|
|
}
|
|
err = mysql.FindOne(comm.TableEchomeetTemplate, template, "id=?", id)
|
|
return
|
|
}
|
|
|
|
// resolvetemplate tid 非空则按 tid+language 查找,否则按 templateid 主键查找
|
|
func (this *modelComp) resolvetemplate(tid string, templateid uint64, language string) (template *pb.DBEchoMeetTemplate, err error) {
|
|
if tid != "" {
|
|
return this.gettemplatefortid(tid, language)
|
|
}
|
|
return this.gettemplateforid(templateid)
|
|
}
|
|
|
|
// gettemplatefortid 按 tid + language 查找模板(用于公共模板)
|
|
func (this *modelComp) gettemplatefortid(tid string, language string) (template *pb.DBEchoMeetTemplate, err error) {
|
|
template = &pb.DBEchoMeetTemplate{}
|
|
err = postgres.FindOne(comm.TableEchomeetTemplate, template, "tid=? AND language=?", tid, language)
|
|
if err == nil {
|
|
return
|
|
}
|
|
err = mysql.FindOne(comm.TableEchomeetTemplate, template, "tid=? AND language=?", tid, language)
|
|
return
|
|
}
|
|
|
|
func (this *modelComp) addtemplates(template *pb.DBEchoMeetTemplate) (err error) {
|
|
err = mysql.Insert(comm.TableEchomeetTemplate, template)
|
|
return
|
|
}
|
|
|
|
func (this *modelComp) updatetemplates(template *pb.DBEchoMeetTemplate) (err error) {
|
|
err = mysql.Save(comm.TableEchomeetTemplate, template)
|
|
return
|
|
}
|
|
|
|
func (this *modelComp) deltemplates(id []uint64) (err error) {
|
|
err = mysql.Delete(comm.TableEchomeetTemplate, "id IN ?", id)
|
|
return
|
|
}
|
|
|
|
func (this *modelComp) getrecordsforuid(uid string) (models []*pb.DBEchoMeetRecord, err error) {
|
|
models = make([]*pb.DBEchoMeetRecord, 0)
|
|
err = mysql.Find(comm.TableEchomeetRecord, &models, "uid=?", uid)
|
|
return
|
|
}
|
|
|
|
// 查询用户记录的精简信息(不含 original、translate、summary 大字段)
|
|
func (this *modelComp) getrecordbriefforuid(uid string) (models []*pb.DBEchoMeetRecord, err error) {
|
|
models = make([]*pb.DBEchoMeetRecord, 0)
|
|
err = mysql.Table(comm.TableEchomeetRecord).
|
|
Omit("original", "translate", "summary").
|
|
Where("uid = ?", uid).
|
|
Find(&models).Error
|
|
return
|
|
}
|
|
func (this *modelComp) getrecord(id uint64) (model *pb.DBEchoMeetRecord, err error) {
|
|
model = &pb.DBEchoMeetRecord{}
|
|
err = mysql.FindOne(comm.TableEchomeetRecord, model, "id=?", id)
|
|
return
|
|
}
|
|
func (this *modelComp) getrecordByTaskId(taskId string) (model *pb.DBEchoMeetRecord, err error) {
|
|
model = &pb.DBEchoMeetRecord{}
|
|
err = mysql.FindOne(comm.TableEchomeetRecord, model, "taskid=?", taskId)
|
|
return
|
|
}
|
|
func (this *modelComp) getrecords(ids []uint64) (models []*pb.DBEchoMeetRecord, err error) {
|
|
models = make([]*pb.DBEchoMeetRecord, 0)
|
|
err = mysql.Find(comm.TableEchomeetRecord, &models, "id IN ?", ids)
|
|
return
|
|
}
|
|
func (this *modelComp) addrecord(model *pb.DBEchoMeetRecord) (err error) {
|
|
err = mysql.Insert(comm.TableEchomeetRecord, model)
|
|
return
|
|
}
|
|
func (this *modelComp) saverecords(record []*pb.DBEchoMeetRecord) (err error) {
|
|
caller := saveCaller()
|
|
for _, r := range record {
|
|
this.module.Infof("saverecord(batch) [from %s] id:%d state:%s taskid:%q logid:%q",
|
|
caller, r.Id, r.State.String(), r.Taskid, r.Logid)
|
|
}
|
|
err = mysql.Save(comm.TableEchomeetRecord, record)
|
|
if err != nil {
|
|
this.module.Errorf("saverecord(batch) [from %s] 失败 err:%v", caller, err)
|
|
}
|
|
return
|
|
}
|
|
func (this *modelComp) saverecord(record *pb.DBEchoMeetRecord) (err error) {
|
|
caller := saveCaller()
|
|
// 重点观测 taskid:保存时打印调用方+本次写入的 taskid/logid/state。
|
|
// taskid 由「有」变「空」时,对照这行的调用方即可定位是哪段代码覆盖掉的。
|
|
this.module.Infof("saverecord [from %s] id:%d state:%s taskid:%q logid:%q seconds:%d size:%d",
|
|
caller, record.Id, record.State.String(), record.Taskid, record.Logid, record.Seconds, record.Size)
|
|
if record.Taskid == "" && (record.State == pb.DBEchoMeetRecordState_Transcribing ||
|
|
record.State == pb.DBEchoMeetRecordState_AwaitSummarizing ||
|
|
record.State == pb.DBEchoMeetRecordState_Summarizing) {
|
|
this.module.Warnf("saverecord [from %s] id:%d 异常:state=%s 却写入空 taskid(疑似被覆盖)",
|
|
caller, record.Id, record.State.String())
|
|
}
|
|
err = mysql.Save(comm.TableEchomeetRecord, record)
|
|
if err != nil {
|
|
this.module.Errorf("saverecord [from %s] id:%d 失败 err:%v", caller, record.Id, err)
|
|
}
|
|
return
|
|
}
|
|
|
|
// saveCaller 返回调用 saverecord/saverecords 的上一层代码位置(file:line),
|
|
// 用于在日志里标明本次写库是哪条业务路径触发的。
|
|
func saveCaller() string {
|
|
if _, file, line, ok := runtime.Caller(2); ok {
|
|
return fmt.Sprintf("%s:%d", filepath.Base(file), line)
|
|
}
|
|
return "?"
|
|
}
|
|
func (this *modelComp) delrecords(ids []uint64) (err error) {
|
|
err = mysql.Delete(comm.TableEchomeetRecord, "id IN ?", ids)
|
|
return
|
|
}
|
|
|
|
func (this *modelComp) getStatistics(uid string) (statistics *pb.DBUserStatistics, err error) {
|
|
statistics = &pb.DBUserStatistics{Uid: uid}
|
|
mysql.FindOne(comm.TableUserStatistics, statistics, "uid=?", uid)
|
|
return
|
|
}
|
|
|
|
func (this *modelComp) updateStatistics(statistics *pb.DBUserStatistics) (err error) {
|
|
err = mysql.Table(comm.TableUserStatistics).
|
|
Clauses(clause.OnConflict{UpdateAll: true}).
|
|
Create(statistics).Error
|
|
return
|
|
}
|
|
|
|
func (this *modelComp) addUseLog(log *pb.DBUserUseLog) (err error) {
|
|
err = mysql.Insert(comm.TableUserUseLog, log)
|
|
return
|
|
}
|
|
|