Files
jx-callback/business/partner/purchase/jx/localjx/lakala_pay.go
邹宗楠 cb974f7618 1
2025-08-05 10:47:00 +08:00

321 lines
10 KiB
Go

package localjx
import (
"fmt"
"git.rosy.net.cn/baseapi/platformapi/lakala"
"git.rosy.net.cn/baseapi/utils"
"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/business/partner"
"git.rosy.net.cn/jx-callback/globals/api"
"time"
)
// RefundBarCodeScannerOrderByLaKaLa 拉卡拉退款
func RefundBarCodeScannerOrderByLaKaLa(ctx *jxcontext.Context, vendorOrderId string, skuIds map[int]int, reason string, refund string) (resp interface{}, err error) {
db := dao.GetDB()
txDB, _ := dao.Begin(db)
defer func() {
if r := recover(); r != nil || err != nil {
dao.Rollback(db, txDB)
if r != nil {
panic(r)
}
}
}()
goodsOrder, err := partner.CurOrderManager.LoadOrder(vendorOrderId, model.VendorIDJX)
if err != nil {
dao.Rollback(db, txDB)
return nil, err
}
// 检查订单售后
refundType, refundMoney, err := checkJxAfsOrder(db, goodsOrder, vendorOrderId, skuIds)
if err != nil {
dao.Rollback(db, txDB)
return nil, err
}
// 本地添加售后数据
afsOrder, orderSkuFinancial, afsOrderSkuFinancial, err := addRefundSku(ctx, goodsOrder, skuIds, reason, refundType)
if err != nil {
dao.Rollback(db, txDB)
return nil, err
}
if err = dao.CreateEntity(db, afsOrder); err != nil {
dao.Rollback(db, txDB)
return nil, err
}
if err = dao.CreateMultiEntities(db, orderSkuFinancial); err != nil {
dao.Rollback(db, txDB)
return nil, err
}
if err = dao.CreateMultiEntities(db, afsOrderSkuFinancial); err != nil {
dao.Rollback(db, txDB)
return nil, err
}
goodsOrder.TotalShopMoney -= int64(refundMoney)
dao.UpdateEntity(db, goodsOrder, "TotalShopMoney")
dao.Commit(db, txDB)
return resp, nil
}
func RefundOrderByLaKaLa(ctx *jxcontext.Context, orderPay *model.OrderPay, afsOrder *model.AfsOrder, refundID string, refundFee int, refundDesc string) (orderPayRefund *model.OrderPayRefund, err error) {
var (
db = dao.GetDB()
)
order, err := partner.CurOrderManager.LoadOrder(orderPay.VendorOrderID, orderPay.VendorID)
if err != nil {
return nil, err
}
// 通知退款,等待回传
incoming, err := dao.GetStoreInfoByMerchantID(db, "", order.JxStoreID, "", "")
if err != nil {
return nil, err
}
switch orderPay.VendorPayType {
case lakala.PayWayAPP: // 收银台
param := &lakala.RefundOrderReq{
MerchantNo: incoming.MerchantNo2,
TermNo: incoming.TermNo,
OutTradeNo: afsOrder.AfsOrderID,
RefundAmount: utils.Int2Str(refundFee),
OriginBizType: "3",
OriginTradeDate: order.OrderCreatedAt.Format("20060102"),
OriginLogNo: "",
OriginTradeNo: order.VendorOrderID,
OriginCardNo: "",
LocationInfo: nil,
RefundType: "",
}
resp, err := api.LaKaLaApi.RefundOrder(param)
orderPayRefund = &model.OrderPayRefund{
RefundID: refundID,
VendorRefundID: resp.OriginTradeNo,
VendorOrderID: orderPay.VendorOrderID,
VendorID: orderPay.VendorID,
Status: model.RefundStatusYes,
TransactionID: resp.LogNo,
RefundFee: refundFee,
RefundCreatedAt: time.Now(),
}
if err == nil {
orderPayRefund.Status = model.RefundStatusYes
orderPayRefund.OriginalData = utils.Format4Output(resp, true)
orderPay.Status = model.PayStatusRefund
dao.UpdateEntity(db, orderPay, "Status")
} else {
orderPayRefund.Status = model.RefundStatusNo
orderPayRefund.OriginalData = err.Error()
}
dao.WrapAddIDCULDEntity(orderPayRefund, ctx.GetUserName())
dao.CreateEntity(db, orderPayRefund)
case lakala.PayWayMini, lakala.PayWayRegister: // 主扫被扫
param := &lakala.AggregateRefundReq{
MerchantNo: incoming.MerchantNo2,
TermNo: incoming.TermNo,
OutTradeNo: afsOrder.AfsOrderID,
RefundAmount: utils.Int2Str(refundFee),
RefundReason: refundDesc,
OriginOutTradeNo: order.VendorOrderID,
OriginTradeNo: "",
OriginLogNo: "",
LocationInfo: lakala.LocationInfoObj{RequestIp: ctx.GetRealRemoteIP()},
}
resp, err := api.LaKaLaApi.AggregateRefund(param)
orderPayRefund = &model.OrderPayRefund{
RefundID: refundID,
VendorRefundID: resp.OriginTradeNo,
VendorOrderID: orderPay.VendorOrderID,
VendorID: orderPay.VendorID,
Status: model.RefundStatusYes,
TransactionID: orderPay.TransactionID,
RefundFee: refundFee,
RefundCreatedAt: time.Now(),
}
if err == nil {
orderPayRefund.Status = model.RefundStatusYes
orderPayRefund.OriginalData = utils.Format4Output(resp, true)
orderPay.Status = model.PayStatusRefund
dao.UpdateEntity(db, orderPay, "Status")
} else {
orderPayRefund.Status = model.RefundStatusNo
orderPayRefund.OriginalData = err.Error()
}
dao.WrapAddIDCULDEntity(orderPayRefund, ctx.GetUserName())
dao.CreateEntity(db, orderPayRefund)
}
if order.TotalShopMoney == int64(refundFee) && err == nil {
order.Status = model.OrderStatusCanceled
order.VendorStatus = "laKaLaRefund"
dao.UpdateEntity(db, order, "Status", "VendorStatus")
}
return orderPayRefund, err
}
// QueryBarCodeRefundStatus 退款订单状态查询
func QueryBarCodeRefundStatus(afsOrderID string) (resp []*lakala.RefundOrderQueryResp, err error) {
db := dao.GetDB()
txDB, _ := dao.Begin(db)
defer func() {
if r := recover(); r != nil || err != nil {
dao.Rollback(db, txDB)
if r != nil {
panic(r)
}
}
}()
afsOrder, err := partner.CurOrderManager.LoadAfsOrder(afsOrderID, model.VendorIDJX)
if err != nil {
return nil, err
}
goodsOrder, err := partner.CurOrderManager.LoadOrder(afsOrder.VendorOrderID, model.VendorIDJX)
if err != nil {
dao.Rollback(db, txDB)
return nil, err
}
// 通知退款,等待回传
incoming, err := dao.GetStoreInfoByMerchantID(db, "", goodsOrder.JxStoreID, "", "")
if err != nil {
return nil, err
}
param := &lakala.RefundOrderQueryReq{
MerchantNo: incoming.MerchantNo,
TermNo: incoming.TermNo,
OutTradeNo: lakala.GetOrderNumber(8),
OriginTradeDate: afsOrder.AfsCreatedAt.Format("20060102"),
OriginBizType: "3",
OriginTradeNo: "",
OriginTradeRefNo: "",
OriginOutTradeNo: afsOrderID,
}
result, err := api.LaKaLaApi.RefundOrderQuery(param)
if err != nil {
return nil, err
}
for _, v := range result {
if v.OutTradeNo == afsOrderID && v.TradeState == "SUCCESS" {
afsOrder.Status = model.AfsOrderStatusFinished
afsOrder.VendorStatus = v.TradeState
afsOrder.AfsFinishedAt = time.Now()
dao.UpdateEntity(db, afsOrder, "Status", "VendorStatus", "AfsFinishedAt")
}
}
return result, err
}
// BarCodeScannerPayByLaKaLa 拉卡拉扫码枪扫码
func BarCodeScannerPayByLaKaLa(ctx *jxcontext.Context, vendorOrderId, userPaymentLabel, ip string) (string, error) {
db := dao.GetDB()
goodsOrder, err := dao.GetSimpleOrder(db, vendorOrderId)
if err != nil {
return "", err
}
if goodsOrder.VendorID != model.VendorIDJX {
return "", fmt.Errorf("此订单不是京西订单,无法使用该功能")
}
merchantObj, err := dao.GetStoreInfoByMerchantID(db, "", goodsOrder.JxStoreID, "", "")
if err != nil {
return "", err
}
parma := &lakala.PayMicroPayReq{
MerchantNo: merchantObj.MerchantNo,
TermNo: merchantObj.TermNo,
OutTradeNo: goodsOrder.VendorOrderID,
AuthCode: userPaymentLabel,
TotalAmount: utils.Int64ToStr(goodsOrder.ActualPayPrice),
LocationInfo: lakala.LocationInfoObj{
RequestIp: ip,
},
NotifyUrl: lakala.PayStatusCallback,
SettleType: "1",
Subject: fmt.Sprintf("感谢您在本店%s消费,欢迎下次再来", goodsOrder.StoreName),
}
code, msg, tradeNo, logNo, err := api.LaKaLaApi.ScannerPayMicroPay(parma)
if code == lakala.PaySuccess {
goodsOrder.Status = model.OrderStatusFinished
goodsOrder.VendorStatus = code
goodsOrder.VendorOrderID2 = logNo
goodsOrder.OrderFinishedAt = time.Now()
dao.UpdateEntity(db, goodsOrder, "Status", "VendorStatus", "OrderFinishedAt", "VendorOrderID2")
return "支付成功", nil
}
payInfo := &model.OrderPay{
PayOrderID: tradeNo,
PayType: model.PayTypeLaKaLa,
VendorPayType: lakala.PayWayAPP,
TransactionID: logNo,
VendorOrderID: goodsOrder.VendorOrderID,
VendorID: goodsOrder.VendorID,
Status: 0,
PayCreatedAt: time.Now(),
PrepayID: tradeNo,
CodeURL: "",
TotalFee: int(goodsOrder.ActualPayPrice),
}
dao.WrapAddIDCULDEntity(payInfo, ctx.GetUserName())
dao.CreateEntity(db, payInfo)
return msg, err
}
// LaKaLaBarCodeScannerStatus 刷新当前订单的支付状态
func LaKaLaBarCodeScannerStatus(vendorOrderId string) (vendorStatus string, err error) {
db := dao.GetDB()
goodsOrder, err := dao.GetSimpleOrder(db, vendorOrderId)
if err != nil {
return "", err
}
if goodsOrder.VendorID != model.VendorIDJX {
return "", fmt.Errorf("此订单不是京西订单,无法使用该功能")
}
merchantObj, err := dao.GetStoreInfoByMerchantID(db, "", goodsOrder.JxStoreID, "", "")
if err != nil {
return "", err
}
param := &lakala.PayStatusQueryReq{
MerchantNo: merchantObj.MerchantNo,
TermNo: merchantObj.TermNo,
OutTradeNo: goodsOrder.VendorOrderID,
TradeNo: "",
}
result, err := api.LaKaLaApi.PayStatusQuery(param)
if err != nil {
return "", err
}
switch result.TradeState {
case lakala.PayStatusINIT, lakala.PayStatusCREATE, lakala.PayStatusDEAL:
goodsOrder.Status = model.OrderStatusWaitPay
goodsOrder.VendorStatus = lakala.PayStatusINIT
case lakala.PayStatusSUCCESS, lakala.PayStatusPARTREFUND:
goodsOrder.Status = model.OrderStatusFinished
goodsOrder.VendorStatus = lakala.PayStatusSUCCESS
goodsOrder.OrderFinishedAt = time.Now()
case lakala.PayStatusFAIL, lakala.PayStatusCLOSE, lakala.PayStatusREFUND:
goodsOrder.Status = model.OrderStatusCanceled
goodsOrder.VendorStatus = lakala.PayStatusFAIL
goodsOrder.OrderFinishedAt = time.Now()
case lakala.PayStatusUNKNOWN:
}
dao.UpdateEntity(db, goodsOrder, "Status", "VendorStatus", "OrderFinishedAt")
partner.CurOrderManager.OnOrderMsg(goodsOrder, result.TradeState, fmt.Sprintf("扫码枪扫码刷新结果:[code:%s,说明:%s,异常原因:%s],本地状态[%d]", result.TradeState, result.TradeStateDesc, "", goodsOrder.Status))
return result.TradeStateDesc, err
}