yintai2/app/common/dao/job.go

125 lines
2.7 KiB
Go

package dao
import (
"errors"
"fmt"
"yintai-api/app/common/model"
"github.com/spf13/cast"
"gorm.io/gorm"
)
type Job struct {
db *gorm.DB
}
func NewJob(db ...*gorm.DB) *Job {
return &Job{db: getDB(db...)}
}
func (r *Job) TableName() string {
return "yt_job"
}
func (r *Job) Create(m *model.Job) error {
return r.db.Table(r.TableName()).Create(m).Error
}
func (r *Job) Update(m *model.Job) error {
return r.db.Table(r.TableName()).Save(m).Error
}
func (r *Job) Delete(id int64) error {
return r.db.Table(r.TableName()).Where("id = ?", id).Delete(&Job{}).Error
}
func (r *Job) Get(id int64) (*model.Job, error) {
var res model.Job
if err := r.db.Table(r.TableName()).Where("id = ?", id).First(&res).Error; err != nil {
if errors.Is(err, gorm.ErrRecordNotFound) {
return nil, nil
}
return nil, err
}
return &res, nil
}
func (r *Job) Exists(id int64) (bool, error) {
var count int64
if err := r.db.Table(r.TableName()).Where("id = ?", id).Count(&count).Error; err != nil {
return false, err
}
return count > 0, nil
}
func (r *Job) List(lang, city, title, desc, reqs, jobType, jobArea, jobUnit string, page, size int, sort string) ([]*model.JobPage, int64, error) {
var list []*model.JobPage
var count int64
tx := r.db.Table(r.TableName() + " AS p ")
tx = tx.Joins(fmt.Sprintf(" LEFT JOIN %s t ON p.id = t.job_id ", NewJobTranslations().TableName()))
if lang != "" {
tx = tx.Where("t.lang = ?", lang)
}
if city != "" {
tx = tx.Where("p.city = ?", city)
}
if title != "" {
tx = tx.Where("t.name LIKE ?", "%"+title+"%")
}
if desc != "" {
tx = tx.Where("t.description LIKE ?", "%"+desc+"%")
}
if reqs != "" {
tx = tx.Where("t.requirement LIKE ?", "%"+reqs+"%")
}
if v := cast.ToInt64(jobType); v != 0 {
tx = tx.Where("p.job_type = ?", v)
}
if v := cast.ToInt64(jobArea); v != 0 {
tx = tx.Where("p.job_area = ?", v)
}
if v := cast.ToInt64(jobUnit); v != 0 {
tx = tx.Where("p.job_unit = ?", v)
}
if err := tx.Count(&count).Error; err != nil {
return nil, 0, err
}
if sort == "" {
tx = tx.Order(sort)
} else {
tx = tx.Order(sort)
}
if err := tx.Offset((page - 1) * size).Limit(size).Select("p.*,t.*").Find(&list).Error; err != nil {
return nil, 0, err
}
return list, count, nil
}
func (r *Job) GetLang(id int64, lang string) (*model.JobPage, error) {
var res *model.JobPage
tx := r.db.Table(r.TableName() + " AS p ")
tx = tx.Joins(fmt.Sprintf(" LEFT JOIN %s t ON p.id = t.job_id ", NewJobTranslations().TableName()))
tx = tx.Where("t.lang = ?", lang)
tx = tx.Where("p.id = ?", id)
if err := tx.Select("p.*,t.*").First(&res).Error; err != nil {
if errors.Is(err, gorm.ErrRecordNotFound) {
return nil, nil
}
return nil, err
}
return res, nil
}