job submit

This commit is contained in:
苏尹岚
2020-10-16 11:51:52 +08:00
parent 47c2cd12fe
commit 1c1784943e
3 changed files with 221 additions and 23 deletions

View File

@@ -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
}

View File

@@ -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
})
}

View File

@@ -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",