From 1c1784943eb33d56d0208b6e96e78fe7071e53b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8B=8F=E5=B0=B9=E5=B2=9A?= <770236076@qq.com> Date: Fri, 16 Oct 2020 11:51:52 +0800 Subject: [PATCH] job submit --- business/jxstore/cms/job.go | 171 ++++++++++++++++++++++---- controllers/job_controller.go | 46 +++++++ routers/commentsRouter_controllers.go | 27 ++++ 3 files changed, 221 insertions(+), 23 deletions(-) diff --git a/business/jxstore/cms/job.go b/business/jxstore/cms/job.go index ff3df2065..c482b816c 100644 --- a/business/jxstore/cms/job.go +++ b/business/jxstore/cms/job.go @@ -4,6 +4,8 @@ import ( "fmt" "time" + "git.rosy.net.cn/jx-callback/globals" + "git.rosy.net.cn/jx-callback/business/jxstore/financial" "git.rosy.net.cn/baseapi/utils" @@ -127,6 +129,46 @@ func PublishJob(ctx *jxcontext.Context, job *model.Job) (err error) { return err } +func CancelPublishJob(ctx *jxcontext.Context, jobID int) (err error) { + var ( + db = dao.GetDB() + ) + job := &model.Job{} + job.ID = jobID + err = dao.GetEntity(db, &job) + if job.UserID == "" || job.Status == model.JobStatusFailed || job.Status == model.JobStatusOverdue || job.FinishedAt.Sub(time.Now()) <= 0 || job.SurplusCount <= 0 || job.LimitCountType <= 0 { + return fmt.Errorf("未找到该任务或该任务状态不正常,无法取消!") + } + //取消已发布的任务 + userBill, err := dao.GetUserBill(db, job.UserID, "") + if userBill == nil { + return fmt.Errorf("未查询到该用户的账单!") + } + dao.Begin(db) + defer func() { + if r := recover(); r != nil { + dao.Rollback(db) + panic(r) + } + }() + //1、根据任务剩余数量退钱到任务保证金余额中 + userBill.DepositBalance += job.SurplusCount * job.AvgPrice + if _, err = dao.UpdateEntity(db, userBill, "DepositBalance"); err != nil { + dao.Rollback(db) + } + //2、账户收入增加一条记录 + if err = financial.AddBillIncome(db, userBill.BillID, model.OrderTypeDeposit, userBill.DepositBalance); err != nil { + dao.Rollback(db) + } + //3、任务状态被取消 + job.Status = model.JobStatusFailed + if _, err = dao.UpdateEntity(db, job, "Status"); err != nil { + dao.Rollback(db) + } + dao.Commit(db) + return err +} + 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) } @@ -140,30 +182,34 @@ func AcceptJob(ctx *jxcontext.Context, jobID int) (err error) { job := &model.Job{} job.ID = jobID err = dao.GetEntity(db, &job) - if job.UserID == "" || job.Status == model.JobStatusFailed || job.FinishedAt.Sub(time.Now()) <= 0 || job.SurplusCount <= 0 || job.LimitCountType <= 0 { + if job.UserID == "" || job.Status == model.JobStatusFailed || job.Status == model.JobStatusOverdue || job.FinishedAt.Sub(time.Now()) <= 0 || job.SurplusCount <= 0 || job.LimitCountType <= 0 { return fmt.Errorf("未找到该任务或该任务状态不正常,无法接单!") } - num, err = checkJobOrders(db, "<= "+utils.Int2Str(model.JobOrderStatusWaitAudit), userID, utils.ZeroTimeValue, utils.ZeroTimeValue) + num, err = checkJobOrders(db, 0, "<= "+utils.Int2Str(model.JobOrderStatusAccept), userID, utils.ZeroTimeValue, utils.ZeroTimeValue) + if num >= AcceptMaxCount { + return fmt.Errorf("每人最多接取" + utils.Int2Str(AcceptMaxCount) + "个任务,请核实!") + } + num, err = checkJobOrders(db, jobID, "<= "+utils.Int2Str(model.JobOrderStatusWaitAudit), userID, utils.ZeroTimeValue, utils.ZeroTimeValue) if num > 0 { return fmt.Errorf("您还有此任务未完成,请完成后再接取!") } - num, err = checkJobOrders(db, "= "+utils.Int2Str(model.JobOrderStatusAuditUnPass), userID, utils.ZeroTimeValue, utils.ZeroTimeValue) - if num > 0 { - return fmt.Errorf("您还有此任务未审核通过记录,可直接在未审核中重新提交!") - } + // num, err = checkJobOrders(db, "= "+utils.Int2Str(model.JobOrderStatusAuditUnPass), userID, utils.ZeroTimeValue, utils.ZeroTimeValue) + // if num > 0 { + // return fmt.Errorf("您还有此任务未审核通过记录,可直接在未审核中重新提交!") + // } switch job.LimitCountType { case model.JobLimitCountTypePO: - num, err = checkJobOrders(db, "<> "+utils.Int2Str(model.JobOrderStatusCancel), userID, utils.ZeroTimeValue, utils.ZeroTimeValue) + num, err = checkJobOrders(db, jobID, "<> "+utils.Int2Str(model.JobOrderStatusCancel), userID, utils.ZeroTimeValue, utils.ZeroTimeValue) if num > 0 { return fmt.Errorf("此任务只支持每人做一次!") } case model.JobLimitCountTypePDO: - num, err = checkJobOrders(db, "<> "+utils.Int2Str(model.JobOrderStatusCancel), userID, DayTimeBegin, DayTimeEnd) + num, err = checkJobOrders(db, jobID, "<> "+utils.Int2Str(model.JobOrderStatusCancel), userID, DayTimeBegin, DayTimeEnd) if num > 0 { return fmt.Errorf("此任务只支持每人每天做一次!") } case model.JobLimitCountTypePWO: - num, err = checkJobOrders(db, "<> "+utils.Int2Str(model.JobOrderStatusCancel), userID, WeekTimeBegin, WeekTimeEnd) + num, err = checkJobOrders(db, jobID, "<> "+utils.Int2Str(model.JobOrderStatusCancel), userID, WeekTimeBegin, WeekTimeEnd) if num > 0 { return fmt.Errorf("此任务只支持每人每周做一次!") } @@ -194,22 +240,101 @@ func AcceptJob(ctx *jxcontext.Context, jobID int) (err error) { } 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") - }) + checkLimitJobOrders(db, job, jobOrder) return err } -func checkJobOrders(db *dao.DaoDB, statusCompareStr, userID string, fromTime, toTime time.Time) (num int, err error) { - jobOrders, err := dao.GetJobOrdersNoPage(db, 0, 0, userID, statusCompareStr, fromTime, toTime, nil) +func CancelAcceptJob(ctx *jxcontext.Context, jobID int, jobOrderID int64) (err error) { + var ( + db = dao.GetDB() + ) + jobOrder := &model.JobOrder{} + jobOrder.JobOrderID = jobOrderID + err = dao.GetEntity(db, &jobOrder, "JobOrderID") + job := &model.Job{} + job.ID = jobID + err = dao.GetEntity(db, &job) + dao.Begin(db) + defer func() { + if r := recover(); r != nil { + dao.Rollback(db) + panic(r) + } + }() + //如果当前任务状态正常,剩余数量就加1 + if job.Status > 0 { + job.SurplusCount += 1 + if _, err = dao.UpdateEntity(db, job, "SurplusCount"); err != nil { + dao.Rollback(db) + } + } else { + userBill, err := dao.GetUserBill(db, job.UserID, "") + if userBill == nil { + return fmt.Errorf("未查询到该用户的账单!") + } + //如果状态不正常(取消或者过期)就要把这一笔退回去 + //1、根据任务剩余数量退钱到任务保证金余额中 + userBill.DepositBalance += job.AvgPrice + if _, err = dao.UpdateEntity(db, userBill, "DepositBalance"); err != nil { + dao.Rollback(db) + } + //2、账户收入增加一条记录 + if err = financial.AddBillIncome(db, userBill.BillID, model.OrderTypeDeposit, userBill.DepositBalance); err != nil { + dao.Rollback(db) + } + //3、任务订单状态被取消 + jobOrder.Status = model.JobOrderStatusCancel + if _, err = dao.UpdateEntity(db, jobOrder, "Status"); err != nil { + dao.Rollback(db) + } + } + dao.Commit(db) + return err +} + +func checkJobOrders(db *dao.DaoDB, jobID int, statusCompareStr, userID string, fromTime, toTime time.Time) (num int, err error) { + jobOrders, err := dao.GetJobOrdersNoPage(db, jobID, 0, userID, statusCompareStr, fromTime, toTime, nil) return len(jobOrders), err } + +func checkLimitJobOrders(db *dao.DaoDB, job *model.Job, jobOrder *model.JobOrder) { + utils.AfterFuncWithRecover(time.Hour*time.Duration(job.JobLimitAt), func() { + utils.CallFuncAsync(func() { + globals.SugarLogger.Debugf("checkLimitJobOrders jobID: %v, jobOrderID: %v", job.ID, jobOrder.JobOrderID) + jobOrders, _ := dao.GetJobOrdersNoPage(db, job.ID, jobOrder.JobOrderID, job.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") + }) + }) +} + +func SubmitJob(ctx *jxcontext.Context, jobOrder *model.JobOrder) (err error) { + var ( + db = dao.GetDB() + ) + if jobOrder.JobID == 0 || jobOrder.JobOrderID == 0 { + return fmt.Errorf("传入数据有误!") + } + jobOrder2 := &model.JobOrder{} + jobOrder2.JobOrderID = jobOrder.JobOrderID + err = dao.GetEntity(db, &jobOrder2, "JobOrderID") + if jobOrder2.JobID == 0 { + return fmt.Errorf("未查询到相应的任务!") + } + if jobOrder2.Status >= model.JobOrderStatusWaitAudit { + return fmt.Errorf("任务订单状态有误!") + } + jobOrder2.Img = jobOrder.Img + jobOrder2.Content = jobOrder.Content + jobOrder2.SubmitAuditAt = time.Now() + jobOrder2.Status = model.JobOrderStatusWaitAudit + dao.UpdateEntity(db, jobOrder2, "Img", "Content", "SubmitAuditAt", "Status") + return err +} diff --git a/controllers/job_controller.go b/controllers/job_controller.go index 1b2742381..ae8ee29ac 100644 --- a/controllers/job_controller.go +++ b/controllers/job_controller.go @@ -30,6 +30,20 @@ func (c *JobController) PublishJob() { }) } +// @Title 用户取消发布的任务 +// @Description 用户取消发布的任务 +// @Param token header string true "认证token" +// @Param jobID formData int true "jobID" +// @Success 200 {object} controllers.CallResult +// @Failure 200 {object} controllers.CallResult +// @router /CancelPublishJob [post] +func (c *JobController) CancelPublishJob() { + c.callCancelPublishJob(func(params *tJobCancelPublishJobParams) (retVal interface{}, errCode string, err error) { + err = cms.CancelPublishJob(params.Ctx, params.JobID) + return retVal, "", err + }) +} + // @Title 查看任务类型 // @Description 查看任务类型 // @Param token header string true "认证token" @@ -100,6 +114,21 @@ func (c *JobController) AcceptJob() { }) } +// @Title 用户取消接受的任务 +// @Description 用户取消接受的任务 +// @Param token header string true "认证token" +// @Param jobID formData int true "jobID" +// @Param jobOrderID formData int true "jobOrderID" +// @Success 200 {object} controllers.CallResult +// @Failure 200 {object} controllers.CallResult +// @router /CancelAcceptJob [post] +func (c *JobController) CancelAcceptJob() { + c.callCancelAcceptJob(func(params *tJobCancelAcceptJobParams) (retVal interface{}, errCode string, err error) { + err = cms.CancelAcceptJob(params.Ctx, params.JobID, int64(params.JobOrderID)) + return retVal, "", err + }) +} + // @Title 查看接受的任务列表 // @Description 查看接受的任务列表 // @Param token header string true "认证token" @@ -124,3 +153,20 @@ func (c *JobController) GetJobOrders() { return retVal, "", err }) } + +// @Title 提交任务 +// @Description 提交任务 +// @Param token header string true "认证token" +// @Param payload formData string true "joborder type" +// @Success 200 {object} controllers.CallResult +// @Failure 200 {object} controllers.CallResult +// @router /SubmitJob [post] +func (c *JobController) SubmitJob() { + c.callSubmitJob(func(params *tJobSubmitJobParams) (retVal interface{}, errCode string, err error) { + var jobOrder *model.JobOrder + if err = jxutils.Strings2Objs(params.Payload, &jobOrder); err == nil { + err = cms.SubmitJob(params.Ctx, jobOrder) + } + return retVal, "", err + }) +} diff --git a/routers/commentsRouter_controllers.go b/routers/commentsRouter_controllers.go index 4425c7966..4cc3d33f2 100644 --- a/routers/commentsRouter_controllers.go +++ b/routers/commentsRouter_controllers.go @@ -160,6 +160,24 @@ func init() { Filters: nil, Params: nil}) + beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:JobController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:JobController"], + beego.ControllerComments{ + Method: "CancelAcceptJob", + Router: `/CancelAcceptJob`, + AllowHTTPMethods: []string{"post"}, + MethodParams: param.Make(), + Filters: nil, + Params: nil}) + + beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:JobController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:JobController"], + beego.ControllerComments{ + Method: "CancelPublishJob", + Router: `/CancelPublishJob`, + AllowHTTPMethods: []string{"post"}, + MethodParams: param.Make(), + Filters: nil, + Params: nil}) + beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:JobController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:JobController"], beego.ControllerComments{ Method: "GetJobCategories", @@ -205,6 +223,15 @@ func init() { Filters: nil, Params: nil}) + beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:JobController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:JobController"], + beego.ControllerComments{ + Method: "SubmitJob", + Router: `/SubmitJob`, + AllowHTTPMethods: []string{"post"}, + MethodParams: param.Make(), + Filters: nil, + Params: nil}) + beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:OrderController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:OrderController"], beego.ControllerComments{ Method: "CreateOrder",