255 lines
7.6 KiB
Go
255 lines
7.6 KiB
Go
package financial
|
||
|
||
import (
|
||
"fmt"
|
||
"git.rosy.net.cn/baseapi/utils"
|
||
"git.rosy.net.cn/jx-callback/business/auth2"
|
||
"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, isFree bool) (errCode string, err error) {
|
||
var (
|
||
db = dao.GetDB()
|
||
memberCards []*model.MemberCard
|
||
memberCard *model.MemberCard
|
||
userIDReal string
|
||
)
|
||
if !isFree {
|
||
userIDReal = ctx.GetUserID()
|
||
} else {
|
||
userIDReal = userID
|
||
}
|
||
userMembers, err := dao.GetUserMember(db, userIDReal, model.MemberTypeNormal)
|
||
configList, err := dao.QueryConfigs(db, model.ConfigTypeName[model.ConfigTypeMemberCard], model.ConfigTypeMemberCard, "")
|
||
userBill, err := dao.GetUserBill(db, userIDReal, "")
|
||
if len(configList) <= 0 {
|
||
return "", fmt.Errorf("未找到会员卡配置!")
|
||
}
|
||
config := configList[0]
|
||
err = jxutils.Strings2Objs(config.Value, &memberCards)
|
||
if err != nil {
|
||
return "", err
|
||
}
|
||
for _, v := range memberCards {
|
||
if v.ID == memberID {
|
||
memberCard = v
|
||
}
|
||
}
|
||
if !isFree {
|
||
//验证微信绑定
|
||
if err = auth2.CheckWeixinminiAuthBind(userIDReal); err != nil {
|
||
return "", err
|
||
}
|
||
if userBill.AccountBalance < memberCard.ActPrice {
|
||
return model.ErrCodeAccountBalanceNotEnough, fmt.Errorf("用户余额不足,请充值!")
|
||
}
|
||
}
|
||
txDB, _ := dao.Begin(db)
|
||
defer func() {
|
||
if r := recover(); r != nil {
|
||
dao.Rollback(db, txDB)
|
||
panic(r)
|
||
}
|
||
}()
|
||
//证明已经开了会员了,相当于续费
|
||
if len(userMembers) > 0 {
|
||
userMember := userMembers[0]
|
||
if memberID == model.MemberCardTypeMonth {
|
||
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 {
|
||
dao.Rollback(db, txDB)
|
||
return
|
||
}
|
||
} else {
|
||
userMember2 := &model.UserMember{
|
||
UserID: userIDReal,
|
||
MemberType: model.MemberTypeNormal,
|
||
MemberTypeID: memberID,
|
||
}
|
||
if memberID == model.MemberCardTypeMonth {
|
||
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 {
|
||
dao.Rollback(db, txDB)
|
||
return
|
||
}
|
||
}
|
||
if !isFree {
|
||
|
||
//支出明细
|
||
if err = AddExpendUpdateAccount(txDB, userBill, model.BillTypeMember, memberCard.ActPrice, 0); err != nil {
|
||
dao.Rollback(db, txDB)
|
||
return
|
||
}
|
||
}
|
||
dao.Commit(db, txDB)
|
||
return errCode, err
|
||
}
|