job submit
This commit is contained in:
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
})
|
||||
}
|
||||
|
||||
@@ -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",
|
||||
|
||||
Reference in New Issue
Block a user