This commit is contained in:
邹宗楠
2025-08-04 11:39:30 +08:00
parent ad2b46b2cc
commit a7a48ff1ee
7 changed files with 86 additions and 32 deletions

View File

@@ -490,9 +490,7 @@ func SeparateUnBind(param *lakala.SeparateUnBindReq) error {
} }
// SeparateQueryAmt 可分账金额查询 // SeparateQueryAmt 可分账金额查询
func SeparateQueryAmt(merchantNo, logNo, logDate string) (*lakala.SeparateQueryAmtResp, error) { func SeparateQueryAmt(merchantNo, logDate, logNo string) (*lakala.SeparateQueryAmtResp, error) {
logNo = lakala.GetOrderNumber(8)
logDate = utils.Time2TimeStrByFormat(time.Now(), "20060102")
result, err := api.LaKaLaApi.SeparateQueryAmt(merchantNo, logNo, logDate) result, err := api.LaKaLaApi.SeparateQueryAmt(merchantNo, logNo, logDate)
if err != nil { if err != nil {
return nil, err return nil, err
@@ -519,7 +517,7 @@ func Separate(ctx *jxcontext.Context, param *lakala.OrderSeparateReq) (string, s
param.OutSeparateNo = lakala.GetOrderNumber(10) param.OutSeparateNo = lakala.GetOrderNumber(10)
param.NotifyUrl = lakala.CallbackLaKaLaSeparateUrl param.NotifyUrl = lakala.CallbackLaKaLaSeparateUrl
status, separateNo, err := api.LaKaLaApi.Separate(param) status, separateNo, logNo, err := api.LaKaLaApi.Separate(param)
if err != nil { if err != nil {
return "", "", err return "", "", err
} }
@@ -532,6 +530,7 @@ func Separate(ctx *jxcontext.Context, param *lakala.OrderSeparateReq) (string, s
FinishDate: "", FinishDate: "",
TotalAmt: param.TotalAmt, TotalAmt: param.TotalAmt,
Status: status, Status: status,
LogNo: logNo,
DetailData: string(recv), DetailData: string(recv),
Remark: "分账", Remark: "分账",
} }

View File

@@ -127,6 +127,7 @@ type LakalaSeparateAmt struct {
CmdType string `orm:"column(cmd_type);size(32)" json:"cmdType"` // SEPARATE分账 CANCEL分账撤销FALLBACK分账回退 CmdType string `orm:"column(cmd_type);size(32)" json:"cmdType"` // SEPARATE分账 CANCEL分账撤销FALLBACK分账回退
SeparateNo string `orm:"column(separate_no);size(32)" json:"separateNo"` // 分账系统生成唯一流水 SeparateNo string `orm:"column(separate_no);size(32)" json:"separateNo"` // 分账系统生成唯一流水
Status string `orm:"column(status);size(32)" json:"status1"` // 分账状态 Status string `orm:"column(status);size(32)" json:"status1"` // 分账状态
LogNo string `orm:"column(log_no);size(32)" json:"logNo"` // 交易流水号
//SeparateNo2 string `orm:"column(separate_no2);size(32)" json:"separateNo2"` // 分账撤销系统生成唯一流水 //SeparateNo2 string `orm:"column(separate_no2);size(32)" json:"separateNo2"` // 分账撤销系统生成唯一流水
//Status2 string `orm:"column(status2);size(32)" json:"status2"` // 分账撤销状态 //Status2 string `orm:"column(status2);size(32)" json:"status2"` // 分账撤销状态
//SeparateNo3 string `orm:"column(separate_no3);size(32)" json:"separateNo3"` // 分账回退系统生成唯一流水 //SeparateNo3 string `orm:"column(separate_no3);size(32)" json:"separateNo3"` // 分账回退系统生成唯一流水

View File

@@ -14,7 +14,7 @@ import (
) )
// RefundBarCodeScannerOrderByLaKaLa 拉卡拉扫码枪退款 // RefundBarCodeScannerOrderByLaKaLa 拉卡拉扫码枪退款
func RefundBarCodeScannerOrderByLaKaLa(ctx *jxcontext.Context, vendorOrderId string, skuIds map[int]int, reason string) (err error) { func RefundBarCodeScannerOrderByLaKaLa(ctx *jxcontext.Context, vendorOrderId string, skuIds map[int]int, reason string, refund string) (resp interface{}, err error) {
db := dao.GetDB() db := dao.GetDB()
txDB, _ := dao.Begin(db) txDB, _ := dao.Begin(db)
defer func() { defer func() {
@@ -29,64 +29,83 @@ func RefundBarCodeScannerOrderByLaKaLa(ctx *jxcontext.Context, vendorOrderId str
goodsOrder, err := partner.CurOrderManager.LoadOrder(vendorOrderId, model.VendorIDJX) goodsOrder, err := partner.CurOrderManager.LoadOrder(vendorOrderId, model.VendorIDJX)
if err != nil { if err != nil {
dao.Rollback(db, txDB) dao.Rollback(db, txDB)
return err return nil, err
} }
// 检查订单售后 // 检查订单售后
refundType, refundMoney, err := checkJxAfsOrder(db, goodsOrder, vendorOrderId, skuIds) refundType, refundMoney, err := checkJxAfsOrder(db, goodsOrder, vendorOrderId, skuIds)
if err != nil { if err != nil {
dao.Rollback(db, txDB) dao.Rollback(db, txDB)
return err return nil, err
} }
// 本地添加售后数据 // 本地添加售后数据
afsOrder, orderSkuFinancial, afsOrderSkuFinancial, err := addRefundSku(ctx, goodsOrder, skuIds, reason, refundType) afsOrder, orderSkuFinancial, afsOrderSkuFinancial, err := addRefundSku(ctx, goodsOrder, skuIds, reason, refundType)
if err != nil { if err != nil {
dao.Rollback(db, txDB) dao.Rollback(db, txDB)
return err return nil, err
} }
// 通知退款,等待回传 // 通知退款,等待回传
incoming, err := dao.GetStoreInfoByMerchantID(db, "", goodsOrder.JxStoreID, "", "") incoming, err := dao.GetStoreInfoByMerchantID(db, "", goodsOrder.JxStoreID, "", "")
if err != nil { if err != nil {
return err return nil, err
}
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: "",
} }
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: "",
}
_, err = api.LaKaLaApi.RefundOrder(param) resp, err = api.LaKaLaApi.RefundOrder(param)
if err != nil { if err != nil {
return err 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 { if err = dao.CreateEntity(db, afsOrder); err != nil {
dao.Rollback(db, txDB) dao.Rollback(db, txDB)
return err return nil, err
} }
if err = dao.CreateMultiEntities(db, orderSkuFinancial); err != nil { if err = dao.CreateMultiEntities(db, orderSkuFinancial); err != nil {
dao.Rollback(db, txDB) dao.Rollback(db, txDB)
return err return nil, err
} }
if err = dao.CreateMultiEntities(db, afsOrderSkuFinancial); err != nil { if err = dao.CreateMultiEntities(db, afsOrderSkuFinancial); err != nil {
dao.Rollback(db, txDB) dao.Rollback(db, txDB)
return err return nil, err
} }
goodsOrder.TotalShopMoney -= int64(refundMoney) goodsOrder.TotalShopMoney -= int64(refundMoney)
dao.UpdateEntity(db, goodsOrder, "TotalShopMoney") dao.UpdateEntity(db, goodsOrder, "TotalShopMoney")
dao.Commit(db, txDB) dao.Commit(db, txDB)
return nil return resp, nil
} }
// QueryBarCodeRefundStatus 退款订单状态查询 // QueryBarCodeRefundStatus 退款订单状态查询

View File

@@ -609,7 +609,7 @@ func (c *PurchaseHandler) PickupGoods(order *model.GoodsOrder, isSelfDelivery bo
// 美团专送、快送、混合送、美团企客 // 美团专送、快送、混合送、美团企客
logisticsCode := utils.Interface2String(orderDetail["logistics_code"]) logisticsCode := utils.Interface2String(orderDetail["logistics_code"])
isSelfDelivery = logisticsCode == mtwmapi.PeiSongTypeMTZSJM || logisticsCode == mtwmapi.PeiSongTypeMTZSPT || isSelfDelivery = logisticsCode == mtwmapi.PeiSongTypeMTZSJM || logisticsCode == mtwmapi.PeiSongTypeMTZSPT ||
logisticsCode == mtwmapi.PeiSongTypeMTZSZJ || logisticsCode == mtwmapi.PeiSongTypeKuaiDi || logisticsCode == mtwmapi.PeiSongTypeMTZSZJ || logisticsCode == mtwmapi.PeiSongTypeKuaiDi || logisticsCode == mtwmapi.PeiSongTypeMTZSDL ||
logisticsCode == mtwmapi.PeiSongTypeMixed || logisticsCode == mtwmapi.PeiSongTypeQiKe || logisticsCode == mtwmapi.PeiSongTypeMixed || logisticsCode == mtwmapi.PeiSongTypeQiKe ||
logisticsCode == mtwmapi.PeiSongTypeMixedExpressQiKe || logisticsCode == mtwmapi.PeiSongTypeFranchise || logisticsCode == mtwmapi.PeiSongTypeMixedExpressQiKe || logisticsCode == mtwmapi.PeiSongTypeFranchise ||
logisticsCode == mtwmapi.PeiSongTypeSelf || logisticsCode == mtwmapi.PeiSongTypeWholeCity || logisticsCode == mtwmapi.PeiSongTypeSelf || logisticsCode == mtwmapi.PeiSongTypeWholeCity ||

View File

@@ -87,7 +87,7 @@ func (c *JxOrderController) RefundOnlineOrder() {
case "tonglian": case "tonglian":
err = localjx.RefundBarCodeScannerOrder(params.Ctx, params.VendorOrderID, skuIds, params.Reason) err = localjx.RefundBarCodeScannerOrder(params.Ctx, params.VendorOrderID, skuIds, params.Reason)
case "lakala": case "lakala":
err = localjx.RefundBarCodeScannerOrderByLaKaLa(params.Ctx, params.VendorOrderID, skuIds, params.Reason) retVal, err = localjx.RefundBarCodeScannerOrderByLaKaLa(params.Ctx, params.VendorOrderID, skuIds, params.Reason, "toStore")
} }
return retVal, errCode, err return retVal, errCode, err

View File

@@ -1,9 +1,11 @@
package controllers package controllers
import ( import (
"encoding/json"
"git.rosy.net.cn/baseapi/platformapi/lakala" "git.rosy.net.cn/baseapi/platformapi/lakala"
"git.rosy.net.cn/baseapi/utils" "git.rosy.net.cn/baseapi/utils"
lakalaServer "git.rosy.net.cn/jx-callback/business/lakala" lakalaServer "git.rosy.net.cn/jx-callback/business/lakala"
"git.rosy.net.cn/jx-callback/business/partner/purchase/jx/localjx"
"github.com/astaxie/beego/server/web" "github.com/astaxie/beego/server/web"
) )
@@ -548,12 +550,14 @@ func (c *LaKaLaController) SeparateUnBind() {
// @Description 可分账金额查询 // @Description 可分账金额查询
// @Param token header string true "认证token" // @Param token header string true "认证token"
// @Param merchantNo query string true "商户号" // @Param merchantNo query string true "商户号"
// @Param logDate query string true "拉卡拉对账单交易日期[yyyyMMdd]"
// @Param logNo query string true "交易流水号"
// @Success 200 {object} controllers.CallResult // @Success 200 {object} controllers.CallResult
// @Failure 200 {object} controllers.CallResult // @Failure 200 {object} controllers.CallResult
// @router /SeparateQueryAmt [get] // @router /SeparateQueryAmt [get]
func (c *LaKaLaController) SeparateQueryAmt() { func (c *LaKaLaController) SeparateQueryAmt() {
c.callSeparateQueryAmt(func(params *tLakalaSeparateQueryAmtParams) (retVal interface{}, errCode string, err error) { c.callSeparateQueryAmt(func(params *tLakalaSeparateQueryAmtParams) (retVal interface{}, errCode string, err error) {
retVal, err = lakalaServer.SeparateQueryAmt(params.MerchantNo, "", "") retVal, err = lakalaServer.SeparateQueryAmt(params.MerchantNo, params.LogDate, params.LogNo)
return return
}) })
} }
@@ -1041,3 +1045,25 @@ func (c *LaKaLaController) CloseOrderByMini() {
return return
}) })
} }
// AggregateRefundOrder 聚合支付退款
// @Title 聚合支付退款
// @Description 聚合支付退款
// @Param token header string true "认证token"
// @Param vendorOrderID formData string true "订单ID"
// @Param skuIds formData string true "[key:value]退款商品 skuId:count,int"
// @Param Reason formData string false "退单原因"
// @Success 200 {object} controllers.CallResult
// @Failure 200 {object} controllers.CallResult
// @router /AggregateRefundOrder [post]
func (c *LaKaLaController) AggregateRefundOrder() {
c.callAggregateRefundOrder(func(params *tLakalaAggregateRefundOrderParams) (retVal interface{}, errCode string, err error) {
skuIds := make(map[int]int, 0)
if err = json.Unmarshal([]byte(params.SkuIds), &skuIds); err != nil {
return nil, "", err
}
retVal, err = localjx.RefundBarCodeScannerOrderByLaKaLa(params.Ctx, params.VendorOrderID, skuIds, params.Reason, "aggregate")
return
})
}

View File

@@ -5194,6 +5194,15 @@ func init() {
MethodParams: param.Make(), MethodParams: param.Make(),
Filters: nil, Filters: nil,
Params: nil}) Params: nil})
// 聚合支付退款
web.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:LaKaLaController"] = append(web.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:LaKaLaController"],
web.ControllerComments{
Method: "AggregateRefundOrder",
Router: `/AggregateRefundOrder`,
AllowHTTPMethods: []string{"post"},
MethodParams: param.Make(),
Filters: nil,
Params: nil})
//web.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:FnController"] = append(web.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:FnController"], //web.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:FnController"] = append(web.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:FnController"],
// web.ControllerComments{ // web.ControllerComments{