Files
jx-callback/business/model/dao/dao_job.go
苏尹岚 ad02997ff7 aa
2020-12-02 09:22:27 +08:00

415 lines
12 KiB
Go

package dao
import (
"encoding/json"
"fmt"
"time"
"git.rosy.net.cn/baseapi/utils"
"git.rosy.net.cn/jx-callback/business/jxutils"
"git.rosy.net.cn/jx-callback/business/model"
)
const (
sortTypeDistance = 1 //距离
sortTypeAvgPrice = 4 //奖励高低
)
func GetJobCategories(db *DaoDB, name string) (jobCategories []*model.JobCategory, err error) {
sql := `
SELECT * FROM job_category WHERE deleted_at = ?
`
sqlParams := []interface{}{utils.DefaultTimeValue}
if name != "" {
sql += ` AND name LIKE ?`
sqlParams = append(sqlParams, "%"+name+"%")
}
err = GetRows(db, &jobCategories, sql, sqlParams)
return jobCategories, err
}
type GetJobsResult struct {
model.Job
CategoryName string `json:"categoryName"` //分类名
IndexImg string `json:"indexImg"` //任务封面
Distance float64 `json:"distance"` //距用户距离
}
func GetJobSteps(db *DaoDB, jobID int) (jobSteps []*model.JobStep, err error) {
sql := `
SELECT *
FROM job_step
WHERE job_id = ?
AND deleted_at = ?
`
sqlParams := []interface{}{jobID, utils.DefaultTimeValue}
err = GetRows(db, &jobSteps, sql, sqlParams)
return jobSteps, err
}
func GetJobImgs(db *DaoDB, jobID int) (jobImgs []*model.JobImg, err error) {
sql := `
SELECT *
FROM job_img
WHERE job_id = ?
`
sqlParams := []interface{}{jobID}
err = GetRows(db, &jobImgs, sql, sqlParams)
return jobImgs, err
}
func GetJobs(db *DaoDB, userIDs []string, categoryIDs, statuss, vendorIDs, types []int, includeStep bool, fromTime, toTime time.Time, lng, lat float64, keyword string, sortType, pageSize, offset int) (pagedInfo *model.PagedInfo, err error) {
var (
jobs []*GetJobsResult
distanceFlag bool
sqlParams = []interface{}{}
)
if lng != 0 && lat != 0 && (sortType == sortTypeDistance || sortType == -sortTypeDistance) {
distanceFlag = true
}
sql := `
SELECT SQL_CALC_FOUND_ROWS a.*, b.name
`
if distanceFlag {
sql += `, ROUND(POWER((POWER(a.lng/100000-?,2))+(POWER(a.lat/100000-?,2)),1/2)) distance`
sqlParams = append(sqlParams, lng, lat)
}
sql += ` FROM job a
JOIN job_category b ON b.id = a.job_category_id AND b.deleted_at = ?
WHERE a.deleted_at = ?
`
sqlParams = append(sqlParams, utils.DefaultTimeValue, utils.DefaultTimeValue)
if len(userIDs) > 0 {
sql += ` AND a.user_id IN (` + GenQuestionMarks(len(userIDs)) + `)`
sqlParams = append(sqlParams, userIDs)
}
if len(categoryIDs) > 0 {
sql += ` AND a.job_category_id IN (` + GenQuestionMarks(len(categoryIDs)) + `)`
sqlParams = append(sqlParams, categoryIDs)
}
if len(statuss) > 0 {
sql += ` AND a.status IN (` + GenQuestionMarks(len(statuss)) + `)`
sqlParams = append(sqlParams, statuss)
}
if len(vendorIDs) > 0 {
sql += ` AND a.vendor_id IN (` + GenQuestionMarks(len(vendorIDs)) + `)`
sqlParams = append(sqlParams, vendorIDs)
}
if len(types) > 0 {
sql += ` AND a.type IN (` + GenQuestionMarks(len(types)) + `)`
sqlParams = append(sqlParams, types)
}
if fromTime != utils.ZeroTimeValue {
sql += ` AND a.created_at >= ?`
sqlParams = append(sqlParams, fromTime)
}
if toTime != utils.ZeroTimeValue {
sql += ` AND a.created_at <= ?`
sqlParams = append(sqlParams, toTime)
}
if keyword != "" {
sql += ` AND (a.title LIKE ? OR a.content LIKE ? OR a.address LIKE ? OR b.name LIKE ?)`
sqlParams = append(sqlParams, "%"+keyword+"%", "%"+keyword+"%", "%"+keyword+"%", "%"+keyword+"%")
}
if sortType != 0 {
if sortType == sortTypeDistance {
sql += ` ORDER BY distance`
} else if sortType == -sortTypeDistance {
sql += ` ORDER BY distance DESC`
} else if sortType == sortTypeAvgPrice {
sql += ` ORDER BY a.avg_price`
} else if sortType == -sortTypeAvgPrice {
sql += ` ORDER BY a.avg_price DESC`
}
}
sql += " LIMIT ? OFFSET ?"
pageSize = jxutils.FormalizePageSize(pageSize)
sqlParams = append(sqlParams, pageSize, offset)
Begin(db)
defer Commit(db)
if err = GetRows(db, &jobs, sql, sqlParams...); err == nil {
pagedInfo = &model.PagedInfo{
TotalCount: GetLastTotalRowCount(db),
// Data: jobs,
}
for _, v := range jobs {
if includeStep {
if jobSteps, err := GetJobSteps(db, v.ID); err == nil && len(jobSteps) > 0 {
v.JobSteps = jobSteps
}
}
var (
distance float64
)
if jobImgs, err := GetJobImgs(db, v.ID); err == nil && len(jobImgs) > 0 {
v.JobImgs = jobImgs
v.IndexImg = jobImgs[0].Img
}
if v.Lng != 0 && v.Lat != 0 {
distance = jxutils.EarthDistance(lng, lat, jxutils.IntCoordinate2Standard(v.Lng), jxutils.IntCoordinate2Standard(v.Lat))
} else {
distance = 0
}
v.Distance = distance
}
pagedInfo.Data = jobs
}
return pagedInfo, err
}
func GetJob(db *DaoDB, userIDs []string, categoryIDs, statuss, types []int, fromTime, toTime time.Time, includeStep bool) (job *model.Job, err error) {
jobs, err := GetJobsNoPage(db, userIDs, categoryIDs, statuss, types, fromTime, toTime, includeStep)
if err != nil {
return job, err
}
if len(jobs) == 0 {
return job, fmt.Errorf("未查询到对应的京东快递任务!")
}
if data, err := json.Marshal(jobs[0]); err == nil {
json.Unmarshal(data, &job)
}
return job, err
}
func GetJobsNoPage(db *DaoDB, userIDs []string, categoryIDs, statuss, types []int, fromTime, toTime time.Time, includeStep bool) (jobs []*GetJobsResult, err error) {
sql := `
SELECT a.*, b.name
FROM job a
JOIN job_category b ON b.id = a.job_category_id AND b.deleted_at = ?
WHERE 1 = 1
`
sqlParams := []interface{}{utils.DefaultTimeValue}
if len(userIDs) > 0 {
sql += ` AND a.user_id IN (` + GenQuestionMarks(len(userIDs)) + `)`
sqlParams = append(sqlParams, userIDs)
}
if len(categoryIDs) > 0 {
sql += ` AND a.job_category_id IN (` + GenQuestionMarks(len(categoryIDs)) + `)`
sqlParams = append(sqlParams, categoryIDs)
}
if len(statuss) > 0 {
sql += ` AND a.status IN (` + GenQuestionMarks(len(statuss)) + `)`
sqlParams = append(sqlParams, statuss)
}
if len(types) > 0 {
sql += ` AND a.type IN (` + GenQuestionMarks(len(types)) + `)`
sqlParams = append(sqlParams, types)
}
if fromTime != utils.ZeroTimeValue {
sql += ` AND a.created_at >= ?`
sqlParams = append(sqlParams, fromTime)
}
if toTime != utils.ZeroTimeValue {
sql += ` AND a.created_at <= ?`
sqlParams = append(sqlParams, toTime)
}
err = GetRows(db, &jobs, sql, sqlParams...)
for _, v := range jobs {
if includeStep {
if jobSteps, err := GetJobSteps(db, v.ID); err == nil && len(jobSteps) > 0 {
v.JobSteps = jobSteps
}
}
if jobImgs, err := GetJobImgs(db, v.ID); err == nil && len(jobImgs) > 0 {
v.JobImgs = jobImgs
}
}
return jobs, err
}
func GetJobDetail(db *DaoDB, jobID int) (job *GetJobsResult, err error) {
sql := `
SELECT a.*, b.name
FROM job a
JOIN job_category b ON b.id = a.job_category_id AND b.deleted_at = ?
WHERE 1 = 1
`
sqlParams := []interface{}{utils.DefaultTimeValue}
if jobID != 0 {
sql += ` AND a.id = ?`
sqlParams = append(sqlParams, jobID)
}
err = GetRow(db, &job, sql, sqlParams...)
if job != nil {
if jobSteps, err := GetJobSteps(db, job.ID); err == nil && len(jobSteps) > 0 {
job.JobSteps = jobSteps
}
if jobImgs, err := GetJobImgs(db, job.ID); err == nil && len(jobImgs) > 0 {
job.JobImgs = jobImgs
}
} else {
return job, fmt.Errorf("未查到到该任务!")
}
return job, err
}
func GetJobOrdersNoPage(db *DaoDB, jobID int, jobOrderID int64, userID string, statusCompareStr string, fromTime, toTime time.Time, statuss []int) (jobOrders []*model.JobOrder, err error) {
sql := `
SELECT a.*
FROM job_order a
WHERE 1 = 1
`
sqlParams := []interface{}{}
if jobID != 0 {
sql += ` AND a.job_id = ?`
sqlParams = append(sqlParams, jobID)
}
if jobOrderID != 0 {
sql += ` AND a.job_order_id = ?`
sqlParams = append(sqlParams, jobOrderID)
}
if userID != "" {
sql += ` AND a.user_id = ?`
sqlParams = append(sqlParams, userID)
}
if statusCompareStr != "" {
sql += ` AND a.status ` + statusCompareStr
}
if fromTime != utils.ZeroTimeValue {
sql += ` AND a.created_at >= ?`
sqlParams = append(sqlParams, fromTime)
}
if toTime != utils.ZeroTimeValue {
sql += ` AND a.created_at <= ?`
sqlParams = append(sqlParams, toTime)
}
if len(statuss) > 0 {
sql += ` AND a.status IN (` + GenQuestionMarks(len(statuss)) + `)`
sqlParams = append(sqlParams, statuss)
}
err = GetRows(db, &jobOrders, sql, sqlParams)
return jobOrders, err
}
type GetJobOrdersResult struct {
model.JobOrder
JobLimitAt int `json:"jobLimitAt"` //任务限时完成小时数
AuditLimitAt int `json:"auditLimitAt"` //限时审核小时数
JobOrderFinishAt time.Time `json:"jobOrderFinishAt"`
JobOrderAuditFinishAt time.Time `json:"jobOrderAuditFinishAt"`
JobIndexImg string `json:"jobIndexImg"`
VendorID int `orm:"column(vendor_id)" json:"vendorID"` //推广平台
AvgPrice int `json:"avgPrice"` //单个任务金额
Title string `orm:"size(255)" json:"title"` //任务标题
JobContent string `orm:"size(500)" json:"jobContent"`
}
func GetJobOrders(db *DaoDB, jobID int, jobOrderID int64, userID, jobUserID string, statusCompareStr string, fromTime, toTime time.Time, statuss []int, pageSize, offset int) (pagedInfo *model.PagedInfo, err error) {
var jobOrders []*GetJobOrdersResult
sql := `
SELECT SQL_CALC_FOUND_ROWS a.*, b.job_limit_at, b.vendor_id, b.avg_price, b.title, b.content job_content, b.audit_limit_at
FROM job_order a
JOIN job b ON a.job_id = b.id
WHERE 1 = 1
`
sqlParams := []interface{}{}
if jobID != 0 {
sql += ` AND a.job_id = ?`
sqlParams = append(sqlParams, jobID)
}
if jobOrderID != 0 {
sql += ` AND a.job_order_id = ?`
sqlParams = append(sqlParams, jobOrderID)
}
if userID != "" {
sql += ` AND a.user_id = ?`
sqlParams = append(sqlParams, userID)
}
if jobUserID != "" {
sql += ` AND b.user_id = ?`
sqlParams = append(sqlParams, jobUserID)
}
if statusCompareStr != "" {
sql += ` AND a.status ` + statusCompareStr
}
if fromTime != utils.ZeroTimeValue {
sql += ` AND a.created_at >= ?`
sqlParams = append(sqlParams, fromTime)
}
if toTime != utils.ZeroTimeValue {
sql += ` AND a.created_at <= ?`
sqlParams = append(sqlParams, toTime)
}
if len(statuss) > 0 {
sql += ` AND a.status IN (` + GenQuestionMarks(len(statuss)) + `)`
sqlParams = append(sqlParams, statuss)
}
sql += " LIMIT ? OFFSET ?"
pageSize = jxutils.FormalizePageSize(pageSize)
sqlParams = append(sqlParams, pageSize, offset)
Begin(db)
defer Commit(db)
if err = GetRows(db, &jobOrders, sql, sqlParams...); err == nil {
pagedInfo = &model.PagedInfo{
TotalCount: GetLastTotalRowCount(db),
// Data: jobOrders,
}
for _, v := range jobOrders {
if jobImgs, err := GetJobImgs(db, v.JobID); err == nil && len(jobImgs) > 0 {
v.JobIndexImg = jobImgs[0].Img
}
v.JobOrderFinishAt = v.JobOrder.CreatedAt.Add(time.Duration(v.JobLimitAt) * time.Hour)
v.JobOrderAuditFinishAt = v.JobOrder.SubmitAuditAt.Add(time.Duration(v.AuditLimitAt) * time.Hour)
}
pagedInfo.Data = jobOrders
}
return pagedInfo, err
}
func GetMtMember(db *DaoDB) (mtMember *model.MtMember, err error) {
sql := `
SELECT *
FROM mt_member
WHERE deleted_at = ?
LIMIT 1
`
sqlParams := []interface{}{utils.DefaultTimeValue}
err = GetRow(db, &mtMember, sql, sqlParams)
return mtMember, err
}
func GetJobTimers(db *DaoDB, status int) (jobTimers []*model.JobTimer, err error) {
sql := `
SELECT *
FROM job_timer
WHERE 1 = 1
`
sqlParams := []interface{}{}
if status != -1 {
sql += ` AND status = ?`
sqlParams = append(sqlParams, status)
}
err = GetRows(db, &jobTimers, sql, sqlParams)
return jobTimers, err
}
func GetMtMembers(db *DaoDB) (num int, err error) {
var mtMembers []*model.MtMember
sql := `
SELECT * FROM mt_member WHERE deleted_at = ?
`
sqlParams := []interface{}{utils.DefaultTimeValue}
err = GetRows(db, &mtMembers, sql, sqlParams)
num = len(mtMembers)
return num, err
}
func GetUserSearch(db *DaoDB, userID, keyword string) (userSearchs []*model.UserSearch, err error) {
sql := `
SELECT *
FROM user_search
WHERE 1 = 1
`
sqlParams := []interface{}{}
if userID != "" {
sql += ` AND user_id = ?`
sqlParams = append(sqlParams, userID)
}
if keyword != "" {
sql += ` AND key = ?`
sqlParams = append(sqlParams, keyword)
}
err = GetRows(db, &userSearchs, sql, sqlParams)
return userSearchs, err
}