Merge branch 'jdshop' of https://e.coding.net/rosydev/jx-callback into jdshop

This commit is contained in:
richboo111
2023-07-06 10:18:46 +08:00
16 changed files with 484 additions and 250 deletions

View File

@@ -4,6 +4,7 @@ import (
"crypto/md5"
"errors"
"fmt"
"git.rosy.net.cn/baseapi/platformapi/tao_vegetable"
"math"
"strings"
"time"
@@ -161,19 +162,6 @@ func (c *OrderManager) OnOrderAdjust(order *model.GoodsOrder, orderStatus *model
}
func (c *OrderManager) OnOrderStatusChanged(vendorOrgCode string, orderStatus *model.OrderStatus) (err error) {
// 有些平台(比如美团外卖),在新订单事件没有成功返回,但在重发订单消息前,订单状态转换,则不会再重发新订单事件,特殊处理一下
if orderStatus != nil {
if orderStatus.Status == model.OrderStatusAccepted {
if _, err2 := c.LoadOrder(orderStatus.VendorOrderID, orderStatus.VendorID); err2 == ErrCanNotFindOrder {
if handler := partner.GetPurchaseOrderHandlerFromVendorID(orderStatus.VendorID); handler != nil {
if order, err2 := handler.GetOrder(vendorOrgCode, orderStatus.VendorOrderID, ""); err2 == nil && order != nil {
c.OnOrderNew(order, orderStatus)
}
}
}
}
}
db := dao.GetDB()
txDB, _ := dao.Begin(db)
defer func() {
@@ -182,6 +170,28 @@ func (c *OrderManager) OnOrderStatusChanged(vendorOrgCode string, orderStatus *m
panic(r)
}
}()
globals.SugarLogger.Debugf("========OnOrderStatusChanged : %s", vendorOrgCode)
globals.SugarLogger.Debugf("========OnOrderStatusChanged : %s", utils.Format4Output(orderStatus, false))
// 有些平台(比如美团外卖),在新订单事件没有成功返回,但在重发订单消息前,订单状态转换,则不会再重发新订单事件,特殊处理一下
if orderStatus != nil {
if orderStatus.Status == model.OrderStatusAccepted {
if loadOrder, err2 := c.LoadOrder(orderStatus.VendorOrderID, orderStatus.VendorID); err2 == ErrCanNotFindOrder {
if handler := partner.GetPurchaseOrderHandlerFromVendorID(orderStatus.VendorID); handler != nil {
if order, err2 := handler.GetOrder(vendorOrgCode, orderStatus.VendorOrderID, ""); err2 == nil && order != nil {
c.OnOrderNew(order, orderStatus)
}
}
} else {
globals.SugarLogger.Debugf("========loadOrder : %s", utils.Format4Output(loadOrder, false))
loadOrder.Status = model.OrderStatusAccepted
loadOrder.VendorStatus = tao_vegetable.OrderStatusNew
c.UpdateOrderFields(loadOrder, []string{"Status", "VendorStatus"})
globals.SugarLogger.Debugf("========loadOrder : %s", utils.Format4Output(loadOrder, false))
}
}
}
isDuplicated, order, err := c.addOrderStatus(orderStatus, db)
if err == nil {
dao.Commit(db, txDB)

View File

@@ -411,8 +411,9 @@ func (c *OrderManager) CreateAfsOrderFromOrder(vendorOrderID string, vendorID in
for _, sku := range order.Skus {
orderSkuFinancial := &model.OrderSkuFinancial{
VendorID: sku.VendorID,
VendorOrderID: sku.VendorOrderID,
VendorID: sku.VendorID,
VendorOrderID: sku.VendorOrderID,
VendorSubOrderID: sku.VendorSubOrderID,
// OrderFinancialID: sku.VendorOrderID,
// ConfirmTime: afsOrder.AfsCreateAt,
VendorStoreID: afsOrder.VendorStoreID,

View File

@@ -698,7 +698,13 @@ func syncStoreSkuNew(ctx *jxcontext.Context, parentTask tasksch.ITask, causeFlag
// api.JdShop2API.SetCookieWithStr(configs[0].Value)
// }
}
globals.SugarLogger.Debugf("createList ==== := %s", utils.Format4Output(createList, false))
globals.SugarLogger.Debugf("updateList ==== := %s", utils.Format4Output(updateList, false))
globals.SugarLogger.Debugf("deleteList ==== := %s", utils.Format4Output(deleteList, false))
globals.SugarLogger.Debugf("stockList ==== := %s", utils.Format4Output(stockList, false))
globals.SugarLogger.Debugf("onlineList ==== := %s", utils.Format4Output(onlineList, false))
globals.SugarLogger.Debugf("offlineList ==== := %s", utils.Format4Output(offlineList, false))
globals.SugarLogger.Debugf("priceList ==== := %s", utils.Format4Output(priceList, false))
task := tasksch.NewParallelTask("syncStoreSkuNew", tasksch.NewParallelConfig().SetParallelCount(1).SetIsContinueWhenError(isContinueWhenError2), ctx,
func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
step := batchItemList[0].(int)

View File

@@ -2,7 +2,6 @@ package dao
import (
"fmt"
"git.rosy.net.cn/jx-callback/globals"
"regexp"
"strconv"
"time"
@@ -1156,8 +1155,6 @@ func GetOrders(db *DaoDB, ids []int64, isIncludeSku, isIncludeFake bool, fromDat
sqlParams = append(sqlParams, pageSize, offset)
txDB, _ := Begin(db)
defer Commit(db, txDB)
globals.SugarLogger.Debugf("===============sql2 := %s", sql)
globals.SugarLogger.Debugf("===============sql2 := %s", utils.Format4Output(sqlParams, false))
if err = GetRowsTx(txDB, &orders, sql, sqlParams...); err == nil {
totalCount = GetLastTotalRowCount2(db, txDB)
}

View File

@@ -89,7 +89,7 @@ type AfsOrder struct {
ReasonImgList string `orm:"size(1024)" json:"reasonImgList"` // 售后描述图片
AppealType int8 `json:"appealType"` // 售后方式(本地)
VendorAppealType string `orm:"size(255)" json:"vendorAppealType"` // 原始售后方式(第三方平台)
Flag int `json:"flag"`
Flag int `json:"flag"` // 0 未操作/1同意/3驳回
RefundType int8 `json:"refundType"`
RefuseReason string `orm:"size(1024)" json:"refuseReason"`
@@ -119,10 +119,11 @@ func (o *AfsOrder) TableUnique() [][]string {
type OrderSkuFinancial struct {
ModelIDCUL
VendorID int `orm:"column(vendor_id)" json:"vendorID"` // 平台id
VendorOrderID string `orm:"column(vendor_order_id);size(48)" json:"vendorOrderID"` // 关联原始订单ID
AfsOrderID string `orm:"column(afs_order_id);size(48)" json:"afsOrderID"` // 售后单ID
IsAfsOrder int8 `json:"isAfsOrder"` // 0--正向单, 1--售后单
VendorID int `orm:"column(vendor_id)" json:"vendorID"` // 平台id
VendorOrderID string `orm:"column(vendor_order_id);size(48)" json:"vendorOrderID"` // 关联原始订单ID
VendorSubOrderID string `orm:"column(vendor_sub_order_id);size(48)" json:"vendorSubOrderID"` // 关联原始订单ID
AfsOrderID string `orm:"column(afs_order_id);size(48)" json:"afsOrderID"` // 售后单ID
IsAfsOrder int8 `json:"isAfsOrder"` // 0--正向单, 1--售后单
// ConfirmTime time.Time `orm:"type(datetime)" json:"confirmTime"` // 订单生成/完成时间
VendorStoreID string `orm:"column(vendor_store_id);size(48)" json:"vendorStoreID"` // 外部系统里记录的storeid

View File

@@ -88,9 +88,10 @@ func (p *PurchaseHandler) OrderFinancialDetail2Refund(orderFinancial *model.Orde
}
for _, sku := range orderFinancial.Skus {
orderSkuFinancial := &model.OrderSkuFinancial{
VendorID: sku.VendorID,
VendorOrderID: sku.VendorOrderID,
AfsOrderID: sku.VendorOrderID,
VendorID: sku.VendorID,
VendorOrderID: sku.VendorOrderID,
VendorSubOrderID: sku.VendorSubOrderID,
AfsOrderID: sku.VendorOrderID,
// ConfirmTime: afsOrder.AfsCreateAt,
VendorStoreID: afsOrder.VendorStoreID,
StoreID: afsOrder.StoreID,
@@ -141,9 +142,10 @@ func (p *PurchaseHandler) AfsOrderDetail2Financial(orderData map[string]interfac
for _, refundInfo := range refundDetail {
xMap := refundInfo.(map[string]interface{})
orderSkuFinancial := &model.OrderSkuFinancial{
VendorID: model.VendorIDEBAI,
AfsOrderID: afsOrder.AfsOrderID,
VendorOrderID: afsOrder.VendorOrderID,
VendorID: model.VendorIDEBAI,
AfsOrderID: afsOrder.AfsOrderID,
VendorOrderID: afsOrder.VendorOrderID,
VendorSubOrderID: afsOrder.VendorOrderID2,
// ConfirmTime: getTimeFromInterface(xMap["apply_time"]),
VendorSkuID: utils.Interface2String(xMap["sku_id"]),
SkuID: int(utils.Str2Int64WithDefault(utils.Interface2String(xMap["custom_sku_id"]), 0)),

View File

@@ -3,6 +3,7 @@ package tao_vegetable
import (
"git.rosy.net.cn/baseapi/platformapi/mtwmapi"
"git.rosy.net.cn/baseapi/platformapi/tao_vegetable"
"git.rosy.net.cn/baseapi/utils"
"git.rosy.net.cn/jx-callback/business/jxutils"
"git.rosy.net.cn/jx-callback/business/model"
"git.rosy.net.cn/jx-callback/globals"
@@ -15,6 +16,7 @@ func OnCallbackMsg(orderStatus, orderId string, msg interface{}) (response *tao_
if CurPurchaseHandler != nil {
jxutils.CallMsgHandler(func() {
response = CurPurchaseHandler.onOrderMsg(orderStatus, orderId, msg)
globals.SugarLogger.Debugf("OnCallbackMsg response : %s", utils.Format4Output(response, false))
}, jxutils.ComposeUniversalOrderID(orderId, model.VendorIDTaoVegetable))
}
return response

View File

@@ -29,7 +29,7 @@ func OnFinancialMsg(msg *mtwmapi.CallbackMsg) (err error) {
orderData := msg.FormData
if orderData.Get("notify_type") == mtwmapi.NotifyTypeSuccess {
afsOrderID := orderData.Get("order_id")
orderFinancial, err := partner.CurOrderManager.LoadOrderFinancial(afsOrderID, model.VendorIDMTWM)
orderFinancial, err := partner.CurOrderManager.LoadOrderFinancial(afsOrderID, model.VendorIDTaoVegetable)
if err == nil {
err = partner.CurOrderManager.SaveAfsOrderFinancialInfo(CurPurchaseHandler.OrderFinancialDetail2Refund(orderFinancial, orderData))
} else {
@@ -42,7 +42,7 @@ func OnFinancialMsg(msg *mtwmapi.CallbackMsg) (err error) {
func (p *PurchaseHandler) OrderFinancialDetail2Refund(orderFinancial *model.OrderFinancial, orderData url.Values) (afsOrder *model.AfsOrder) {
afsOrder = &model.AfsOrder{
VendorID: model.VendorIDMTWM,
VendorID: model.VendorIDTaoVegetable,
AfsOrderID: orderData.Get("refund_id"),
VendorOrderID: orderData.Get("order_id"),
AfsCreatedAt: utils.Timestamp2Time(utils.Str2Int64(orderData.Get("timestamp"))),
@@ -63,8 +63,9 @@ func (p *PurchaseHandler) OrderFinancialDetail2Refund(orderFinancial *model.Orde
}
for _, sku := range orderFinancial.Skus {
orderSkuFinancial := &model.OrderSkuFinancial{
VendorID: sku.VendorID,
VendorOrderID: sku.VendorOrderID,
VendorID: sku.VendorID,
VendorOrderID: sku.VendorOrderID,
VendorSubOrderID: sku.VendorSubOrderID,
// OrderFinancialID: sku.VendorOrderID,
// ConfirmTime: afsOrder.AfsCreateAt,
VendorStoreID: afsOrder.VendorStoreID,
@@ -88,7 +89,7 @@ func (p *PurchaseHandler) OrderFinancialDetail2Refund(orderFinancial *model.Orde
func (p *PurchaseHandler) AfsOrderDetail2Financial(orderData url.Values) (afsOrder *model.AfsOrder) {
afsOrder = &model.AfsOrder{
VendorID: model.VendorIDMTWM,
VendorID: model.VendorIDTaoVegetable,
AfsOrderID: orderData.Get("order_id"),
VendorOrderID: orderData.Get("order_id"),
AfsCreatedAt: utils.Timestamp2Time(utils.Str2Int64(orderData.Get("timestamp"))),
@@ -111,9 +112,10 @@ func (p *PurchaseHandler) AfsOrderDetail2Financial(orderData url.Values) (afsOrd
utils.UnmarshalUseNumber([]byte(food), &refundDetail)
for _, xMap := range refundDetail {
orderSkuFinancial := &model.OrderSkuFinancial{
VendorID: model.VendorIDMTWM,
AfsOrderID: afsOrder.AfsOrderID,
VendorOrderID: afsOrder.VendorOrderID,
VendorID: model.VendorIDTaoVegetable,
AfsOrderID: afsOrder.AfsOrderID,
VendorOrderID: afsOrder.VendorOrderID,
VendorSubOrderID: afsOrder.VendorOrderID2,
// ConfirmTime: afsOrder.AfsCreateAt,
VendorSkuID: utils.Interface2String(xMap["app_food_code"]),
SkuID: int(utils.Str2Int64WithDefault(utils.Interface2String(xMap["sku_id"]), 0)),
@@ -159,18 +161,19 @@ func (p *PurchaseHandler) OrderDetail2Financial(result *domain591.AlibabaAelophy
// 订单
for _, x := range *result.SubOrderResponseList {
orderSkuFinancial := &model.OrderSkuFinancial{
VendorID: orderFinancial.VendorID,
VendorOrderID: orderFinancial.VendorOrderID,
VendorStoreID: *result.StoreId,
StoreID: 0,
JxStoreID: jxStoreID,
VendorSkuID: *x.SkuCode,
SkuID: utils.Str2Int(*x.SkuCode),
Name: *x.SkuName,
SalePrice: *x.Price,
Count: utils.Float64TwoInt(*x.BuySaleQuantity),
SkuBoxMoney: 0,
IsAfsOrder: 0,
VendorID: orderFinancial.VendorID,
VendorOrderID: orderFinancial.VendorOrderID,
VendorSubOrderID: orderFinancial.VendorOrderID2,
VendorStoreID: *result.StoreId,
StoreID: 0,
JxStoreID: jxStoreID,
VendorSkuID: *x.SkuCode,
SkuID: utils.Str2Int(*x.SkuCode),
Name: *x.SkuName,
SalePrice: *x.Price,
Count: utils.Float64TwoInt(*x.BuySaleQuantity),
SkuBoxMoney: 0,
IsAfsOrder: 0,
}
orderFinancial.Skus = append(orderFinancial.Skus, orderSkuFinancial)
orderFinancial.SalePriceMoney += orderSkuFinancial.SalePrice * int64(orderSkuFinancial.Count)
@@ -180,8 +183,9 @@ func (p *PurchaseHandler) OrderDetail2Financial(result *domain591.AlibabaAelophy
if x.Activitys != nil {
for _, v := range *x.Activitys {
activity := &model.OrderDiscountFinancial{
VendorID: orderFinancial.VendorID,
VendorOrderID: orderFinancial.VendorOrderID,
VendorID: orderFinancial.VendorID,
VendorOrderID: orderFinancial.VendorOrderID,
VendorOrderID2: orderFinancial.VendorOrderID2,
}
if v.ChannelActivityId != nil {
activity.VendorActivityID = *v.ChannelActivityId

View File

@@ -7,7 +7,6 @@ import (
"strings"
"time"
"git.rosy.net.cn/baseapi/platformapi/mtwmapi"
"git.rosy.net.cn/baseapi/platformapi/tao_vegetable"
domain3156 "git.rosy.net.cn/baseapi/platformapi/tao_vegetable/sdk/ability3156/domain"
request3156 "git.rosy.net.cn/baseapi/platformapi/tao_vegetable/sdk/ability3156/request"
@@ -55,8 +54,8 @@ func (p *PurchaseHandler) getOrder(vendorOrgCode string, vendorOrderID int64, ve
StoreId: utils.String2Pointer(vendorStoreID),
BizOrderId: utils.Int64ToPointer(vendorOrderID),
}}
orderDetail, err := getAPI(vendorOrgCode, 0, vendorStoreID).QueryOrderDetail(requestParam)
api := getAPI(vendorOrgCode, 0, vendorStoreID)
orderDetail, err := api.QueryOrderDetail(requestParam)
if err != nil {
return nil, nil, err
}
@@ -65,6 +64,7 @@ func (p *PurchaseHandler) getOrder(vendorOrgCode string, vendorOrderID int64, ve
VendorOrderID: utils.Int64ToStr(vendorOrderID),
VendorID: model.VendorIDTaoVegetable,
VendorStoreID: vendorStoreID,
VendorOrderID2: *orderDetail.OutOrderId,
StoreID: utils.Str2Int(*orderDetail.StoreId),
JxStoreID: utils.Str2Int(*orderDetail.StoreId),
CoordinateType: model.CoordinateTypeMars,
@@ -79,7 +79,7 @@ func (p *PurchaseHandler) getOrder(vendorOrgCode string, vendorOrderID int64, ve
InvoiceTitle: "",
InvoiceTaxerID: "",
InvoiceEmail: "",
VendorOrgCode: vendorOrgCode,
VendorOrgCode: api.GetVendorOrgCode(),
UserID: *orderDetail.OpenUid,
}
@@ -104,6 +104,7 @@ func (p *PurchaseHandler) getOrder(vendorOrgCode string, vendorOrderID int64, ve
for _, extra := range *orderDetail.SubOrderResponseList {
sku := &model.OrderSku{
VendorOrderID: order.VendorOrderID,
VendorSubOrderID: *extra.OutSubOrderId,
VendorID: model.VendorIDTaoVegetable,
StoreSubID: 0,
StoreSubName: "",
@@ -122,7 +123,6 @@ func (p *PurchaseHandler) getOrder(vendorOrgCode string, vendorOrderID int64, ve
OrderCreatedAt: order.OrderCreatedAt,
IsVendorAct: 0,
Upc: *extra.Barcode,
VendorSubOrderID: utils.Int64ToStr(*extra.BizSubOrderId),
}
activityId := make([]int64, 0)
@@ -333,22 +333,19 @@ func (c *PurchaseHandler) onOrderMsg(orderStatus, orderId string, orderCallback
msg.OrderStatus = tao_vegetable.OrderStatusOnSaleCancel
}
status := c.callbackOrderMsg2Status(msg)
if partner.CurOrderManager.GetStatusDuplicatedCount(status) > 0 {
return nil
}
// 校验重复消息
if partner.CurOrderManager.GetStatusDuplicatedCount(status) > 0 {
return tao_vegetable.CallBackResultInfo(nil)
}
// 商户接单/支付完成代表新订单
if msg.OrderStatus == tao_vegetable.OrderStatusNew || msg.OrderStatus == tao_vegetable.OrderStatusPayFinsh {
if msg.OrderStatus == tao_vegetable.OrderStatusPayFinsh {
order, orderMap, err2 := c.getOrder("", msg.BizOrderId, msg.StoreId)
if err = err2; err == nil {
err = partner.CurOrderManager.OnOrderNew(order, status)
if err == nil {
utils.CallFuncAsync(func() {
if msg.OrderStatus == mtwmapi.MsgTypeNewOrder {
if msg.OrderStatus == tao_vegetable.OrderStatusPayFinsh {
c.OnOrderDetail(orderMap, partner.CreatedPeration)
} else {
c.OnOrderDetail(orderMap, partner.UpdatedPeration)
@@ -380,7 +377,7 @@ func (c *PurchaseHandler) onOrderMsg(orderStatus, orderId string, orderCallback
// 发货完成
if msg.OrderStatus == tao_vegetable.OrderStatusCallRider { // || msgId == tiktokShop.CallbackPartGoodsMsgTagId 部分发货
utils.CallFuncAsync(func() {
orderMap, _ := getAPI(order.VendorOrgCode, jxutils.GetSaleStoreIDFromOrder(order), "").QueryOrderDetail(&request591.AlibabaAelophyOrderGetRequest{
orderMap, _ := getAPI("", jxutils.GetSaleStoreIDFromOrder(order), order.VendorStoreID).QueryOrderDetail(&request591.AlibabaAelophyOrderGetRequest{
OrderGetRequest: &domain591.AlibabaAelophyOrderGetOrderGetRequest{
StoreId: utils.String2Pointer(msg.StoreId),
BizOrderId: utils.Int64ToPointer(msg.BizOrderId),
@@ -439,6 +436,9 @@ func (c *PurchaseHandler) callbackOrderMsg2Status(msg *tao_vegetable.CallbackOrd
case tao_vegetable.OrderStatusOnSaleCancel:
orderStatus.Status = model.OrderStatusCanceled
orderStatus.Remark = "用户售中取消"
case tao_vegetable.OrderStatusSuccess: // 送达
orderStatus.Status = model.OrderStatusFinished
orderStatus.Remark = "订单送达"
}
return orderStatus
}
@@ -578,32 +578,62 @@ func (c *PurchaseHandler) GetOrderRealMobile(ctx *jxcontext.Context, order *mode
}
func (c *PurchaseHandler) AgreeOrRefuseCancel(ctx *jxcontext.Context, order *model.GoodsOrder, isAgree bool, reason string) (err error) {
db := dao.GetDB()
afsOrder, err := partner.CurOrderManager.LoadAfsOrder(order.VendorOrderID, order.VendorID)
if err != nil {
return err
}
if isAgree {
// 加载子订单号
orderDetail, _ := partner.CurOrderManager.LoadOrder(order.VendorOrderID, model.VendorIDTaoVegetable)
// 加载退款商品
afsSkuOrder, _ := dao.GetOrderRefundSkuList(db, []string{order.VendorOrderID})
param := &request3156.AlibabaTclsAelophyRefundAgreeRequest{
StoreId: utils.String2Pointer(order.VendorStoreID),
OutOrderId: utils.String2Pointer(order.VendorOrderID),
OutOrderId: utils.String2Pointer(orderDetail.VendorOrderID2),
RefundId: utils.String2Pointer(afsOrder.AfsOrderID),
OrderFrom: utils.Int64ToPointer(utils.Str2Int64(tao_vegetable.TaoVegetableChannelCode)),
}
// 加载购买商品
sku, _ := dao.GetSimpleOrderSkus(db, order.VendorOrderID, nil)
skuCount := 0
for _, v := range sku {
skuCount += v.Count
}
refundSkuCount := 0
subRefundList := make([]domain3156.AlibabaTclsAelophyRefundAgreeSubrefundlist, 0, len(afsSkuOrder))
for _, v := range afsSkuOrder {
subRefundList = append(subRefundList, domain3156.AlibabaTclsAelophyRefundAgreeSubrefundlist{
OutSubOrderId: utils.String2Pointer(v.VendorSubOrderID),
RefundFee: utils.Int64ToPointer(v.UserMoney),
})
refundSkuCount += v.Count
}
// 全退退运费
if skuCount == refundSkuCount {
}
param.SubRefundList = &subRefundList
param.AuditMemo = utils.String2Pointer(fmt.Sprintf("商户同意退款"))
if reason != "" {
param.AuditMemo = utils.String2Pointer(*param.AuditMemo + fmt.Sprintf(",%s", reason))
}
err = getAPI(order.VendorOrgCode, jxutils.GetSaleStoreIDFromOrder(order), "").AgreeUserCancel(param)
err = getAPI(order.VendorOrgCode, jxutils.GetSaleStoreIDFromAfsOrder(afsOrder), order.VendorStoreID).AgreeUserCancel(param)
} else {
afsOrder, err := partner.CurOrderManager.LoadAfsOrder(order.VendorOrderID, order.VendorID)
if err != nil {
return err
}
param := &request3156.AlibabaTclsAelophyRefundDisagreeRequest{
RefundId: utils.String2Pointer(afsOrder.AfsOrderID),
RejectReason: utils.String2Pointer(reason),
OrderFrom: utils.Int64ToPointer(utils.Str2Int64(tao_vegetable.TaoVegetableChannelCode)),
}
err = getAPI(order.VendorOrgCode, jxutils.GetSaleStoreIDFromOrder(order), "").DisAgreeUserCancel(param)
err = getAPI(order.VendorOrgCode, jxutils.GetSaleStoreIDFromAfsOrder(afsOrder), order.VendorStoreID).DisAgreeUserCancel(param)
if err != nil {
afsOrder.Status = model.AfsOrderStatusFailed
afsOrder.VendorStatus = "老板拒绝"
afsOrder.ReasonDesc += reason + ","
afsOrder.ReasonDesc += "," + reason
dao.UpdateEntity(dao.GetDB(), afsOrder, "Status", "ReasonDesc", "VendorStatus")
}
}
@@ -624,10 +654,11 @@ func (c *PurchaseHandler) CancelOrder(ctx *jxcontext.Context, order *model.Goods
}
}
reasonId := *orderSkuList.ReasonList
param := &request3156.AlibabaTclsAelophyRefundCsapplyRequest{
RefundCsApplyDTO: &domain3156.AlibabaTclsAelophyRefundCsapplyRefundCsApplyDto{
ReasonId: utils.Int64ToPointer(1111),
OutOrderId: utils.String2Pointer(order.VendorOrderID),
ReasonId: reasonId[0].ReasonId,
OutOrderId: utils.String2Pointer(order.VendorOrderID2),
StoreId: utils.String2Pointer(order.VendorStoreID),
RequestId: utils.String2Pointer(fmt.Sprintf("%s%d", order.VendorStoreID, time.Now().UnixNano())),
OutSubOrderIds: &outSubOrderIds,

View File

@@ -4,6 +4,7 @@ import (
"errors"
"fmt"
"git.rosy.net.cn/baseapi/platformapi/tao_vegetable"
domain3156 "git.rosy.net.cn/baseapi/platformapi/tao_vegetable/sdk/ability3156/domain"
request3156 "git.rosy.net.cn/baseapi/platformapi/tao_vegetable/sdk/ability3156/request"
domain591 "git.rosy.net.cn/baseapi/platformapi/tao_vegetable/sdk/ability591/domain"
request591 "git.rosy.net.cn/baseapi/platformapi/tao_vegetable/sdk/ability591/request"
@@ -28,18 +29,27 @@ var (
func (c *PurchaseHandler) isAfsMsg(orderStatus string, orderId string) bool {
if orderStatus == tao_vegetable.OrderStatusApplyAfs || orderStatus == tao_vegetable.OrderStatusCancelAfs || orderStatus == tao_vegetable.OrderStatusRefundSuccess {
order, _ := partner.CurOrderManager.LoadOrder(orderId, model.VendorIDTaoVegetable)
if order != nil {
return true
switch orderStatus {
case tao_vegetable.OrderStatusApplyAfs, tao_vegetable.OrderStatusCancelAfs:
order, _ := partner.CurOrderManager.LoadOrder2(orderId, model.VendorIDTaoVegetable)
if order != nil {
return true
}
case tao_vegetable.OrderStatusRefundSuccess:
afsOrder, _ := partner.CurOrderManager.LoadAfsOrder(orderId, model.VendorIDTaoVegetable)
if afsOrder != nil {
return true
}
}
}
return false
}
func (c *PurchaseHandler) OnAfsOrderMsg(orderId, status string, msg interface{}) (retVal *tao_vegetable.CallBackResult) {
jxutils.CallMsgHandlerAsync(func() {
retVal = c.onAfsOrderMsg(status, msg)
}, jxutils.ComposeUniversalOrderID(orderId, model.VendorIDTaoVegetable))
// 取消线程池执行代码,异步返回
//jxutils.CallMsgHandlerAsync(func() {
retVal = c.onAfsOrderMsg(status, msg)
//}, jxutils.ComposeUniversalOrderID(orderId, model.VendorIDTaoVegetable))
return retVal
}
@@ -63,6 +73,8 @@ func (c *PurchaseHandler) onAfsOrderMsg(status string, msg interface{}) (retVal
if needCallNew {
refundData := msg.(*tao_vegetable.UserApplyRefundCallBack)
var afsOrder *model.AfsOrder
var api = getAPI("", 0, refundData.StoreId)
afsOrder = &model.AfsOrder{
VendorID: model.VendorIDTaoVegetable,
AfsOrderID: orderStatus.VendorOrderID,
@@ -77,8 +89,7 @@ func (c *PurchaseHandler) onAfsOrderMsg(status string, msg interface{}) (retVal
ReasonType: 0,
ReasonDesc: refundData.RefundReason,
ReasonImgList: utils.LimitUTF8StringLen(refundData.RefundPictures, 1024),
RefundType: model.AfsTypeFullRefund,
VendorOrgCode: refundData.MerchantCode,
VendorOrgCode: api.GetVendorOrgCode(),
}
refundIds := make([]int64, 0, 0)
@@ -88,48 +99,81 @@ func (c *PurchaseHandler) onAfsOrderMsg(status string, msg interface{}) (retVal
}
refundIds = append(refundIds, utils.Str2Int64(refundData.BizRefundId))
taoAfsOrderDetail, err := getAPI(refundData.MerchantCode, 0, "").QueryAfsOrderDetail(&request591.AlibabaWdkOrderRefundGetRequest{
BizOrderIds: &bizOrderIds,
RefundIds: &refundIds,
OrderFrom: nil,
ShopId: nil,
StoreId: &refundData.StoreId,
})
if err != nil {
return tao_vegetable.CallBackResultInfo(err)
}
//taoAfsOrderDetail, err := getAPI(refundData.MerchantCode, 0, "").QueryAfsOrderDetail(&request591.AlibabaWdkOrderRefundGetRequest{
// BizOrderIds: &bizOrderIds,
// RefundIds: &refundIds,
// OrderFrom: nil,
// ShopId: nil,
// StoreId: &refundData.StoreId,
//})
//if err != nil {
// return tao_vegetable.CallBackResultInfo(err)
//}
//
//taoAfsOrder := *taoAfsOrderDetail.Orders
taoAfsOrder := *taoAfsOrderDetail.Orders
afsOrder.FreightUserMoney = *taoAfsOrder[0].RefundPostFee
afsOrder.AfsFreightMoney = *taoAfsOrder[0].RefundPostFee // 暂时未发现退货取件费用
afsOrder.BoxMoney = 0 // 餐盒
afsOrder.TongchengFreightMoney = 0 // 同城配送费
afsOrder.SkuBoxMoney = 0 // 商品包装费
afsOrder.VendorStatus = orderStatus.VendorStatus // 退货状态
afsOrder.FreightUserMoney = 0 // 订单运费
afsOrder.AfsFreightMoney = 0 // 暂时未发现退货取件费用
afsOrder.BoxMoney = 0 // 餐盒费
afsOrder.TongchengFreightMoney = 0 // 同城配送费
afsOrder.SkuBoxMoney = 0 // 商品包装
afsOrder.VendorStatus = orderStatus.VendorStatus // 退货状态
// 订单商品详细信息
skuList, err := getAPI(refundData.MerchantCode, 0, "").QueryOrderDetail(&request591.AlibabaAelophyOrderGetRequest{OrderGetRequest: &domain591.AlibabaAelophyOrderGetOrderGetRequest{
StoreId: utils.String2Pointer(refundData.StoreId),
BizOrderId: utils.Int64ToPointer(utils.Str2Int64(refundData.OutOrderId)),
}})
queryOrderDetailParam := &request591.AlibabaAelophyOrderGetRequest{OrderGetRequest: &domain591.AlibabaAelophyOrderGetOrderGetRequest{
StoreId: utils.String2Pointer(refundData.StoreId),
}}
order, err := partner.CurOrderManager.LoadOrder2(refundData.OutOrderId, model.VendorIDTaoVegetable)
if err != nil {
globals.SugarLogger.Debugf("用户申请售后时,通过售后外部渠道订单号获取主订单失败:%s", err.Error())
return tao_vegetable.CallBackResultInfo(err)
}
if order == nil {
globals.SugarLogger.Debugf("数据库订单查询失败,订单号异常 :%s", refundData.OutOrderId)
return tao_vegetable.CallBackResultInfo(errors.New("订单号异常"))
}
queryOrderDetailParam.OrderGetRequest.BizOrderId = utils.Int64ToPointer(utils.Str2Int64(order.VendorOrderID))
skuList, err := api.QueryOrderDetail(queryOrderDetailParam)
if err != nil {
return tao_vegetable.CallBackResultInfo(err)
}
for _, sku := range *skuList.SubOrderResponseList {
orderSku := &model.OrderSkuFinancial{
Count: utils.Float64TwoInt(*sku.BuySaleQuantity),
VendorSkuID: *sku.SkuCode,
SkuID: utils.Str2Int(*sku.SkuCode),
Name: *sku.SkuName,
UserMoney: *sku.OriginalFee - *sku.DiscountFee,
PmSkuSubsidyMoney: *sku.DiscountPlatformFee, // 平台补贴商品
}
afsOrder.PmSkuSubsidyMoney += orderSku.PmSkuSubsidyMoney
afsOrder.SkuUserMoney += orderSku.UserMoney
afsOrder.Skus = append(afsOrder.Skus, orderSku)
var refundSkuCount int64 = 0 // 子订单申请退款的商品数
var orderSkuCount int64 = 0 // 子订单购买的商品数
for _, refundSku := range refundData.SubRefundOrders { // 本次退款订单
refundSkuCount += refundSku.RefundAmount
for _, sku := range *skuList.SubOrderResponseList { // 总订单
if refundSku.OutSubOrderId == *sku.OutSubOrderId {
orderSku := &model.OrderSkuFinancial{
Count: utils.Float64TwoInt(*sku.BuySaleQuantity),
VendorSkuID: *sku.SkuCode,
SkuID: utils.Str2Int(*sku.SkuCode),
Name: *sku.SkuName,
PmSkuSubsidyMoney: *sku.DiscountPlatformFee, // 平台补贴商品
VendorOrderID: orderStatus.VendorOrderID,
VendorSubOrderID: *sku.OutSubOrderId,
}
// 交易成功,商户取消,配送中,配送结束时!订单不退换运费
switch *sku.OrderStatus {
case tao_vegetable.OrderStatusSuccess, tao_vegetable.OrderStatusMerchantCancel, tao_vegetable.OrderStatusDelivery, tao_vegetable.OrderStatusDeliveryOver:
orderSku.UserMoney = refundSku.RefundFee
default:
orderSku.UserMoney = refundSku.MaxRefundFee
}
afsOrder.PmSkuSubsidyMoney += orderSku.PmSkuSubsidyMoney
afsOrder.Skus = append(afsOrder.Skus, orderSku)
orderSkuCount += utils.Float64TwoInt64(*sku.BuySaleQuantity)
}
}
}
if refundSkuCount == orderSkuCount && refundData.RefundFee == *skuList.PayFee { // 全退
afsOrder.RefundType = model.AfsTypeFullRefund
} else {
afsOrder.RefundType = model.AfsTypePartRefund
}
afsOrder.SkuUserMoney += refundData.RefundFee
if afsOrder != nil {
//直接就来一个新的售后单,并且还是售后完成的
if orderStatus.Status == model.AfsOrderStatusFinished {
@@ -147,33 +191,51 @@ func (c *PurchaseHandler) onAfsOrderMsg(status string, msg interface{}) (retVal
return tao_vegetable.CallBackResultInfo(err)
}
if err = utils.CallFuncLogError(func() error {
_, err = dao.DeleteEntity(db, afsOrder[0], "VendorOrderID", "VendorID")
return err
}, "SaveAfsOrder delete AfsOrder, afsOrderID:%s", afsOrder[0].AfsOrderID); err != nil {
return tao_vegetable.CallBackResultInfo(err)
}
cancelMsg := msg.(*tao_vegetable.UserCancelRefundApply)
for _, v := range afsOrder {
// 商家驳回,会发出用户撤销的回调通知,不管他
if v.AfsOrderID == cancelMsg.RefundId && v.Flag == model.AfsOrderFlagRefuseUserRefund {
return tao_vegetable.CallBackResultInfo(nil)
}
// 删除售后商品
if err = utils.CallFuncLogError(func() error {
_, err = dao.DeleteEntity(db, &model.OrderSkuFinancial{
VendorOrderID: afsOrder[0].VendorOrderID,
VendorID: afsOrder[0].VendorID,
IsAfsOrder: 1,
}, "VendorOrderID", "VendorID", "IsAfsOrder")
return err
}, "SaveAfsOrder delete OrderSkuFinancial, afsOrderID:%s", afsOrder[0].AfsOrderID); err != nil {
return tao_vegetable.CallBackResultInfo(err)
// 用户撤销未处理的售后订单
if v.AfsOrderID == cancelMsg.RefundId && v.Flag == 0 {
// 下面处理用户撤销售后
if err = utils.CallFuncLogError(func() error {
_, err = dao.DeleteEntity(db, v, "VendorOrderID", "VendorID")
return err
}, "SaveAfsOrder delete AfsOrder, afsOrderID:%s", v.AfsOrderID); err != nil {
return tao_vegetable.CallBackResultInfo(err)
}
// 删除售后商品
if err = utils.CallFuncLogError(func() error {
_, err = dao.DeleteEntity(db, &model.OrderSkuFinancial{
VendorOrderID: v.VendorOrderID,
VendorID: v.VendorID,
IsAfsOrder: 1,
}, "VendorOrderID", "VendorID", "IsAfsOrder")
return err
}, "SaveAfsOrder delete OrderSkuFinancial, afsOrderID:%s", v.AfsOrderID); err != nil {
return tao_vegetable.CallBackResultInfo(err)
}
}
}
// 订单更改为待配送
goodsOrder, _ := partner.CurOrderManager.LoadOrder(orderStatus.RefVendorOrderID, model.VendorIDTaoVegetable)
goodsOrder.Status = model.OrderStatusFinishedPickup
goodsOrder.VendorStatus = status
dao.UpdateEntity(db, goodsOrder, "Status", "VendorStatus")
}
if err := partner.CurOrderManager.OnAfsOrderStatusChanged(orderStatus); err == nil {
if err == nil && status == tao_vegetable.OrderStatusRefundSuccess {
skuList, _ := dao.GetSimpleOrderSkus(db, orderStatus.RefVendorOrderID, nil)
totalSkuCount := 0
for _, v := range skuList {
totalSkuCount += v.Count
}
financialSku, _ := dao.GetOrderRefundSkuList(db, []string{orderStatus.RefVendorOrderID})
refundSkuCount := 0
for _, v := range financialSku {
refundSkuCount += v.Count
}
if err == nil && status == tao_vegetable.OrderStatusRefundSuccess && totalSkuCount == refundSkuCount {
goodsOrder, _ := partner.CurOrderManager.LoadOrder(orderStatus.RefVendorOrderID, orderStatus.VendorID)
goodsOrder.Status = model.OrderStatusCanceled
goodsOrder.VendorStatus = orderStatus.VendorStatus
@@ -181,6 +243,7 @@ func (c *PurchaseHandler) onAfsOrderMsg(status string, msg interface{}) (retVal
}
}
}
globals.SugarLogger.Debugf("=============errr : %v", err)
return tao_vegetable.CallBackResultInfo(err)
}
@@ -192,35 +255,45 @@ func (c *PurchaseHandler) callbackAfsMsg2Status(status string, msg interface{})
}
switch status {
case tao_vegetable.OrderStatusApplyAfs:
case tao_vegetable.OrderStatusApplyAfs: // 用户申请售后
refundData := msg.(*tao_vegetable.UserApplyRefundCallBack)
orderStatus.RefVendorOrderID = refundData.OutOrderId
orderStatus.VendorStatus = fmt.Sprintf("%s:%s", tao_vegetable.OrderStatusApplyAfs, "用户申请取消")
orderStatus.Status = c.GetAfsStatusFromVendorStatus(tao_vegetable.OrderStatusApplyAfs)
orderStatus.StatusTime = time.Now()
orderStatus.Remark = refundData.Remarks
orderStatus.VendorOrderID = refundData.BizRefundId
case tao_vegetable.OrderStatusCancelAfs:
orderStatus.VendorOrderID = refundData.RefundId
order, _ := partner.CurOrderManager.LoadOrder2(orderStatus.RefVendorOrderID, model.VendorIDTaoVegetable)
if order != nil {
orderStatus.RefVendorOrderID = order.VendorOrderID
}
case tao_vegetable.OrderStatusCancelAfs: // 用户取消售后
refundData := msg.(*tao_vegetable.UserCancelRefundApply)
orderStatus.RefVendorOrderID = refundData.OutOrderId
orderStatus.VendorStatus = fmt.Sprintf("%s:%s", tao_vegetable.OrderStatusCancelAfs, "用户取消售后申请")
orderStatus.Status = c.GetAfsStatusFromVendorStatus(tao_vegetable.OrderStatusCancelAfs)
orderStatus.StatusTime = time.Now()
orderStatus.VendorOrderID = refundData.BizRefundId
//case tao_vegetable.OrderStatusOnSaleCancel:
orderStatus.VendorOrderID = refundData.RefundId
order, _ := partner.CurOrderManager.LoadOrder2(orderStatus.RefVendorOrderID, model.VendorIDTaoVegetable)
if order != nil {
orderStatus.RefVendorOrderID = order.VendorOrderID
}
//case tao_vegetable.OrderStatusOnSaleCancel:
// refundData := msg.(*tao_vegetable.OnSaleCancel)
// orderStatus.RefVendorOrderID = utils.Int64ToStr(refundData.BizOrderId)
// orderStatus.VendorStatus = fmt.Sprintf("%s:%s", tao_vegetable.OrderStatusOnSaleCancel, "用户售中取消")
// orderStatus.Status = c.GetAfsStatusFromVendorStatus(tao_vegetable.OrderStatusOnSaleCancel)
// orderStatus.StatusTime = utils.Str2Time(refundData.Timestamp)
// orderStatus.VendorOrderID = refundData.IdempotentId
case tao_vegetable.OrderStatusRefundSuccess:
case tao_vegetable.OrderStatusRefundSuccess: // 售后成功
refundData := msg.(*tao_vegetable.RefundOrderFinish)
orderStatus.RefVendorOrderID = refundData.OutMainRefundId
afsOrder, _ := partner.CurOrderManager.LoadAfsOrder(refundData.OutMainRefundId, model.VendorIDTaoVegetable)
orderStatus.RefVendorOrderID = afsOrder.VendorOrderID
orderStatus.VendorStatus = fmt.Sprintf("%s:%s", tao_vegetable.OrderStatusRefundSuccess, "用户售后退款成功")
orderStatus.Status = c.GetAfsStatusFromVendorStatus(tao_vegetable.OrderStatusRefundSuccess)
orderStatus.StatusTime = time.Now()
orderStatus.VendorOrderID = refundData.BizSubRefundId
orderStatus.Remark = fmt.Sprintf("QueryTaoAfsOrderId:%s", refundData.BizSubRefundId)
orderStatus.VendorOrderID = refundData.OutMainRefundId
}
if orderStatus.VendorOrderID == "" {
@@ -239,32 +312,62 @@ func (c *PurchaseHandler) GetAfsStatusFromVendorStatus(notifyType string) int {
// 审核售后单申请
func (c *PurchaseHandler) AgreeOrRefuseRefund(ctx *jxcontext.Context, order *model.AfsOrder, approveType int, reason string) (err error) {
db := dao.GetDB()
if approveType == partner.AfsApproveTypeRefused {
param := &request3156.AlibabaTclsAelophyRefundAgreeRequest{
StoreId: utils.String2Pointer(order.VendorStoreID),
OutOrderId: utils.String2Pointer(order.VendorOrderID),
OrderFrom: utils.Int64ToPointer(utils.Str2Int64(tao_vegetable.TaoVegetableChannelCode)),
}
param.AuditMemo = utils.String2Pointer(fmt.Sprintf("商户同意退款"))
if reason != "" {
param.AuditMemo = utils.String2Pointer(*param.AuditMemo + fmt.Sprintf(",%s", reason))
}
err = getAPI(order.VendorOrgCode, jxutils.GetSaleStoreIDFromAfsOrder(order), order.VendorStoreID).AgreeUserCancel(param)
} else if approveType == partner.AfsApproveTypeRefusedToRefundMoney {
return errors.New("此平台暂时不支持")
} else {
param := &request3156.AlibabaTclsAelophyRefundDisagreeRequest{
RefundId: utils.String2Pointer(order.AfsOrderID),
RejectReason: utils.String2Pointer(reason),
OrderFrom: utils.Int64ToPointer(utils.Str2Int64(tao_vegetable.TaoVegetableChannelCode)),
}
err = getAPI(order.VendorOrgCode, jxutils.GetSaleStoreIDFromAfsOrder(order), order.VendorStoreID).DisAgreeUserCancel(param)
if err != nil {
order.Status = model.AfsOrderStatusFailed
order.VendorStatus = "老板拒绝"
order.ReasonDesc += reason + ","
dao.UpdateEntity(dao.GetDB(), order, "Status", "ReasonDesc", "VendorStatus")
//if err == nil {
// order.Status = model.AfsOrderStatusFailed
// order.VendorStatus = "老板拒绝"
// order.ReasonDesc += "," + reason
// dao.UpdateEntity(dao.GetDB(), order, "Status", "ReasonDesc", "VendorStatus")
//}
} else if approveType == partner.AfsApproveTypeRefusedToRefundMoney {
return errors.New("此平台暂时不支持")
} else {
// 加载子订单号
orderDetail, _ := partner.CurOrderManager.LoadOrder(order.VendorOrderID, model.VendorIDTaoVegetable)
// 加载退款商品
afsSkuOrder, _ := dao.GetOrderRefundSkuList(db, []string{order.VendorOrderID})
param := &request3156.AlibabaTclsAelophyRefundAgreeRequest{
StoreId: utils.String2Pointer(order.VendorStoreID),
OutOrderId: utils.String2Pointer(orderDetail.VendorOrderID2),
RefundId: utils.String2Pointer(order.AfsOrderID),
OrderFrom: utils.Int64ToPointer(utils.Str2Int64(tao_vegetable.TaoVegetableChannelCode)),
}
// 加载购买商品
//sku, _ := dao.GetSimpleOrderSkus(db, order.VendorOrderID, nil)
//skuCount := 0
//for _, v := range sku {
// skuCount += v.Count
//}
//refundSkuCount := 0
subRefundList := make([]domain3156.AlibabaTclsAelophyRefundAgreeSubrefundlist, 0, len(afsSkuOrder))
for _, v := range afsSkuOrder {
subRefundList = append(subRefundList, domain3156.AlibabaTclsAelophyRefundAgreeSubrefundlist{
OutSubOrderId: utils.String2Pointer(v.VendorSubOrderID),
RefundFee: utils.Int64ToPointer(v.UserMoney),
})
//refundSkuCount += v.Count
}
// 全退退运费
//if skuCount == refundSkuCount {
// subRefundList[len(subRefundList)-1].RefundFee = utils.Int64ToPointer(*subRefundList[len(subRefundList)-1].RefundFee + orderDetail.BaseFreightMoney)
//}
param.SubRefundList = &subRefundList
param.AuditMemo = utils.String2Pointer(fmt.Sprintf("商户同意退款"))
if reason != "" {
param.AuditMemo = utils.String2Pointer(*param.AuditMemo + fmt.Sprintf(",%s", reason))
}
err = getAPI(order.VendorOrgCode, jxutils.GetSaleStoreIDFromAfsOrder(order), order.VendorStoreID).AgreeUserCancel(param)
}
return err
}
@@ -277,7 +380,7 @@ func (c *PurchaseHandler) ConfirmReceivedReturnGoods(ctx *jxcontext.Context, ord
// 发起全款退款
func (c *PurchaseHandler) RefundOrder(ctx *jxcontext.Context, order *model.GoodsOrder, reason string) (err error) {
return fmt.Errorf("%s不支持售后全额退款请让买家发起退款", model.VendorChineseNames[model.VendorIDMTWM])
return fmt.Errorf("%s不支持售后全额退款请让买家发起退款", model.VendorChineseNames[model.VendorIDTaoVegetable])
}
// 发起部分退款
@@ -295,7 +398,7 @@ func (c *PurchaseHandler) GetOrderAfsInfo(ctx *jxcontext.Context, vendorOrderID,
}
}
}
if order, err := partner.CurOrderManager.LoadOrder(vendorOrderID, model.VendorIDMTWM); err == nil {
if order, err := partner.CurOrderManager.LoadOrder(vendorOrderID, model.VendorIDTaoVegetable); err == nil {
orderAfsInfo.AfsTotalShopMoney = order.TotalShopMoney + afsTotalShopMoney
}
return orderAfsInfo, err

View File

@@ -31,12 +31,19 @@ func orderStatusChangeNotice(order *model.GoodsOrder, orderStatus string) (*requ
if len(skuList) == model.NO {
return nil, fmt.Errorf("订单商品列表为零,请管理员检查")
}
for _, v := range skuList {
orderDetail, err := getAPI(order.VendorOrgCode, 0, "").QueryOrderDetail(&request591.AlibabaAelophyOrderGetRequest{OrderGetRequest: &domain591.AlibabaAelophyOrderGetOrderGetRequest{
StoreId: utils.String2Pointer(order.VendorStoreID),
BizOrderId: utils.Int64ToPointer(utils.Str2Int64(order.VendorOrderID)),
}})
if err != nil {
return nil, err
}
for _, v := range *orderDetail.SubOrderResponseList {
workCallbackSubOrderInfo := domain591.AlibabaAelophyOrderWorkCallbackWorkCallbackSubOrderInfo{
BizSubOrderId: utils.Int64ToPointer(utils.Str2Int64(v.VendorSubOrderID)),
SkuCode: utils.String2Pointer(v.VendorSkuID),
PickSaleQuantity: utils.String2Pointer(utils.Int2Str(v.Count)),
PickStockQuantity: utils.String2Pointer(utils.Int2Str(v.Count)),
BizSubOrderId: v.BizSubOrderId,
SkuCode: v.SkuCode,
PickSaleQuantity: utils.String2Pointer(utils.Float64ToStr(*v.BuySaleQuantity)),
PickStockQuantity: utils.String2Pointer(utils.Float64ToStr(*v.BuyStockQuantity)),
}
workCallbackSubOrderInfoList = append(workCallbackSubOrderInfoList, workCallbackSubOrderInfo)
}
@@ -79,12 +86,24 @@ func OrderStatusChangeDelivery(order *model.GoodsOrder, orderStatus string) *req
func getOrderCancelList(api *tao_vegetable.API, order *model.GoodsOrder) (*domain3156.AlibabaTclsAelophyRefundCsapplyrenderRefundCsApplyRenderResponseDto, error) {
param := &request3156.AlibabaTclsAelophyRefundCsapplyrenderRequest{
RefundCsApplyRenderDTO: &domain3156.AlibabaTclsAelophyRefundCsapplyrenderRefundCsApplyRenderDto{
OutOrderId: utils.String2Pointer(order.VendorOrderID),
OutOrderId: utils.String2Pointer(order.VendorOrderID2),
StoreId: utils.String2Pointer(order.VendorStoreID),
OutSubOrderIds: nil,
OrderFrom: utils.Int64ToPointer(utils.Str2Int64(tao_vegetable.TaoVegetableChannelCode)),
},
}
skuList, err := dao.GetSimpleOrderSkus(dao.GetDB(), order.VendorOrderID, nil)
if err != nil {
return nil, err
}
outSubOrderIds := make([]string, 0, len(skuList))
for _, v := range skuList {
outSubOrderIds = append(outSubOrderIds, v.VendorSubOrderID)
}
param.RefundCsApplyRenderDTO.OutSubOrderIds = &outSubOrderIds
return api.PartialRefundReason(param)
}

View File

@@ -440,7 +440,7 @@ func (p *PurchaseHandler) onStoreStatusChanged(msg *mtwmapi.CallbackMsg) (respon
}
if err == nil {
err = partner.CurStoreManager.OnStoreStatusChanged(vendorStoreID, model.VendorIDMTWM, storeStatus)
err = partner.CurStoreManager.OnStoreStatusChanged(vendorStoreID, model.VendorIDTaoVegetable, storeStatus)
}
response = mtwmapi.Err2CallbackResponse(err, "")
// 操作日志(美团外卖)

View File

@@ -225,7 +225,7 @@ func (p *PurchaseHandler) createOrUpdateStoreSkus(ctx *jxcontext.Context, storeI
api := getAPI(getStoreVendorOrgCode(storeID), storeID, vendorStoreID)
if isCreate {
failedList, err = createTaoVegetable(api, storeSkuList, vendorStoreID, storeID, syncType)
failedList, err = createTaoVegetable(ctx, api, storeSkuList, vendorStoreID, storeID, syncType)
globals.SugarLogger.Debugf("创建淘鲜达商品异常:%v", err)
} else {
failedList, err = UpdateTaoVegetable(api, storeSkuList, vendorStoreID, storeID, syncType)
@@ -278,7 +278,7 @@ func UpdateTaoVegetable(api *tao_vegetable.API, storeSkuList []*dao.StoreSkuSync
}
// createTaoVegetable 创建淘鲜达商品
func createTaoVegetable(api *tao_vegetable.API, storeSkuList []*dao.StoreSkuSyncInfo, vendorStoreID string, storeID int, syncType string) (failedList []*partner.StoreSkuInfoWithErr, err error) {
func createTaoVegetable(ctx *jxcontext.Context, api *tao_vegetable.API, storeSkuList []*dao.StoreSkuSyncInfo, vendorStoreID string, storeID int, syncType string) (failedList []*partner.StoreSkuInfoWithErr, err error) {
createPram := &request585.AlibabaWdkSkuAddRequest{}
param := make([]domain585.AlibabaWdkSkuAddSkuDo, 0, 0)
totalCount := len(storeSkuList)
@@ -376,22 +376,30 @@ func createTaoVegetable(api *tao_vegetable.API, storeSkuList []*dao.StoreSkuSync
createPram.ParamList = &param
result, err := api.AddStoreSku(createPram)
globals.SugarLogger.Debugf("创建淘鲜达商品异常 result :%s", utils.Format4Output(result, false))
if err != nil {
globals.SugarLogger.Debugf("创建淘鲜达商品异常:%s", err.Error())
}
// 记录失败的同步数据
failedList, vendorSkuIdMap = SelectStoreSkuListByFoodList(storeSkuList, *result, storeID, model.VendorChineseNames[model.VendorIDTaoVegetable], syncType)
failedList2, vendorSkuIdMap2 := SelectStoreSkuListByFoodList(storeSkuList, *result, storeID, model.VendorChineseNames[model.VendorIDTaoVegetable], syncType)
failedList = append(failedList, failedList2...)
for k, v := range vendorSkuIdMap2 {
vendorSkuIdMap[k] = v
}
createPram.ParamList = nil
param = make([]domain585.AlibabaWdkSkuAddSkuDo, 0, 0)
}
}
globals.SugarLogger.Debugf("vendorSkuIdMap=====err := %v", utils.Format4Output(vendorSkuIdMap, false))
var successSku = make([]int, 0, len(vendorSkuIdMap))
for _, v := range storeSkuList {
if k, ok := vendorSkuIdMap[utils.Int2Str(v.SkuID)]; ok {
v.VendorSkuID = k
successSku = append(successSku, v.SkuID)
}
}
failedListStock := updateStoreSkusStockByCreate(ctx, api, storeID, vendorStoreID, successSku)
failedList = append(failedList, failedListStock...)
globals.SugarLogger.Debugf("storeSkuList=====err := %s", utils.Format4Output(storeSkuList, false))
globals.SugarLogger.Debugf("createTaoVegetable=====err := %v", err)
@@ -543,6 +551,41 @@ func (p *PurchaseHandler) UpdateStoreSkusPrice(ctx *jxcontext.Context, vendorOrg
return failedList, err
}
// updateStoreSkusStockByCreate 创建时更新库存数量
func updateStoreSkusStockByCreate(ctx *jxcontext.Context, api *tao_vegetable.API, storeID int, vendorStoreID string, storeSkuList []int) (failedList []*partner.StoreSkuInfoWithErr) {
param := request589.AlibabaWdkStockPublishRequest{}
batchStockPublishDto := &domain589.AlibabaWdkStockPublishBatchStockPublishDto{
UpdateType: utils.Int64ToPointer(tao_vegetable.UpdateTypeStoke),
BillNo: utils.String2Pointer(utils.Int64ToStr(time.Now().UnixNano())),
BillType: utils.Int64ToPointer(tao_vegetable.UpdateTypeStokeBillType),
PublishSource: utils.String2Pointer(vendorStoreID),
ShopCode: utils.String2Pointer(vendorStoreID),
Operator: utils.String2Pointer(ctx.GetUserName()),
StockPublishDtos: nil,
}
stockPublishDtos := make([]domain589.AlibabaWdkStockPublishStockPublishDto, 0, 0)
for index, v := range storeSkuList {
stockPublishDtos = append(stockPublishDtos, domain589.AlibabaWdkStockPublishStockPublishDto{
SkuCode: utils.String2Pointer(utils.Int2Str(v)),
Quantity: utils.String2Pointer("9999"),
OrderNo: utils.String2Pointer(fmt.Sprintf("%s_%d_%d", vendorStoreID, time.Now().UnixNano(), 84671)),
OrderType: utils.String2Pointer("10006800"), // 这个不太确定
})
if (index+model.YES)%tao_vegetable.MAXHandleCount == model.NO || (index+1) == len(storeSkuList) {
batchStockPublishDto.StockPublishDtos = &stockPublishDtos
param.BatchStockPublishDto = batchStockPublishDto
if err := api.StoreSkuStock(&param); err != nil {
failedList = append(failedList, putils.GetErrMsg2FailedSingleList(v, err, storeID, model.VendorChineseNames[model.VendorIDTaoVegetable], "更新库存错误")...)
}
stockPublishDtos = make([]domain589.AlibabaWdkStockPublishStockPublishDto, 0, 0)
param.BatchStockPublishDto = nil
}
}
globals.SugarLogger.Debugf("UpdateStoreSkusStock=====err := %v", failedList)
return failedList
}
// UpdateStoreSkusStock 操作更新库存数量
func (p *PurchaseHandler) UpdateStoreSkusStock(ctx *jxcontext.Context, vendorOrgCode string, storeID int, vendorStoreID string, storeSkuList []*partner.StoreSkuInfo) (failedList []*partner.StoreSkuInfoWithErr, err error) {
api := getAPI(getStoreVendorOrgCode(storeID), storeID, vendorStoreID)

View File

@@ -210,9 +210,6 @@ func (p *PurchaseHandler) getUploadImgPoiCode() (poiCode string) {
// getAPI 包含门店token
func getAPI(appOrgCode string, storeID int, vendorStoreID string) (apiObj *tao_vegetable.API) {
if appOrgCode == "" {
globals.SugarLogger.Debugf("getAPI appOrgCode is empty")
}
if appOrgCode != "" {
apiObj = partner.CurAPIManager.GetAPI(model.VendorIDTaoVegetable, appOrgCode).(*tao_vegetable.API)
} else if appOrgCode == "" && vendorStoreID != "" {

View File

@@ -699,7 +699,7 @@ func (c *OrderController) ConfirmReceiveGoods() {
})
}
// @Title 同意或拒绝用户取消订单申请
// @Title 同意或拒绝用户取消订单申请 (饿百)
// @Description 同意或拒绝用户取消订单申请
// @Param token header string true "认证token"
// @Param vendorOrderID formData string true "订单ID"

View File

@@ -89,7 +89,7 @@ func (c *TaoBaoVegetableController) OrderStatus() {
}
// 获取body参数
order, err := api.TaoVegetableApi.ReaderOrderInfo(c.Ctx.Request)
order, body, err := api.TaoVegetableApi.ReaderOrderInfo(c.Ctx.Request)
globals.SugarLogger.Debugf("order_status ReaderOrderInfo:= %s", utils.Format4Output(order, false))
globals.SugarLogger.Debugf("order_status ReaderOrderInfo:= %s", utils.Format4Output(order, false))
if err != nil {
@@ -99,21 +99,24 @@ func (c *TaoBaoVegetableController) OrderStatus() {
}
// 验签
sign := Sign(values, utils.Format4Output(order, false), api.TaoVegetableApi.GetAppSecret())
if sign != values.Get("sign") {
c.Data["json"] = tao_vegetable.CallBackResultSign(fmt.Errorf("非法签名"))
sign := Sign(values, body, api.TaoVegetableApi.GetAppSecret())
switch order.MerchantCode {
case "CSSJ": // 淘宝回调地址检测
if sign != values.Get("sign") {
c.Data["json"] = tao_vegetable.CallBackResultSign(fmt.Errorf("非法签名"))
c.ServeJSON()
return
} else {
c.Data["json"] = tao_vegetable.CallBackResultSign(nil)
c.ServeJSON()
return
}
default:
callbackResponse := taoVegetable.OnCallbackMsg(tao_vegetable.OrderStatusChange, utils.Int64ToStr(order.BizOrderId), order)
c.Data["json"] = callbackResponse
c.ServeJSON()
return
} /*else {
c.Data["json"] = tao_vegetable.CallBackResultSign(nil)
c.ServeJSON()
return
}*/
callbackResponse := taoVegetable.OnCallbackMsg(tao_vegetable.OrderStatusChange, utils.Int64ToStr(order.BizOrderId), order)
c.Data["json"] = callbackResponse
c.ServeJSON()
return
}
}
// ApplyCancelOrder 用户发起售后申请
@@ -130,7 +133,7 @@ func (c *TaoBaoVegetableController) ApplyCancelOrder() {
return
}
afsOrder, err := api.TaoVegetableApi.UserApplyRefund(c.Ctx.Request)
afsOrder, body, err := api.TaoVegetableApi.UserApplyRefund(c.Ctx.Request)
globals.SugarLogger.Debugf("ApplyCancelOrder := %s", utils.Format4Output(afsOrder, false))
globals.SugarLogger.Debugf("ApplyCancelOrder err := %s", utils.Format4Output(err, false))
if err != nil {
@@ -141,21 +144,25 @@ func (c *TaoBaoVegetableController) ApplyCancelOrder() {
}
// 验签 FFF779F16365992BD721C9C1A027F03C
sign := Sign(values, utils.Format4Output(afsOrder, false), api.TaoVegetableApi.GetAppSecret())
if sign != values.Get("sign") { // 76626F983F0F7E4A159AD64F9B13B332
c.Data["json"] = tao_vegetable.CallBackResultSign(fmt.Errorf("非法签名"))
c.ServeJSON()
return
} else {
c.Data["json"] = tao_vegetable.CallBackResultSign(nil)
sign := Sign(values, body, api.TaoVegetableApi.GetAppSecret())
switch afsOrder.MerchantCode {
case "CSSJ":
if sign != values.Get("sign") { // E8C3B7D19ECCB6618CB0F2C30BB086EC
c.Data["json"] = tao_vegetable.CallBackResultSign(fmt.Errorf("非法签名"))
c.ServeJSON()
return
} else {
c.Data["json"] = tao_vegetable.CallBackResultSign(nil)
c.ServeJSON()
return
}
default:
callbackResponse := taoVegetable.OnCallbackMsg(tao_vegetable.OrderStatusApplyAfs, afsOrder.OutOrderId, afsOrder)
globals.SugarLogger.Debugf("callbackResponse response : %s", utils.Format4Output(callbackResponse, false))
c.Data["json"] = callbackResponse
c.ServeJSON()
return
}
callbackResponse := taoVegetable.OnCallbackMsg(tao_vegetable.OrderStatusApplyAfs, afsOrder.OutOrderId, afsOrder)
c.Data["json"] = callbackResponse
c.ServeJSON()
return
}
// UserCancelRefund 用户取消售后
@@ -172,7 +179,7 @@ func (c *TaoBaoVegetableController) UserCancelRefund() {
return
}
afsOrder, err := api.TaoVegetableApi.UserCancelRefundApply(c.Ctx.Request)
afsOrder, body, err := api.TaoVegetableApi.UserCancelRefundApply(c.Ctx.Request)
globals.SugarLogger.Debugf("UserCancelRefund := %s", utils.Format4Output(afsOrder, false))
globals.SugarLogger.Debugf("UserCancelRefund err := %s", utils.Format4Output(err, false))
if err != nil {
@@ -183,21 +190,25 @@ func (c *TaoBaoVegetableController) UserCancelRefund() {
}
// 验签
sign := Sign(values, utils.Format4Output(afsOrder, false), api.TaoVegetableApi.GetAppSecret())
if sign != values.Get("sign") {
c.Data["json"] = tao_vegetable.CallBackResultSign(fmt.Errorf("非法签名"))
sign := Sign(values, body, api.TaoVegetableApi.GetAppSecret())
switch afsOrder.MerchantCode {
case "CSSJ":
if sign != values.Get("sign") {
c.Data["json"] = tao_vegetable.CallBackResultSign(fmt.Errorf("非法签名"))
c.ServeJSON()
return
} else {
c.Data["json"] = tao_vegetable.CallBackResultSign(nil)
c.ServeJSON()
return
}
default:
callbackResponse := taoVegetable.OnCallbackMsg(tao_vegetable.OrderStatusCancelAfs, afsOrder.OutOrderId, afsOrder)
c.Data["json"] = callbackResponse
c.ServeJSON()
return
} /*else {
c.Data["json"] = tao_vegetable.CallBackResultSign(nil)
c.ServeJSON()
return
}*/
}
callbackResponse := taoVegetable.OnCallbackMsg(tao_vegetable.OrderStatusCancelAfs, afsOrder.OutOrderId, afsOrder)
c.Data["json"] = callbackResponse
c.ServeJSON()
return
}
// CancelOnSaleRefundOrder 用户售中取消(走订单取消流程)
@@ -214,7 +225,7 @@ func (c *TaoBaoVegetableController) CancelOnSaleRefundOrder() {
return
}
afsOrder, err := api.TaoVegetableApi.OnSaleRefundOrder(c.Ctx.Request)
afsOrder, body, err := api.TaoVegetableApi.OnSaleRefundOrder(c.Ctx.Request)
globals.SugarLogger.Debugf("CancelOnSaleRefundOrder := %s", utils.Format4Output(afsOrder, false))
globals.SugarLogger.Debugf("CancelOnSaleRefundOrder err := %s", utils.Format4Output(err, false))
if err != nil {
@@ -225,21 +236,24 @@ func (c *TaoBaoVegetableController) CancelOnSaleRefundOrder() {
}
// 验签
sign := Sign(values, utils.Format4Output(afsOrder, false), api.TaoVegetableApi.GetAppSecret())
if sign != values.Get("sign") {
c.Data["json"] = tao_vegetable.CallBackResultSign(fmt.Errorf("非法签名"))
sign := Sign(values, body, api.TaoVegetableApi.GetAppSecret())
switch afsOrder.PartCancelRequest.MerchantCode {
case "CSSJ":
if sign != values.Get("sign") {
c.Data["json"] = tao_vegetable.CallBackResultSign(fmt.Errorf("非法签名"))
c.ServeJSON()
return
} else {
c.Data["json"] = tao_vegetable.CallBackResultSign(nil)
c.ServeJSON()
return
}
default:
callbackResponse := taoVegetable.OnCallbackMsg(tao_vegetable.OrderStatusOnSaleCancel, utils.Int64ToStr(afsOrder.PartCancelRequest.BizOrderId), afsOrder)
c.Data["json"] = callbackResponse
c.ServeJSON()
return
} /*else {
c.Data["json"] = tao_vegetable.CallBackResultSign(nil)
c.ServeJSON()
return
}*/
callbackResponse := taoVegetable.OnCallbackMsg(tao_vegetable.OrderStatusOnSaleCancel, utils.Int64ToStr(afsOrder.PartCancelRequest.BizOrderId), afsOrder)
c.Data["json"] = callbackResponse
c.ServeJSON()
return
}
}
// RefundOrderSuccess 用户售后成功通知,只有退款成功了才会通知(商户拒绝退款,不会通知)
@@ -256,7 +270,7 @@ func (c *TaoBaoVegetableController) RefundOrderSuccess() {
return
}
refundSuccess, err := api.TaoVegetableApi.RefundOrderFinish(c.Ctx.Request)
refundSuccess, body, err := api.TaoVegetableApi.RefundOrderFinish(c.Ctx.Request)
globals.SugarLogger.Debugf("RefundOrderSuccess := %s", utils.Format4Output(refundSuccess, false))
globals.SugarLogger.Debugf("RefundOrderSuccess err := %s", utils.Format4Output(err, false))
if err != nil {
@@ -266,21 +280,24 @@ func (c *TaoBaoVegetableController) RefundOrderSuccess() {
return
}
// 验签
sign := Sign(values, utils.Format4Output(refundSuccess, false), api.TaoVegetableApi.GetAppSecret())
if sign != values.Get("sign") {
c.Data["json"] = tao_vegetable.CallBackResultSign(fmt.Errorf("非法签名"))
sign := Sign(values, body, api.TaoVegetableApi.GetAppSecret())
switch refundSuccess.MerchantCode {
case "CSSJ":
if sign != values.Get("sign") {
c.Data["json"] = tao_vegetable.CallBackResultSign(fmt.Errorf("非法签名"))
c.ServeJSON()
return
} else {
c.Data["json"] = tao_vegetable.CallBackResultSign(nil)
c.ServeJSON()
return
}
default:
callbackResponse := taoVegetable.OnCallbackMsg(tao_vegetable.OrderStatusRefundSuccess, refundSuccess.OutMainRefundId, refundSuccess)
c.Data["json"] = callbackResponse
c.ServeJSON()
return
} /*else {
c.Data["json"] = tao_vegetable.CallBackResultSign(nil)
c.ServeJSON()
return
}*/
callbackResponse := taoVegetable.OnCallbackMsg(tao_vegetable.OrderStatusRefundSuccess, refundSuccess.OutSubOrderId, refundSuccess)
c.Data["json"] = callbackResponse
c.ServeJSON()
return
}
}
func Sign(param url.Values, data, secret string) string {
@@ -293,10 +310,11 @@ func Sign(param url.Values, data, secret string) string {
}
sort.Strings(publicParam)
resultParam := strings.ReplaceAll(strings.ReplaceAll(strings.ReplaceAll(data, "\n", ""), "\t", ""), " ", "")
resultParam := strings.ReplaceAll(strings.ReplaceAll(strings.ReplaceAll(strings.ReplaceAll(data, "\n", ""), "\t", ""), " ", ""), "\r", "")
if strings.Contains(resultParam, `\u0026`) {
resultParam = strings.ReplaceAll(resultParam, `\u0026`, "&")
}
cc := secret + strings.Join(publicParam, "") + resultParam + secret
return fmt.Sprintf("%X", md5.Sum([]byte(cc)))
}