feat: import services and standardize Go 1.26.5
This commit is contained in:
62
apps/finance/wallet/internal/logic/basic/add_bank_card.go
Normal file
62
apps/finance/wallet/internal/logic/basic/add_bank_card.go
Normal file
@@ -0,0 +1,62 @@
|
||||
package basic
|
||||
|
||||
import (
|
||||
"context"
|
||||
"time"
|
||||
|
||||
"git.apinb.com/bsm-finance/wallet/internal/impl"
|
||||
"git.apinb.com/bsm-finance/wallet/internal/models"
|
||||
pb "git.apinb.com/bsm-finance/wallet/pb"
|
||||
"git.apinb.com/bsm-sdk/core/errcode"
|
||||
"git.apinb.com/bsm-sdk/core/printer"
|
||||
"git.apinb.com/bsm-sdk/core/service"
|
||||
"git.apinb.com/bsm-sdk/core/utils"
|
||||
"git.apinb.com/bsm-sdk/core/vars"
|
||||
)
|
||||
|
||||
// 添加银行卡
|
||||
func AddBankCard(ctx context.Context, in *pb.AddBankCardRequest) (reply *pb.StatusReply, err error) {
|
||||
auth, ok := service.ParseMetaCtx(ctx, nil)
|
||||
if ok != nil {
|
||||
return nil, ok
|
||||
}
|
||||
|
||||
if in.Phone == "" || in.IdCard == "" || in.CardNo == "" || in.CardOwner == "" {
|
||||
return nil, errcode.ErrInvalidArgument
|
||||
}
|
||||
|
||||
myWallet, err := models.GetWalletByPassportIdentity(auth.ID, auth.Identity)
|
||||
if err != nil {
|
||||
printer.Error(err.Error())
|
||||
return nil, errcode.ErrDB
|
||||
}
|
||||
|
||||
// Try to enrich bank meta if exists locally; ignore not found.
|
||||
var cardInfo models.WalletBank
|
||||
_ = impl.DBService.Where("card_no = ?", in.CardNo).First(&cardInfo).Error
|
||||
|
||||
data := &models.WalletBank{
|
||||
WalletIdentity: myWallet.Identity,
|
||||
CardNo: in.CardNo,
|
||||
BankName: cardInfo.BankName,
|
||||
Bank: cardInfo.Bank,
|
||||
BankType: cardInfo.BankType,
|
||||
CardOwner: in.CardOwner,
|
||||
IDCard: in.IdCard,
|
||||
Phone: in.Phone,
|
||||
}
|
||||
|
||||
data.Identity = utils.UUID()
|
||||
data.PassportID = auth.ID
|
||||
data.PassportIdentity = auth.Identity
|
||||
|
||||
err = impl.DBService.Create(&data).Error
|
||||
if err != nil {
|
||||
printer.Error(err.Error())
|
||||
return nil, errcode.ErrDB
|
||||
}
|
||||
return &pb.StatusReply{
|
||||
Message: vars.OK,
|
||||
Timeseq: time.Now().UnixMilli(),
|
||||
}, nil
|
||||
}
|
||||
60
apps/finance/wallet/internal/logic/basic/apply_cash.go
Normal file
60
apps/finance/wallet/internal/logic/basic/apply_cash.go
Normal file
@@ -0,0 +1,60 @@
|
||||
package basic
|
||||
|
||||
import (
|
||||
"context"
|
||||
"time"
|
||||
|
||||
"git.apinb.com/bsm-finance/wallet/internal/excode"
|
||||
"git.apinb.com/bsm-finance/wallet/internal/impl"
|
||||
"git.apinb.com/bsm-finance/wallet/internal/models"
|
||||
pb "git.apinb.com/bsm-finance/wallet/pb"
|
||||
"git.apinb.com/bsm-sdk/core/errcode"
|
||||
"git.apinb.com/bsm-sdk/core/printer"
|
||||
"git.apinb.com/bsm-sdk/core/service"
|
||||
"git.apinb.com/bsm-sdk/core/utils"
|
||||
"git.apinb.com/bsm-sdk/core/vars"
|
||||
)
|
||||
|
||||
// 申请提现
|
||||
func ApplyCash(ctx context.Context, in *pb.ApplyCashRequest) (reply *pb.StatusReply, err error) {
|
||||
auth, ok := service.ParseMetaCtx(ctx, nil)
|
||||
if ok != nil {
|
||||
return nil, ok
|
||||
}
|
||||
|
||||
if in.Amount == 0 || in.Channel == 0 {
|
||||
return nil, errcode.ErrInvalidArgument
|
||||
}
|
||||
|
||||
myWallet, err := models.GetWalletByPassportIdentity(auth.ID, auth.Identity)
|
||||
if err != nil {
|
||||
printer.Error(err.Error())
|
||||
return nil, errcode.ErrDB
|
||||
}
|
||||
|
||||
if in.Amount > myWallet.Balance {
|
||||
return nil, excode.ErrBalanceNotEnough
|
||||
}
|
||||
|
||||
data := &models.WalletApplyCash{
|
||||
WalletIdentity: myWallet.Identity,
|
||||
Amount: in.Amount,
|
||||
Channel: int8(in.Channel),
|
||||
Remark: in.Remark,
|
||||
}
|
||||
data.Identity = utils.UUID()
|
||||
data.PassportID = auth.ID
|
||||
data.PassportIdentity = auth.Identity
|
||||
|
||||
err = impl.DBService.Create(&data).Error
|
||||
if err != nil {
|
||||
printer.Error(err.Error())
|
||||
return nil, errcode.ErrDB
|
||||
}
|
||||
|
||||
//生成提现单
|
||||
return &pb.StatusReply{
|
||||
Message: vars.OK,
|
||||
Timeseq: time.Now().UnixMilli(),
|
||||
}, nil
|
||||
}
|
||||
46
apps/finance/wallet/internal/logic/basic/bind_payment_id.go
Normal file
46
apps/finance/wallet/internal/logic/basic/bind_payment_id.go
Normal file
@@ -0,0 +1,46 @@
|
||||
package basic
|
||||
|
||||
import (
|
||||
"context"
|
||||
"time"
|
||||
|
||||
"git.apinb.com/bsm-finance/wallet/internal/impl"
|
||||
"git.apinb.com/bsm-finance/wallet/internal/models"
|
||||
pb "git.apinb.com/bsm-finance/wallet/pb"
|
||||
"git.apinb.com/bsm-sdk/core/errcode"
|
||||
"git.apinb.com/bsm-sdk/core/printer"
|
||||
"git.apinb.com/bsm-sdk/core/service"
|
||||
"git.apinb.com/bsm-sdk/core/vars"
|
||||
)
|
||||
|
||||
// 绑定微信或支付宝账户
|
||||
func BindPaymentId(ctx context.Context, in *pb.BindPaymentIDRequest) (reply *pb.StatusReply, err error) {
|
||||
auth, ok := service.ParseMetaCtx(ctx, nil)
|
||||
if ok != nil {
|
||||
return nil, ok
|
||||
}
|
||||
|
||||
if in.PayType == 0 || in.AuthCode == "" {
|
||||
return nil, errcode.ErrInvalidArgument
|
||||
}
|
||||
|
||||
var filed string
|
||||
//通过code获取微信或者支付宝的openid
|
||||
if in.PayType == 1 {
|
||||
filed = "wxpay_id"
|
||||
}
|
||||
if in.PayType == 2 {
|
||||
filed = "alipay_id"
|
||||
}
|
||||
|
||||
err = impl.DBService.Model(&models.WalletBasic{}).Where("passport_identity=?", auth.Identity).Update(filed, in.AuthCode).Error
|
||||
if err != nil {
|
||||
printer.Error(err.Error())
|
||||
return nil, errcode.ErrDB
|
||||
}
|
||||
|
||||
return &pb.StatusReply{
|
||||
Message: vars.OK,
|
||||
Timeseq: time.Now().UnixMilli(),
|
||||
}, nil
|
||||
}
|
||||
54
apps/finance/wallet/internal/logic/basic/get_bank_card.go
Normal file
54
apps/finance/wallet/internal/logic/basic/get_bank_card.go
Normal file
@@ -0,0 +1,54 @@
|
||||
package basic
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"git.apinb.com/bsm-finance/wallet/internal/impl"
|
||||
"git.apinb.com/bsm-finance/wallet/internal/models"
|
||||
pb "git.apinb.com/bsm-finance/wallet/pb"
|
||||
"git.apinb.com/bsm-sdk/core/errcode"
|
||||
"git.apinb.com/bsm-sdk/core/printer"
|
||||
"git.apinb.com/bsm-sdk/core/service"
|
||||
"git.apinb.com/bsm-sdk/core/vars"
|
||||
)
|
||||
|
||||
// 获取用户银行卡列表
|
||||
func GetBankCard(ctx context.Context, in *pb.FinanceEmpty) (reply *pb.GetBankCardReply, err error) {
|
||||
auth, ok := service.ParseMetaCtx(ctx, nil)
|
||||
if ok != nil {
|
||||
return nil, ok
|
||||
}
|
||||
|
||||
myWallet, err := models.GetWalletByPassportIdentity(auth.ID, auth.Identity)
|
||||
if err != nil {
|
||||
printer.Error(err.Error())
|
||||
return nil, errcode.ErrDB
|
||||
}
|
||||
|
||||
result := make([]*models.WalletBank, 0)
|
||||
err = impl.DBService.Where("wallet_identity=?", myWallet.Identity).Find(&result).Error
|
||||
if err != nil {
|
||||
printer.Error(err.Error())
|
||||
return nil, errcode.ErrDB
|
||||
}
|
||||
|
||||
data := make([]*pb.BankCardInfo, 0)
|
||||
for _, card := range result {
|
||||
data = append(data, &pb.BankCardInfo{
|
||||
Id: int64(card.ID),
|
||||
Bank: card.Bank,
|
||||
BankName: card.BankName,
|
||||
BankType: card.BankType,
|
||||
BankNumber: card.CardNo,
|
||||
BindId: card.BindID,
|
||||
Phone: card.Phone,
|
||||
CardOwner: card.CardOwner,
|
||||
IdCard: card.IDCard,
|
||||
Created: card.CreatedAt.Format(vars.YYYY_MM_DD),
|
||||
})
|
||||
}
|
||||
|
||||
return &pb.GetBankCardReply{
|
||||
Data: data,
|
||||
}, nil
|
||||
}
|
||||
86
apps/finance/wallet/internal/logic/basic/get_wallet.go
Normal file
86
apps/finance/wallet/internal/logic/basic/get_wallet.go
Normal file
@@ -0,0 +1,86 @@
|
||||
package basic
|
||||
|
||||
import (
|
||||
"context"
|
||||
"strconv"
|
||||
"time"
|
||||
|
||||
"git.apinb.com/bsm-finance/wallet/internal/impl"
|
||||
"git.apinb.com/bsm-finance/wallet/internal/models"
|
||||
pb "git.apinb.com/bsm-finance/wallet/pb"
|
||||
"git.apinb.com/bsm-sdk/core/errcode"
|
||||
"git.apinb.com/bsm-sdk/core/printer"
|
||||
"git.apinb.com/bsm-sdk/core/service"
|
||||
"git.apinb.com/bsm-sdk/core/vars"
|
||||
)
|
||||
|
||||
// 获取钱包信息
|
||||
func GetWallet(ctx context.Context, in *pb.GetWalletRequest) (reply *pb.GetWalletReply, err error) {
|
||||
auth, ok := service.ParseMetaCtx(ctx, nil)
|
||||
if ok != nil {
|
||||
return nil, ok
|
||||
}
|
||||
|
||||
myWallet, err := models.GetWalletByPassportIdentity(auth.ID, auth.Identity)
|
||||
if err != nil {
|
||||
printer.Error(err.Error())
|
||||
return nil, errcode.ErrDB
|
||||
}
|
||||
|
||||
var transIn int8 = 1 // 收入
|
||||
var transOut int8 = -1 // 支出
|
||||
|
||||
ymd, _ := strconv.Atoi(time.Now().Format(vars.YYYYMMDD))
|
||||
ym := time.Now().Year()*100 + int(time.Now().Month())
|
||||
|
||||
var totalMoney int64
|
||||
total := make(map[string]int64)
|
||||
|
||||
// 统计当日收入
|
||||
if in.IsTotalTodayIn {
|
||||
impl.DBService.Model(&models.WalletRecord{}).Select("sum(money)").Where("passport_id=? AND trans_type=? AND ymd=?", auth.ID, transIn, ymd).Scan(&totalMoney)
|
||||
total["TodayIn"] = totalMoney
|
||||
}
|
||||
|
||||
// 统计当日支出
|
||||
if in.IsTotalTodayOut {
|
||||
impl.DBService.Model(&models.WalletRecord{}).Select("sum(money)").Where("passport_id=? AND trans_type=? AND ymd=?", auth.ID, transOut, ymd).Scan(&totalMoney)
|
||||
total["TodayOut"] = totalMoney
|
||||
}
|
||||
|
||||
// 统计本月收入
|
||||
if in.IsTotalMonthIn {
|
||||
impl.DBService.Model(&models.WalletRecord{}).Select("sum(money)").Where("passport_id=? AND trans_type=? AND ym=?", auth.ID, transIn, ym).Scan(&totalMoney)
|
||||
total["MonthIn"] = totalMoney
|
||||
}
|
||||
|
||||
// 统计本月支出
|
||||
if in.IsTotalMonthOut {
|
||||
impl.DBService.Model(&models.WalletRecord{}).Select("sum(money)").Where("passport_id=? AND trans_type=? AND ym=?", auth.ID, transOut, ym).Scan(&totalMoney)
|
||||
total["MonthOut"] = totalMoney
|
||||
}
|
||||
|
||||
// 统计全部收入
|
||||
if in.IsTotalAllIn {
|
||||
impl.DBService.Model(&models.WalletRecord{}).Select("sum(money)").Where("passport_id=? AND trans_type=? ", auth.ID, transIn).Scan(&totalMoney)
|
||||
total["AllIn"] = totalMoney
|
||||
}
|
||||
|
||||
// 统计全部支出
|
||||
if in.IsTotalAllOut {
|
||||
impl.DBService.Model(&models.WalletRecord{}).Select("sum(money)").Where("passport_id=? AND trans_type=? ", auth.ID, transOut).Scan(&totalMoney)
|
||||
total["AllOut"] = totalMoney
|
||||
}
|
||||
// remove useless fmt.Sprint side-effect-free call
|
||||
return &pb.GetWalletReply{
|
||||
PassportIdentity: myWallet.PassportIdentity,
|
||||
WalletIdentity: myWallet.Identity,
|
||||
Balance: myWallet.Balance,
|
||||
WithdrawalBalance: myWallet.WithdrawalBalance,
|
||||
Total: total,
|
||||
Status: int32(myWallet.Status),
|
||||
AlipayId: myWallet.AlipayID,
|
||||
WxpayId: myWallet.WxpayID,
|
||||
Created: myWallet.CreatedAt.Format(vars.YYYY_MM_DD_HH_MM_SS),
|
||||
}, nil
|
||||
}
|
||||
37
apps/finance/wallet/internal/logic/basic/rm_bank_card.go
Normal file
37
apps/finance/wallet/internal/logic/basic/rm_bank_card.go
Normal file
@@ -0,0 +1,37 @@
|
||||
package basic
|
||||
|
||||
import (
|
||||
"context"
|
||||
"time"
|
||||
|
||||
"git.apinb.com/bsm-finance/wallet/internal/impl"
|
||||
"git.apinb.com/bsm-finance/wallet/internal/models"
|
||||
pb "git.apinb.com/bsm-finance/wallet/pb"
|
||||
"git.apinb.com/bsm-sdk/core/errcode"
|
||||
"git.apinb.com/bsm-sdk/core/printer"
|
||||
"git.apinb.com/bsm-sdk/core/service"
|
||||
"git.apinb.com/bsm-sdk/core/vars"
|
||||
)
|
||||
|
||||
// 删除银行卡
|
||||
func RmBankCard(ctx context.Context, in *pb.RmBankCardRequest) (reply *pb.StatusReply, err error) {
|
||||
auth, ok := service.ParseMetaCtx(ctx, nil)
|
||||
if ok != nil {
|
||||
return nil, ok
|
||||
}
|
||||
|
||||
if in.Identity == "" {
|
||||
return nil, errcode.ErrInvalidArgument
|
||||
}
|
||||
|
||||
err = impl.DBService.Where("passport_identity=? and identity=?", auth.Identity, in.Identity).Delete(&models.WalletBank{}).Error
|
||||
if err != nil {
|
||||
printer.Error(err.Error())
|
||||
return nil, errcode.ErrDB
|
||||
}
|
||||
|
||||
return &pb.StatusReply{
|
||||
Message: vars.OK,
|
||||
Timeseq: time.Now().UnixMilli(),
|
||||
}, nil
|
||||
}
|
||||
39
apps/finance/wallet/internal/logic/basic/set_pay_password.go
Normal file
39
apps/finance/wallet/internal/logic/basic/set_pay_password.go
Normal file
@@ -0,0 +1,39 @@
|
||||
package basic
|
||||
|
||||
import (
|
||||
"context"
|
||||
"time"
|
||||
|
||||
"git.apinb.com/bsm-finance/wallet/internal/impl"
|
||||
"git.apinb.com/bsm-finance/wallet/internal/models"
|
||||
pb "git.apinb.com/bsm-finance/wallet/pb"
|
||||
"git.apinb.com/bsm-sdk/core/errcode"
|
||||
"git.apinb.com/bsm-sdk/core/printer"
|
||||
"git.apinb.com/bsm-sdk/core/service"
|
||||
"git.apinb.com/bsm-sdk/core/vars"
|
||||
)
|
||||
|
||||
// 设置支付密码
|
||||
func SetPayPassword(ctx context.Context, in *pb.SetPayPasswordRequest) (reply *pb.StatusReply, err error) {
|
||||
auth, ok := service.ParseMetaCtx(ctx, nil)
|
||||
if ok != nil {
|
||||
return nil, ok
|
||||
}
|
||||
|
||||
if in.Password == "" {
|
||||
return nil, errcode.ErrPassword
|
||||
}
|
||||
|
||||
encPassword := EncodePassword(in.Password, auth.Identity)
|
||||
|
||||
err = impl.DBService.Model(&models.WalletBasic{}).Where("passport_identity", auth.Identity).Update("pay_password", encPassword).Error
|
||||
if err != nil {
|
||||
printer.Error(err.Error())
|
||||
return nil, errcode.ErrDB
|
||||
}
|
||||
|
||||
return &pb.StatusReply{
|
||||
Message: vars.OK,
|
||||
Timeseq: time.Now().UnixMilli(),
|
||||
}, nil
|
||||
}
|
||||
54
apps/finance/wallet/internal/logic/basic/transactions.go
Normal file
54
apps/finance/wallet/internal/logic/basic/transactions.go
Normal file
@@ -0,0 +1,54 @@
|
||||
package basic
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"git.apinb.com/bsm-finance/wallet/internal/models"
|
||||
pb "git.apinb.com/bsm-finance/wallet/pb"
|
||||
"git.apinb.com/bsm-sdk/core/errcode"
|
||||
"git.apinb.com/bsm-sdk/core/printer"
|
||||
"git.apinb.com/bsm-sdk/core/service"
|
||||
"git.apinb.com/bsm-sdk/core/vars"
|
||||
)
|
||||
|
||||
// 查询交易记录
|
||||
func Transactions(ctx context.Context, in *pb.TransactionsRequest) (reply *pb.TransactionsReply, err error) {
|
||||
auth, err := service.ParseMetaCtx(ctx, nil)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if in.Page <= 1 {
|
||||
in.Page = 1
|
||||
}
|
||||
if in.PageSize <= 1 {
|
||||
in.PageSize = 20
|
||||
}
|
||||
list, total, err := models.FindWalletRecords(auth.Identity, in.Start, in.End, in.TransType, in.TradeType, in.Page, in.PageSize)
|
||||
if err != nil {
|
||||
printer.Error(err.Error())
|
||||
return nil, errcode.ErrDB
|
||||
}
|
||||
res := &pb.TransactionsReply{
|
||||
Total: total,
|
||||
}
|
||||
data := make([]*pb.Transaction, 0)
|
||||
if len(list) > 0 {
|
||||
for _, item := range list {
|
||||
data = append(data, &pb.Transaction{
|
||||
TransType: int32(item.TransType),
|
||||
TradeType: int32(item.TradeType),
|
||||
InTradeNo: item.InTradeNo,
|
||||
OutTradeNo: item.OutTradeNo,
|
||||
Money: item.Money,
|
||||
Fee: item.Fee,
|
||||
PayChannel: int32(item.PayChannel),
|
||||
PayType: item.PayType,
|
||||
Remark: item.Remark,
|
||||
Created: item.CreatedAt.Format(vars.YYYY_MM_DD_HH_MM_SS),
|
||||
})
|
||||
}
|
||||
}
|
||||
res.Records = data
|
||||
return res, nil
|
||||
}
|
||||
69
apps/finance/wallet/internal/logic/basic/wallet.go
Normal file
69
apps/finance/wallet/internal/logic/basic/wallet.go
Normal file
@@ -0,0 +1,69 @@
|
||||
// Package basic 钱包基础业务逻辑
|
||||
package basic
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"git.apinb.com/bsm-finance/wallet/internal/config"
|
||||
"git.apinb.com/bsm-finance/wallet/internal/excode"
|
||||
"git.apinb.com/bsm-finance/wallet/internal/impl"
|
||||
"git.apinb.com/bsm-finance/wallet/internal/models"
|
||||
"git.apinb.com/bsm-sdk/core/errcode"
|
||||
"git.apinb.com/bsm-sdk/core/utils"
|
||||
)
|
||||
|
||||
// WalletPay 钱包支付结构体
|
||||
type WalletPay struct {
|
||||
ctx context.Context
|
||||
Body *models.WalletBasic
|
||||
}
|
||||
|
||||
// NewWallet 创建钱包支付实例
|
||||
// 验证用户身份、钱包状态、支付密码和余额
|
||||
func NewWallet(passportIdentity, pwd string, amount int64) (*WalletPay, error) {
|
||||
// 检查钱包是否存在
|
||||
wallet := models.WalletExists(passportIdentity)
|
||||
if wallet == nil {
|
||||
return nil, errcode.ErrNotFound(404, "wallet")
|
||||
}
|
||||
|
||||
// 检查钱包状态
|
||||
if wallet.Status == -1 {
|
||||
return nil, errcode.ErrPermissionDenied
|
||||
}
|
||||
|
||||
// 验证支付密码
|
||||
encPassword := EncodePassword(pwd, passportIdentity)
|
||||
if encPassword != wallet.PayPassword {
|
||||
return nil, errcode.ErrPassword
|
||||
}
|
||||
|
||||
// 检查余额是否足够
|
||||
if amount > wallet.Balance {
|
||||
return nil, excode.ErrBalanceNotEnough
|
||||
}
|
||||
|
||||
return &WalletPay{
|
||||
Body: wallet,
|
||||
}, nil
|
||||
}
|
||||
|
||||
// TradeConsum 执行交易消费
|
||||
// 扣除钱包余额和可提现余额
|
||||
func (srv *WalletPay) TradeConsum(amount int64) error {
|
||||
data := map[string]interface{}{
|
||||
"balance": srv.Body.Balance - amount,
|
||||
"withdrawal_balance": srv.Body.WithdrawalBalance - amount,
|
||||
}
|
||||
err := impl.DBService.Model(&models.WalletBasic{}).Where("identity=?", srv.Body.Identity).UpdateColumns(data).Error
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// EncodePassword 加密支付密码
|
||||
// 使用SHA256算法对密码进行加密
|
||||
func EncodePassword(pwd, passportIdentity string) string {
|
||||
return utils.Sha256(pwd, passportIdentity+config.Spec.Wallet.PublicKey)
|
||||
}
|
||||
Reference in New Issue
Block a user