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.
 
 
 
 
 
 

155 lines
4.6 KiB

package allhelp
import (
"yunyan/comm"
"yunyan/lego/core"
"yunyan/lego/core/cbase"
"yunyan/lego/sys/mysql"
"yunyan/pb"
"time"
)
type modelComp struct {
cbase.ModuleCompBase
module *Allhelp
}
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.(*Allhelp)
if err = mysql.CreateTable(comm.TableAllhelpTask, &pb.DBTask{}); err != nil {
this.module.Errorln(err)
}
if err = mysql.CreateTable(comm.TableChatSummary, &pb.DBChatSummary{}); err != nil {
this.module.Errorln(err)
}
return
}
// ===== 定时提醒任务 =====
func (this *modelComp) addTask(task *pb.DBTask) error {
now := time.Now().Unix()
task.CreateTime = now
task.UpdateTime = now
task.Status = pb.TaskStatus_TaskStatus_Pending
return mysql.Insert(comm.TableAllhelpTask, task)
}
func (this *modelComp) getTasksByUid(uid string, status int32, page, size int32) ([]*pb.DBTask, int64, error) {
var tasks []*pb.DBTask
var total int64
tx := mysql.Table(comm.TableAllhelpTask).Where("uid = ?", uid)
if status >= 0 {
tx = tx.Where("status = ?", status)
}
if err := tx.Count(&total).Error; err != nil {
return nil, 0, err
}
offset := (page - 1) * size
if offset < 0 {
offset = 0
}
if err := tx.Order("create_time DESC").Offset(int(offset)).Limit(int(size)).Find(&tasks).Error; err != nil {
return nil, 0, err
}
return tasks, total, nil
}
func (this *modelComp) getTaskById(id uint64) (*pb.DBTask, error) {
task := &pb.DBTask{}
err := mysql.FindOne(comm.TableAllhelpTask, task, "id = ?", id)
return task, err
}
func (this *modelComp) updateTaskStatus(id uint64, status pb.TaskStatus) error {
now := time.Now().Unix()
updates := map[string]interface{}{
"status": int32(status),
"update_time": now,
}
if status == pb.TaskStatus_TaskStatus_Completed || status == pb.TaskStatus_TaskStatus_Cancelled {
updates["finish_time"] = now
}
return mysql.Table(comm.TableAllhelpTask).Where("id = ?", id).Updates(updates).Error
}
// ===== 每日聊天总结 =====
// upsertChatSummary 按 (uid, summary_date) 覆盖写入;新记录返回 rec.Id 被赋值
func (this *modelComp) upsertChatSummary(rec *pb.DBChatSummary) error {
now := time.Now().Unix()
rec.UpdateTime = now
existing := &pb.DBChatSummary{}
err := mysql.FindOne(comm.TableChatSummary, existing, "uid = ? AND summary_date = ?", rec.Uid, rec.SummaryDate)
if err == nil && existing.Id > 0 {
rec.Id = existing.Id
rec.CreateTime = existing.CreateTime
return mysql.Table(comm.TableChatSummary).Where("id = ?", existing.Id).Updates(map[string]interface{}{
"chat_content": rec.ChatContent,
"chat_msgs": rec.ChatMsgs,
"summary": rec.Summary,
"state": int32(rec.State),
"error_msg": rec.ErrorMsg,
"update_time": now,
"finish_time": rec.FinishTime,
}).Error
}
rec.CreateTime = now
return mysql.Insert(comm.TableChatSummary, rec)
}
func (this *modelComp) saveChatSummary(rec *pb.DBChatSummary) error {
rec.UpdateTime = time.Now().Unix()
return mysql.Table(comm.TableChatSummary).Where("id = ?", rec.Id).Updates(map[string]interface{}{
"chat_content": rec.ChatContent,
"chat_msgs": rec.ChatMsgs,
"summary": rec.Summary,
"state": int32(rec.State),
"error_msg": rec.ErrorMsg,
"update_time": rec.UpdateTime,
"finish_time": rec.FinishTime,
}).Error
}
func (this *modelComp) getChatSummary(uid, date string) (*pb.DBChatSummary, error) {
rec := &pb.DBChatSummary{}
err := mysql.FindOne(comm.TableChatSummary, rec, "uid = ? AND summary_date = ?", uid, date)
return rec, err
}
func (this *modelComp) getChatSummaryById(id uint64) (*pb.DBChatSummary, error) {
rec := &pb.DBChatSummary{}
err := mysql.FindOne(comm.TableChatSummary, rec, "id = ?", id)
return rec, err
}
func (this *modelComp) listChatSummaries(uid, startDate, endDate string, page, size int32) ([]*pb.DBChatSummary, int64, error) {
var list []*pb.DBChatSummary
var total int64
tx := mysql.Table(comm.TableChatSummary).Where("uid = ?", uid)
if startDate != "" {
tx = tx.Where("summary_date >= ?", startDate)
}
if endDate != "" {
tx = tx.Where("summary_date <= ?", endDate)
}
if err := tx.Count(&total).Error; err != nil {
return nil, 0, err
}
offset := (page - 1) * size
if offset < 0 {
offset = 0
}
if err := tx.Order("summary_date DESC").Offset(int(offset)).Limit(int(size)).Find(&list).Error; err != nil {
return nil, 0, err
}
return list, total, nil
}
func (this *modelComp) delChatSummary(uid string, id uint64) error {
return mysql.Table(comm.TableChatSummary).Where("id = ? AND uid = ?", id, uid).Delete(&pb.DBChatSummary{}).Error
}