125 lines
2.7 KiB
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
|
|
}
|