hepa-calc-api/api/dao/Question.go
2024-09-19 17:00:58 +08:00

302 lines
7.8 KiB
Go

package dao
import (
"errors"
"fmt"
"gorm.io/gorm"
"gorm.io/gorm/clause"
"hepa-calc-api/api/model"
"hepa-calc-api/api/requests"
"hepa-calc-api/global"
)
type QuestionDao struct {
}
// GetQuestionById 获取数据-id
func (r *QuestionDao) GetQuestionById(QuestionId int64) (m *model.Question, err error) {
err = global.Db.First(&m, QuestionId).Error
if err != nil {
return nil, err
}
return m, nil
}
// GetQuestionPreloadById 获取数据-加载全部关联-id
func (r *QuestionDao) GetQuestionPreloadById(QuestionId int64) (m *model.Question, err error) {
err = global.Db.Preload(clause.Associations).First(&m, QuestionId).Error
if err != nil {
return nil, err
}
return m, nil
}
// DeleteQuestion 删除
func (r *QuestionDao) DeleteQuestion(tx *gorm.DB, maps interface{}) error {
err := tx.Where(maps).Delete(&model.Question{}).Error
if err != nil {
return err
}
return nil
}
// DeleteQuestionById 删除-id
func (r *QuestionDao) DeleteQuestionById(tx *gorm.DB, QuestionId int64) error {
if err := tx.Delete(&model.Question{}, QuestionId).Error; err != nil {
return err
}
return nil
}
// EditQuestion 修改
func (r *QuestionDao) EditQuestion(tx *gorm.DB, maps interface{}, data interface{}) error {
err := tx.Model(&model.Question{}).Where(maps).Updates(data).Error
if err != nil {
return err
}
return nil
}
// EditQuestionById 修改-id
func (r *QuestionDao) EditQuestionById(tx *gorm.DB, QuestionId int64, data interface{}) error {
err := tx.Model(&model.Question{}).Where("question_id = ?", QuestionId).Updates(data).Error
if err != nil {
return err
}
return nil
}
// GetQuestionList 获取列表
func (r *QuestionDao) GetQuestionList(maps interface{}) (m []*model.Question, err error) {
err = global.Db.Where(maps).Find(&m).Error
if err != nil {
return nil, err
}
return m, nil
}
// GetQuestionCount 获取数量
func (r *QuestionDao) GetQuestionCount(maps interface{}) (total int64, err error) {
err = global.Db.Model(&model.Question{}).Where(maps).Count(&total).Error
if err != nil {
return 0, err
}
return total, nil
}
// GetQuestionListRand 获取列表-随机
func (r *QuestionDao) GetQuestionListRand(maps interface{}, limit int) (m []*model.Question, err error) {
err = global.Db.Where(maps).Order("rand()").Limit(limit).Find(&m).Error
if err != nil {
return nil, err
}
return m, nil
}
// AddQuestion 新增
func (r *QuestionDao) AddQuestion(tx *gorm.DB, model *model.Question) (*model.Question, error) {
if err := tx.Create(model).Error; err != nil {
return nil, err
}
return model, nil
}
// GetQuestion 获取
func (r *QuestionDao) GetQuestion(maps interface{}) (m *model.Question, err error) {
err = global.Db.Where(maps).First(&m).Error
if err != nil {
return nil, err
}
return m, nil
}
// GetQuestionOrderLimitList 获取列表-排序、限制数量
func (r *QuestionDao) GetQuestionOrderLimitList(maps interface{}, orderField string, limit int) (m []*model.Question, err error) {
err = global.Db.Where(maps).Order(orderField).Limit(limit).Find(&m).Error
if err != nil {
return nil, err
}
return m, nil
}
// GetQuestionPageSearch 获取题目列表-分页
func (r *QuestionDao) GetQuestionPageSearch(req requests.GetQuestionPage, page, pageSize int) (m []*model.Question, total int64, err error) {
var totalRecords int64
// 构建查询条件
query := global.Db.Model(&model.Question{})
// 是否隐藏
query = query.Where("is_hide = ?", 0)
// 问题状态
query = query.Where("question_status = ?", 1)
// 主键id
if req.QuestionId != "" {
query = query.Where("question_id = ?", req.QuestionId)
}
// 标题
if req.QuestionTitle != "" {
query = query.Where("question_title LIKE ?", "%"+req.QuestionTitle+"%")
}
// 副标题
if req.QuestionSubtitle != "" {
query = query.Where("question_subtitle LIKE ?", "%"+req.QuestionSubtitle+"%")
}
// 唯一标识
if req.QuestionIden != "" {
query = query.Where("question_iden = ?", req.QuestionIden)
}
// 问题状态
if req.QuestionStatus != nil {
query = query.Where("question_status = ?", req.QuestionStatus)
}
// 是否推荐
if req.IsRecommend != nil {
query = query.Where("is_recommend = ?", req.IsRecommend)
}
// 问题介绍
if req.QuestionBrief != "" {
query = query.Where("question_brief LIKE ?", "%"+req.QuestionBrief+"%")
}
// 问题解释/科普
if req.QuestionExplain != "" {
query = query.Where("question_explain LIKE ?", "%"+req.QuestionExplain+"%")
}
// 分类标识
if req.ClassId != "" {
baseClassQuery := global.Db.Model(&model.BaseClass{}).
Select("class_id").
Where("class_id = ?", req.ClassId)
questionClassQuery := global.Db.Model(&model.QuestionClass{}).
Select("question_id").
Where("class_id IN (?)", baseClassQuery)
query = query.Where("question_id IN (?)", questionClassQuery)
}
// 搜索关键字
if req.Keyword != "" {
fmt.Println(111)
keyword := "%" + req.Keyword + "%" //
// 标题
orQuery := global.Db.Model(&model.Question{}).Or("question_title LIKE ?", keyword)
// 副标题
orQuery = orQuery.Or("question_subtitle LIKE ?", keyword)
// 分类标识
baseClassSubQuery := global.Db.Model(&model.BaseClass{}).
Select("class_id").
Where("class_name LIKE ?", keyword)
questionClassSubQuery := global.Db.Model(&model.QuestionClass{}).
Select("question_id").
Where(gorm.Expr("class_id IN (?)", baseClassSubQuery))
orQuery = orQuery.Or(gorm.Expr("question_id IN (?)", questionClassSubQuery))
// 执行组建
query = query.Where(orQuery)
}
// 排序
if req.Order != nil {
// 点击次数(点击进入详情页的人次)
if req.Order.ClickCount != "" {
if req.Order.ClickCount != "desc" && req.Order.ClickCount != "asc" {
return nil, 0, errors.New("排序字段错误")
}
query = query.Order("click_count " + req.Order.ClickCount)
}
// 提交次数(提交个人信息进行了算算的人次)
if req.Order.SubmitCount != "" {
if req.Order.SubmitCount != "desc" && req.Order.SubmitCount != "asc" {
return nil, 0, errors.New("排序字段错误")
}
query = query.Order("submit_count " + req.Order.SubmitCount)
}
// 支付次数(查看报告的人次)
if req.Order.PayCount != "" {
if req.Order.PayCount != "desc" && req.Order.PayCount != "asc" {
return nil, 0, errors.New("排序字段错误")
}
query = query.Order("pay_count " + req.Order.PayCount)
}
// 价格(原价)
if req.Order.Price != "" {
if req.Order.Price != "desc" && req.Order.Price != "asc" {
return nil, 0, errors.New("排序字段错误")
}
query = query.Order("price " + req.Order.Price)
}
// 优惠价格
if req.Order.DiscountPrice != "" {
if req.Order.DiscountPrice != "desc" && req.Order.DiscountPrice != "asc" {
return nil, 0, errors.New("排序字段错误")
}
query = query.Order("discount_price " + req.Order.DiscountPrice)
}
if req.Order.UpdatedAt != "" {
if req.Order.UpdatedAt != "desc" && req.Order.UpdatedAt != "asc" {
return nil, 0, errors.New("排序字段错误")
}
query = query.Order("updated_at " + req.Order.UpdatedAt)
}
}
// 排序
query = query.Order("created_at desc")
// 查询总数量
if err := query.Count(&totalRecords).Error; err != nil {
return nil, 0, err
}
err = query.Scopes(model.Paginate(page, pageSize)).Find(&m).Error
if err != nil {
return nil, 0, err
}
return m, totalRecords, nil
}
// Inc 自增
func (r *QuestionDao) Inc(tx *gorm.DB, questionId int64, field string, numeral int) error {
err := tx.Model(&model.Question{}).Where("question_id = ?", questionId).UpdateColumn(field, gorm.Expr(field+" + ?", numeral)).Error
if err != nil {
return err
}
return nil
}
// Dec 自减
func (r *QuestionDao) Dec(tx *gorm.DB, questionId int64, field string, numeral int) error {
err := tx.Model(&model.Question{}).Where("question_id = ?", questionId).UpdateColumn(field, gorm.Expr(field+" - ?", numeral)).Error
if err != nil {
return err
}
return nil
}