diff --git a/business/jxstore/cms/job.go b/business/jxstore/cms/job.go index 10c5558ae..ff3df2065 100644 --- a/business/jxstore/cms/job.go +++ b/business/jxstore/cms/job.go @@ -127,8 +127,8 @@ func PublishJob(ctx *jxcontext.Context, job *model.Job) (err error) { return err } -func GetJobs(ctx *jxcontext.Context, userIDs []string, categoryIDs, statuss []int, includeStep bool, fromTime, toTime string, pageSize, offset int) (pagedInfo *model.PagedInfo, err error) { - return dao.GetJobs(dao.GetDB(), userIDs, categoryIDs, statuss, includeStep, utils.Str2Time(fromTime), utils.Str2Time(toTime), pageSize, offset) +func GetJobs(ctx *jxcontext.Context, userIDs []string, categoryIDs, statuss, vendorIDs []int, includeStep bool, fromTime, toTime string, pageSize, offset int) (pagedInfo *model.PagedInfo, err error) { + return dao.GetJobs(dao.GetDB(), userIDs, categoryIDs, statuss, vendorIDs, includeStep, utils.Str2Time(fromTime), utils.Str2Time(toTime), pageSize, offset) } func AcceptJob(ctx *jxcontext.Context, jobID int) (err error) { @@ -171,7 +171,41 @@ func AcceptJob(ctx *jxcontext.Context, jobID int) (err error) { default: return fmt.Errorf("不支持的任务限次类型!%v", job.LimitCountType) } - + jobOrder := &model.JobOrder{ + JobID: jobID, + JobOrderID: jxutils.GenJobOrderNo(), + UserID: job.UserID, + Status: model.JobOrderStatusAccept, + } + dao.Begin(db) + defer func() { + if r := recover(); r != nil { + dao.Rollback(db) + panic(r) + } + }() + if err = dao.CreateEntity(db, jobOrder); err != nil { + dao.Rollback(db) + } + //用户接受任务,任务剩余次数-1 + job.SurplusCount -= 1 + if _, err = dao.UpdateEntity(db, job, "SurplusCount"); err != nil { + dao.Rollback(db) + } + dao.Commit(db) + //任务限时完成 + utils.AfterFuncWithRecover(time.Hour*time.Duration(job.JobLimitAt), func() { + jobOrders, _ := dao.GetJobOrdersNoPage(db, jobID, jobOrder.JobOrderID, userID, "", utils.ZeroTimeValue, utils.ZeroTimeValue, nil) + if len(jobOrders) == 0 { + return + } + jobOrder := jobOrders[0] + if jobOrder.Status == model.JobOrderStatusCancel { + return + } + jobOrder.Status = model.JobOrderStatusCancel + dao.UpdateEntity(db, jobOrder, "Status") + }) return err } diff --git a/business/jxutils/jxutils.go b/business/jxutils/jxutils.go index 06868d4f8..7e8fbc3e0 100644 --- a/business/jxutils/jxutils.go +++ b/business/jxutils/jxutils.go @@ -186,6 +186,21 @@ func GenOrderNo() (orderNo int64) { return orderNo } +func GenJobOrderNo() (orderNo int64) { + const prefix = 88 + const randPartNum = 1000 + orderNo = time.Now().Unix() - orderNoBeginTimestamp + orderNo = orderNo * randPartNum + md5Bytes := md5.Sum([]byte(utils.GetUUID())) + randPart := 0 + for k, v := range md5Bytes { + randPart += int(v) << ((k % 3) * 8) + } + orderNo += int64(randPart % randPartNum) + orderNo += int64(math.Pow10(int(math.Log10(float64(orderNo)))+1)) * prefix + return orderNo +} + func GenBillID() (billID int64) { const prefix = 66 const randPartNum = 100 diff --git a/business/model/dao/dao_job.go b/business/model/dao/dao_job.go index a9e6156ae..6bfe57d05 100644 --- a/business/model/dao/dao_job.go +++ b/business/model/dao/dao_job.go @@ -26,7 +26,7 @@ type GetJobsResult struct { CategoryName string `json:"CategoryName"` //分类名 } -func GetJobs(db *DaoDB, userIDs []string, categoryIDs, statuss []int, includeStep bool, fromTime, toTime time.Time, pageSize, offset int) (pagedInfo *model.PagedInfo, err error) { +func GetJobs(db *DaoDB, userIDs []string, categoryIDs, statuss, vendorIDs []int, includeStep bool, fromTime, toTime time.Time, pageSize, offset int) (pagedInfo *model.PagedInfo, err error) { var jobs []*GetJobsResult sql := ` SELECT SQL_CALC_FOUND_ROWS a.*, b.name @@ -47,6 +47,10 @@ func GetJobs(db *DaoDB, userIDs []string, categoryIDs, statuss []int, includeSte 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 fromTime != utils.ZeroTimeValue { sql += ` AND a.created_at >= ?` sqlParams = append(sqlParams, fromTime) diff --git a/business/model/job.go b/business/model/job.go index eccaf6d6e..1748eca93 100644 --- a/business/model/job.go +++ b/business/model/job.go @@ -87,7 +87,7 @@ type JobOrder struct { ModelIDCUL JobID int `orm:"column(job_id)" json:"jobID"` //任务ID - JobOrderID int `orm:"column(job_order_id)" json:"jobOrderID"` //任务订单号 + JobOrderID int64 `orm:"column(job_order_id)" json:"jobOrderID"` //任务订单号 UserID string `orm:"column(user_id)" json:"userID"` //接任务人ID Status int `json:"status"` //任务订单状态,接单,待审核,已审核,已结算等 SubmitAuditAt time.Time `json:"submitAuditTime"` //提交审核日期 diff --git a/controllers/job_controller.go b/controllers/job_controller.go index 231c5cd4a..1b2742381 100644 --- a/controllers/job_controller.go +++ b/controllers/job_controller.go @@ -50,6 +50,7 @@ func (c *JobController) GetJobCategories() { // @Param userIDs query string false "用户IDs" // @Param categoryIDs query string false "分类IDs" // @Param statuss query string false "状态s" +// @Param vendorIDs query string false "平台IDs" // @Param includeStep query bool false "是否查询步骤,默认否" // @Param fromTime query string false "开始时间" // @Param toTime query string false "结束时间" @@ -61,11 +62,11 @@ func (c *JobController) GetJobCategories() { func (c *JobController) GetJobs() { c.callGetJobs(func(params *tJobGetJobsParams) (retVal interface{}, errCode string, err error) { var ( - userIDs []string - categoryIDs, statuss []int + userIDs []string + categoryIDs, statuss, vendorIDs []int ) - if err = jxutils.Strings2Objs(params.UserIDs, &userIDs, params.CategoryIDs, &categoryIDs, params.Statuss, &statuss); err == nil { - retVal, err = cms.GetJobs(params.Ctx, userIDs, categoryIDs, statuss, params.IncludeStep, params.FromTime, params.ToTime, params.PageSize, params.Offset) + if err = jxutils.Strings2Objs(params.UserIDs, &userIDs, params.CategoryIDs, &categoryIDs, params.Statuss, &statuss, params.VendorIDs, vendorIDs); err == nil { + retVal, err = cms.GetJobs(params.Ctx, userIDs, categoryIDs, statuss, vendorIDs, params.IncludeStep, params.FromTime, params.ToTime, params.PageSize, params.Offset) } return retVal, "", err })