diff --git a/business/jxcallback/orderman/order.go b/business/jxcallback/orderman/order.go index 5dd7a7646..597581283 100644 --- a/business/jxcallback/orderman/order.go +++ b/business/jxcallback/orderman/order.go @@ -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) diff --git a/business/jxcallback/orderman/order_afs.go b/business/jxcallback/orderman/order_afs.go index e361d0cdc..5fe5c9bfa 100644 --- a/business/jxcallback/orderman/order_afs.go +++ b/business/jxcallback/orderman/order_afs.go @@ -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, diff --git a/business/jxstore/cms/sync_store_sku.go b/business/jxstore/cms/sync_store_sku.go index 5ce233747..b045953d2 100644 --- a/business/jxstore/cms/sync_store_sku.go +++ b/business/jxstore/cms/sync_store_sku.go @@ -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) diff --git a/business/model/dao/dao_order.go b/business/model/dao/dao_order.go index 0dda02257..637b4e99c 100644 --- a/business/model/dao/dao_order.go +++ b/business/model/dao/dao_order.go @@ -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) } diff --git a/business/model/order_financial.go b/business/model/order_financial.go index aef6bddf0..f27af9fb3 100644 --- a/business/model/order_financial.go +++ b/business/model/order_financial.go @@ -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 diff --git a/business/partner/purchase/ebai/financial.go b/business/partner/purchase/ebai/financial.go index 40cfe6773..8607b74eb 100644 --- a/business/partner/purchase/ebai/financial.go +++ b/business/partner/purchase/ebai/financial.go @@ -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)), diff --git a/business/partner/purchase/tao_vegetable/callback.go b/business/partner/purchase/tao_vegetable/callback.go index 9d8c09894..b8898dec2 100644 --- a/business/partner/purchase/tao_vegetable/callback.go +++ b/business/partner/purchase/tao_vegetable/callback.go @@ -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 diff --git a/business/partner/purchase/tao_vegetable/financial.go b/business/partner/purchase/tao_vegetable/financial.go index c31d6510b..8b1a6c9b0 100644 --- a/business/partner/purchase/tao_vegetable/financial.go +++ b/business/partner/purchase/tao_vegetable/financial.go @@ -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 diff --git a/business/partner/purchase/tao_vegetable/order.go b/business/partner/purchase/tao_vegetable/order.go index fbea60828..09ae8d9c0 100644 --- a/business/partner/purchase/tao_vegetable/order.go +++ b/business/partner/purchase/tao_vegetable/order.go @@ -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, diff --git a/business/partner/purchase/tao_vegetable/order_afs.go b/business/partner/purchase/tao_vegetable/order_afs.go index a5f0c897a..54f9b3f92 100644 --- a/business/partner/purchase/tao_vegetable/order_afs.go +++ b/business/partner/purchase/tao_vegetable/order_afs.go @@ -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 diff --git a/business/partner/purchase/tao_vegetable/order_utils.go b/business/partner/purchase/tao_vegetable/order_utils.go index 88fd9f5e7..86ed90286 100644 --- a/business/partner/purchase/tao_vegetable/order_utils.go +++ b/business/partner/purchase/tao_vegetable/order_utils.go @@ -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) } diff --git a/business/partner/purchase/tao_vegetable/store.go b/business/partner/purchase/tao_vegetable/store.go index d32f173b5..dac751604 100644 --- a/business/partner/purchase/tao_vegetable/store.go +++ b/business/partner/purchase/tao_vegetable/store.go @@ -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, "") // 操作日志(美团外卖) diff --git a/business/partner/purchase/tao_vegetable/store_sku2.go b/business/partner/purchase/tao_vegetable/store_sku2.go index 40b744074..e31e2ffcb 100644 --- a/business/partner/purchase/tao_vegetable/store_sku2.go +++ b/business/partner/purchase/tao_vegetable/store_sku2.go @@ -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 = ¶m 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(¶m); 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) diff --git a/business/partner/purchase/tao_vegetable/tao.go b/business/partner/purchase/tao_vegetable/tao.go index 77a5278f8..2bd7000d3 100644 --- a/business/partner/purchase/tao_vegetable/tao.go +++ b/business/partner/purchase/tao_vegetable/tao.go @@ -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 != "" { diff --git a/controllers/jx_order.go b/controllers/jx_order.go index b01792fac..9641411c2 100644 --- a/controllers/jx_order.go +++ b/controllers/jx_order.go @@ -699,7 +699,7 @@ func (c *OrderController) ConfirmReceiveGoods() { }) } -// @Title 同意或拒绝用户取消订单申请 +// @Title 同意或拒绝用户取消订单申请 (饿百) // @Description 同意或拒绝用户取消订单申请 // @Param token header string true "认证token" // @Param vendorOrderID formData string true "订单ID" diff --git a/controllers/taobao_vegetable.go b/controllers/taobao_vegetable.go index 4170e1f44..bf9926651 100644 --- a/controllers/taobao_vegetable.go +++ b/controllers/taobao_vegetable.go @@ -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))) }