package financial import ( _ "fmt" "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) { billIncome := &model.BillIncome{ BillID: billID, Type: billType, IncomePrice: incomePrice, JobID: jobID, } dao.WrapAddIDCULEntity(billIncome, jxcontext.AdminCtx.GetUserName()) return dao.CreateEntityTx(txDB, billIncome) } func AddBillExpend(txDB orm.TxOrmer, billID int64, billType, expendPrice, jobID int) (err error) { billExpend := &model.BillExpend{ BillID: billID, Type: billType, ExpendPrice: expendPrice, JobID: jobID, } dao.WrapAddIDCULEntity(billExpend, jxcontext.AdminCtx.GetUserName()) return dao.CreateEntityTx(txDB, billExpend) } 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.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) } func AddExpendUpdateAccount(txDB orm.TxOrmer, userBill *model.UserBill, billType, price, jobID int) (err error) { //1、账户支出增加一条记录 err = AddBillExpend(txDB, userBill.BillID, billType, price, jobID) if err != nil { return err } //2、账户表余额减少相应值 userBill.AccountBalance -= price _, err = dao.UpdateEntityTx(txDB, userBill, "AccountBalance") return err } func AddIncomeUpdateAccount(txDB orm.TxOrmer, userBill *model.UserBill, billType, price, jobID int) (err error) { //2、账户收入增加一条记录 err = AddBillIncome(txDB, userBill.BillID, billType, price, jobID) if err != nil { return err } //1、根据任务剩余数量退钱到账户余额中 userBill.AccountBalance += price _, 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 } //微信 老会员续费 func WXInvestMember(ctx *jxcontext.Context, memberID int, userID string) (errCode string, err error) { var db = dao.GetDB() //获取用户 当前会员信息 userMembers, err := dao.GetUserMember(db, userID, model.MemberTypeNormal) if err != nil { return "获取用户会员信息失败", err } //当前状态是否是会员 续费/开通 if len(userMembers) > 0 { userMember := userMembers[0] if memberID == model.OrderTypeMember { userMember.EndAt = userMember.EndAt.AddDate(0, 1, 0) } else { userMember.EndAt = userMember.EndAt.AddDate(1, 0, 0) } if _, err = dao.UpdateEntity(db, userMember, "EndAt"); err != nil { return "更新会员到期时间失败", err } } else { userMember2 := &model.UserMember{ UserID: userID, MemberType: model.MemberTypeNormal, MemberTypeID: memberID, } if memberID == model.OrderTypeMember { userMember2.EndAt = time.Now().AddDate(0, 1, 0) } else { userMember2.EndAt = time.Now().AddDate(1, 0, 0) } dao.WrapAddIDCULDEntity(userMember2, ctx.GetUserName()) if err = dao.CreateEntity(db, userMember2); err != nil { return "开通会员失败", err } } return errCode, err } //微信 新充值会员 func WXInvestMemberNew(ctx *jxcontext.Context, memberID int, userID string) (errCode string, err error) { var db = dao.GetDB() userMember2 := &model.UserMember{ UserID: userID, MemberType: 1, //model.MemberTypeNormal, MemberTypeID: 1, } if memberID == model.OrderTypeMember { userMember2.EndAt = time.Now().AddDate(0, 1, 0) } else { userMember2.EndAt = time.Now().AddDate(1, 0, 0) } userinfo, err := dao.GetUser(db, userMember2.UserID) if err != nil { return "", err } userMember2.LastOperator = userinfo.UserID2 userMember2.DeletedAt = utils.DefaultTimeValue if err = dao.CreateEntity(db, userMember2); err != nil { return "开通会员失败", err } return errCode, err }