274 lines
8.2 KiB
Go
274 lines
8.2 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"
|
|
"strings"
|
|
"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
|
|
}
|
|
|
|
// 通知退款,等待回传
|
|
incoming, err := dao.GetStoreInfoByMerchantID(db, "", goodsOrder.JxStoreID, "", "")
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
switch refund {
|
|
case "toStore": // 收银台
|
|
param := &lakala.RefundOrderReq{
|
|
MerchantNo: incoming.MerchantNo,
|
|
TermNo: incoming.TermNo,
|
|
OutTradeNo: afsOrder.AfsOrderID,
|
|
RefundAmount: utils.Int2Str(refundMoney),
|
|
OriginBizType: "3",
|
|
OriginTradeDate: goodsOrder.OrderCreatedAt.Format("20060102"),
|
|
OriginLogNo: "",
|
|
OriginTradeNo: "",
|
|
OriginCardNo: "",
|
|
LocationInfo: nil,
|
|
RefundType: "",
|
|
}
|
|
|
|
resp, err = api.LaKaLaApi.RefundOrder(param)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
case "aggregate": // 聚合支付
|
|
param := &lakala.AggregateRefundReq{
|
|
MerchantNo: incoming.MerchantNo,
|
|
TermNo: incoming.TermNo,
|
|
OutTradeNo: afsOrder.AfsOrderID,
|
|
RefundAmount: utils.Int2Str(refundMoney),
|
|
RefundReason: reason,
|
|
OriginOutTradeNo: goodsOrder.VendorOrderID,
|
|
OriginTradeNo: "",
|
|
OriginLogNo: "",
|
|
LocationInfo: lakala.LocationInfoObj{RequestIp: ctx.GetRealRemoteIP()},
|
|
}
|
|
resp, err = api.LaKaLaApi.AggregateRefund(param)
|
|
if err != nil {
|
|
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
|
|
}
|
|
|
|
// 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, payOrderId, err := api.LaKaLaApi.ScannerPayMicroPay(parma)
|
|
if code == lakala.PaySuccess {
|
|
goodsOrder.Status = model.OrderStatusFinished
|
|
goodsOrder.VendorStatus = code
|
|
goodsOrder.OrderFinishedAt = time.Now()
|
|
dao.UpdateEntity(db, goodsOrder, "Status", "VendorStatus", "OrderFinishedAt")
|
|
return "支付成功", nil
|
|
}
|
|
|
|
vendorPayType := ""
|
|
if strings.Contains(userPaymentLabel, "101112131415") {
|
|
vendorPayType = lakala.Wechat
|
|
} else {
|
|
vendorPayType = lakala.Alipay
|
|
}
|
|
payInfo := &model.OrderPay{
|
|
PayOrderID: payOrderId,
|
|
PayType: model.PayTypeLaKaLa,
|
|
VendorPayType: vendorPayType,
|
|
TransactionID: userPaymentLabel,
|
|
VendorOrderID: goodsOrder.VendorOrderID,
|
|
VendorID: goodsOrder.VendorID,
|
|
Status: 0,
|
|
PayCreatedAt: time.Now(),
|
|
PrepayID: userPaymentLabel,
|
|
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
|
|
}
|