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 }