feat: order rpc

This commit is contained in:
zzw
2026-09-14 10:56:34 +08:00
parent 5a25bf9263
commit d895c9456d
5 changed files with 105 additions and 97 deletions
+10 -48
View File
@@ -4,7 +4,6 @@ import (
"context"
"fmt"
"math"
"strconv"
"lone-services/pkg/modelbase"
pkgpay "lone-services/pkg/payment"
@@ -12,7 +11,6 @@ import (
payment "lone-services/rpc/payment/pb"
"lone-services/services/payment/internal/channel"
"lone-services/services/payment/internal/dao"
"lone-services/services/payment/internal/model"
"lone-services/services/payment/internal/svc"
"github.com/zeromicro/go-zero/core/logx"
@@ -45,22 +43,23 @@ func (l *PayLogic) Pay(in *payment.PayReq) (*payment.Response, error) {
client := resolveClient(in.Client, loginUser.ClientCode)
channelCode := resolveChannel(in.Channel)
order, err := loadPayableOrder(in.OrderSn, loginUser.ID)
orderInfo, err := getOrderInfo(l.ctx, l.svcCtx.OrderSvcName, loginUser.ID, in.OrderSn, loginUser.Type)
if err != nil {
l.Errorf("pay load order: %v", err)
return failResponse(utils.ErrorNotFund), nil
}
if order.Status == dao.PayStatusOk {
if orderPayStatus(orderInfo) == dao.PayStatusOk {
return &payment.Response{
Code: int32(utils.ErrorRepeatPayment.GetCode()),
Msg: utils.ErrorRepeatPayment.GetMsg(),
}, nil
}
if order.Status != dao.PayStatusWait && order.Status != dao.PayStatusIn && order.Status != dao.PayStatusFail {
status := orderPayStatus(orderInfo)
if status != dao.PayStatusWait && status != dao.PayStatusIn && status != dao.PayStatusFail {
return outResponse(utils.Fail, "订单状态不可支付"), nil
}
amountFen := yuanToFen(order.PayPrice)
amountFen := yuanToFen(orderInfo.PayPrice)
if amountFen <= 0 {
return outResponse(utils.Fail, "支付金额无效"), nil
}
@@ -97,39 +96,17 @@ func (l *PayLogic) Pay(in *payment.PayReq) (*payment.Response, error) {
return outResponse(utils.Fail, err.Error()), nil
}
_ = markOrderPaying(in.OrderSn, channelCode, in.OrderSn)
_ = updateOrderPayStatus(l.ctx, l.svcCtx.OrderSvcName, in.OrderSn, dao.PayStatusIn, 0, in.OrderSn, loginUser.Type)
return okResponse(result), nil
}
func loadPayableOrder(orderSn string, userID int64) (*dao.OrderPayRow, error) {
var row dao.OrderPayRow
err := model.OrderModel{}.Init().GetOne(modelbase.Params{
Eq: map[string]string{
"order_sn": orderSn,
},
}, &row)
if err != nil {
return nil, err
}
if row.Id < utils.NumberOne {
return nil, fmt.Errorf("order not found")
}
if row.UserId > 0 && row.UserId != userID {
return nil, fmt.Errorf("order user mismatch")
}
return &row, nil
}
func loadOpenID(userID int64) (string, error) {
var cred dao.UserCredential
err := model.UserCredentialModel{}.Init().GetOne(modelbase.Params{
Eq: map[string]string{
"user_id": strconv.FormatInt(userID, 10),
"credential_type": dao.CredentialTypeOpenid,
"status": strconv.Itoa(int(dao.CredentialEnabled)),
},
}, &cred)
err := modelbase.DB().Table(modelbase.Prefix()+"user_credential").
Where("user_id = ? AND credential_type = ? AND status = ?",
userID, dao.CredentialTypeOpenid, dao.CredentialEnabled).
Take(&cred).Error
if err != nil {
return "", err
}
@@ -139,21 +116,6 @@ func loadOpenID(userID int64) (string, error) {
return cred.Identifier, nil
}
func markOrderPaying(orderSn, channelCode, outTradeNo string) error {
payType := dao.ChannelToPayType(channelCode)
updates := map[string]any{
"status": dao.PayStatusIn,
"out_trade_no": outTradeNo,
}
if payType > 0 {
updates["pay_type"] = payType
}
_, err := model.OrderModel{}.Init().Edit(modelbase.Params{
Eq: map[string]string{"order_sn": orderSn},
}, updates)
return err
}
func yuanToFen(yuan float64) int64 {
return int64(math.Round(yuan * 100))
}