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
}