diff --git a/business/jxstore/cms/job.go b/business/jxstore/cms/job.go index 4b06663cd..b4a73c9a2 100644 --- a/business/jxstore/cms/job.go +++ b/business/jxstore/cms/job.go @@ -192,7 +192,7 @@ func PublishJob(ctx *jxcontext.Context, jobExt *model.JobExt) (errCode string, e } //发布任务要扣除任务总额的保证金,不够扣就要进行充值 if err == nil && job.Status != model.JobStatusFailed { - if err = financial.AddExpendUpdateAccount(db, userBill, model.BillTypeDeposit, job.TotalPrice, job.ID); err != nil { + if err = financial.AddExpendUpdateAccount(txDB, userBill, model.BillTypeDeposit, job.TotalPrice, job.ID); err != nil { dao.Rollback(db, txDB) return } @@ -243,14 +243,14 @@ func CancelPublishJob(ctx *jxcontext.Context, jobID int) (err error) { } price = job.TotalPrice - price } - if err = financial.AddIncomeUpdateAccount(db, userBill, model.BillTypeJobCancelOverdue, price, jobID); err != nil { + if err = financial.AddIncomeUpdateAccount(txDB, userBill, model.BillTypeJobCancelOverdue, price, jobID); err != nil { dao.Rollback(db, txDB) return } //3、任务状态被取消 job.Status = model.JobStatusFailed // job.DeletedAt = time.Now() - if _, err = dao.UpdateEntity(db, job, "Status"); err != nil { + if _, err = dao.UpdateEntityTx(txDB, job, "Status"); err != nil { dao.Rollback(db, txDB) return } @@ -409,13 +409,13 @@ func AcceptJob(ctx *jxcontext.Context, jobID, dropShippingDeliveryID, dropShippi } }() dao.WrapAddIDCULEntity(jobOrder, ctx.GetUserName()) - if err = dao.CreateEntity(db, jobOrder); err != nil { + if err = dao.CreateEntityTx(txDB, jobOrder); err != nil { dao.Rollback(db, txDB) return } //用户接受任务,任务剩余次数-1 job.SurplusCount -= 1 - if _, err = dao.UpdateEntity(db, job, "SurplusCount"); err != nil { + if _, err = dao.UpdateEntityTx(txDB, job, "SurplusCount"); err != nil { dao.Rollback(db, txDB) return } @@ -429,7 +429,7 @@ func AcceptJob(ctx *jxcontext.Context, jobID, dropShippingDeliveryID, dropShippi panic(r) } }() - if err = financial.AddExpendUpdateAccount(db, userBill, model.BillTypeDropShipping, jobOrder.UserActualPrice, job.ID); err != nil { + if err = financial.AddExpendUpdateAccount(txDB, userBill, model.BillTypeDropShipping, jobOrder.UserActualPrice, job.ID); err != nil { dao.Rollback(db, txDB) return } @@ -481,7 +481,7 @@ func CancelAcceptJob(ctx *jxcontext.Context, jobID int, jobOrderID int64) (err e //如果当前任务状态正常,剩余数量就加1 if job.Status >= 0 { job.SurplusCount += 1 - if _, err = dao.UpdateEntity(db, job, "SurplusCount"); err != nil { + if _, err = dao.UpdateEntityTx(txDB, job, "SurplusCount"); err != nil { dao.Rollback(db, txDB) return } @@ -494,7 +494,7 @@ func CancelAcceptJob(ctx *jxcontext.Context, jobID int, jobOrderID int64) (err e //2、账户收入 //是固定返现才会退一笔任务单价 if job.CashbackType == model.JobCashbackPrice { - if err = financial.AddIncomeUpdateAccount(db, userBill, model.BillTypeJobCancelOverdue, job.AvgPrice, jobID); err != nil { + if err = financial.AddIncomeUpdateAccount(txDB, userBill, model.BillTypeJobCancelOverdue, job.AvgPrice, jobID); err != nil { dao.Rollback(db, txDB) return err } @@ -506,14 +506,14 @@ func CancelAcceptJob(ctx *jxcontext.Context, jobID int, jobOrderID int64) (err e if userBill == nil { return fmt.Errorf("未查询到该用户的账单!") } - if err = financial.AddIncomeUpdateAccount(db, userBill, model.BillTypeJobCancelOverdue, jobOrder.UserActualPrice, jobID); err != nil { + if err = financial.AddIncomeUpdateAccount(txDB, userBill, model.BillTypeJobCancelOverdue, jobOrder.UserActualPrice, jobID); err != nil { dao.Rollback(db, txDB) return err } } //3、任务订单状态被取消 jobOrder.Status = model.JobOrderStatusCancel - if _, err = dao.UpdateEntity(db, jobOrder, "Status"); err != nil { + if _, err = dao.UpdateEntityTx(txDB, jobOrder, "Status"); err != nil { dao.Rollback(db, txDB) return err } @@ -617,7 +617,7 @@ func UpdateDropShippingJobOrders(db *dao.DaoDB, timer *time.Timer, jobID int, jo panic(r) } }() - if err = financial.AddIncomeUpdateAccount(db, userBill, model.BillTypeDropShippingDeposit, job.AvgPrice, job.ID); err != nil { + if err = financial.AddIncomeUpdateAccount(txDB, userBill, model.BillTypeDropShippingDeposit, job.AvgPrice, job.ID); err != nil { dao.Rollback(db, txDB) return } @@ -746,7 +746,7 @@ func AuditJob(ctx *jxcontext.Context, jobOrderID, status int, comment, vendorWay panic(r) } }() - if _, err = dao.UpdateEntity(db, jobOrder, "Status", "Comment", "AuditAt", "LastOperator"); err != nil { + if _, err = dao.UpdateEntityTx(txDB, jobOrder, "Status", "Comment", "AuditAt", "LastOperator"); err != nil { dao.Rollback(db, txDB) return } @@ -771,19 +771,19 @@ func AuditJob(ctx *jxcontext.Context, jobOrderID, status int, comment, vendorWay if len(messageGroupsResult) == 1 { if messageGroupsResult[0].DividePercentage != 0 { if userBillGroupMaster, err := dao.GetUserBill(db, messageGroupsResult[0].UserID, ""); err == nil { - if err = financial.AddIncomeUpdateAccount(db, userBillGroupMaster, model.BillTypeDivide, price*messageGroupsResult[0].DividePercentage/100, job.ID); err != nil { + if err = financial.AddIncomeUpdateAccount(txDB, userBillGroupMaster, model.BillTypeDivide, price*messageGroupsResult[0].DividePercentage/100, job.ID); err != nil { dao.Rollback(db, txDB) return err } } //接收人账户收入 - if err = financial.AddIncomeUpdateAccount(db, userBillJobOrder, model.BillTypeJobDivide, price*(100-messageGroupsResult[0].DividePercentage)/100, job.ID); err != nil { + if err = financial.AddIncomeUpdateAccount(txDB, userBillJobOrder, model.BillTypeJobDivide, price*(100-messageGroupsResult[0].DividePercentage)/100, job.ID); err != nil { dao.Rollback(db, txDB) return err } } else { //接收人账户收入 - if err = financial.AddIncomeUpdateAccount(db, userBillJobOrder, model.BillTypeJob, price, job.ID); err != nil { + if err = financial.AddIncomeUpdateAccount(txDB, userBillJobOrder, model.BillTypeJob, price, job.ID); err != nil { dao.Rollback(db, txDB) return err } @@ -792,14 +792,14 @@ func AuditJob(ctx *jxcontext.Context, jobOrderID, status int, comment, vendorWay } } else if len(messageGroupMembers) == 0 { //若没有在某个群组,则得到全部 //接收人账户收入 - if err = financial.AddIncomeUpdateAccount(db, userBillJobOrder, model.BillTypeJob, price, job.ID); err != nil { + if err = financial.AddIncomeUpdateAccount(txDB, userBillJobOrder, model.BillTypeJob, price, job.ID); err != nil { dao.Rollback(db, txDB) return err } } } jobOrder.Status = model.JobOrderStatusFinish - if _, err = dao.UpdateEntity(db, jobOrder, "Status"); err != nil { + if _, err = dao.UpdateEntityTx(txDB, jobOrder, "Status"); err != nil { dao.Rollback(db, txDB) return err } @@ -809,12 +809,12 @@ func AuditJob(ctx *jxcontext.Context, jobOrderID, status int, comment, vendorWay //一件代发处理,审核相当于发货 jobOrder.VendorWaybillID = vendorWaybillID jobOrder.Status = model.JobOrderStatusFinish - if _, err = dao.UpdateEntity(db, jobOrder, "Status", "VendorWaybillID"); err != nil { + if _, err = dao.UpdateEntityTx(txDB, jobOrder, "Status", "VendorWaybillID"); err != nil { dao.Rollback(db, txDB) return err } userBill, err := dao.GetUserBill(db, job.UserID, "") - if err = financial.AddIncomeUpdateAccount(db, userBill, model.BillTypeDropShippingDeposit, job.AvgPrice, job.ID); err != nil { + if err = financial.AddIncomeUpdateAccount(txDB, userBill, model.BillTypeDropShippingDeposit, job.AvgPrice, job.ID); err != nil { dao.Rollback(db, txDB) return err } @@ -828,7 +828,7 @@ func AuditJob(ctx *jxcontext.Context, jobOrderID, status int, comment, vendorWay if job.Status < 0 { if job.CashbackType == model.JobCashbackPrice { userBill, err := dao.GetUserBill(db, job.UserID, "") - if err = financial.AddIncomeUpdateAccount(db, userBill, model.BillTypeJobAuditUnPassWithCancelOverdue, job.AvgPrice, job.ID); err != nil { + if err = financial.AddIncomeUpdateAccount(txDB, userBill, model.BillTypeJobAuditUnPassWithCancelOverdue, job.AvgPrice, job.ID); err != nil { dao.Rollback(db, txDB) return err } @@ -836,7 +836,7 @@ func AuditJob(ctx *jxcontext.Context, jobOrderID, status int, comment, vendorWay } else { //审核不通过的话,要重新变成待上传,再重新开个定时器 jobOrder.Status = model.JobOrderStatusAccept - if _, err = dao.UpdateEntity(db, jobOrder, "Status"); err != nil { + if _, err = dao.UpdateEntityTx(txDB, jobOrder, "Status"); err != nil { dao.Rollback(db, txDB) return } @@ -845,7 +845,7 @@ func AuditJob(ctx *jxcontext.Context, jobOrderID, status int, comment, vendorWay JobID: job.ID, JobOrderID: jobOrder.JobOrderID, } - if _, err = dao.DeleteEntity(db, jobTimer, "JobID", "JobOrderID"); err != nil { + if _, err = dao.DeleteEntityTx(txDB, jobTimer, "JobID", "JobOrderID"); err != nil { dao.Rollback(db, txDB) return } @@ -919,7 +919,7 @@ func RefreshJobStatus(ctx *jxcontext.Context) (err error) { } price = job.TotalPrice - price } - if err = financial.AddIncomeUpdateAccount(db, userBill, model.BillTypeJobCancelOverdue, price, job.ID); err != nil { + if err = financial.AddIncomeUpdateAccount(txDB, userBill, model.BillTypeJobCancelOverdue, price, job.ID); err != nil { dao.Rollback(db, txDB) return err } @@ -930,7 +930,7 @@ func RefreshJobStatus(ctx *jxcontext.Context) (err error) { if job2 != nil { job2.Status = model.JobStatusOverdue // job.DeletedAt = time.Now() - if _, err = dao.UpdateEntity(db, job2, "Status"); err != nil { + if _, err = dao.UpdateEntityTx(txDB, job2, "Status"); err != nil { dao.Rollback(db, txDB) return err } @@ -999,7 +999,7 @@ func RechargeMtMembers(ctx *jxcontext.Context, phone int) (errCode string, err e return model.ErrCodeAccountBalanceNotEnough, fmt.Errorf("用户余额不足,请充值!") } //账户支出 - if err = financial.AddExpendUpdateAccount(db, userBill, model.BillTypeSpJob, mtwmMemberPrice, 1); err != nil { + if err = financial.AddExpendUpdateAccount(txDB, userBill, model.BillTypeSpJob, mtwmMemberPrice, 1); err != nil { dao.Rollback(db, txDB) return errCode, err } @@ -1128,7 +1128,7 @@ func SendJdDelivery(ctx *jxcontext.Context, dOrder *model.DeliveryOrder) (errCod } }() //账户支出明细 - if err = financial.AddExpendUpdateAccount(db, userBill, model.BillTypeSpJob, dOrder.PayPrice, 2); err != nil { + if err = financial.AddExpendUpdateAccount(txDB, userBill, model.BillTypeSpJob, dOrder.PayPrice, 2); err != nil { dao.Rollback(db, txDB) return } @@ -1206,7 +1206,7 @@ func CancelJdDelivery(ctx *jxcontext.Context, vendorWaybillID, reason string) (e dao.Rollback(db, txDB) return } - if err = financial.AddIncomeUpdateAccount(db, userBill, model.BillTypeSpJob, dOrder.PayPrice, 2); err != nil { + if err = financial.AddIncomeUpdateAccount(txDB, userBill, model.BillTypeSpJob, dOrder.PayPrice, 2); err != nil { dao.Rollback(db, txDB) return } @@ -1268,12 +1268,19 @@ func RefreshJdDelivery(ctx *jxcontext.Context) (err error) { } dOrder := &model.DeliveryOrder{} dOrder.VendorWaybillID = v.VendorWaybillID + txDB, _ := dao.Begin(db) + defer func() { + if r := recover(); r != nil { + dao.Rollback(db, txDB) + panic(r) + } + }() if err = dao.GetEntity(db, dOrder, "VendorWaybillID"); err == nil { if isCancel { //退钱给发快递的 dOrder.Status = model.OrderStatusCanceled userBill, _ := dao.GetUserBill(db, v.UserID, "") - err = financial.AddIncomeUpdateAccount(db, userBill, model.BillTypeSpJob, v.PayPrice+v.DiffPrice, 2) + err = financial.AddIncomeUpdateAccount(txDB, userBill, model.BillTypeSpJob, v.PayPrice+v.DiffPrice, 2) } else if isFinished { //快递任务要完成 dOrder.Status = model.OrderStatusFinished @@ -1284,13 +1291,14 @@ func RefreshJdDelivery(ctx *jxcontext.Context) (err error) { return retVal, err } if err == nil { - dao.UpdateEntity(db, dOrder, "Status") + dao.UpdateEntityTx(txDB, dOrder, "Status") } else { if strings.Contains(err.Error(), "审核状态不正确") { - dao.UpdateEntity(db, dOrder, "Status") + dao.UpdateEntityTx(txDB, dOrder, "Status") } } } + dao.Commit(db, txDB) } return retVal, err }, list) @@ -1362,6 +1370,13 @@ func CheckJdDeliveryWeight(ctx *jxcontext.Context) (err error) { if waybill.DeliveryID == "" { return retVal, err } + txDB, _ := dao.Begin(db) + defer func() { + if r := recover(); r != nil { + dao.Rollback(db, txDB) + panic(r) + } + }() if waybill.DeliveryID == deliveryOrder.VendorWaybillID { deliveryOrder.IsWeight = 1 //合格 if waybill.Weight > 3 && math.Floor(deliveryOrder.Weight) < math.Floor(waybill.Weight) { @@ -1369,7 +1384,8 @@ func CheckJdDeliveryWeight(ctx *jxcontext.Context) (err error) { if err != nil { return retVal, err } - if err = financial.AddExpendUpdateAccount(db, userBill, model.BillTypeJdWaybillOverWeight, utils.Float64TwoInt(diffPrice), 2); err != nil { + if err = financial.AddExpendUpdateAccount(txDB, userBill, model.BillTypeJdWaybillOverWeight, utils.Float64TwoInt(diffPrice), 2); err != nil { + txDB.Rollback() return retVal, err } deliveryOrder.IsWeight = 2 //超重 @@ -1377,7 +1393,8 @@ func CheckJdDeliveryWeight(ctx *jxcontext.Context) (err error) { } } deliveryOrder.ActualWeight = waybill.Weight - dao.UpdateEntity(db, deliveryOrder, "IsWeight", "ActualWeight", "DiffPrice") + dao.UpdateEntityTx(txDB, deliveryOrder, "IsWeight", "ActualWeight", "DiffPrice") + dao.Commit(db, txDB) return retVal, err }, deliveryOrders) tasksch.HandleTask(task, nil, true).Run() @@ -1550,7 +1567,7 @@ func ConfirmDropShippingJob(ctx *jxcontext.Context, jobOrderID int) (err error) return } userBill, err := dao.GetUserBill(db, job.UserID, "") - if err = financial.AddIncomeUpdateAccount(db, userBill, model.BillTypeDropShipping, jobOrder.UserActualPrice, job.ID); err != nil { + if err = financial.AddIncomeUpdateAccount(txDB, userBill, model.BillTypeDropShipping, jobOrder.UserActualPrice, job.ID); err != nil { dao.Rollback(db, txDB) return } diff --git a/business/jxstore/financial/bill.go b/business/jxstore/financial/bill.go index 0e75764d3..aedb49491 100644 --- a/business/jxstore/financial/bill.go +++ b/business/jxstore/financial/bill.go @@ -5,9 +5,10 @@ import ( "git.rosy.net.cn/jx-callback/business/jxutils/jxcontext" "git.rosy.net.cn/jx-callback/business/model" "git.rosy.net.cn/jx-callback/business/model/dao" + "github.com/astaxie/beego/client/orm" ) -func AddBillIncome(db *dao.DaoDB, billID int64, billType, incomePrice, jobID int) (err error) { +func AddBillIncome(txDB orm.TxOrmer, billID int64, billType, incomePrice, jobID int) (err error) { billIncome := &model.BillIncome{ BillID: billID, Type: billType, @@ -15,10 +16,10 @@ func AddBillIncome(db *dao.DaoDB, billID int64, billType, incomePrice, jobID int JobID: jobID, } dao.WrapAddIDCULEntity(billIncome, jxcontext.AdminCtx.GetUserName()) - return dao.CreateEntity(db, billIncome) + return dao.CreateEntityTx(txDB, billIncome) } -func AddBillExpend(db *dao.DaoDB, billID int64, billType, expendPrice, jobID int) (err error) { +func AddBillExpend(txDB orm.TxOrmer, billID int64, billType, expendPrice, jobID int) (err error) { billExpend := &model.BillExpend{ BillID: billID, Type: billType, @@ -26,41 +27,41 @@ func AddBillExpend(db *dao.DaoDB, billID int64, billType, expendPrice, jobID int JobID: jobID, } dao.WrapAddIDCULEntity(billExpend, jxcontext.AdminCtx.GetUserName()) - return dao.CreateEntity(db, billExpend) + return dao.CreateEntityTx(txDB, billExpend) } -func AddUserBill(db *dao.DaoDB, billID int64, userID string) (err error) { +func AddUserBill(txDB orm.TxOrmer, billID int64, userID string) (err error) { userBillInsert := &model.UserBill{ BillID: billID, UserID: userID, } dao.WrapAddIDCULDEntity(userBillInsert, jxcontext.AdminCtx.GetUserName()) - return dao.CreateEntity(db, userBillInsert) + return dao.CreateEntityTx(txDB, userBillInsert) } func GetUserBillDetail(ctx *jxcontext.Context, userID, fromTime, toTime string, pageSize, offset int) (pagedInfo *model.PagedInfo, err error) { return dao.GetUserBillDetail(dao.GetDB(), userID, utils.Str2Time(fromTime), utils.Str2Time(toTime), pageSize, offset) } -func AddExpendUpdateAccount(db *dao.DaoDB, userBill *model.UserBill, billType, price, jobID int) (err error) { +func AddExpendUpdateAccount(txDB orm.TxOrmer, userBill *model.UserBill, billType, price, jobID int) (err error) { //1、账户支出增加一条记录 - err = AddBillExpend(db, userBill.BillID, billType, price, jobID) + err = AddBillExpend(txDB, userBill.BillID, billType, price, jobID) if err != nil { return err } //2、账户表余额减少相应值 userBill.AccountBalance -= price - _, err = dao.UpdateEntity(db, userBill, "AccountBalance") + _, err = dao.UpdateEntityTx(txDB, userBill, "AccountBalance") return err } -func AddIncomeUpdateAccount(db *dao.DaoDB, userBill *model.UserBill, billType, price, jobID int) (err error) { +func AddIncomeUpdateAccount(txDB orm.TxOrmer, userBill *model.UserBill, billType, price, jobID int) (err error) { //2、账户收入增加一条记录 - err = AddBillIncome(db, userBill.BillID, billType, price, jobID) + err = AddBillIncome(txDB, userBill.BillID, billType, price, jobID) if err != nil { return err } //1、根据任务剩余数量退钱到账户余额中 userBill.AccountBalance += price - _, err = dao.UpdateEntity(db, userBill, "AccountBalance") + _, err = dao.UpdateEntityTx(txDB, userBill, "AccountBalance") return err } diff --git a/business/model/dao/dao.go b/business/model/dao/dao.go index 2171518e4..e2ffca07b 100644 --- a/business/model/dao/dao.go +++ b/business/model/dao/dao.go @@ -263,6 +263,18 @@ func DeleteEntity(db *DaoDB, item interface{}, cols ...string) (num int64, err e return num, err } +func DeleteEntityTx(txDB orm.TxOrmer, item interface{}, cols ...string) (num int64, err error) { + if txDB == nil { + return + } + err = utils.CallFuncLogError(func() error { + num, err = txDB.Delete(item, cols...) + //num, err = db.Db.Delete(item, cols...) + return err + }, reflect.TypeOf(item).Name()) + return num, err +} + func ExecuteSQL(db *DaoDB, sql string, params ...interface{}) (num int64, err error) { if db == nil { db = GetDB()