247 lines
7.7 KiB
Go
247 lines
7.7 KiB
Go
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"
|
||
"git.rosy.net.cn/jx-callback/globals"
|
||
"github.com/astaxie/beego/client/orm"
|
||
"time"
|
||
)
|
||
|
||
func AddMixPay(txDB orm.TxOrmer, orderID string, balancePrice, totalPrice, status int) error {
|
||
mixPayInfo := &model.MixPay{
|
||
OrderID: orderID,
|
||
BalancePrice: balancePrice,
|
||
TotalPrice: totalPrice,
|
||
Status: status,
|
||
WxPrice: totalPrice - balancePrice,
|
||
}
|
||
dao.WrapAddIDCULEntity(mixPayInfo, jxcontext.AdminCtx.GetUserName())
|
||
return dao.CreateEntityTx(txDB, mixPayInfo)
|
||
}
|
||
|
||
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,
|
||
}
|
||
globals.SugarLogger.Debug("进入AddBillExpend")
|
||
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、账户支出增加一条记录
|
||
globals.SugarLogger.Debug("进入AddExpendUpdateAccount")
|
||
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
|
||
}
|