288 lines
5.7 KiB
Go
288 lines
5.7 KiB
Go
package service
|
|
|
|
import (
|
|
"slices"
|
|
"strings"
|
|
"time"
|
|
"yintai-api/app/admin/request"
|
|
"yintai-api/app/common/consts"
|
|
"yintai-api/app/common/dao"
|
|
err2 "yintai-api/app/common/err"
|
|
"yintai-api/app/common/model"
|
|
"yintai-api/base/global"
|
|
|
|
"github.com/spf13/cast"
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
type Job struct{}
|
|
|
|
func (r *Job) Create(req request.JobCreate) int64 {
|
|
m := new(model.Job)
|
|
m.RecruitCount = cast.ToInt64(req.RecruitCount)
|
|
m.City = req.City
|
|
m.JobType = cast.ToInt64(req.JobType)
|
|
m.JobArea = cast.ToInt64(req.JobArea)
|
|
m.JobUnit = cast.ToInt64(req.JobUnit)
|
|
m.CreateTime = time.Now().Unix()
|
|
|
|
ms := make([]*model.JobTranslations, 0)
|
|
for lang, trans := range req.Translations {
|
|
lang = strings.ToUpper(lang)
|
|
if !slices.Contains(consts.LangSupport, lang) {
|
|
continue
|
|
}
|
|
|
|
temp := &model.JobTranslations{
|
|
Lang: lang,
|
|
Name: trans.Name,
|
|
Description: trans.Desc,
|
|
Requirement: trans.Requirement,
|
|
ContractInfo: trans.ContractInfo,
|
|
}
|
|
ms = append(ms, temp)
|
|
}
|
|
|
|
err := global.GetDB().Transaction(func(tx *gorm.DB) error {
|
|
if err := dao.NewJob(tx).Create(m); err != nil {
|
|
return err
|
|
}
|
|
|
|
for _, trans := range ms {
|
|
trans.JobID = m.ID
|
|
if err := dao.NewJobTranslations(tx).Create(trans); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
|
|
if err := BizCateCreate(tx, m.ID, cast.ToInt64(req.JobType), model.CateTypeJobType); err != nil {
|
|
return err
|
|
}
|
|
|
|
if err := BizCateCreate(tx, m.ID, cast.ToInt64(req.JobArea), model.CateTypeJobArea); err != nil {
|
|
return err
|
|
}
|
|
|
|
if err := BizCateCreate(tx, m.ID, cast.ToInt64(req.JobUnit), model.CateTypeJobUnit); err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
})
|
|
|
|
if err != nil {
|
|
err2.DbErr(err)
|
|
}
|
|
|
|
return m.ID
|
|
}
|
|
|
|
func (r *Job) Update(req request.JobUpdate) {
|
|
m, err := dao.NewJob().Get(cast.ToInt64(req.ID))
|
|
if err != nil {
|
|
err2.DbErr(err)
|
|
}
|
|
|
|
if m == nil {
|
|
err2.NotEsxErr()
|
|
return
|
|
}
|
|
|
|
if cast.ToInt64(req.RecruitCount) != 0 {
|
|
m.RecruitCount = cast.ToInt64(req.RecruitCount)
|
|
}
|
|
|
|
if req.City != "" {
|
|
m.City = req.City
|
|
}
|
|
m.UpdateTime = time.Now().Unix()
|
|
|
|
ms := make([]*model.JobTranslations, 0)
|
|
for lang, trans := range req.Translations {
|
|
lang = strings.ToUpper(lang)
|
|
if !slices.Contains(consts.LangSupport, lang) {
|
|
continue
|
|
}
|
|
|
|
t := new(model.JobTranslations)
|
|
if t, err = dao.NewJobTranslations().GetByMaster(m.ID, lang); err != nil {
|
|
err2.DbErr(err)
|
|
}
|
|
|
|
if trans.Name != "" {
|
|
t.Name = trans.Name
|
|
}
|
|
|
|
if trans.Desc != "" {
|
|
t.Description = trans.Desc
|
|
}
|
|
|
|
if trans.Requirement != "" {
|
|
t.Requirement = trans.Requirement
|
|
}
|
|
|
|
if trans.ContractInfo != "" {
|
|
t.ContractInfo = trans.ContractInfo
|
|
}
|
|
|
|
ms = append(ms, t)
|
|
}
|
|
|
|
err = global.GetDB().Transaction(func(tx *gorm.DB) error {
|
|
for _, trans := range ms {
|
|
if err = dao.NewJobTranslations(tx).Update(trans); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
|
|
if v := cast.ToInt64(req.JobType); v > 0 {
|
|
m.JobType = v
|
|
if err = BizCateUpdate(tx, m.ID, v, model.CateTypeJobType); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
|
|
if v := cast.ToInt64(req.JobArea); v > 0 {
|
|
m.JobArea = v
|
|
if err = BizCateUpdate(tx, m.ID, v, model.CateTypeJobArea); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
|
|
if v := cast.ToInt64(req.JobUnit); v > 0 {
|
|
m.JobUnit = v
|
|
if err = BizCateUpdate(tx, m.ID, v, model.CateTypeJobUnit); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
|
|
if err = dao.NewJob(tx).Update(m); err != nil {
|
|
return err
|
|
}
|
|
return nil
|
|
})
|
|
|
|
if err != nil {
|
|
err2.DbErr(err)
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
func (r *Job) Delete(req request.JobDelete) {
|
|
m, err := dao.NewJob().Get(cast.ToInt64(req.ID))
|
|
if err != nil {
|
|
err2.DbErr(err)
|
|
}
|
|
|
|
if m == nil {
|
|
err2.NotEsxErr()
|
|
return
|
|
}
|
|
|
|
err = global.GetDB().Transaction(func(tx *gorm.DB) error {
|
|
if err = dao.NewJob().Delete(m.ID); err != nil {
|
|
return err
|
|
}
|
|
|
|
if err = dao.NewJobTranslations(tx).Delete(m.ID); err != nil {
|
|
return err
|
|
}
|
|
|
|
if err = dao.NewCategoryRelation(tx).DeleteByCondition(m.ID, model.CateTypeJob); err != nil {
|
|
return err
|
|
}
|
|
|
|
for _, t := range model.CateJobTypes {
|
|
if err = dao.NewCategoryRelation(tx).DeleteByCondition(m.ID, t); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
|
|
return nil
|
|
})
|
|
|
|
if err != nil {
|
|
err2.DbErr(err)
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
func (r *Job) List(req request.JobList) (any, int64) {
|
|
req.Pagination()
|
|
lists, count, err := dao.NewJob().List(req.Lang, req.City, req.Title, req.Desc, req.Reqs, req.JobType, req.JobArea, req.JobUnit, req.Page, req.Size, req.Sort)
|
|
if err != nil {
|
|
err2.DbErr(err)
|
|
}
|
|
res := make([]map[string]any, 0)
|
|
for _, list := range lists {
|
|
temp := list.Format()
|
|
temp["category"] = r.GetCate(list)[list.Lang]
|
|
res = append(res, temp)
|
|
}
|
|
|
|
return res, count
|
|
}
|
|
|
|
func (r *Job) Get(req request.JobDelete) any {
|
|
res := make(map[string]any)
|
|
for _, lang := range consts.LangSupport {
|
|
x, err := dao.NewJob().GetLang(cast.ToInt64(req.ID), lang)
|
|
if err != nil {
|
|
err2.DbErr(err)
|
|
}
|
|
|
|
if x == nil {
|
|
res[lang] = make(map[string]any)
|
|
continue
|
|
}
|
|
|
|
format := x.Format()
|
|
format["category"] = r.GetCate(x)[x.Lang]
|
|
res[lang] = format
|
|
}
|
|
|
|
return res
|
|
}
|
|
|
|
func (r *Job) GetCate(params *model.JobPage) map[string]map[string]any {
|
|
// type:id
|
|
s := map[string]int64{
|
|
model.CateTypeJobType: params.JobType,
|
|
model.CateTypeJobArea: params.JobArea,
|
|
model.CateTypeJobUnit: params.JobUnit,
|
|
}
|
|
|
|
res := make(map[string]map[string]any)
|
|
|
|
for t, id := range s {
|
|
x, err := dao.NewCategory().GetWithType(id, t)
|
|
if err != nil {
|
|
err2.DbErr(err)
|
|
}
|
|
|
|
if x == nil {
|
|
x = new(model.Category)
|
|
}
|
|
|
|
for _, lang := range consts.LangSupport {
|
|
name := ""
|
|
switch lang {
|
|
case consts.LangZH:
|
|
name = x.Name
|
|
case consts.LangEN:
|
|
name = x.NameEn
|
|
}
|
|
if _, ok := res[lang]; !ok {
|
|
res[lang] = make(map[string]any)
|
|
}
|
|
|
|
res[lang][t] = x.ID
|
|
res[lang][t+"_name"] = name
|
|
}
|
|
}
|
|
|
|
return res
|
|
}
|