diff --git a/business/jxstore/financial/bill.go b/business/jxstore/financial/bill.go index aedb49491..e5ef71dad 100644 --- a/business/jxstore/financial/bill.go +++ b/business/jxstore/financial/bill.go @@ -2,10 +2,12 @@ package financial import ( "git.rosy.net.cn/baseapi/utils" + "git.rosy.net.cn/jx-callback/business/jxutils" "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" + "time" ) func AddBillIncome(txDB orm.TxOrmer, billID int64, billType, incomePrice, jobID int) (err error) { @@ -38,6 +40,15 @@ func AddUserBill(txDB orm.TxOrmer, billID int64, userID string) (err error) { return dao.CreateEntityTx(txDB, userBillInsert) } +func AddUserBillDb(db *dao.DaoDB, billID int64, userID string) (err error) { + userBillInsert := &model.UserBill{ + BillID: billID, + UserID: userID, + } + dao.WrapAddIDCULDEntity(userBillInsert, jxcontext.AdminCtx.GetUserName()) + return dao.CreateEntity(db, 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) } @@ -65,3 +76,92 @@ func AddIncomeUpdateAccount(txDB orm.TxOrmer, userBill *model.UserBill, billType _, err = dao.UpdateEntityTx(txDB, userBill, "AccountBalance") return err } + +func SettleUnionOrders(ctx *jxcontext.Context, vendorIDs []int) (err error) { + var ( + db = dao.GetDB() + unionOrderVendorMap map[int][]*model.UnionOrder //key 为平台ID + unionOrderMap map[string]map[int][]*model.UnionOrder //key为userID,整个map把每个User的不同平台的订单放一起 + settleOrders []*model.UnionOrderSettle + ) + unionOrderVendorMap = make(map[int][]*model.UnionOrder) + unionOrderMap = make(map[string]map[int][]*model.UnionOrder) + unionOrders, err := dao.GetUnionOrders(db, vendorIDs, []int{model.UnionOrderStatusFinish}, utils.ZeroTimeValue, utils.ZeroTimeValue, model.NO) + if err != nil { + return err + } + for _, v := range unionOrders { + if _, ok := unionOrderMap[v.UserID]; ok { + if _, ol := unionOrderVendorMap[v.VendorID]; ol { + unionOrderMap[v.UserID][v.VendorID] = append(unionOrderMap[v.UserID][v.VendorID], v) + } else { + unionOrderMap[v.UserID][v.VendorID] = []*model.UnionOrder{v} + } + } else { + unionOrderVendorMap[v.VendorID] = []*model.UnionOrder{v} + unionOrderMap[v.UserID] = unionOrderVendorMap + } + } + for userID, v := range unionOrderMap { + var ( + billID int64 + ) + userBill, _ := dao.GetUserBill(db, userID, "") + if userBill == nil { + billID = jxutils.GenBillID() + AddUserBillDb(db, billID, userID) + } else { + billID = userBill.BillID + } + for vendorID, vv := range v { + var ( + sumPrice, count int + ) + for _, unionOrder := range vv { + count++ + sumPrice += unionOrder.PromotionAmount + } + unionOrderSettle := &model.UnionOrderSettle{ + BillID: billID, + VendorID: vendorID, + Issue: jxutils.GetIssue(), + EarningPrice: sumPrice, + OrderCount: count, + } + dao.WrapAddIDCULEntity(unionOrderSettle, ctx.GetUserName()) + settleOrders = append(settleOrders, unionOrderSettle) + //err = dao.CreateEntity(db, unionOrderSettle) + } + } + txDB, _ := dao.Begin(db) + defer func() { + if r := recover(); r != nil { + dao.Rollback(db, txDB) + panic(r) + } + }() + for _, v := range settleOrders { + //插入结算表 + if err = dao.CreateEntityTx(txDB, v); err != nil { + dao.Rollback(db, txDB) + return err + } + //更新用户账户 + userBill, _ := dao.GetUserBill(db, "", utils.Int64ToStr(v.BillID)) + if err = AddIncomeUpdateAccount(txDB, userBill, model.BillTypeUnionShare, v.EarningPrice, 0); err != nil { + dao.Rollback(db, txDB) + return err + } + } + //修改订单结算标志 + for _, v := range unionOrders { + v.IsEarning = model.YES + v.UpdatedAt = time.Now() + if _, err = dao.UpdateEntityTx(txDB, v, "IsEarning", "UpdatedAt"); err != nil { + dao.Rollback(db, txDB) + return err + } + } + dao.Commit(db, txDB) + return err +} diff --git a/business/jxutils/jxutils.go b/business/jxutils/jxutils.go index 63f4d772e..f3c0898d6 100644 --- a/business/jxutils/jxutils.go +++ b/business/jxutils/jxutils.go @@ -839,17 +839,9 @@ func MixWatermarkImg(imgWatermark, img, positon string) (imgMix string) { return imgMix } -func GetDefendPriceIssue() (issue int) { - if time.Now().Hour() >= 22 { - issue = utils.Str2Int(time.Now().AddDate(0, 0, 1).Format("20060102")) - } else { - issue = utils.Str2Int(time.Now().Format("20060102")) - } - return issue -} - -func GetLastDefendPriceIssue() (issue int) { - return utils.Str2Int(time.Now().AddDate(0, 0, 1).Format("20060102")) +func GetIssue() (issue int) { + year, month, _ := time.Now().Date() + return year*100 + int(month) } //根据一堆坐标求面积 diff --git a/business/model/bill.go b/business/model/bill.go index 8ce1ab661..ffc35e896 100644 --- a/business/model/bill.go +++ b/business/model/bill.go @@ -97,3 +97,20 @@ func (v *UserBill) TableIndex() [][]string { []string{"AccountBalance"}, } } + +type UnionOrderSettle struct { + ModelIDCUL + + BillID int64 `orm:"column(bill_id)" json:"billID"` //账单ID + VendorID int `orm:"column(vendor_id)" json:"vendorID"` //平台ID + Issue int `json:"issue"` //期数 + EarningPrice int `json:"earningPrice"` //结算金额 + OrderCount int `json:"orderCount"` //当期有效推广订单数量 + Comment string `json:"comment"` //备注 +} + +func (v *UnionOrderSettle) TableUnique() [][]string { + return [][]string{ + []string{"BillID", "VendorID", "Issue"}, + } +} diff --git a/business/model/dao/dao_order.go b/business/model/dao/dao_order.go index f5776ce6b..5a43ba3ae 100644 --- a/business/model/dao/dao_order.go +++ b/business/model/dao/dao_order.go @@ -515,6 +515,37 @@ func GetManageStatisticsJob(db *DaoDB, cityCodes []int, fromTime, toTime time.Ti return pageInfo, err } +func GetUnionOrders(db *DaoDB, vendorIDs, statuss []int, beginTime, endTime time.Time, isEarning int) (orders []*model.UnionOrder, err error) { + sql := ` + SELECT * + FROM union_order + WHERE 1 = 1 + ` + sqlParams := []interface{}{} + if len(vendorIDs) > 0 { + sql += ` AND vendor_id IN (` + GenQuestionMarks(len(vendorIDs)) + `)` + sqlParams = append(sqlParams, vendorIDs) + } + if len(statuss) > 0 { + sql += ` AND status IN (` + GenQuestionMarks(len(statuss)) + `)` + sqlParams = append(sqlParams, statuss) + } + if !utils.IsTimeZero(beginTime) { + sql += ` AND order_settle_at > ?` + sqlParams = append(sqlParams, beginTime) + } + if !utils.IsTimeZero(endTime) { + sql += ` AND order_settle_at < ?` + sqlParams = append(sqlParams, endTime) + } + if isEarning != -1 { + sql += ` AND is_earning = ?` + sqlParams = append(sqlParams, isEarning) + } + err = GetRows(db, &orders, sql, sqlParams) + return orders, err +} + func GetUnionOrdersByIDs(db *DaoDB, vendorOrderIDs []string, vendorID int) (orders []*model.UnionOrder, err error) { if len(vendorOrderIDs) == 0 { return nil, err diff --git a/controllers/order_controller.go b/controllers/order_controller.go index be14afc66..083a09402 100644 --- a/controllers/order_controller.go +++ b/controllers/order_controller.go @@ -2,6 +2,7 @@ package controllers import ( "git.rosy.net.cn/jx-callback/business/jxstore/cms" + "git.rosy.net.cn/jx-callback/business/jxstore/financial" "git.rosy.net.cn/jx-callback/business/jxutils" beego "github.com/astaxie/beego/adapter" ) @@ -187,3 +188,20 @@ func (c *OrderController) GetMyUnionOrders() { return retVal, "", err }) } + +// @Title 联盟订单结算 +// @Description 联盟订单结算 +// @Param token header string true "认证token" +// @Param vendorIDs query string false "平台IDs" +// @Success 200 {object} controllers.CallResult +// @Failure 200 {object} controllers.CallResult +// @router /SettleUnionOrders [post] +func (c *OrderController) SettleUnionOrders() { + c.callSettleUnionOrders(func(params *tOrderSettleUnionOrdersParams) (retVal interface{}, errCode string, err error) { + var vendorIDs []int + if err = jxutils.Strings2Objs(params.VendorIDs, &vendorIDs); err == nil { + err = financial.SettleUnionOrders(params.Ctx, vendorIDs) + } + return retVal, "", err + }) +} diff --git a/globals/beegodb/beegodb.go b/globals/beegodb/beegodb.go index 595a3b403..9f21da47f 100644 --- a/globals/beegodb/beegodb.go +++ b/globals/beegodb/beegodb.go @@ -27,6 +27,7 @@ func Init() { //联盟订单 orm.RegisterModel(&model.UnionOrder{}) orm.RegisterModel(&model.UnionOrderStatus{}) + orm.RegisterModel(&model.UnionOrderSettle{}) //订单结算 //任务 orm.RegisterModel(&model.Job{}, &model.JobCategory{}, &model.JobStep{}, &model.JobImg{}) orm.RegisterModel(&model.JobOrder{}) diff --git a/routers/commentsRouter_controllers.go b/routers/commentsRouter_controllers.go index cfc7ef43e..b0521b417 100644 --- a/routers/commentsRouter_controllers.go +++ b/routers/commentsRouter_controllers.go @@ -754,6 +754,15 @@ func init() { 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: "SettleUnionOrders", + Router: "/SettleUnionOrders", + 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: "GetOrders",