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 }