diff --git a/business/auth2/auth2.go b/business/auth2/auth2.go index 1ab4c6c7f..401a05efd 100644 --- a/business/auth2/auth2.go +++ b/business/auth2/auth2.go @@ -5,7 +5,6 @@ import ( "encoding/base64" "encoding/json" "errors" - "git.rosy.net.cn/jx-callback/globals" "regexp" "strings" "time" @@ -286,7 +285,6 @@ func LoginInternal(ctx *Context, authType, authID, authIDType, authSecret string //如果是小程序 if authType == AuthTypeWXMini { // || authType == AuthTypeWXApp 此处AuthTypeWXApp没用上 appID := strings.Split(authSecret, ",")[0] - globals.SugarLogger.Debugf("authSecret=%s,appID=%s", authSecret, appID) // 菜市商家 // // // 京西商城 if appID == model.JXC4BusinessAppId || appID == "wx2d6949f724b2541d" || appID == "wx18111a41fd17f24f" || appID == model.JXC4AppId { //菜市或者果园 if authInfo.AuthBindInfo.UserID != "" { diff --git a/business/jxcallback/auto_delivery/auto_delivery.go b/business/jxcallback/auto_delivery/auto_delivery.go index c9030077e..02df8318c 100644 --- a/business/jxcallback/auto_delivery/auto_delivery.go +++ b/business/jxcallback/auto_delivery/auto_delivery.go @@ -75,7 +75,7 @@ func Init() { riderListInfo = list } -// AutoSettingFakeDelivery 抖音自动设置骑手, 推送假订单 +// AutoSettingFakeDelivery 抖音自动设置骑手(饿百), 推送假订单 func AutoSettingFakeDelivery() { db := dao.GetDB() @@ -106,9 +106,17 @@ func AutoSettingFakeDelivery() { riderKey := "" if strings.Contains(v.ConsigneeAddress, "重庆") || strings.Contains(v.ConsigneeAddress, "上海") || strings.Contains(v.ConsigneeAddress, "北京") { riderKey = strings.Split(v.ConsigneeAddress, "市")[0] - } else { + } else if strings.Contains(v.ConsigneeAddress, "省") { riderKey = strings.Split(v.ConsigneeAddress, "省")[0] + } else { + storeDetail, _ := dao.GetStoreDetail(db, v.JxStoreID, 0, "") + if strings.Contains(storeDetail.Address, "重庆") || strings.Contains(storeDetail.Address, "上海") || strings.Contains(storeDetail.Address, "北京") { + riderKey = strings.Split(storeDetail.Address, "市")[0] + } else { + riderKey = strings.Split(storeDetail.Address, "省")[0] + } } + if len(riderListInfo[riderKey]) == model.NO { // 骑手列表 configRiderList, err := dao.QueryConfigs(db, "riderList", "Sys", "") @@ -121,7 +129,7 @@ func AutoSettingFakeDelivery() { return } } - + globals.SugarLogger.Debugf("===============riderListInfo= : %s", riderKey) randNumber, _ := rand.Int(rand.Reader, big.NewInt(int64(len(riderListInfo[riderKey])))) randTime := randNumber.Int64() if randTime < 0 { @@ -130,7 +138,7 @@ func AutoSettingFakeDelivery() { if randTime >= int64(len(riderListInfo[riderKey])) { randTime = int64(len(riderListInfo[riderKey])) - 1 } - if v.PhoneAscription == "" || strings.Split(v.PhoneAscription, "-")[0] != model.PhoneAscriptionAddressYes { + if (v.PhoneAscription == "" || strings.Split(v.PhoneAscription, "-")[0] != model.PhoneAscriptionAddressYes) && v.VendorID == model.VendorIDDD { continue } // 自动拣货 @@ -148,7 +156,6 @@ func AutoSettingFakeDelivery() { break } for riderName, riderPhone := range riderListInfo[riderKey][randTime] { - globals.SugarLogger.Debugf("SelfDeliveringAndUpdateStatus : %s", v.VendorOrderID) if err := defsch.FixedScheduler.SelfDeliveringAndUpdateStatus(jxcontext.AdminCtx, v.VendorOrderID, v.VendorID, jxcontext.AdminCtx.GetUserName(), riderName, riderPhone); err != nil { globals.SugarLogger.Errorf("自动发货错误:[%v]", err) break diff --git a/business/jxcallback/orderman/fake_jd_order.go b/business/jxcallback/orderman/fake_jd_order.go index f0ea22f67..04b370f42 100644 --- a/business/jxcallback/orderman/fake_jd_order.go +++ b/business/jxcallback/orderman/fake_jd_order.go @@ -66,7 +66,6 @@ func notifyWxNewFakeJdOrder(order *model.GoodsOrder, storeID int) (err error) { } title := fmt.Sprintf("你有到家菜市新订单%d", order.OrderSeq) content := sb.String() - // globals.SugarLogger.Debugf("notifyWxNewFakeJdOrder, orderID:%s, content:%s", order.VendorOrderID, content) _, err = weixinmsg.SendStoreMessage(jxcontext.AdminCtx, title, content, []int{storeID}, nil, "", model.MessageTypeStore, true, true) return err } diff --git a/business/jxcallback/orderman/order_afs.go b/business/jxcallback/orderman/order_afs.go index 783a72385..e361d0cdc 100644 --- a/business/jxcallback/orderman/order_afs.go +++ b/business/jxcallback/orderman/order_afs.go @@ -67,19 +67,22 @@ func (c *OrderManager) onAfsOrderNew(afsOrder *model.AfsOrder, orderStatus *mode panic(r) } }() + isDuplicated, err := addOrderOrWaybillStatus(orderStatus, db) - if err != nil || isDuplicated { + if err != nil || (isDuplicated && orderStatus.VendorID != model.VendorIDJX) { if err == nil { dao.Commit(db, txDB) } return err } - var existAfsOrder *model.AfsOrder - if existAfsOrder, err = c.loadAfsOrder(db, afsOrder.AfsOrderID, afsOrder.VendorID); err != nil { + + existAfsOrder, err := c.loadAfsOrder(db, afsOrder.AfsOrderID, afsOrder.VendorID) + if err != nil { if !dao.IsNoRowsError(err) { return err } } + if existAfsOrder != nil { // todo 可能导致状态回绕 existAfsOrder.Status = afsOrder.Status @@ -327,8 +330,9 @@ func (c *OrderManager) updateAfsOrderOtherInfo(db *dao.DaoDB, afsOrder *model.Af afsOrder.JxStoreID = storeDetail.Store.ID } } + order, err2 := c.LoadOrder(afsOrder.VendorOrderID, afsOrder.VendorID) if afsOrder.StoreID == 0 && afsOrder.JxStoreID == 0 { - if order, err2 := c.LoadOrder(afsOrder.VendorOrderID, afsOrder.VendorID); err2 == nil { + if err2 == nil { afsOrder.JxStoreID = order.JxStoreID if afsOrder.StoreID == 0 { afsOrder.StoreID = order.StoreID @@ -346,6 +350,9 @@ func (c *OrderManager) updateAfsOrderOtherInfo(db *dao.DaoDB, afsOrder *model.Af } if err = c.updateAfsOrderSkuOtherInfo(db, afsOrder); err == nil { jxutils.RefreshAfsOrderSkuRelated(afsOrder) + if afsOrder.RefundType == model.AfsTypeFullRefund && afsOrder.VendorID == model.VendorIDJX && order.DeliveryType != model.OrderDeliveryTypeSelfTake { + afsOrder.SkuUserMoney = order.ActualPayPrice + } } } return err @@ -368,9 +375,9 @@ func (c *OrderManager) setAfsOrderID(db *dao.DaoDB, orderStatus *model.OrderStat list := strings.Split(afsOrderList[0].AfsOrderID, "-") if len(list) > 1 { index = int(utils.Str2Int64WithDefault(list[1], 0)) - if afsOrderList[0].Status >= model.AfsOrderStatusFinished { - index++ - } + //if afsOrderList[0].Status >= model.AfsOrderStatusFinished { + index++ + //} } } } else { diff --git a/business/jxcallback/orderman/orderman_ext.go b/business/jxcallback/orderman/orderman_ext.go index b5ba39178..cb5a9aa2f 100644 --- a/business/jxcallback/orderman/orderman_ext.go +++ b/business/jxcallback/orderman/orderman_ext.go @@ -902,7 +902,7 @@ func (c *OrderManager) GetStoresOrderSaleInfoNew(ctx *jxcontext.Context, storeID orderIDMap := make(map[string]struct{}) var vendorOrderIDs []string - orderSkuList, err := dao.GetStoreOrderSkuList(db, storeIDList, fromTime, toTime, statusList, true, isService) + orderSkuList, err := dao.GetStoreOrderSkuList(db, storeIDList, fromTime, toTime, statusList, true, isService) // 所有的完成订单 if err != nil { return nil, err } @@ -1019,7 +1019,7 @@ func (c *OrderManager) GetStoresOrderSaleInfoNew(ctx *jxcontext.Context, storeID } return orderMap, orderSkuMap, saleInfoMap } - _, _, saleInfoMap := orderSkuHandler(orderSkuList) + _, _, saleInfoMap := orderSkuHandler(orderSkuList) // 所有订单的支付金额 orderMap, orderSkuMap, _ := orderSkuHandler(orderSkuList4Afs) afsOrderMap := make(map[string]*model.GoodsOrder) @@ -1074,6 +1074,23 @@ func (c *OrderManager) GetStoresOrderSaleInfoNew(ctx *jxcontext.Context, storeID saleInfo.Count++ } for _, v := range saleInfoMap { + if v.Status == model.OrderStatusFinished { + // 计算平台计算 + settle, _ := dao.GetPlatformSettlement(db, storeIDList, fromTime, toTime) + for _, s := range settle { + if v.VendorID == s.VendorID { + v.PlatformSettlement = s.TotalShopMoney + } + } + + // 计算三方配送 + fee, _ := dao.GetPlatformDesiredFee(db, storeIDList, fromTime, toTime) + for _, f := range fee { + if v.VendorID == f.VendorID { + v.ActualFee = f.ActualFee + } + } + } saleInfoList = append(saleInfoList, v) } return saleInfoList, err diff --git a/business/jxcallback/scheduler/basesch/basesch_ext.go b/business/jxcallback/scheduler/basesch/basesch_ext.go index 3f00fa775..c7df132cb 100644 --- a/business/jxcallback/scheduler/basesch/basesch_ext.go +++ b/business/jxcallback/scheduler/basesch/basesch_ext.go @@ -78,10 +78,12 @@ func (c *BaseScheduler) SelfDeliveredAndUpdateStatus(ctx *jxcontext.Context, ven err = c.Swtich2SelfDelivered(order, userName) } if err == nil { - // order.Status = model.OrderStatusFinished // todo 是否需要强制设置完成状态? - if err = dao.SetOrderFlag(dao.GetDB(), ctx.GetUserName(), order.VendorOrderID, order.VendorID, model.OrderFlagMaskSetDelivered); err == nil { + order.Status = model.OrderStatusFinished // todo 是否需要强制设置完成状态? + if err = dao.SetOrderFlag(dao.GetDB(), ctx.GetUserName(), order.VendorOrderID, order.VendorID, model.OrderFlagMaskSetDelivered); err != nil { return err } + order.OrderFinishedAt = time.Now() + dao.UpdateEntity(dao.GetDB(), order, "Status", "OrderFinishedAt") } } return err @@ -99,7 +101,7 @@ func (c *BaseScheduler) PickupGoodsAndUpdateStatus(ctx *jxcontext.Context, vendo err = c.PickupGoods(order, flag, userName) if err == nil { order.Status = model.OrderStatusFinishedPickup - if err = partner.CurOrderManager.UpdateOrderStatusAndDeliveryFlag(order); err == nil { + if err = partner.CurOrderManager.UpdateOrderStatusAndDeliveryFlag(order); err != nil { return err } } @@ -108,7 +110,8 @@ func (c *BaseScheduler) PickupGoodsAndUpdateStatus(ctx *jxcontext.Context, vendo order.Status = model.OrderStatusFinished order.VendorStatus = utils.Int64ToStr(model.OrderStatusFinished) order.Flag = 128 - dao.UpdateEntity(dao.GetDB(), order, "Status", "VendorStatus", "Flag") + order.OrderFinishedAt = time.Now() + dao.UpdateEntity(dao.GetDB(), order, "Status", "VendorStatus", "Flag", "OrderFinishedAt") } } return err @@ -227,7 +230,7 @@ func (c *BaseScheduler) AgreeOrRefuseRefund(ctx *jxcontext.Context, afsOrderID s ) waybills, _ := dao.GetWaybills(db, order.VendorOrderID) //美团的订单如果是同意全部退款,要取消所有三方运单并停止调度 - if order.VendorID == model.VendorIDMTWM { + if order.VendorID == model.VendorIDMTWM || order.VendorID == model.VendorIDJX { var ( afsCount, orderCount int ) @@ -239,13 +242,19 @@ func (c *BaseScheduler) AgreeOrRefuseRefund(ctx *jxcontext.Context, afsOrderID s orderCount += v.Count } //如果售后退款的商品数等于订单商品数,我就当是全部退款了 - if afsCount == orderCount { + if afsCount == orderCount && order.VendorID == model.VendorIDMTWM { order.DeliveryFlag |= model.OrderDeliveryFlagMaskScheduleDisabled partner.CurOrderManager.UpdateOrderFields(order, []string{"DeliveryFlag"}) for _, v := range waybills { c.CancelWaybill(v, partner.CancelWaybillReasonOther, partner.CancelWaybillReasonStrActive) } } + if afsCount == orderCount && order.VendorID == model.VendorIDJX { + order.DeliveryFlag |= model.OrderDeliveryFlagMaskScheduleDisabled + order.Status = model.OrderStatusCanceled + order.VendorStatus = utils.Int2Str(model.OrderStatusCanceled) + partner.CurOrderManager.UpdateOrderFields(order, []string{"DeliveryFlag", "Status", "VendorStatus"}) + } } if order.EarningType == model.EarningTypePoints { var ( @@ -278,7 +287,7 @@ func (c *BaseScheduler) AgreeOrRefuseRefund(ctx *jxcontext.Context, afsOrderID s } } - if approveType != partner.AfsApproveTypeRefused { + if approveType != partner.AfsApproveTypeRefused && err == nil { storeDetail, err := partner.CurOrderManager.LoadStoreDetail(afsOrder.StoreID, afsOrder.VendorID) if err != nil { return err diff --git a/business/jxcallback/scheduler/defsch/defsch_ext.go b/business/jxcallback/scheduler/defsch/defsch_ext.go index d09b25037..9a8c6eb06 100644 --- a/business/jxcallback/scheduler/defsch/defsch_ext.go +++ b/business/jxcallback/scheduler/defsch/defsch_ext.go @@ -81,7 +81,7 @@ func (s *DefScheduler) SelfDeliveringAndUpdateStatus(ctx *jxcontext.Context, ven } // 上面是真的转自送,支持美团,饿百,京东,如果时抖店,抖店暂时全部是自送的!但是有骑手信息时,就是一个白嫖单子! - if order.VendorID == model.VendorIDDD && courierName != "" && courierMobile != "" && err == nil { + if (order.VendorID == model.VendorIDDD || order.VendorID == model.VendorIDEBAI) && courierName != "" && courierMobile != "" && err == nil { timeNow := time.Now() rand.Seed(timeNow.UnixNano()) randNumber := rand.Int63n(640) @@ -94,7 +94,7 @@ func (s *DefScheduler) SelfDeliveringAndUpdateStatus(ctx *jxcontext.Context, ven VendorWaybillID2: "", WaybillVendorID: model.VendorJXFakeWL, VendorOrderID: order.VendorOrderID, - OrderVendorID: model.VendorIDDD, + OrderVendorID: order.VendorID, CourierName: courierName, CourierMobile: courierMobile, Status: model.OrderStatusNew, @@ -108,7 +108,7 @@ func (s *DefScheduler) SelfDeliveringAndUpdateStatus(ctx *jxcontext.Context, ven WaybillFinishedAt: utils.DefaultTimeValue, StatusTime: timeNow.Add(randTime), // 下一状态时间 OriginalData: "", - Remark: "自定义物流单", + Remark: "自定义物流单(抖音/饿了么)", VendorOrgCode: order.VendorOrgCode, } err = dao.CreateEntity(dao.GetDB(), bill) @@ -130,9 +130,9 @@ func (s *DefScheduler) canOrderCreateWaybillNormally(order *model.GoodsOrder, sa func (s *DefScheduler) isPossibleSwitch2SelfDelivery(order *model.GoodsOrder) (err error) { //TODO 刷单用,之后不刷单了删除 - if order.VendorID == model.VendorIDDD { - return nil - } + //if order.VendorID == model.VendorIDDD { + // return nil + //} if model.IsOrderDeliveryByPlatform(order) { if order.Status < model.OrderStatusFinishedPickup { diff --git a/business/jxstore/act/act.go b/business/jxstore/act/act.go index 41967ad06..9773c534b 100644 --- a/business/jxstore/act/act.go +++ b/business/jxstore/act/act.go @@ -2035,32 +2035,32 @@ func RrefreshMtwmVendorAct(ctx *jxcontext.Context) (err error) { } // 查询门店爆款商品,当门店存在爆款时,取消之前的力荐商品,将新的爆款设置为力荐商品 // 商品为手动设置力荐或者爆款活动在取消力荐之前被删除,那么无法取消被力荐的商品! - //if k == mtwmapi.RetailActTypeSecKill && len(actList) > 0 && storeMap.StoreID == 1 { - // allActivitySkuIdList := make([]string, 0, 0) // 此门店全部的折扣(爆款)活动商品 - // activationActivitySkuIdList := make([]*partner.StoreSkuInfo, 0, 0) // 此门店正在进行的折扣(爆款)活动商品 - // loseActivitySkuIdList := make([]*partner.StoreSkuInfo, 0, 0) // 此门店已经结束的折扣(爆款)活动商品 - // for _, ac := range actList { - // allActivitySkuIdList = append(allActivitySkuIdList, utils.Int64ToStr(ac.ItemID)) - // // 已经生效的爆款活动 - // if ac.Status == 1 && ac.SkuId != "" { - // activationActivitySkuIdList = append(activationActivitySkuIdList, &partner.StoreSkuInfo{ - // SkuID: utils.Str2Int(ac.SkuId), - // IsSpecialty: 1, - // }) - // } - // // 已经失效的爆款活动 - // if ac.Status == 0 && ac.SkuId != "" { - // loseActivitySkuIdList = append(loseActivitySkuIdList, &partner.StoreSkuInfo{ - // SkuID: utils.Str2Int(ac.SkuId), - // IsSpecialty: 0, - // }) - // } - // } - // // 取消当前力荐商品 - // partner.GetPurchasePlatformFromVendorID(storeMap.VendorID).(partner.ISingleStoreStoreSkuHandler).UpdateStoreSkusSpecTag(ctx, storeMap.VendorOrgCode, storeMap.StoreID, storeMap.VendorStoreID, loseActivitySkuIdList) - // // 重新推荐力荐商品 - // partner.GetPurchasePlatformFromVendorID(storeMap.VendorID).(partner.ISingleStoreStoreSkuHandler).UpdateStoreSkusSpecTag(ctx, storeMap.VendorOrgCode, storeMap.StoreID, storeMap.VendorStoreID, activationActivitySkuIdList) - //} + if k == mtwmapi.RetailActTypeSecKill && len(actList) > 0 && storeMap.VendorID == model.VendorIDMTWM { + //allActivitySkuIdList := make([]string, 0, 0) // 此门店全部的折扣(爆款)活动商品 + //activationActivitySkuIdList := make([]*partner.StoreSkuInfo, 0, 0) // 此门店正在进行的折扣(爆款)活动商品 + //loseActivitySkuIdList := make([]*partner.StoreSkuInfo, 0, 0) // 此门店已经结束的折扣(爆款)活动商品 + //for _, ac := range actList { + // allActivitySkuIdList = append(allActivitySkuIdList, utils.Int64ToStr(ac.ItemID)) + // // 已经生效的爆款活动 + // if ac.Status == 1 && ac.SkuId != "" { + // activationActivitySkuIdList = append(activationActivitySkuIdList, &partner.StoreSkuInfo{ + // SkuID: utils.Str2Int(ac.SkuId), + // IsSpecialty: 1, + // }) + // } + // // 已经失效的爆款活动 + // if ac.Status == 0 && ac.SkuId != "" { + // loseActivitySkuIdList = append(loseActivitySkuIdList, &partner.StoreSkuInfo{ + // SkuID: utils.Str2Int(ac.SkuId), + // IsSpecialty: 0, + // }) + // } + //} + //// 取消当前力荐商品 + //partner.GetPurchasePlatformFromVendorID(storeMap.VendorID).(partner.ISingleStoreStoreSkuHandler).UpdateStoreSkusSpecTag(ctx, storeMap.VendorOrgCode, storeMap.StoreID, storeMap.VendorStoreID, loseActivitySkuIdList) + //// 重新推荐力荐商品 + //partner.GetPurchasePlatformFromVendorID(storeMap.VendorID).(partner.ISingleStoreStoreSkuHandler).UpdateStoreSkusSpecTag(ctx, storeMap.VendorOrgCode, storeMap.StoreID, storeMap.VendorStoreID, activationActivitySkuIdList) + } } return retVal, err }, storeMaps) diff --git a/business/jxstore/cms/sku.go b/business/jxstore/cms/sku.go index 807490f3d..26fcc486e 100644 --- a/business/jxstore/cms/sku.go +++ b/business/jxstore/cms/sku.go @@ -1194,7 +1194,7 @@ func getJDCategoryLoadingLocalCategoryReflex(jdCategoryId, jdsCategoryID, ebaiCa if mtwmCategoryID == "" && cats[0].MtwmCategoryID != 0 { mtwmCategoryID = utils.Int64ToStr(cats[0].MtwmCategoryID) } - if jxCategoryId == 0 { + if jxCategoryId == 0 || jxCategoryId == 291 { jxCategoryId = cats[0].ID } } @@ -1260,30 +1260,54 @@ func updateOrCreateSkuVendorCategoryMap(db *dao.DaoDB, ctx *jxcontext.Context, n } } else { if payload["jdCategoryID"] != nil { - jdCategoryId = payload["jdCategoryID"].(string) - } else { - jdCategoryId = getCategoryByName(payload["name"].(string)) + value, ok := payload["jdCategoryID"].(string) + if ok && value != "" && value != "0" { + jdCategoryId = payload["jdCategoryID"].(string) + } else { + jdCategoryId = getCategoryByName(payload["name"].(string)) + } } if payload["jdsCategoryID"] != nil { - jdsCategoryID = payload["jdsCategoryID"].(string) + value, ok := payload["jdCategoryID"].(string) + if ok && value != "" && value != "0" { + jdsCategoryID = payload["jdsCategoryID"].(string) + } } if payload["ebaiCategoryID"] != nil { - ebaiCategoryID = payload["ebaiCategoryID"].(string) + value, ok := payload["ebaiCategoryID"].(string) + if ok && value != "" && value != "0" { + ebaiCategoryID = payload["ebaiCategoryID"].(string) + } } if payload["mtwmCategoryID"] != nil { - mtwmCategoryID = payload["mtwmCategoryID"].(string) + value, ok := payload["mtwmCategoryID"].(string) + if ok && value != "" && value != "0" { + mtwmCategoryID = payload["mtwmCategoryID"].(string) + } } if payload["categoryID2"] != nil && !utils.IsNil(payload["categoryID2"]) { - jxCategoryIDNumber, err := payload["categoryID2"].(json.Number).Int64() - if err != nil { - return false + var jxCategoryIDNumber int64 + if value, ok := payload["categoryID2"].(string); ok && value != "" { + jxCategoryIDNumber = utils.Str2Int64(value) + } + if value, ok := payload["categoryID2"].(int64); ok && value != 0 { + jxCategoryIDNumber = value + } + if value, ok := payload["categoryID2"].(json.Number); ok && value != "" { + jxCategoryIDNumber, _ = value.Int64() } jxCategoryID = int(jxCategoryIDNumber) } else if payload["categoryID"] != nil && !utils.IsNil(payload["categoryID"]) { - jxCategoryIDNumber, err := payload["categoryID"].(json.Number).Int64() - if err != nil { - return false + var jxCategoryIDNumber int64 + if value, ok := payload["categoryID"].(string); ok && value != "" { + jxCategoryIDNumber = utils.Str2Int64(value) + } + if value, ok := payload["categoryID"].(int64); ok && value != 0 { + jxCategoryIDNumber = value + } + if value, ok := payload["categoryID"].(json.Number); ok && value != "" { + jxCategoryIDNumber, _ = value.Int64() } jxCategoryID = int(jxCategoryIDNumber) } else { @@ -1295,7 +1319,9 @@ func updateOrCreateSkuVendorCategoryMap(db *dao.DaoDB, ctx *jxcontext.Context, n } if payload["ddCategoryID"] != nil { - ddCategoryID = payload["ddCategoryID"].(string) + if value, ok := payload["ddCategoryID"].(string); ok && value != "" { + ddCategoryID = value + } } else { ddCategoryID = getCategoryByImg(payload["descImg"].(string), payload["img"].(string), payload["img2"].(string), payload["img3"].(string), payload["img4"].(string), payload["img5"].(string)) } @@ -1321,6 +1347,10 @@ func updateOrCreateSkuVendorCategoryMap(db *dao.DaoDB, ctx *jxcontext.Context, n updateOrCreate(model.VendorIDJD, nameID, jdCategoryId) flag = true } + if jxCategoryID != 0 && jxCategoryID != 291 { + dao.ExecuteSQL(dao.GetDB(), `UPDATE sku_name SET category_id = ? WHERE id = ?`, []interface{}{jxCategoryID, nameID}...) + flag = true + } } return flag @@ -2331,18 +2361,34 @@ func CreateUpcSkuByExcelBin(ctx *jxcontext.Context, reader io.Reader, categoryID if configs, err := dao.QueryConfigs(dao.GetDB(), "mtwmCookieStr", model.ConfigTypeCookie, ""); err == nil { api.MtwmAPI.SetCookieWithStr(configs[0].Value) } - result, err := api.MtwmAPI.GetStandardProductListWithCond(*skuName.Upc) - if result != nil { - productInfo.OriginalName = result.Name - productInfo.OriginalSpec = result.Spec - productInfo.Name = result.Name - productInfo.SpecUnit = result.SpecUnit - productInfo.Unit = result.Unit - productInfo.SpecQuality = float32(result.SpecNew) - productInfo.ImgList = strings.Split(result.Pic, ",") - productInfo.Weight = float32(result.Weight) - productInfo.BrandName = result.BrandNamePath + + //result, err := api.MtwmAPI.GetStandardProductListWithCond(*skuName.Upc) + //if result != nil { + result, err := api.JdAPI.GetJdUpcCodeByName("", *skuName.Upc, 1, 5) + if result != nil && len(result) != 0 { + productInfo.OriginalName = result[0].OriginalName + productInfo.OriginalSpec = result[0].OriginalSpec + productInfo.Name = result[0].Name + productInfo.SpecUnit = result[0].SpecUnit + productInfo.Unit = result[0].Unit + productInfo.SpecQuality = result[0].SpecQuality + productInfo.ImgList = result[0].ImgList + if result[0].Img != "" { + productInfo.ImgList = append(productInfo.ImgList, productInfo.Img) + } + productInfo.Weight = result[0].Weight + productInfo.BrandName = result[0].BrandName setImgs(skuName, productInfo.ImgList) + // productInfo.OriginalName = result.Name + // productInfo.OriginalSpec = result.Spec + // productInfo.Name = result.Name + // productInfo.SpecUnit = result.SpecUnit + // productInfo.Unit = result.Unit + // productInfo.SpecQuality = float32(result.SpecNew) + // productInfo.ImgList = strings.Split(result.Pic, ",") + // productInfo.Weight = float32(result.Weight) + // productInfo.BrandName = result.BrandNamePath + // setImgs(skuName, productInfo.ImgList) } else { retVal = []*CreateUpcSkuByExcelErr{buildCreateUpcSkuByExcelErr(v, "美团cookie过期或者没查询到")} return retVal, err @@ -2505,16 +2551,48 @@ func CreateUpcSkuByExcelBin(ctx *jxcontext.Context, reader io.Reader, categoryID skuName.Img5 = downloadURL } } + + // 标品不存在规格是默认为包 + if (skuName.Unit == "份" && *skuName.Upc != "") || skuName.Unit == "" { + skuName.Unit = "包" + } if !isUpdate { _, err = AddSkuName(ctx, skuName, ctx.GetUserName()) } else { + var data []*model.SkuVendorCategoryMap + err = dao.GetRows(db, &data, `SELECT * FROM sku_vendor_category_map WHERE name_id = ? AND deleted_at = ?`, []interface{}{sku.ID, utils.DefaultTimeValue}...) + sku.Name = skuName.Name sku.Img = skuName.Img sku.Img2 = skuName.Img2 sku.Img3 = skuName.Img3 sku.Img4 = skuName.Img4 sku.Img5 = skuName.Img5 - dao.UpdateEntity(db, sku, "Name", "Img", "Img2", "Img3", "Img4", "Img5") + sku.Unit = skuName.Unit + dao.UpdateEntity(db, sku, "Name", "Img", "Img2", "Img3", "Img4", "Img5", "Unit") + payload := make(map[string]interface{}, 0) + payload["categoryID2"] = utils.Int2Str(sku.CategoryID) + payload["categoryID"] = utils.Int2Str(sku.CategoryID) + payload["descImg"] = sku.DescImg + payload["img"] = sku.Img + payload["img2"] = sku.Img2 + payload["img3"] = sku.Img3 + payload["img4"] = sku.Img4 + payload["img5"] = sku.Img5 + for _, d := range data { + switch d.VendorID { + case model.VendorIDJD: + payload["jdCategoryID"] = d.VendorCategoryID + case model.VendorIDMTWM: + payload["mtwmCategoryID"] = d.VendorCategoryID + case model.VendorIDJDShop: + case model.VendorIDDD: + payload["ddCategoryID"] = d.VendorCategoryID + case model.VendorIDEBAI: + payload["ebaiCategoryID"] = d.VendorCategoryID + } + } + updateOrCreateSkuVendorCategoryMap(db, ctx, sku.ID, payload, nil, false) } if err != nil { retVal = []*CreateUpcSkuByExcelErr{buildCreateUpcSkuByExcelErr(v, err.Error())} @@ -3303,7 +3381,7 @@ func setImgs2(v *model.SkuName, imgs []string) (err error) { return err } -func GetSkuNamesNew(ctx *jxcontext.Context, keyword string, skuIDs, skuNameIDs []int, categoryID, status int, isBySku bool, offset, pageSize int) (skuNamesInfo *SkuNamesInfo, err error) { +func GetSkuNamesNew(ctx *jxcontext.Context, keyword string, skuIDs, skuNameIDs []int, categoryID, status int, isBySku bool, offset, pageSize, bestSeller int) (skuNamesInfo *SkuNamesInfo, err error) { var ( db = dao.GetDB() sql = "" @@ -3408,6 +3486,10 @@ func GetSkuNamesNew(ctx *jxcontext.Context, keyword string, skuIDs, skuNameIDs [ sql += " AND t2.id IN (" + dao.GenQuestionMarks(len(skuIDs)) + ")" sqlParams = append(sqlParams, skuIDs) } + if bestSeller > 0 { + sql += " AND t1.best_seller = ? " + sqlParams = append(sqlParams, bestSeller) + } if categoryID > 0 { cat := &model.SkuCategory{} cat.ID = categoryID @@ -3502,3 +3584,10 @@ func GetSkuNamesNew(ctx *jxcontext.Context, keyword string, skuIDs, skuNameIDs [ } return skuNamesInfo, err } + +func SetSkuNameSeller(nameIds []int64, bastSeller int) error { + sql := ` UPDATE sku_name SET bast_seller = ? WHERE id IN (` + dao.GenQuestionMarks(len(nameIds)) + `)` + param := []interface{}{bastSeller, nameIds} + _, err := dao.ExecuteSQL(dao.GetDB(), sql, param...) + return err +} diff --git a/business/jxstore/cms/store.go b/business/jxstore/cms/store.go index 61189f6cc..b4d4a9dbf 100644 --- a/business/jxstore/cms/store.go +++ b/business/jxstore/cms/store.go @@ -1125,10 +1125,56 @@ func UpdateStore(ctx *jxcontext.Context, storeID int, payload map[string]interfa } } else { globals.SugarLogger.Debugf("UpdateStore track:%s, store:%s", ctx.GetTrackInfo(), utils.Format4Output(store, true)) + } + if status == -2 { + } return num, err } +//// updateVendorStoreStatusAndDeliveryStatus 当门店被禁用时,将三方平台和三方配送全部关闭 +//func updateVendorStoreStatusAndDeliveryStatus(ctx *jxcontext.Context, storeId int) error { +// var ( +// db = dao.GetDB() +// ) +// // 获取门店绑定三方平台列表 +// storeMap, err := dao.GetStoresMapList(db, nil, []int{storeId}, nil, 0, 0, "", "", "") +// if err != nil { +// return err +// } +// // 获取门店绑定的配送凭条 +// storeCouriers, err := dao.GetOpenedStoreCouriersByStoreID(db, storeId, -1) +// if err != nil { +// return err +// } +// +// work := func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { +// var errList []error +// step := batchItemList[0].(int) +// switch step { +// case 0: // 同步修改门店营业撞他 +// // 京东关店,本地店铺状态修改 +// // 美团关店,本地店铺状态修改 +// // 饿百关店,本地店铺状态修改 +// // 抖音关店,本地店铺状态修改 +// case 1: // 同步修改门店配送状态 +// // 美团跑腿配送(没有门店状态修改,直接修改本店) +// // 蜂鸟配送,关闭(有) +// // 达达配送,关闭(有) +// // uu跑腿,关闭(不涉及门店概念,直接本地取消绑定信息) +// } +// return errList, nil +// } +// tasksch.NewParallelTask( +// "禁用门店,修改平台门店状态", +// tasksch.NewParallelConfig().SetParallelCount(1).SetIsContinueWhenError(false), +// ctx, +// work, +// []int{0, 1}, +// ) +// +//} + func notifyStoreOperatorChanged(ctx *jxcontext.Context, storeID int, operatorRoleName, phone string, newPhone interface{}) { if phone != "" && newPhone != nil { db := dao.GetDB() @@ -1780,6 +1826,7 @@ func UpdateStoreVendorMap(ctx *jxcontext.Context, db *dao.DaoDB, storeID, vendor dao.Rollback(db, txDB) return 0, err } + isSyncStoreMapSku := false if num > 0 { if globals.IsAddEvent { mapBefore := refutil.FindMapAndStructMixed(valid, beforeStoreMap) @@ -1794,6 +1841,7 @@ func UpdateStoreVendorMap(ctx *jxcontext.Context, db *dao.DaoDB, storeID, vendor dao.Rollback(db, txDB) return 0, err } + isSyncStoreMapSku = true } } else { if valid["pricePercentage"] != nil || valid["pricePercentagePack"] != nil { @@ -1804,7 +1852,27 @@ func UpdateStoreVendorMap(ctx *jxcontext.Context, db *dao.DaoDB, storeID, vendor dao.Commit(db, txDB) if isStoreMapNeedSync(vendorID, valid) { _, err = CurVendorSync.SyncStore(ctx, db, vendorID, storeID, false, userName) - globals.SugarLogger.Debug("CurVendorSync.SyncStore:err======%v", err) + } + + // 更新商品 + if isSyncStoreMapSku { + globals.SugarLogger.Debugf("修改门店调价包是同步门店商品价格=============: %v", err) + singleStoreHandler, _ := partner.GetPurchasePlatformFromVendorID(vendorID).(partner.ISingleStoreStoreSkuHandler) + task := tasksch.NewParallelTask("修改门店调价包的时候,同时同步门店商品", tasksch.NewParallelConfig().SetParallelCount(1).SetIsContinueWhenError(true), ctx, + func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { + step := batchItemList[0].(int) + switch step { + case 1: + if singleStoreHandler != nil { + // 直接同步商品 + err = syncStoreSkuNew(ctx, task, 0, true, vendorID, storeID, "", nil, nil, nil, false, true) + } + } + return retVal, err + }, []int{1}) + tasksch.HandleTask(task, nil, true).Run() + _, err = task.GetResult(0) + return 0, err } } } diff --git a/business/jxstore/cms/store_sku.go b/business/jxstore/cms/store_sku.go index 4399c586f..e8665dabb 100644 --- a/business/jxstore/cms/store_sku.go +++ b/business/jxstore/cms/store_sku.go @@ -3738,8 +3738,14 @@ func GetTopSkusByStoreIDs(ctx *jxcontext.Context, storeIDs []int) (storeSkuNameE return storeSkuNameExt2, err } +// GetTopSkusByCityCode 获取当前城市订单销量前一百的商品,排除掉商户已经可售的商品剩下的为热销推荐 func GetTopSkusByCityCode(ctx *jxcontext.Context, cityCode, storeID int) (skuNameAndPlaceList []*dao.SkuNameAndPlace, err error) { db := dao.GetDB() + store, err := dao.GetStoreDetail(db, storeID, -1, "") + if err != nil { + return nil, err + } + cityCode = store.CityCode orderCreate := time.Now().AddDate(0, -1, 0) var skuNameAndPlace []*dao.SkuNameAndPlace if cityCode > 0 { @@ -3779,10 +3785,7 @@ func GetTopSkusByCityCode(ctx *jxcontext.Context, cityCode, storeID int) (skuNam for _, v := range skuNameList { skuNameMap[v.ID] = v } - store, err := dao.GetStoreDetail(db, storeID, -1, "") - if err != nil { - return nil, err - } + var payPercentage int if store.PayPercentage < 50 { payPercentage = 70 @@ -5889,14 +5892,13 @@ func doStoreSkuAudit(ctx *jxcontext.Context, storeIDs []int, skuBindInfos []*Sto } } for _, skuBindInfo := range skuBindInfos { - globals.SugarLogger.Debugf("doStoreSkuAudit storeID: %v , nameID: %v", storeID, skuBindInfo.NameID) storeAudits, err := dao.GetStoreSkuAuditLight(db, []int{storeID}, []int{skuBindInfo.NameID}, model.StoreAuditStatusOnline) //取消关注,可售排除 if skuBindInfo.IsFocus == -1 || skuBindInfo.IsSale != 0 || skuBindInfo.UnitPrice == 0 { return false, err } - if ctx.GetLoginType() != weixin.AuthTypeMP && ctx.GetLoginType() != weixin.AuthTypeMini && ctx.GetLoginType() != weixin.AuthTypeWxApp && ctx.GetLoginType() != weixin.AuthTypeWxAppCaishi && ctx.GetLoginType() != auth2.AuthTypeMobile { + if ctx.GetLoginType() != weixin.AuthTypeMP && ctx.GetLoginType() != weixin.AuthTypeMini && ctx.GetLoginType() != weixin.AuthTypeWxApp && ctx.GetLoginType() != weixin.AuthTypeWxAppCaishi && ctx.GetLoginType() != auth2.AuthTypeMobile && ctx.GetLoginType() != auth2.AuthTypePassword { authInfo, err := ctx.GetV2AuthInfo() if err == nil && authInfo != nil && (ctx.GetFullUser().Type&model.UserTypeOperator) != 0 { if len(storeAudits) > 0 { diff --git a/business/jxstore/cms/sync2.go b/business/jxstore/cms/sync2.go index 800ca15cf..5271e925e 100644 --- a/business/jxstore/cms/sync2.go +++ b/business/jxstore/cms/sync2.go @@ -203,7 +203,6 @@ func SyncSkus(ctx *jxcontext.Context, parentTask tasksch.ITask, vendorIDs []int, } if err == nil && len(skuList) > 0 { - // todo 按vendorID orgCode合并操作SyncSkus============= task := tasksch.NewParallelTask( fmt.Sprintf("同步商品:%v,%v", nameIDs, skuIDs), tasksch.NewParallelConfig().SetIsContinueWhenError(true), ctx, cc, skuList) diff --git a/business/jxstore/cms/system_store_sku.go b/business/jxstore/cms/system_store_sku.go new file mode 100644 index 000000000..80950a899 --- /dev/null +++ b/business/jxstore/cms/system_store_sku.go @@ -0,0 +1,158 @@ +package cms + +import ( + "fmt" + "git.rosy.net.cn/baseapi/platformapi/mtwmapi" + "git.rosy.net.cn/baseapi/utils" + "git.rosy.net.cn/jx-callback/business/jxutils/jxcontext" + "git.rosy.net.cn/jx-callback/business/jxutils/tasksch" + "git.rosy.net.cn/jx-callback/business/model" + "git.rosy.net.cn/jx-callback/business/model/dao" + "git.rosy.net.cn/jx-callback/business/partner" + "git.rosy.net.cn/jx-callback/business/partner/purchase/mtwm" + "git.rosy.net.cn/jx-callback/business/partner/putils" + "time" +) + +// CopyOnStoreSkuToOther 将一个美团门店分类和商品复制到另一个门店 +func CopyOnStoreSkuToOther(ctx *jxcontext.Context, fromVendorStoreId, toStoreId int, isAsync bool) (hint string, err error) { + var ( + db = dao.GetDB() + ) + + // 门店api加载 + // fromStore, err := dao.GetStoreDetail(db, fromStoreId, model.VendorIDMTWM, "") + if err != nil { + return "", err + } + toStore, err := dao.GetStoreDetail(db, toStoreId, model.VendorIDMTWM, "") + if err != nil { + return "", err + } + //fromApi := partner.CurAPIManager.GetAPI(model.VendorIDMTWM, toStore.VendorOrgCode).(*mtwmapi.API) + toApi := partner.CurAPIManager.GetAPI(model.VendorIDMTWM, toStore.VendorOrgCode).(*mtwmapi.API) + + taskName := fmt.Sprintf("将平台门店[%d],分类和商品复制到[%d]", fromVendorStoreId, toStoreId) + config := tasksch.NewParallelConfig().SetParallelCount(1).SetIsContinueWhenError(false) + work := func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { + step := batchItemList[0].(int) + switch step { + case 1: + // 1.加载门店商品,删除商品.当分类下没有商品时.删除分类 + errs := LoadingStoreSkuList(ctx, toApi, toStore.VendorStoreID) + if errs != nil && len(errs) > 0 { + return nil, errs[0] + } + case 2: + // 同步分类 + fromCategoryList, err := toApi.RetailCatList(utils.Int2Str(fromVendorStoreId)) + if err != nil { + return nil, err + } + for _, v := range fromCategoryList { + if err := toApi.RetailCatUpdate(toStore.VendorStoreID, v.Name, &mtwmapi.Param4UpdateCat{ + CategoryCode: v.Code, + Sequence: v.Sequence, + }); err != nil { + return nil, err + } + if v.Children != nil && len(v.Children) != 0 { + for _, c := range v.Children { + if err := toApi.RetailCatUpdate(toStore.VendorStoreID, v.Name, &mtwmapi.Param4UpdateCat{ + CategoryCode: v.Code, + SecondaryCategoryCode: c.Code, + SecondaryCategoryName: c.Name, + Sequence: c.Sequence, + }); err != nil { + return nil, err + } + } + } + } + + case 3: + // 同步商品 + fromFoodList, err1 := toApi.RetailListAll(utils.Int2Str(fromVendorStoreId)) + if err1 != nil { + return nil, err1 + } + if err := BatchInitData(ctx, fromFoodList, toApi, toStore.VendorStoreID); err != nil { + return nil, err + } + } + return + } + task := tasksch.NewParallelTask(taskName, config, ctx, work, []int{1, 2, 3}) + tasksch.HandleTask(task, nil, true).Run() + if !isAsync { + _, err = task.GetResult(0) + hint = "1" + } else { + hint = task.ID + } + return hint, err +} + +func LoadingStoreSkuList(ctx *jxcontext.Context, api *mtwmapi.API, poiCode string) (err []error) { + foodList, err1 := api.RetailListAll(poiCode) + if err1 != nil { + return append(err, err1) + } + + i := 0 + for _, v := range foodList { + err1 := api.RetailDelete(ctx.GetTrackInfo(), poiCode, v.AppFoodCode) + if err1 != nil { + err = append(err, err1) + } + if i%40 == 0 { + time.Sleep(200 * time.Millisecond) + } + i++ + } + + return +} + +// BatchInitData 批量创建商品 +func BatchInitData(ctx *jxcontext.Context, fromSku []*mtwmapi.AppFood, toApi *mtwmapi.API, vendorStoreID string) error { + foodDataList := make([]map[string]interface{}, len(fromSku)) + for i, storeSku := range fromSku { + foodData := make(map[string]interface{}) + foodDataList[i] = foodData + foodData[mtwmapi.KeyAppFoodCode] = storeSku.AppFoodCode + foodData["skus"] = storeSku.Skus + foodData["name"] = utils.LimitUTF8StringLen(storeSku.Name, mtwmapi.MaxSkuNameCharCount) + foodData["description"] = storeSku.Description + foodData["price"] = storeSku.Price + if storeSku.MinOrderCount != 0 { + foodData["min_order_count"] = storeSku.MinOrderCount + } else { + foodData["min_order_count"] = 1 + } + foodData["unit"] = storeSku.Unit + attr := mtwm.SwitchAttr(int64(storeSku.TagID)) + if attr != "" { + foodData["common_attr_value"] = attr + } + foodData["category_code"] = storeSku.CategoryCode + foodData["category_name"] = storeSku.CategoryName + foodData["is_sold_out"] = storeSku.IsSoldOut + foodData["picture"] = storeSku.Picture + foodData["picture_contents"] = storeSku.PictureContents + foodData["sequence"] = storeSku.Sequence + foodData["tag_id"] = storeSku.TagID + } + + failedFoodList, err2 := toApi.RetailBatchInitData(ctx.GetTrackInfo(), vendorStoreID, foodDataList) + if err := err2; err == nil { + if err = putils.GenPartialFailedErr(failedFoodList, len(failedFoodList)); err != nil { + return err + } + } else if err2 != nil && len(failedFoodList) == 0 { + if errExt, ok := err2.(*utils.ErrorWithCode); ok { + return utils.UnmarshalUseNumber([]byte(errExt.ErrMsg()), &failedFoodList) + } + } + return nil +} diff --git a/business/jxstore/misc/misc.go b/business/jxstore/misc/misc.go index 62176f0ca..d9131d22b 100644 --- a/business/jxstore/misc/misc.go +++ b/business/jxstore/misc/misc.go @@ -50,7 +50,7 @@ var ( "21:30:00", } dailyWorkTimeList2 = []string{ - "2:00:00", + "02:30:00", } priceReferTimeList = []string{ "03:00:00", @@ -253,7 +253,7 @@ func Init() { orderman.FixedOrderManager.AmendMissingOrders(jxcontext.AdminCtx, []int{model.VendorIDJD, model.VendorIDMTWM, model.VendorIDEBAI, model.VendorIDDD}, 0, curDate, curDate, true, true) }, 5*time.Second, 10*time.Minute) - // 抖音更新门店商品 + // 抖音更新门店商品 ,接口收费暂不使用 if beego.BConfig.RunMode != "jxgy" { ScheduleTimerFunc("RefreshSyncSkuList", func() { syncStoreSkuTiktok() @@ -368,10 +368,10 @@ func Init() { ScheduleTimerFunc("GetNewVendorPopActs", func() { act.GetNewVendorPopActs(jxcontext.AdminCtx) }, dailyHeartbeat) - //企业微信群人数通告 - ScheduleTimerFunc("SendQywxPeopleCount", func() { - cms.SendQywxPeopleCount(jxcontext.AdminCtx) - }, dailyHeartbeat) + //企业微信群人数通告(暂时取消) + //ScheduleTimerFunc("SendQywxPeopleCount", func() { + // cms.SendQywxPeopleCount(jxcontext.AdminCtx) + //}, dailyHeartbeat) ScheduleTimerFunc("doDailyWork1", func() { //同步商品额外前缀和水印图(打标记) cms.SyncSkuExperfixAndWatermark(jxcontext.AdminCtx) diff --git a/business/jxutils/jxutils_cms.go b/business/jxutils/jxutils_cms.go index 6605bb5cb..18e2b8b44 100644 --- a/business/jxutils/jxutils_cms.go +++ b/business/jxutils/jxutils_cms.go @@ -495,6 +495,8 @@ func GuessVendorIDFromVendorStoreID(vendorStoreID int64) (vendorID int) { // vendorID = model.VendorIDWSC } else if vendorStoreID > 123456 && vendorStoreID < 654321 { // 京西门店ID,6位 vendorID = model.VendorIDJX + } else if vendorStoreID >= 100000000 { // 饿百出现九未id + vendorID = model.VendorIDEBAI } return vendorID } diff --git a/business/jxutils/smsmsg/smsmsg_test.go b/business/jxutils/smsmsg/smsmsg_test.go index 49583a31b..85a005615 100644 --- a/business/jxutils/smsmsg/smsmsg_test.go +++ b/business/jxutils/smsmsg/smsmsg_test.go @@ -17,12 +17,12 @@ func init() { } func TestSendSMSMsg(t *testing.T) { - err := SendVoiceMsg([]string{"18981810340"}, "tts_222871733", map[string]interface{}{ - "tel": "18981810340", - }) - aa := map[string]interface{}{"tel": "13957767601"} + //err := SendVoiceMsg([]string{"18981810340"}, "tts_222871733", map[string]interface{}{ + // "tel": "18981810340", + //}) + aa := map[string]interface{}{"tel": "18981810340"} request := &dyvmsapiclient.SingleCallByTtsRequest{ - CalledNumber: tea.String("13957767601"), + CalledNumber: tea.String("18981810340"), TtsCode: tea.String("tts_222871733"), TtsParam: tea.String(string(utils.MustMarshal(aa))), } diff --git a/business/jxutils/unipush/push.go b/business/jxutils/unipush/push.go index 1b79eb49e..26dad7ee1 100644 --- a/business/jxutils/unipush/push.go +++ b/business/jxutils/unipush/push.go @@ -47,6 +47,7 @@ func NotifyNewOrder(order *model.GoodsOrder) { msg.OrderSqs = utils.Int2Str(order.OrderSeq) msg.StoreTitle = storeDetail.Name msg.Context = "老板,你有新的订单了!" + msg.VendorOrderId = order.VendorOrderID context, _ := json.Marshal(msg) body := fmt.Sprintf(msg.Context+"(%s)", model.VendorChineseNames[order.VendorID]+"#"+msg.OrderSqs) pushMsgByUniApp(storeDetail.ID, storeDetail.Name, cid, string(context), body, SoundsFileNewOrder) @@ -175,11 +176,12 @@ func GetStoreBoosCID(storeId int) ([]string, error) { } type MsgContext struct { - MsgType string `json:"msg_type"` // 订单类型[新订单/售后单/取消单] - StoreTitle string `json:"store_title"` // 门店名称 - Context string `json:"context"` // 消息文本 - VendorName string `json:"vendor_name"` // 平台名称 - OrderSqs string `json:"order_sqs"` // 订单流水号 + MsgType string `json:"msg_type"` // 订单类型[新订单/售后单/取消单] + StoreTitle string `json:"store_title"` // 门店名称 + Context string `json:"context"` // 消息文本 + VendorName string `json:"vendor_name"` // 平台名称 + OrderSqs string `json:"order_sqs"` // 订单流水号 + VendorOrderId string `json:"vendor_order_id"` // 订单id } func pushMsgByUniApp(storeId int, storeName string, cID []string, msg string, body string, soundsFileName string) { diff --git a/business/model/api.go b/business/model/api.go index 057a1ea6c..ac163d118 100644 --- a/business/model/api.go +++ b/business/model/api.go @@ -68,6 +68,8 @@ type GoodsOrderExt struct { OperatorPhone3 string `orm:"size(16)" json:"operatorPhone3"` // 饿百运营人电话 OperatorName3 string `orm:"size(32)" json:"operatorName3"` // 饿百运营人组(角色) + + VendorPayType string `json:"vendorPayType"` // 支付方式,当订单来源小程序时通过支付方式区分订单来源(w06微信/tt抖音/ks快手/支付宝) } type OrderSkuExt struct { diff --git a/business/model/api_config.go b/business/model/api_config.go index 0b0d6de8a..0ceb110b2 100644 --- a/business/model/api_config.go +++ b/business/model/api_config.go @@ -25,7 +25,8 @@ const ( VendorGoMei = 12 // 国美 VendorIDTT = 13 // 抖音平台小程序 VendorIDDD = 14 // 抖店 - VendorIDPurchaseEnd = 15 + VendorIDKS = 15 // 快手小程序 + VendorIDPurchaseEnd = 20 VendorIDWXPay = 51 // 微信支付 diff --git a/business/model/const.go b/business/model/const.go index 49b457930..151f5e790 100644 --- a/business/model/const.go +++ b/business/model/const.go @@ -567,7 +567,7 @@ func IsWaybillFinalStatus(status int) bool { const ( JXC4AppId = "wx4b5930c13f8b1170" // 京西菜市appId type=weixinmini JXC4BusinessAppId = "wx08a5c2a8581414ff" // 京西商家appId type=weixinmini - JXC4TiktokAppId = "tta6a1d01c399f264201" // 抖音appID + JXC4TiktokAppId = "ttaceeda5333d7a7ab01" // 抖音appID JXC4ClientAppID = "wxf3657c94aa01a3f0" //京西菜市客户端APP ID type="weixinapp" diff --git a/business/model/dao/dao_order.go b/business/model/dao/dao_order.go index 8960542bd..e056158e1 100644 --- a/business/model/dao/dao_order.go +++ b/business/model/dao/dao_order.go @@ -37,6 +37,9 @@ type StoresOrderSaleInfo struct { WaybillTipMoney int64 `json:"waybillTipMoney"` // 京西加的平台配送小费 RealEarningPrice int64 `json:"realEarningPrice"` + + PlatformSettlement int64 `json:"platformSettlement"` // 真实订单的平台结算(无扣点) + ActualFee int64 `json:"actualFee"` // 真三方运单配送费 } type OrderSkuWithActualPayPrice struct { @@ -411,6 +414,60 @@ func GetStoreOrderSkuList(db *DaoDB, storeIDs []int, finishedAtBegin, finishedAt return skuList, err } +type TotalShopMoney struct { + TotalShopMoney int64 `json:"totalShopMoney"` + VendorID int `orm:"column(vendor_id)" json:"vendorID"` +} + +// GetPlatformSettlement 统计平台的结算信息 +func GetPlatformSettlement(db *DaoDB, storeIDs []int, finishedAtBegin, finishedAtEnd time.Time) ([]*TotalShopMoney, error) { + sql := ` + SELECT SUM(t2.total_shop_money) total_shop_money,t2.vendor_id FROM goods_order t2 WHERE t2.order_finished_at >= ? AND t2.order_finished_at <= ? +` + sqlParams := []interface{}{ + finishedAtBegin, + finishedAtEnd, + } + if len(storeIDs) > 0 { + sql += " AND IF(t2.jx_store_id > 0, t2.jx_store_id, t2.store_id) IN (" + GenQuestionMarks(len(storeIDs)) + ")" + sqlParams = append(sqlParams, storeIDs) + } + sql += ` AND t2.status = ? GROUP BY t2.vendor_id` + sqlParams = append(sqlParams, model.OrderStatusFinished) + + var total []*TotalShopMoney + err := GetRows(db, &total, sql, sqlParams...) + return total, err +} + +type DeliveryFee struct { + ActualFee int64 `json:"actualFee"` + VendorID int `orm:"column(vendor_id)" json:"vendorID"` +} + +// GetPlatformDesiredFee 统计平台的订单的配送费信息 +func GetPlatformDesiredFee(db *DaoDB, storeIDs []int, finishedAtBegin, finishedAtEnd time.Time) (fee []*DeliveryFee, err error) { + sql := ` + SELECT sum(b.actual_fee) actual_fee,b.order_vendor_id vendor_id FROM goods_order t2 + RIGHT JOIN waybill b ON t2.vendor_order_id = b.vendor_order_id AND b.status IN (?,?) AND b.vendor_order_id <> b.vendor_waybill_id + WHERE t2.order_finished_at >= ? AND t2.order_finished_at <= ? +` + sqlParams := []interface{}{ + model.WaybillStatusDelivered, + 110, + finishedAtBegin, + finishedAtEnd, + } + if len(storeIDs) > 0 { + sql += " AND IF(t2.jx_store_id > 0, t2.jx_store_id, t2.store_id) IN (" + GenQuestionMarks(len(storeIDs)) + ")" + sqlParams = append(sqlParams, storeIDs) + } + + sql += ` GROUP BY b.order_vendor_id ` + err = GetRows(db, &fee, sql, sqlParams...) + return +} + func GetStoreOrderSkuList4Afs(db *DaoDB, storeIDs []int, finishedAtBegin, finishedAtEnd time.Time, isFinish bool) (skuList []*OrderSkuWithActualPayPrice, err error) { sql := ` SELECT t1.*, @@ -458,6 +515,7 @@ func GetStoreOrderSkuList4Afs2(db *DaoDB, vendorOrderIDs []string) (skuList []*O ` sqlParams = append(sqlParams, vendorOrderIDs) } + err = GetRows(db, &skuList, sql, sqlParams...) return skuList, err } @@ -502,6 +560,23 @@ func GetStoreAfsOrderSkuList2(db *DaoDB, vendorOrderIDs []string) (afsSkuList [] sql += " AND t2.vendor_order_id IN (" + GenQuestionMarks(len(vendorOrderIDs)) + ")" sqlParams = append(sqlParams, vendorOrderIDs) } + + err = GetRows(db, &afsSkuList, sql, sqlParams...) + return afsSkuList, err +} + +func GetOrderRefundSkuList(db *DaoDB, vendorOrderIDs []string) (afsSkuList []*model.OrderSkuFinancial, err error) { + sql := ` + SELECT t1.* + FROM order_sku_financial t1 + JOIN afs_order t2 ON t2.vendor_order_id = t1.vendor_order_id AND t2.vendor_id = t1.vendor_id AND t2.afs_order_id = t1.afs_order_id + WHERE t1.is_afs_order = 1 + ` + sqlParams := []interface{}{} + if len(vendorOrderIDs) > 0 { + sql += " AND t2.vendor_order_id IN (" + GenQuestionMarks(len(vendorOrderIDs)) + ")" + sqlParams = append(sqlParams, vendorOrderIDs) + } err = GetRows(db, &afsSkuList, sql, sqlParams...) return afsSkuList, err } @@ -826,7 +901,7 @@ func GetOrders(db *DaoDB, ids []int64, isIncludeSku, isIncludeFake bool, fromDat t5.pay_percentage, t5.comment ,t5.old_pay_percentage, t5.market_man_phone, tu.name market_man_name, t5.operator_phone, t5.operator_phone2, t5.operator_phone3, tu1.name operator_name, tu2.name operator_name2, tu3.name operator_name3, t6.vendor_pay_percentage, - city.name city_name, district.name district_name, + city.name city_name, district.name district_name,op.vendor_pay_type, ROUND(IF(t1.earning_type = 1, t1.total_shop_money-t1.earning_price-IFNULL(t2.desired_fee,0), t1.total_shop_money *(t1.order_pay_percentage/2)/100)) jx_income`, model.DefaultEarningPricePercentage) if isIncludeSku { sql += `, @@ -849,6 +924,7 @@ func GetOrders(db *DaoDB, ids []int64, isIncludeSku, isIncludeFake bool, fromDat LEFT JOIN user tu1 ON tu1.mobile = t5.operator_phone LEFT JOIN user tu2 ON tu2.mobile = t5.operator_phone2 LEFT JOIN user tu3 ON tu3.mobile = t5.operator_phone3 + LEFT JOIN order_pay op ON op.vendor_order_id = t1.vendor_order_id -- LEFT JOIN (SELECT MAX(created_at), afs_order_id, vendor_order_id, vendor_id FROM afs_order WHERE status = 180 GROUP BY 2, 3, 4) t7 ON t7.vendor_order_id = t1.vendor_order_id AND t7.vendor_id = t1.vendor_id -- LEFT JOIN afs_order t8 ON t8.afs_order_id = t7.afs_order_id ` @@ -943,7 +1019,6 @@ func GetOrders(db *DaoDB, ids []int64, isIncludeSku, isIncludeFake bool, fromDat } else { sqlWhere += " AND IF(t1.jx_store_id != 0, t1.jx_store_id, t1.store_id) IN (" + GenQuestionMarks(len(storeIDs)) + ")" sqlParams = append(sqlParams, storeIDs) - //globals.SugarLogger.Debugf("sqlParams storeIDs========%d", storeIDs) } } } @@ -1821,8 +1896,8 @@ func GetOrderStoreIDs(db *DaoDB, beginAt, endAt time.Time, vendorID int) (storeI // GetOrderListByStoreList 根据门店id获取正在刷单的门店商品 func GetOrderListByStoreList(db *DaoDB, storeId []int64) (order []*model.GoodsOrder, err error) { - sql := `SELECT * FROM goods_order g WHERE g.order_created_at >= ? AND g.order_created_at <= ? AND g.jx_store_id IN (` + GenQuestionMarks(len(storeId)) + `)` + `AND g.vendor_id = ? AND g.status < ?` - sqlParam := []interface{}{time.Now().AddDate(0, 0, -5), time.Now().AddDate(0, 0, 1), storeId, model.VendorIDDD, model.OrderStatusDelivering} + sql := `SELECT * FROM goods_order g WHERE g.order_created_at >= ? AND g.order_created_at <= ? AND g.jx_store_id IN (` + GenQuestionMarks(len(storeId)) + `)` + `AND g.vendor_id IN (` + GenQuestionMarks(2) + `)` + `AND g.status < ?` + sqlParam := []interface{}{time.Now().AddDate(0, 0, -5), time.Now().AddDate(0, 0, 1), storeId, []int{model.VendorIDDD, model.VendorIDEBAI}, model.OrderStatusDelivering} if err := GetRows(db, &order, sql, sqlParam...); err != nil { return nil, err diff --git a/business/model/dao/store_sku.go b/business/model/dao/store_sku.go index 32b8e34f0..fd40306fe 100644 --- a/business/model/dao/store_sku.go +++ b/business/model/dao/store_sku.go @@ -1285,7 +1285,7 @@ func GetTopSkusByCityCode(db *DaoDB, cityCode int, orderCreate time.Time) (skuNa AND b.sale_price > ? AND a.order_created_at BETWEEN ? and NOW() GROUP BY 2,3,4 - ORDER BY count DESC + ORDER BY count DESC LIMIT 100 ` sqlParams := []interface{}{ utils.DefaultTimeValue, diff --git a/business/model/order.go b/business/model/order.go index a35834342..acf5b7e22 100644 --- a/business/model/order.go +++ b/business/model/order.go @@ -11,9 +11,10 @@ const ( ) const ( - PayTypeWX = 1 // 微信支付 - PayTypeTL = 2 // 通联宝支付 - PayTypeTicTok = 3 // 抖音支付 + PayTypeWX = 1 // 微信支付 + PayTypeTL = 2 // 通联宝支付 + PayTypeTicTok = 3 // 抖音支付 + PayTypeKuaiShou = 4 // 快手支付 PayTypeTL_DiscountCard = 3 // 通联宝支付(会员折扣卡) PayTypeTL_StoreAcctPay = 4 // 通联宝支付(门店账户充值) @@ -135,32 +136,31 @@ type GoodsOrder struct { DeliveryType string `orm:"size(32)" json:"deliveryType"` // 订单配送方式,缺省是平台配送 CreateDeliveryType int `orm:"default(0)" json:"createDeliveryType"` //默认0系统发单,1为门店发单 - VendorWaybillID string `orm:"column(vendor_waybill_id);size(48)" json:"vendorWaybillID"` - WaybillVendorID int `orm:"column(waybill_vendor_id)" json:"waybillVendorID"` // 表示当前承运商,-1表示还没有安排 - AdjustCount int8 `json:"adjustCount"` // 调整单(次数) - DeliveryFlag int8 `json:"deliveryFlag"` // 第1位为1表示禁止调度器调度三方配送 - DuplicatedCount int `json:"-"` // 重复新订单消息数,这个一般不是由于消息重发造成的(消息重发由OrderStatus过滤),一般是业务逻辑造成的 - OrderCreatedAt time.Time `orm:"type(datetime);index" json:"orderCreatedAt"` // 这里记录的是订单生效时间,即用户支付完成(货到付款即为下单时间) - OrderFinishedAt time.Time `orm:"type(datetime)" json:"orderFinishedAt"` - StatusTime time.Time `orm:"type(datetime)" json:"statusTime"` // last status time - PickDeadline time.Time `orm:"type(datetime);null" json:"pickDeadline"` - DeliveryFeeFrom *time.Time `orm:"type(datetime);null" json:"deliveryFeeFrom,omitempty"` // 三方配置费计算的开始基准时间 - ModelTimeInfo `json:"-"` - Flag int `json:"flag"` //非运单调整相关的其它状态 - - InvoiceTitle string `orm:"size(64)" json:"invoiceTitle"` // 发票抬头 - InvoiceTaxerID string `orm:"size(32);column(invoice_taxer_id)" json:"invoiceTaxerID"` // 发票纳税人识别码 - InvoiceEmail string `orm:"size(64)" json:"invoiceEmail"` // 发票邮箱 - VendorOrgCode string `orm:"size(64)" json:"vendorOrgCode"` // 同一平台下不同的商户代码,如果只有一个,可以为空 - FromStoreID int `orm:"column(from_store_id)" json:"fromStoreID"` //物料配送门店 - EclpOutID string `orm:"column(eclp_out_id)" json:"eclpOutID"` //物料配送的出库单号 - AddressID int64 `orm:"column(address_id)" json:"addressID"` //配送地址ID - EarningType int `json:"earningType"` //订单结算方式,2为扣点,1为报价 - OrderType int `json:"orderType"` //订单类型,0为普通订单,1为物料订单,2为进货订单 - OrderPayPercentage int `json:"orderPayPercentage"` - CouponIDs string `orm:"column(coupon_ids)" json:"couponIDs"` //优惠券IDs(京西商城) - NotifyType int `json:"notifyType"` //0表示没有通知,1表示发的短信,2表示发的语音 - PhoneAscription string `orm:"column(phone_ascription)" json:"phoneAscription"` // 电话号码归属地 + VendorWaybillID string `orm:"column(vendor_waybill_id);size(48)" json:"vendorWaybillID"` + WaybillVendorID int `orm:"column(waybill_vendor_id)" json:"waybillVendorID"` // 表示当前承运商,-1表示还没有安排 + AdjustCount int8 `json:"adjustCount"` // 调整单(次数) + DeliveryFlag int8 `json:"deliveryFlag"` // 第1位为1表示禁止调度器调度三方配送 + DuplicatedCount int `json:"-"` // 重复新订单消息数,这个一般不是由于消息重发造成的(消息重发由OrderStatus过滤),一般是业务逻辑造成的 + OrderCreatedAt time.Time `orm:"type(datetime);index" json:"orderCreatedAt"` // 这里记录的是订单生效时间,即用户支付完成(货到付款即为下单时间) + OrderFinishedAt time.Time `orm:"type(datetime)" json:"orderFinishedAt"` + StatusTime time.Time `orm:"type(datetime)" json:"statusTime"` // last status time + PickDeadline time.Time `orm:"type(datetime);null" json:"pickDeadline"` + DeliveryFeeFrom *time.Time `orm:"type(datetime);null" json:"deliveryFeeFrom,omitempty"` // 三方配置费计算的开始基准时间 + ModelTimeInfo `json:"-"` // 1 + Flag int `json:"flag"` // 非运单调整相关的其它状态 + InvoiceTitle string `orm:"size(64)" json:"invoiceTitle"` // 发票抬头 + InvoiceTaxerID string `orm:"size(32);column(invoice_taxer_id)" json:"invoiceTaxerID"` // 发票纳税人识别码 + InvoiceEmail string `orm:"size(64)" json:"invoiceEmail"` // 发票邮箱 + VendorOrgCode string `orm:"size(64)" json:"vendorOrgCode"` // 同一平台下不同的商户代码,如果只有一个,可以为空 + FromStoreID int `orm:"column(from_store_id)" json:"fromStoreID"` // 物料配送门店 + EclpOutID string `orm:"column(eclp_out_id)" json:"eclpOutID"` // 物料配送的出库单号 + AddressID int64 `orm:"column(address_id)" json:"addressID"` // 配送地址ID + EarningType int `json:"earningType"` // 订单结算方式,2为扣点,1为报价 + OrderType int `json:"orderType"` // 订单类型,0为普通订单,1为物料订单,2为进货订单 + OrderPayPercentage int `json:"orderPayPercentage"` // 调价包? + CouponIDs string `orm:"column(coupon_ids)" json:"couponIDs"` // 优惠券IDs(京西商城) + NotifyType int `json:"notifyType"` // 0表示没有通知,1表示发的短信,2表示发的语音 + PhoneAscription string `orm:"column(phone_ascription)" json:"phoneAscription"` // 电话号码归属地,{代表抖音号码归宿地[yes-四川成都]} // 以下只是用于传递数据 OriginalData string `orm:"-" json:"-"` @@ -244,7 +244,7 @@ type Waybill struct { ModelTimeInfo `json:"-"` OriginalData string `orm:"type(text)" json:"-"` Remark string `orm:"-" json:"-"` // 用于传递remark - + //PunctualFee int64 `orm:"column(punctual_fee)" json:"punctualFee"` // 对应美团外卖运单的准时保险费 VendorOrgCode string `orm:"size(64)" json:"vendorOrgCode"` // 同一平台下不同的商户代码,如果只有一个,可以为空 } diff --git a/business/model/store.go b/business/model/store.go index d7f665eb0..90c634612 100644 --- a/business/model/store.go +++ b/business/model/store.go @@ -325,7 +325,7 @@ type Store struct { AutoEnableAt *time.Time `orm:"type(datetime);null" json:"autoEnableAt"` // 自动营业时间(临时休息用) ChangePriceType int8 `json:"changePriceType"` // 修改价格类型,即是否需要审核 SMSNotify int8 `orm:"column(sms_notify);" json:"smsNotify"` // 是否通过短信接收订单消息(每天只推一条) - SMSNotifyMark int8 `orm:"column(sms_notify_mark);" json:"smsNotifyMark"` //今天是否已经推送过订单消息 + SMSNotifyMark int8 `orm:"column(sms_notify_mark);" json:"smsNotifyMark"` // 今天是否已经推送过订单消息 AutoReplyType int8 `json:"autoReplyType"` // 订单评价自动回复类型 LinkStoreID int `orm:"column(link_store_id);default(0);index" json:"linkStoreID"` // 关联门店ID StoreLevel string `orm:"default(C);size(32)" json:"storeLevel"` // 门店等级(筛选用,京西的) diff --git a/business/msghub/msghub.go b/business/msghub/msghub.go index 14a8efce5..88bd3451f 100644 --- a/business/msghub/msghub.go +++ b/business/msghub/msghub.go @@ -152,7 +152,6 @@ func GetMsg(ctx *jxcontext.Context, storeID int, lastOrderTime time.Time, lastOr } close(chan2Listen) } else { - globals.SugarLogger.Debugf("GetMsg vendorOrderIDs:%s", utils.Format4Output(vendorOrderIDs, true)) msg.MsgData = len(vendorOrderIDs) } storeMap, _ := permission.GetUserStoresResultMap(ctx.GetUserID()) @@ -215,7 +214,6 @@ func OnNewWait4ApproveAfsOrder(order *model.AfsOrder) { } func OnKeyAfsOrderStatusChanged(order *model.AfsOrder) { - globals.SugarLogger.Debugf("msghub OnKeyAfsOrderStatusChanged, order:%s", utils.Format4Output(order, true)) utils.CallFuncAsync(func() { msgChan <- &ServerMsg{ Type: ServerMsgKeyAfsOrderStatusChanged, diff --git a/business/netspider/netspider.go b/business/netspider/netspider.go index f3a9ca94b..e3bc59780 100644 --- a/business/netspider/netspider.go +++ b/business/netspider/netspider.go @@ -199,7 +199,6 @@ func GetAndStoreCitiesShops(ctx *jxcontext.Context, vendorIDs []int, cityCodeLis } }() for _, v := range shopList { - globals.SugarLogger.Debugf("GetAndStoreCitiesShops cityCode:%d, 平台:%s, shopID:%s, districtCode:%d", cityCode, model.VendorChineseNames[v.VendorID], v.VendorStoreID, v.DistrictCode) if v.DistrictCode > 0 { tmpShop := *v dao.DeleteEntity(db, &tmpShop, model.FieldVendorStoreID, model.FieldVendorID) diff --git a/business/partner/delivery/delivery.go b/business/partner/delivery/delivery.go index dc494a84c..e3d1d6ebc 100644 --- a/business/partner/delivery/delivery.go +++ b/business/partner/delivery/delivery.go @@ -29,7 +29,6 @@ func CallCreateWaybillPolicy(deliveryFee, maxDeliveryFee int64, order *model.Goo if deliveryFee > maxDeliveryFee { errStr := fmt.Sprintf("超最高限价, 所需运费:%s, 最高限价:%s", jxutils.IntPrice2StandardCurrencyString(deliveryFee), jxutils.IntPrice2StandardCurrencyString(maxDeliveryFee)) err = fmt.Errorf(errStr) - globals.SugarLogger.Debugf("CallCreateWaybillPolicy orderID:%s, 平台:%s运单,创建出错:%s", order.VendorOrderID, model.VendorChineseNames[waybillVendorID], errStr) } return err } diff --git a/business/partner/delivery/rider.go b/business/partner/delivery/rider.go index 5550a8559..3564f6139 100644 --- a/business/partner/delivery/rider.go +++ b/business/partner/delivery/rider.go @@ -220,6 +220,52 @@ func UpdateOrder2Complete() { return } +func makeRiderInfo(fakeWayBill *model.Waybill, riderInfo *mtpsapi.RiderInfo) { + switch fakeWayBill.Status { + case 5: // 呼叫骑手 + riderInfo.LogisticsContext = "呼叫骑手,新建运单" + riderInfo.LogisticsStatus = 0 + riderInfo.CourierName = "" + riderInfo.CourierPhone = "" + riderInfo.OpCode = tiktok_api.TiktokLogisticsStatusCALLRIDER + + // 下一状态以及推送时间 + fakeWayBill.Status = model.WaybillStatusCourierAssigned + fakeWayBill.VendorStatus = utils.Int64ToStr(model.WaybillStatusCourierAssigned) + case 12: // 骑手接单 + riderInfo.LogisticsContext = model.RiderWaitGetGoods + riderInfo.LogisticsStatus = 12 + riderInfo.OpCode = tiktok_api.TiktokLogisticsORDERRECEIVED + // 下一状态以及推送时间 + fakeWayBill.Status = model.WaybillStatusCourierArrived + fakeWayBill.VendorStatus = utils.Int64ToStr(model.WaybillStatusCourierArrived) + case 15: // 到店 + riderInfo.LogisticsContext = model.RiderToStore + riderInfo.LogisticsStatus = 15 + riderInfo.OpCode = tiktok_api.TiktokLogisticsRIDERARRIVED + // 下一状态以及推送时间 + fakeWayBill.Status = model.WaybillStatusDelivering + fakeWayBill.VendorStatus = utils.Int64ToStr(model.WaybillStatusDelivering) + case 20: //配送中 + riderInfo.LogisticsContext = model.RiderGetOrderDelivering + riderInfo.LogisticsStatus = 20 + riderInfo.OpCode = tiktok_api.TiktokLogisticsRIDERPICKUP + // 下一状态以及推送时间 + fakeWayBill.Status = model.WaybillStatusDelivered + fakeWayBill.VendorStatus = utils.Int64ToStr(model.WaybillStatusDelivered) + case 105: // 完成 + riderInfo.LogisticsContext = model.RiderGetOrderDelivered + riderInfo.LogisticsStatus = 40 + riderInfo.OpCode = tiktok_api.TiktokLogisticsDELIVERED + // 下一状态以及推送时间 + fakeWayBill.Status = model.WaybillStatusFailed + fakeWayBill.VendorStatus = utils.Int64ToStr(model.WaybillStatusFailed) + default: + return + } + return +} + // UpdateFakeWayBillToTiktok 轮询更新假订单到抖音 func UpdateFakeWayBillToTiktok() { scheduleTimer, _ := rand.Int(rand.Reader, big.NewInt(1000)) @@ -252,48 +298,7 @@ func UpdateFakeWayBillToTiktok() { LogisticsStatus: fakeWayBill[i].Status, } - switch fakeWayBill[i].Status { - case 5: // 呼叫骑手 - riderInfo.LogisticsContext = "呼叫骑手,新建运单" - riderInfo.LogisticsStatus = 0 - riderInfo.CourierName = "" - riderInfo.CourierPhone = "" - riderInfo.OpCode = tiktok_api.TiktokLogisticsStatusCALLRIDER - - // 下一状态以及推送时间 - fakeWayBill[i].Status = model.WaybillStatusCourierAssigned - fakeWayBill[i].VendorStatus = utils.Int64ToStr(model.WaybillStatusCourierAssigned) - case 12: // 骑手接单 - riderInfo.LogisticsContext = model.RiderWaitGetGoods - riderInfo.LogisticsStatus = 12 - riderInfo.OpCode = tiktok_api.TiktokLogisticsORDERRECEIVED - // 下一状态以及推送时间 - fakeWayBill[i].Status = model.WaybillStatusCourierArrived - fakeWayBill[i].VendorStatus = utils.Int64ToStr(model.WaybillStatusCourierArrived) - case 15: // 到店 - riderInfo.LogisticsContext = model.RiderToStore - riderInfo.LogisticsStatus = 15 - riderInfo.OpCode = tiktok_api.TiktokLogisticsRIDERARRIVED - // 下一状态以及推送时间 - fakeWayBill[i].Status = model.WaybillStatusDelivering - fakeWayBill[i].VendorStatus = utils.Int64ToStr(model.WaybillStatusDelivering) - case 20: //配送中 - riderInfo.LogisticsContext = model.RiderGetOrderDelivering - riderInfo.LogisticsStatus = 20 - riderInfo.OpCode = tiktok_api.TiktokLogisticsRIDERPICKUP - // 下一状态以及推送时间 - fakeWayBill[i].Status = model.WaybillStatusDelivered - fakeWayBill[i].VendorStatus = utils.Int64ToStr(model.WaybillStatusDelivered) - case 105: // 完成 - riderInfo.LogisticsContext = model.RiderGetOrderDelivered - riderInfo.LogisticsStatus = 40 - riderInfo.OpCode = tiktok_api.TiktokLogisticsDELIVERED - // 下一状态以及推送时间 - fakeWayBill[i].Status = model.WaybillStatusFailed - fakeWayBill[i].VendorStatus = utils.Int64ToStr(model.WaybillStatusFailed) - default: - continue - } + makeRiderInfo(fakeWayBill[i], riderInfo) if riderInfo.LogisticsContext != model.RiderGetOrderDeliverFailed && riderInfo.LogisticsContext != model.RiderGetOrderDeliverOther && riderInfo.LogisticsContext != model.RiderWaitRider { riderInfo.LogisticsContext = fmt.Sprintf(riderInfo.LogisticsContext, riderInfo.CourierName, riderInfo.CourierPhone) @@ -301,7 +306,8 @@ func UpdateFakeWayBillToTiktok() { // 推送骑手信息 paramsMap := utils.Struct2Map(riderInfo, "", true) - if handler := partner.GetPurchaseOrderHandlerFromVendorID(model.VendorIDDD); handler != nil { + handler := partner.GetPurchaseOrderHandlerFromVendorID(fakeWayBill[i].OrderVendorID) + if handler != nil { if err := handler.GetOrderRider(fakeWayBill[i].VendorOrgCode, "", paramsMap); err != nil { globals.SugarLogger.Errorf("Fake Pull Rider Info Err :%s--%s--%v", riderInfo.OrderId, riderInfo.ThirdCarrierOrderId, err) continue @@ -321,11 +327,27 @@ func UpdateFakeWayBillToTiktok() { } // 更新运单为完成状态 if fakeWayBill[i].Status == model.WaybillStatusDelivered { + order, err := partner.CurOrderManager.LoadOrder(fakeWayBill[i].VendorOrderID, fakeWayBill[i].OrderVendorID) + if err != nil { + globals.SugarLogger.Errorf("Loading order by wayBill vendorOrderID err := %v", err) + continue + } + if order.Status == model.OrderStatusCanceled { + continue + } + sql := `UPDATE goods_order g SET g.status = ?,g.vendor_status = ?,g.order_finished_at = ? WHERE g.vendor_order_id = ? ` - _, err := dao.ExecuteSQL(dao.GetDB(), sql, []interface{}{model.OrderStatusFinished, model.OrderStatusFinished, time.Now(), fakeWayBill[i].VendorOrderID}...) + _, err = dao.ExecuteSQL(dao.GetDB(), sql, []interface{}{model.OrderStatusFinished, model.OrderStatusFinished, time.Now(), fakeWayBill[i].VendorOrderID}...) if err != nil { globals.SugarLogger.Debugf("UPDATA goods_order Err :%s", err.Error()) } + // 饿百订单推送订单送达 + if fakeWayBill[i].OrderVendorID == model.VendorIDEBAI { + if err := handler.Swtich2SelfDelivered(order, "JingXiAdmin"); err != nil { + globals.SugarLogger.Errorf("Swtich2SelfDelivered err := %v", err) + } + } + } } diff --git a/business/partner/purchase/ebai/ebai.go b/business/partner/purchase/ebai/ebai.go index da8d97498..9f8f955ee 100644 --- a/business/partner/purchase/ebai/ebai.go +++ b/business/partner/purchase/ebai/ebai.go @@ -158,5 +158,36 @@ func (p *PurchaseHandler) GetVendorCategories(ctx *jxcontext.Context) (vendorCat } func (p *PurchaseHandler) GetOrderRider(vendorOrgCode, vendorStoreID string, param map[string]interface{}) (err error) { - return nil + selfStatus := 0 + switch param["logistics_status"].(int) { + case 0: + selfStatus = 2 // 2:配送待分配 + case 12: + selfStatus = 3 // 骑士接单 + case 15: + selfStatus = 8 // 骑士到店 + case 20: + selfStatus = 20 // 骑手送出 + case 40: + selfStatus = 30 // 配送完成 + default: + selfStatus = 7 // 配送异常 + } + param2 := &ebaiapi.PushRiderInfo{ + DistributorId: 201, + OrderId: param["order_id"].(string), + State: 21, + SelfStatus: selfStatus, + SelfStatusDesc: param["logistics_context"].(string), + DistributorInfoDTO: ebaiapi.DistributorInfoDTO{ + DistributorTypeId: "99999", + DistributorName: "商家自行配送", + }, + Knight: ebaiapi.Knight{ + Id: utils.Str2Int64(param["order_id"].(string)), + Name: param["courier_name"].(string), + Phone: param["courier_phone"].(string), + }, + } + return api.EbaiAPI.OrderselfDeliveryStateSync2(param2) } diff --git a/business/partner/purchase/ebai/order.go b/business/partner/purchase/ebai/order.go index b488a10f4..c92ddb899 100644 --- a/business/partner/purchase/ebai/order.go +++ b/business/partner/purchase/ebai/order.go @@ -522,6 +522,9 @@ func (c *PurchaseHandler) onOrderNew(msg *ebaiapi.CallbackMsg, orderStatus *mode }) } } + if handler := partner.GetPurchaseOrderHandlerFromVendorID(model.VendorIDEBAI); handler != nil { + handler.AcceptOrRefuseOrder(order, true, "jxAdmin") + } return api.EbaiAPI.Err2CallbackResponse(msg.Cmd, err, map[string]interface{}{ "source_order_id": vendorOrderID, }) diff --git a/business/partner/purchase/ebai/store.go b/business/partner/purchase/ebai/store.go index c6645f625..7320d14d1 100644 --- a/business/partner/purchase/ebai/store.go +++ b/business/partner/purchase/ebai/store.go @@ -270,7 +270,6 @@ func (p *PurchaseHandler) UpdateStore(db *dao.DaoDB, storeID int, userName strin if err == nil { if shopID > 0 { err = p.UpdateStoreCustomID(jxcontext.AdminCtx, "", store.VendorStoreID, int64(shopID)) - globals.SugarLogger.Debugf("UpdateStore store.VendorStoreID====%s,shopID====%s", store.VendorStoreID, shopID) } else if shopID == 0 { // todo remove out shop id } @@ -346,7 +345,6 @@ func (p *PurchaseHandler) RefreshAllStoresID(ctx *jxcontext.Context, parentTask fBaiduIDs, fShopIDs, err1 := FilterStoreRel(baiduShopIDs) globals.SugarLogger.Debugf("RefreshAllStoresID FilterStoreRel fBaiduIDs====%d fShopIDs====%d err====%v", fBaiduIDs, fShopIDs, err1) err = api.EbaiAPI.ShopIDBatchUpdate(fBaiduIDs, fShopIDs) - globals.SugarLogger.Debugf("RefreshAllStoresID baiduShopIDs====%s,shopIDs====%s", baiduShopIDs, shopIDs) } return nil, err }, stores) @@ -373,7 +371,6 @@ func FilterStoreRel(baiduShopIDs []string) (fBaiduShopIDs []string, fShopIDs []s return nil, nil, err } localRel, err := dao.GetStoreDetailByVendorStoreID(dao.GetDB(), k, model.VendorIDEBAI, "") - globals.SugarLogger.Debugf("get localRel err===%v", err) if remoteRel.ShopID != utils.Int2Str(localRel.ID) { fBaiduShopIDs = append(fBaiduShopIDs, k) fShopIDs = append(fShopIDs, utils.Int2Str(localRel.ID)) @@ -673,7 +670,6 @@ func (c *PurchaseHandler) UpdateStoreCustomID(ctx *jxcontext.Context, vendorOrgC if err1 != nil { globals.SugarLogger.Debugf("UpdateStoreCustomID err1====%v", err1) } - globals.SugarLogger.Debugf("UpdateStoreCustomID fBaiduIDs====%s fShopIDs====%d err1", fBaiduIDs, fShopIDs) err = api.EbaiAPI.ShopIDBatchUpdate(fBaiduIDs, fShopIDs) //err = api.EbaiAPI.ShopIDBatchUpdate([]string{vendorStoreID}, []string{utils.Int64ToStr(storeID)}) } diff --git a/business/partner/purchase/ebai/store_sku2.go b/business/partner/purchase/ebai/store_sku2.go index 1f2ceacb9..c2fdee9a7 100644 --- a/business/partner/purchase/ebai/store_sku2.go +++ b/business/partner/purchase/ebai/store_sku2.go @@ -515,6 +515,9 @@ func genSkuParamsFromStoreSkuInfo2(storeSku *dao.StoreSkuSyncInfo, isCreate, isE if storeSku.MinOrderCount > 0 { params["minimum"] = utils.Int2Float64(storeSku.MinOrderCount) } + if storeSku.MinOrderCount == 0 { + params["minimum"] = utils.Int2Float64(1) + } return params } diff --git a/business/partner/purchase/jd/sku2.go b/business/partner/purchase/jd/sku2.go index b743af333..9a74f221a 100644 --- a/business/partner/purchase/jd/sku2.go +++ b/business/partner/purchase/jd/sku2.go @@ -108,10 +108,6 @@ func (p *PurchaseHandler) DeleteCategory2(ctx *jxcontext.Context, vendorOrgCode, func (p *PurchaseHandler) ReorderCategories2(ctx *jxcontext.Context, vendorOrgCode, vendorParentCatID string, vendorCatIDList []string) (err error) { if globals.EnableJdStoreWrite { err = getAPI(vendorOrgCode).ChangeShopCategoryOrder(utils.Str2Int64WithDefault(vendorParentCatID, 0), utils.StringSlice2Int64(vendorCatIDList)) - globals.SugarLogger.Debugf("vendorInfo.vendorOrgCode=== %s", vendorOrgCode) - globals.SugarLogger.Debugf("vendorInfo.vendorParentCatID=== %s", vendorParentCatID) - globals.SugarLogger.Debugf("vendorInfo.vendorCatIDList=== %s", vendorCatIDList) - globals.SugarLogger.Debugf("ReorderCategories2 === %v", err) } return err } diff --git a/business/partner/purchase/jdshop/store_sku.go b/business/partner/purchase/jdshop/store_sku.go index f4dd476ba..14eec353b 100644 --- a/business/partner/purchase/jdshop/store_sku.go +++ b/business/partner/purchase/jdshop/store_sku.go @@ -297,7 +297,6 @@ func (p *PurchaseHandler) CreateStoreSkus(ctx *jxcontext.Context, storeID int, v } func (p *PurchaseHandler) UpdateStoreSkus(ctx *jxcontext.Context, storeID int, vendorStoreID string, storeSkuList []*dao.StoreSkuSyncInfo) (failedList []*partner.StoreSkuInfoWithErr, err error) { - globals.SugarLogger.Debugf("是不是正儿八经的京东商城%s", "UpdateStoreSkus") if globals.EnableJdShopWrite && vendorStoreID == model.JdShopMainVendorStoreID { if vendorStoreID == model.JdShopMainVendorStoreID { for _, v := range storeSkuList { diff --git a/business/partner/purchase/jx/localjx/kuaishou_pay.go b/business/partner/purchase/jx/localjx/kuaishou_pay.go new file mode 100644 index 000000000..6a54e5e3a --- /dev/null +++ b/business/partner/purchase/jx/localjx/kuaishou_pay.go @@ -0,0 +1,191 @@ +package localjx + +import ( + "errors" + "fmt" + "git.rosy.net.cn/baseapi/platformapi/kuaishou_mini" + "strings" + "time" + + "git.rosy.net.cn/baseapi/utils" + "git.rosy.net.cn/jx-callback/business/auth2/authprovider/kuaishou" + "git.rosy.net.cn/jx-callback/business/jxutils" + "git.rosy.net.cn/jx-callback/business/jxutils/jxcontext" + "git.rosy.net.cn/jx-callback/business/model" + "git.rosy.net.cn/jx-callback/business/model/dao" + "git.rosy.net.cn/jx-callback/globals" + "git.rosy.net.cn/jx-callback/globals/api" +) + +func getOrderBriefKs(order *model.GoodsOrder) string { + sku := make([]string, len(order.Skus)) + for _, v := range order.Skus { + sku = append(sku, fmt.Sprintf("%s x %d件商品", v.SkuName, v.Count)) + } + return strings.Join(sku, ",") +} + +func pay4OrderByKs(ctx *jxcontext.Context, order *model.GoodsOrder, vendorPayType, subAppID string) (orderPay *model.OrderPay, err error) { + // 获取用户快手OpenId + var ( + db = dao.GetDB() + ) + authBindList, err := dao.GetUserBindAuthInfo(db, ctx.GetUserID(), model.AuthBindTypeAuth, []string{kuaishou.AuthTypeKuaiShouMini}, "", "", nil) + if err != nil { + return nil, err + } + if len(authBindList) == model.NO { + return nil, errors.New("用户未绑定快手,无法快手支付") + } + + param := &kuaishou_mini.PreCreateOrderReq{ + OutOrderNo: utils.Int64ToStr(GenPayOrderID(order)), + OpenId: authBindList[0].AuthID, + TotalAmount: order.ActualPayPrice, + Subject: "蔬菜水果日用品", + Detail: getOrderBriefKs(order), + TypeDetail: 1832, // 蔬菜:费率2%,水果:1833%2 + ExpireTime: 60 * 10, + Sign: "", + Attach: "", + NotifyUrl: "http://callback.jxc4.com/kuaishou/KuaiShouCallback", + GoodsId: "", + GoodsDetailUrl: "", + MultiCopiesGoodsInfo: "", + CancelOrder: 0, + } + + // 预下单 + prePayInfo, err := api.KuaiShouApi.PreCreateOrder(param) + if err == nil { + orderPay = &model.OrderPay{ + PayOrderID: order.VendorOrderID, // 抖音订单id + PayType: model.PayTypeKuaiShou, + VendorPayType: vendorPayType, + VendorOrderID: order.VendorOrderID, + VendorID: order.VendorID, + Status: 0, + PayCreatedAt: time.Now(), + PrepayID: "", + CodeURL: prePayInfo, // 抖音支付token + TotalFee: int(order.ActualPayPrice), + } + } + return orderPay, err +} + +func OnKSPayCallback(msg *kuaishou_mini.CallBackDetail, refund *kuaishou_mini.RefundCallBack, payType string) (err error) { + switch payType { + case kuaishou_mini.CallbackTypePay: // 支付回调 + err = onKSPayFinished(msg) + case kuaishou_mini.CallbackTypeRefund: // 退款回调 + err = onKSPayRefund(refund) + } + return err +} + +func onKSPayFinished(msg *kuaishou_mini.CallBackDetail) (err error) { + orderPay := &model.OrderPay{ + PayOrderID: msg.OutOrderNo, + PayType: model.PayTypeTicTok, + } + orderPay.DeletedAt = utils.DefaultTimeValue + db := dao.GetDB() + if err = dao.GetEntity(db, orderPay, "PayOrderID", "PayType", "DeletedAt"); err == nil { + orderPay.PayFinishedAt = utils.Time2Pointer(time.Now()) + orderPay.TransactionID = msg.TradeNo + orderPay.OriginalData = utils.Format4Output(msg, true) + switch msg.Status { + case kuaishou_mini.OrderPayStatusHandleing: + orderPay.Status = model.PayStatusNo + case kuaishou_mini.OrderPayStatusSuccess: + orderPay.Status = model.PayStatusYes + case kuaishou_mini.OrderPayStatusFailed: + orderPay.Status = model.PayStatusFailed + } + dao.UpdateEntity(db, orderPay) + + if msg.Status == kuaishou_mini.OrderPayStatusSuccess { + err = OnPayFinished(orderPay) + } + } else { + globals.SugarLogger.Debugf("onKSPayFinished msg:%s, err:%v", utils.Format4Output(msg, true), err) + } + return err +} + +func onKSPayRefund(msg *kuaishou_mini.RefundCallBack) (err error) { + orderPayRefund := &model.OrderPayRefund{ + RefundID: msg.OutRefundNo, + } + db := dao.GetDB() + if err = dao.GetEntity(db, orderPayRefund, "RefundID"); err == nil { + switch msg.Status { + case kuaishou_mini.OrderPayStatusHandleing: + orderPayRefund.Status = model.PayStatusNo + case kuaishou_mini.OrderPayStatusSuccess: + orderPayRefund.Status = model.PayStatusYes + case kuaishou_mini.OrderPayStatusFailed: + orderPayRefund.Status = model.PayStatusFailed + } + + orderPayRefund.OriginalData = utils.Format4Output(msg, true) + dao.UpdateEntity(db, orderPayRefund) + } else if dao.IsNoRowsError(err) { + globals.SugarLogger.Warnf("收到异常的退款事件, msg:%s", utils.Format4Output(msg, true)) + } + + orderPay := &model.OrderPay{ + VendorOrderID: orderPayRefund.VendorOrderID, + VendorID: jxutils.GetPossibleVendorIDFromVendorOrderID(orderPayRefund.VendorOrderID), + PayType: model.PayTypeKuaiShou, + Status: model.PayStatusYes, + } + orderPay.DeletedAt = utils.DefaultTimeValue + if err = dao.GetEntity(db, orderPay, "VendorOrderID", "VendorID", "PayType", "Status", "DeletedAt"); err == nil { + orderPay.Status = model.PayStatusRefund + dao.UpdateEntity(db, orderPay) + } + return err +} + +// RefundOrderByKS 申请退款 +func RefundOrderByKS(ctx *jxcontext.Context, orderPay *model.OrderPay, refundID string, refundFee int, refundDesc string) (orderPayRefund *model.OrderPayRefund, err error) { + + param := kuaishou_mini.RefundParam{ + OutOrderNo: orderPay.VendorOrderID, + OutRefundNo: refundID, + Reason: refundDesc, + Attach: "", + NotifyUrl: "http://callback.jxc4.com/kuaishou/kuaiShouCallback", + RefundAmount: int64(orderPay.TotalFee), + Sign: "", + MultiCopiesGoodsInfo: "", + } + result, err := api.KuaiShouApi.RefundOrder(¶m) + if err == nil { + orderPayRefund = &model.OrderPayRefund{ + RefundID: refundID, + VendorRefundID: result, + VendorOrderID: orderPay.VendorOrderID, + VendorID: orderPay.VendorID, + Status: model.RefundStatusNo, + TransactionID: orderPay.TransactionID, + RefundFee: refundFee, + RefundCreatedAt: time.Now(), + } + dao.WrapAddIDCULDEntity(orderPayRefund, ctx.GetUserName()) + db := dao.GetDB() + if result != "" { + orderPayRefund.Status = model.RefundStatusYes + } else { + orderPayRefund.Status = model.RefundStatusFailed + } + orderPayRefund.OriginalData = utils.Format4Output(result, true) + dao.CreateEntity(db, orderPayRefund) + + orderPay.Status = model.PayStatusRefund + dao.UpdateEntity(db, orderPay) + } + return orderPayRefund, err +} diff --git a/business/partner/purchase/jx/localjx/order.go b/business/partner/purchase/jx/localjx/order.go index f0d5fb8a0..a28d6fb04 100644 --- a/business/partner/purchase/jx/localjx/order.go +++ b/business/partner/purchase/jx/localjx/order.go @@ -3,7 +3,6 @@ package localjx import ( "errors" "fmt" - "git.rosy.net.cn/jx-callback/globals" "math" "regexp" "strings" @@ -252,7 +251,6 @@ func CreateOrder(ctx *jxcontext.Context, jxOrder *JxOrderInfo, addressID int64, outJxOrder.OrderID = jxutils.GenOrderNo() } order, err2 := jxOrder2GoodsOrder(ctx, outJxOrder, deliveryAddress, "", IsDeliverySelf, couponIDs) - globals.SugarLogger.Debugf("order order %s", utils.Format4Output(order, false)) if err = err2; err == nil { order.AddressID = addressID @@ -315,7 +313,6 @@ func Pay4Order(ctx *jxcontext.Context, orderID int64, payType int, vendorPayType db = dao.GetDB() ) order, err := partner.CurOrderManager.LoadOrder(utils.Int64ToStr(orderID), model.VendorIDJX) - globals.SugarLogger.Debugf("goodsorder := %s", utils.Format4Output(order, false)) if err == nil { switch payType { case model.PayTypeWX: @@ -336,6 +333,11 @@ func Pay4Order(ctx *jxcontext.Context, orderID int64, payType int, vendorPayType dao.WrapAddIDCULDEntity(orderPay, ctx.GetUserName()) err = dao.CreateEntity(dao.GetDB(), orderPay) } + case model.PayTypeKuaiShou: + if orderPay, err = pay4OrderByKs(ctx, order, vendorPayType, subAppID); err == nil && orderPay != nil { + dao.WrapAddIDCULDEntity(orderPay, ctx.GetUserName()) + err = dao.CreateEntity(dao.GetDB(), orderPay) + } default: err = fmt.Errorf("支付方式:%d当前不支持", payType) } @@ -839,7 +841,7 @@ func generateOrder(ctx *jxcontext.Context, jxOrder *JxOrderInfo, addressID int64 if jxOrder.OrderType != model.OrderTypeMatter || (jxOrder.OrderType == model.OrderTypeMatter && fromStoreID == -1) { outJxOrder.Skus = append(outJxOrder.Skus, jxSku) outJxOrder.OrderPrice += int64(jxSku.Count) * jxSku.SalePrice - } else { //以下else为物料订单袋子金额和数量处理 + } else { //以下else为物料订单袋子金额和数量处理 if !result.Flag { //只要flag是false就按原价申请,是true再按订单量 outJxOrder.Skus = append(outJxOrder.Skus, jxSku) outJxOrder.OrderPrice += int64(jxSku.Count) * jxSku.SalePrice @@ -1028,6 +1030,11 @@ func generateOrder(ctx *jxcontext.Context, jxOrder *JxOrderInfo, addressID int64 if storeDetail.ID == 668470 || storeDetail.ID == 668469 { outJxOrder.FreightPrice = 1 } + + if IsDeliverySelf { + outJxOrder.FreightPrice = 0 + } + if err == nil { if jxOrder.OrderType == model.OrderTypeNormal { outJxOrder.TotalPrice = outJxOrder.OrderPrice + outJxOrder.FreightPrice @@ -1394,7 +1401,8 @@ func CancelOrder(ctx *jxcontext.Context, order *model.GoodsOrder, reason string) // refundID := utils.Int64ToStr(GenRefundID(order)) refundID := order.VendorOrderID var orderPayRefund *model.OrderPayRefund - if orderPay.PayType == model.PayTypeWX { + switch orderPay.PayType { + case model.PayTypeWX: orderPayRefund, err = refundOrderByWX(ctx, orderPay, refundID, orderPay.TotalFee, reason) if err == nil { dao.WrapAddIDCULDEntity(orderPayRefund, ctx.GetUserName()) @@ -1402,17 +1410,23 @@ func CancelOrder(ctx *jxcontext.Context, order *model.GoodsOrder, reason string) } else { errList.AddErr(err) } - } else if orderPay.PayType == model.PayTypeTL { + case model.PayTypeTL: orderPayRefund, err = RefundOrderByTL(ctx, orderPay, refundID, orderPay.TotalFee, reason) if err != nil { errList.AddErr(err) } - } else if orderPay.PayType == model.PayTypeTicTok { + case model.PayTypeTicTok: orderPayRefund, err = RefundOrderByTT(ctx, orderPay, refundID, orderPay.TotalFee, reason) if err != nil { errList.AddErr(err) } + case model.PayTypeKuaiShou: + orderPayRefund, err = RefundOrderByKS(ctx, orderPay, refundID, orderPay.TotalFee, reason) + if err != nil { + errList.AddErr(err) + } } + if err == nil { //如果用了优惠券,状态要刷回去 if order.CouponIDs != "" { diff --git a/business/partner/purchase/jx/localjx/tiktokPay.go b/business/partner/purchase/jx/localjx/tiktokPay.go index 7acd5f8cd..132d120ce 100644 --- a/business/partner/purchase/jx/localjx/tiktokPay.go +++ b/business/partner/purchase/jx/localjx/tiktokPay.go @@ -58,6 +58,7 @@ func getTikTok(appID string) (TikTokMini *tiktok.API) { } return TikTokMini } + func OnTTPayCallback(msg *tiktok.DetailCallBackMessage, refund *tiktok.DetailCallBackMessage2Refund, payType string) (err error) { switch payType { case tiktok.PayStatus: // 支付回调 diff --git a/business/partner/purchase/jx/order_afs.go b/business/partner/purchase/jx/order_afs.go index 730aa90ea..7b34ce0c3 100644 --- a/business/partner/purchase/jx/order_afs.go +++ b/business/partner/purchase/jx/order_afs.go @@ -47,6 +47,9 @@ func (c *PurchaseHandler) AgreeOrRefuseRefund(ctx *jxcontext.Context, order *mod if orderPays[0].PayType == model.PayTypeTicTok { _, err = localjx.RefundOrderByTT(ctx, orderPays[0], order.VendorOrderID, int(order.SkuUserMoney), reason) } + if orderPays[0].PayType == model.PayTypeKuaiShou { + _, err = localjx.RefundOrderByKS(ctx, orderPays[0], order.VendorOrderID, int(order.SkuUserMoney), reason) + } if err != nil { return err } else { @@ -177,5 +180,11 @@ func isJxShop(appID string) bool { } func (c *PurchaseHandler) GetOrderAfsInfo(ctx *jxcontext.Context, vendorOrderID, afsOrderID string) (orderAfsInfo *partner.OrderAfsInfo, err error) { + orderAfsInfo = &partner.OrderAfsInfo{} + + if order, err := partner.CurOrderManager.LoadOrder(vendorOrderID, model.VendorIDJX); err == nil { + orderAfsInfo.AfsTotalShopMoney = order.TotalShopMoney + } + orderAfsInfo.VendorOrderID = vendorOrderID return orderAfsInfo, err } diff --git a/business/partner/purchase/jx/phpjx/order_afs.go b/business/partner/purchase/jx/phpjx/order_afs.go index 2e2fbd109..c2985b376 100644 --- a/business/partner/purchase/jx/phpjx/order_afs.go +++ b/business/partner/purchase/jx/phpjx/order_afs.go @@ -1,11 +1,14 @@ package phpjx import ( + "errors" + "fmt" + "git.rosy.net.cn/jx-callback/business/model/dao" + "strings" "time" "git.rosy.net.cn/baseapi/platformapi/jdapi" "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/business/partner" ) @@ -33,15 +36,58 @@ type Data4AfsOrder struct { } func OnAfsOrderMsg(msg *CallbackMsg) (err error) { - jxutils.CallMsgHandlerAsync(func() { - err = onAfsOrderMsg(msg) - }, jxutils.ComposeUniversalOrderID(msg.ThingID, model.VendorIDJX)) + //jxutils.CallMsgHandlerAsync(func() { + err = onAfsOrderMsg(msg) + //}, jxutils.ComposeUniversalOrderID(msg.ThingID, model.VendorIDJX)) return err } +func CheckOrderSkuCanRefund(db *dao.DaoDB, afsOrder *Data4AfsOrder) error { + // 获取此订单商品吃否存在售后单 + refundFinancial, err := dao.GetOrderRefundSkuList(db, []string{afsOrder.VendorOrderID}) + if err != nil && !strings.Contains(err.Error(), "no row found") { + return nil + } + + if len(refundFinancial) == model.NO { + return nil + } + + for _, r := range refundFinancial { + for _, s := range afsOrder.Skus { + if r.SkuID == utils.Str2Int(s.VendorSkuID) { + return fmt.Errorf("商品:[%s],已经存在售后单无法重复申请", s.Name) + } + } + } + + // 获取用户下单商品列表 + skuList, err := dao.GetSimpleOrderSkus(dao.GetDB(), afsOrder.VendorOrderID, nil) + if err != nil { + return err + } + + var really = make(map[int]bool, 0) + for _, s := range skuList { + really[s.SkuID] = true + } + for _, v := range afsOrder.Skus { + if _, ok := really[utils.Str2Int(v.VendorSkuID)]; !ok { + return fmt.Errorf("商品:[%s],不是购买商品", v.Name) + } + } + + return nil +} + func buildAfsOrder(msg *CallbackMsg) (outAfsOrder *model.AfsOrder, err error) { var afsOrder *Data4AfsOrder + var db = dao.GetDB() if err = utils.UnmarshalUseNumber([]byte(msg.Data), &afsOrder); err == nil { + if err := CheckOrderSkuCanRefund(db, afsOrder); err != nil { + return nil, err + } + outAfsOrder = &model.AfsOrder{ VendorID: model.VendorIDJX, AfsOrderID: afsOrder.AfsOrderID, @@ -61,17 +107,72 @@ func buildAfsOrder(msg *CallbackMsg) (outAfsOrder *model.AfsOrder, err error) { } outAfsOrder.Status = int(utils.Str2Int64WithDefault(afsOrder.VendorStatus, 0)) + skuNumber := 0 // 申请退款商品种类个数 + skuCount := 0 // 申请商品退款总条数 + refundMoney := 0 + // 当前申请退款的商品 for _, x := range afsOrder.Skus { orderSku := &model.OrderSkuFinancial{ Count: x.Count, VendorSkuID: x.VendorSkuID, SkuID: int(utils.Str2Int64WithDefault(x.VendorSkuID, 0)), Name: x.Name, + UserMoney: x.SalePrice * int64(x.Count), } if x.PromotionType != 0 && x.PromotionType != jdapi.PromotionTypeNormal { orderSku.StoreSubName = utils.Int2Str(x.PromotionType) } outAfsOrder.Skus = append(outAfsOrder.Skus, orderSku) + skuCount += orderSku.Count + skuNumber++ + refundMoney += x.Count * int(x.SalePrice) + } + // 已经退款商品 + refundFinancial, err := dao.GetStoreAfsOrderSkuList2(db, []string{afsOrder.VendorOrderID}) + if err != nil && !dao.IsNoRowsError(err) { + return nil, err + } + for _, f := range refundFinancial { + skuCount += f.Count + skuNumber++ + refundMoney += f.Count * int(f.SalePrice) + } + + // 获取订单商品列表(所有的订单商品) + skuList, err := dao.GetSimpleOrderSkus(dao.GetDB(), afsOrder.VendorOrderID, nil) + if err != nil { + return nil, err + } + + makeOrderSkuCount := 0 + afsOrderOrderSkuCount := 0 + refundFinacialSkuCount := 0 + for _, v := range skuList { + makeOrderSkuCount += v.Count + } + for _, v := range afsOrder.Skus { + afsOrderOrderSkuCount += v.Count + } + for _, v := range refundFinancial { + refundFinacialSkuCount += v.Count + } + // 这么写主要是不想让满足条件一的进入条件三 + if makeOrderSkuCount == afsOrderOrderSkuCount && refundFinacialSkuCount == model.NO { // 整单退 + } else if makeOrderSkuCount-refundFinacialSkuCount == model.YES && makeOrderSkuCount == model.YES { // 整单退且只有一个商品 + } else if makeOrderSkuCount-refundFinacialSkuCount-afsOrderOrderSkuCount == model.NO && afsOrderOrderSkuCount > 0 { // 分单退最后一个,不给退 + return nil, errors.New("如需整单退款,请使用整单退,无法分批次整单退款") + } + + orderSkuNumber := 0 + orderSkuCount := 0 + for _, v := range skuList { + orderSkuNumber++ + orderSkuCount += v.Count + } + if skuNumber == orderSkuNumber && skuCount == orderSkuCount { + outAfsOrder.RefundType = model.AfsTypeFullRefund + } else { // 部分退款,只退还商品部分 + outAfsOrder.RefundType = model.AfsTypePartRefund } } return outAfsOrder, err @@ -86,7 +187,7 @@ func callbackAfsMsg2Status(msg *CallbackMsg) *model.OrderStatus { RefVendorID: model.VendorIDJX, VendorStatus: msg.SubMsgType, Status: int(utils.Str2Int64WithDefault(msg.SubMsgType, 0)), - StatusTime: utils.Timestamp2Time(msg.Timestamp), + StatusTime: time.Now(), Remark: "", } return orderStatus diff --git a/business/partner/purchase/mtwm/order.go b/business/partner/purchase/mtwm/order.go index 21e5bcbd7..055483cf2 100644 --- a/business/partner/purchase/mtwm/order.go +++ b/business/partner/purchase/mtwm/order.go @@ -339,6 +339,7 @@ func (c *PurchaseHandler) onOrderMsg(msg *mtwmapi.CallbackMsg) (response *mtwmap var err error if c.isAfsMsg(msg) { response = c.OnAfsOrderMsg(msg) + return response } else { status := c.callbackMsg2Status(msg) if partner.CurOrderManager.GetStatusDuplicatedCount(status) > 0 { diff --git a/business/partner/purchase/mtwm/order_afs.go b/business/partner/purchase/mtwm/order_afs.go index ccbc1c9a8..5f07c1831 100644 --- a/business/partner/purchase/mtwm/order_afs.go +++ b/business/partner/purchase/mtwm/order_afs.go @@ -145,7 +145,15 @@ func (c *PurchaseHandler) onAfsOrderMsg(msg *mtwmapi.CallbackMsg) (retVal *mtwma err = partner.CurOrderManager.OnAfsOrderNew(afsOrder, orderStatus) } } else { - err = partner.CurOrderManager.OnAfsOrderStatusChanged(orderStatus) + if err := partner.CurOrderManager.OnAfsOrderStatusChanged(orderStatus); err == nil { + // 订单回调全额退款接口时,将订单状态修改为取消 + refundData := msg.Data.(*mtwmapi.CallbackRefundInfo) + if refundData.NotifyType == "agree" && msg.Cmd == mtwmapi.MsgTypeOrderRefund { + order, _ := partner.CurOrderManager.LoadOrder(orderStatus.RefVendorOrderID, model.VendorIDMTWM) + order.Status = model.OrderStatusCanceled + dao.UpdateEntity(dao.GetDB(), order, "Status") + } + } } return mtwmapi.Err2CallbackResponse(err, "") } diff --git a/business/partner/purchase/mtwm/store_sku2.go b/business/partner/purchase/mtwm/store_sku2.go index d9142bf15..b2ea34890 100644 --- a/business/partner/purchase/mtwm/store_sku2.go +++ b/business/partner/purchase/mtwm/store_sku2.go @@ -323,7 +323,7 @@ func (p *PurchaseHandler) createOrUpdateStoreSkus(ctx *jxcontext.Context, storeI foodData["min_order_count"] = 1 } foodData["unit"] = storeSku.Unit - attr := switchAttr(storeSku.VendorVendorCatID) + attr := SwitchAttr(storeSku.VendorVendorCatID) if attr != "" { foodData["common_attr_value"] = attr } @@ -452,7 +452,7 @@ func (p *PurchaseHandler) DeleteStoreSkus(ctx *jxcontext.Context, storeID int, v return failedList, err } -func switchAttr(vendorCatID int64) (attrs string) { +func SwitchAttr(vendorCatID int64) (attrs string) { switch vendorCatID { case 200002727: return mtwmapi.MtwmSkuAttr200002727 diff --git a/business/partner/purchase/mtwm/waybill.go b/business/partner/purchase/mtwm/waybill.go index bb615bf7f..01be0cf0e 100644 --- a/business/partner/purchase/mtwm/waybill.go +++ b/business/partner/purchase/mtwm/waybill.go @@ -49,11 +49,16 @@ func (c *PurchaseHandler) callbackMsg2Waybill(msg *mtwmapi.CallbackMsg) (retVal Status: c.GetWaybillStatusFromVendorStatus(vendorStatus), StatusTime: getTimeFromTimestamp(utils.Str2Int64(msg.FormData.Get("time"))), Remark: "", - - VendorOrgCode: msg.AppID, + VendorOrgCode: msg.AppID, } if retVal.StatusTime == utils.DefaultTimeValue { retVal.StatusTime = getTimeFromTimestamp(utils.Str2Int64(msg.FormData.Get("timestamp"))) } + + //if vendorStatus == "4" || vendorStatus == "8" { // 4:美团推送已经(确认骑手)订单 8:美团推送(骑手完成)订单 + // retVal.DesiredFee = utils.Float64TwoInt64(utils.Str2Float64WithDefault(msg.FormData.Get("shipping_fee"), 0)) // 订单优惠前的总费用 + // partner.CurOrderManager + //} + return retVal } diff --git a/business/partner/purchase/tiktok_store/callback.go b/business/partner/purchase/tiktok_store/callback.go index f1ae1889c..bee40db01 100644 --- a/business/partner/purchase/tiktok_store/callback.go +++ b/business/partner/purchase/tiktok_store/callback.go @@ -28,7 +28,6 @@ const ( func OnOrderMsg(msgId string, msg interface{}) (response *tiktokShop.CallbackResponse) { if CurPurchaseHandler != nil { orderId, shopId, _ := api.TiktokStore.GetCallbackOrderId(msgId, msg) - globals.SugarLogger.Debugf("order_id %s,%d", orderId, shopId) orderDetail, err := GetTiktokApi(utils.Int64ToStr(shopId), 0, "").GetTiktokOrderDetail(orderId) if err != nil { return tiktokShop.Err2CallbackResponse(err, "") @@ -78,7 +77,6 @@ func HttpToGuoYuan(param map[string]interface{}, requestType string) (*http.Resp } } body := strings.NewReader(string(paramData)) - globals.SugarLogger.Debugf("HttpToGuoYuan paramData====%s", utils.Format4Output(paramData, false)) url := "" switch requestType { case CaiShiPushGyTagOrder: // 订单相关 diff --git a/business/partner/purchase/tiktok_store/order.go b/business/partner/purchase/tiktok_store/order.go index de7b1f0f5..e9d78fc8a 100644 --- a/business/partner/purchase/tiktok_store/order.go +++ b/business/partner/purchase/tiktok_store/order.go @@ -192,7 +192,6 @@ func (p *PurchaseHandler) getOrder(vendorOrgCode, vendorOrderID, vendorStoreID s // 预订单还是快速达 localStore, err := dao.GetStoreDetailByVendorStoreID(dao.GetDB(), vendorStoreIdRelly, model.VendorIDDD, vendorOrgCode) if err != nil || localStore == nil || localStore.ID == 0 { - globals.SugarLogger.Debugf("平台门店未绑定到京西系统 %s", err.Error()) return nil, nil, err } diff --git a/business/partner/purchase/tiktok_store/order_afs_utils.go b/business/partner/purchase/tiktok_store/order_afs_utils.go index 53f2718ab..2039479e4 100644 --- a/business/partner/purchase/tiktok_store/order_afs_utils.go +++ b/business/partner/purchase/tiktok_store/order_afs_utils.go @@ -47,6 +47,7 @@ func (c *PurchaseHandler) OnAfsOrderMsg(msgId, orderId string, msg interface{}) // todo 对于退款与部分退款,order.go与这个文件中对于状态的处理不一致 func (c *PurchaseHandler) onAfsOrderMsg(msgId string, msg interface{}) (retVal *tiktokShop.CallbackResponse) { var err error + var db = dao.GetDB() orderStatus, vendorOrgCode := c.callbackAfsMsg2Status(msgId, msg) if orderStatus == nil { return tiktokShop.Err2CallbackResponse(nil, "") @@ -115,14 +116,20 @@ func (c *PurchaseHandler) onAfsOrderMsg(msgId string, msg interface{}) (retVal * afsOrder.AfsFinishedAt = afsOrder.AfsCreatedAt } if msgId == tiktokShop.CallbackUpdateRefundOrderMsgTagId { - _, err = dao.DeleteEntity(dao.GetDB(), afsOrder, "VendorOrderID", "VendorID") + _, err = dao.DeleteEntity(db, afsOrder, "VendorOrderID", "VendorID") afsOrder.Skus[0].VendorOrderID = afsOrder.VendorOrderID - _, err = dao.DeleteEntity(dao.GetDB(), afsOrder.Skus[0], "VendorOrderID") + _, err = dao.DeleteEntity(db, afsOrder.Skus[0], "VendorOrderID") } err = partner.CurOrderManager.OnAfsOrderNew(afsOrder, orderStatus) } } else { err = partner.CurOrderManager.OnAfsOrderStatusChanged(orderStatus) + if err == nil && msgId == tiktokShop.CallbackReturnRefundAgreedMsgTagId { + goodsOrder, _ := partner.CurOrderManager.LoadOrder(orderStatus.RefVendorOrderID, orderStatus.VendorID) + goodsOrder.Status = model.OrderStatusCanceled + goodsOrder.VendorStatus = orderStatus.VendorStatus + dao.UpdateEntity(db, goodsOrder, "Status", "VendorStatus") + } } return tiktokShop.Err2CallbackResponse(err, "") @@ -186,20 +193,20 @@ func (c *PurchaseHandler) callbackAfsMsg2Status(msgId string, msg interface{}) ( RefVendorOrderID: utils.Int64ToStr(refundOrder.PId), RefVendorID: model.VendorIDDD, VendorStatus: fmt.Sprintf("%s:%s", "order", "refund_success"), - Status: c.GetAfsStatusFromVendorStatus(refundOrder.AftersaleType, tiktokShop.CallbackUpdateRefundOrderMsgTagId), + Status: c.GetAfsStatusFromVendorStatus(int(refundOrder.AftersaleType), tiktokShop.CallbackUpdateRefundOrderMsgTagId), StatusTime: utils.Timestamp2Time(int64(refundOrder.SuccessTime)), } - if k, ok := ReasonCodeMap[refundOrder.ReasonCode]; ok { + if k, ok := ReasonCodeMap[int(refundOrder.ReasonCode)]; ok { orderMsg.Remark = k } else { - orderMsg.Remark = "退款成功回调,抖音reason_code对应reason不足,需要更新.code:" + utils.Int2Str(refundOrder.ReasonCode) + orderMsg.Remark = "退款成功回调,抖音reason_code对应reason不足,需要更新.code:" + utils.Int64ToStr(refundOrder.ReasonCode) } if refundOrder.AftersaleId > 0 { orderMsg.VendorOrderID = utils.Int64ToStr(refundOrder.AftersaleId) } else { orderMsg.VendorOrderID = orderMsg.RefVendorOrderID } - vendorOrgCode = refundOrder.ShopId + vendorOrgCode = int(refundOrder.ShopId) orderStatus = orderMsg case tiktokShop.CallbackRefundOrderRefuseMsgTagId: // 拒绝退款消息 refundOrder := msg.(tiktokShop.BusinessNotRefundRefusedData) diff --git a/business/partner/purchase/tiktok_store/store.go b/business/partner/purchase/tiktok_store/store.go index 2f0f16d6b..a6cafc6a3 100644 --- a/business/partner/purchase/tiktok_store/store.go +++ b/business/partner/purchase/tiktok_store/store.go @@ -494,7 +494,6 @@ func CreateFreightTemplate(storeCode, deliveryFeeDeductionSill int) (int64, erro //}, //} } - globals.SugarLogger.Debugf("CreateFreightTemplate 直辖市code====%d", param.Template.ProductCity) if deliveryFeeDeductionSill != 0 { param.Template.TemplateName += "满减包邮模板" param.Columns = []freightTemplate_create_request.ColumnsItem{{ @@ -601,7 +600,6 @@ func CreateBindFreeShipTemplate(vendorOrgCode string, storeID int, shipFee int64 } else { param.Template.ProductCity = int64(storeDetail.CityCode) } - globals.SugarLogger.Debugf("CreateBindFreeShipTemplate 直辖市code=%d", param.Template.ProductCity) if resp, err := getAPI(vendorOrgCode, 0, "").FreightTemplateCreate(param); err != nil { return errors.New(fmt.Sprintf("平台门店(%s) 京西门店(%d) 创建包邮模板失败:%v,根据提示处理", storeDetail.VendorStoreID, storeID, err)) } else { diff --git a/business/partner/purchase/tiktok_store/store_sku2.go b/business/partner/purchase/tiktok_store/store_sku2.go index ac0d638a0..2076c608b 100644 --- a/business/partner/purchase/tiktok_store/store_sku2.go +++ b/business/partner/purchase/tiktok_store/store_sku2.go @@ -116,7 +116,6 @@ func (p *PurchaseHandler) DeleteStoreSkus(ctx *jxcontext.Context, storeID int, v if err = getAPI(storeSkuList[0].VendorOrgCode, storeID, vendorStoreID).DeleteStoreCommodity(utils.Str2Int64(v.VendorSkuID)); err != nil { failedList = append(failedList, putils.GetErrMsg2FailedSingleList(v, err, storeID, model.VendorChineseNames[model.VendorIDDD], "删除子商品")...) } - dao.DeleteThingToTiktokMapList(model.VendorIDDD, v.VendorMainId, storeSkuList[0].SkuID) } } if len(failedList) > 0 { diff --git a/business/partner/purchase/tiktok_store/store_sku2_utils.go b/business/partner/purchase/tiktok_store/store_sku2_utils.go index 48e6b330c..9e3c49f12 100644 --- a/business/partner/purchase/tiktok_store/store_sku2_utils.go +++ b/business/partner/purchase/tiktok_store/store_sku2_utils.go @@ -226,6 +226,8 @@ func (p *PurchaseHandler) createOrUpdateStoreSkus(ctx *jxcontext.Context, storeI } else if localThing[0].SyncStatus == model.ThingTypeSyncSuccess { // 主商品存在,直接同步子商品 childrenProductId, err := api.CreateSubProduct(utils.Str2Int64(localThing[0].VendorThingID), utils.Str2Int64(vendorStoreID)) + globals.SugarLogger.Debugf("==========:%s", localThing[0].VendorThingID) + globals.SugarLogger.Debugf("==========:%v", err) if err != nil && strings.Contains(err.Error(), "2010004") { // 2010004:主商品非在线审核通过状态,不允许绑定子商品 // 线上本地都存在,但是线上审核不成功,就去更新主商品 mainOrderDetail = loadMainProductId(api, storeSku, localThing[0].VendorThingID) @@ -498,7 +500,6 @@ func makeMainProductSku(db *dao.DaoDB, api *tiktokShop.API, storeSku *dao.StoreS } func getTiktokBrandId(api *tiktokShop.API, db *dao.DaoDB, upc, upcBrandName, upcTiktokBrandId string, categoryLeafId int64) (int64, error) { - globals.SugarLogger.Debugf("upc:%s,upcBrandName:%s,upcTiktokBrandId:%s,categoryLeafId:%d", upc, upcBrandName, upcTiktokBrandId, categoryLeafId) if upc == "" { // 默认品牌京西菜市 596120136 return 596120136, nil } else if upc != "" && upcBrandName != "" && upcTiktokBrandId != "" { diff --git a/business/partner/purchase/weimob/wsc/order.go b/business/partner/purchase/weimob/wsc/order.go index 787c3a925..8c88c141d 100644 --- a/business/partner/purchase/weimob/wsc/order.go +++ b/business/partner/purchase/weimob/wsc/order.go @@ -275,7 +275,6 @@ func (p *PurchaseHandler) setStoreOrderSeq(order *model.GoodsOrder) { db := dao.GetDB() if err := dao.GetRow(db, &count, sql, order.StoreID, dateBegin, model.VendorIDWSC); err == nil { order.OrderSeq = count + 1 - globals.SugarLogger.Debugf("setStoreOrderSeq orderID:%s, dateBegin:%s, orderSeq:%d", order.VendorOrderID, utils.Time2Str(dateBegin), order.OrderSeq) } else { globals.SugarLogger.Errorf("setStoreOrderSeq orderID:%s failed with error:%v", order.VendorOrderID, err) } diff --git a/conf/app.conf b/conf/app.conf index 3ed046f73..4b325d339 100644 --- a/conf/app.conf +++ b/conf/app.conf @@ -116,7 +116,8 @@ dingdingCallbackURL = "http://callback.test.jxc4.com/dingding/msg" dingdingCorpID = "ding7ab5687f3784a8db" alipayAppID = "2019110769024042" -alipayPrivateKey = "MIIEpAIBAAKCAQEAjI46NiIj+Z19+ll4FFR+xss2N69jD5b31LtZVONM8CqNKCe7eBYx6y2pfslgg8R9Xj67PEmc/30euoG7bW23ow6QCj2fS0K2AZBA+TuEbtDpSFr0CUqS+tc/4nEurSyLOOt53ijNFPfVTT56Kl2h0mXLBDA5nvEKlzZTNimJcM/r4yyz4N72zXqfjT7cVTE/3cx6f4fkD3EsYdrxzIAruAYEywqraexLI1oIotGqufBemUhHdcOJquJJtxRLfYC000nEovHFtq1RhtakKRz8j80Edp0X+Dk1vA6JY1sVXnIFh/9QFyT70uFc77GPgwh7OT/qWvWnkBIbY+TGO7+dVQIDAQABAoIBAHQ0do4g5ctO2UOsyqlMPlBO2/Fn8KeH8jgP+MhE8GwzUebcCpM7DmRYqSRoi4IFZn0Psi8i0UktgcVC0tmi90s5E/9TeSp46g8a24zzFwejcutePxqbbC803N1zI9sK08PocyYoZ32pdNFbEReLt+lCPXmmAU2WDWJ9CIjkCHyaO+eadwqckc8VDGuBZU44pKrDDjlYfaWJk3bi7DJ2YqIGL+i0rm+1vVuK7qFTX9fHeeedperVwuBjjA5SPC6xn8I0Uq55fUQ36KQok53VIOzk5HrtiFw9GRBmULthY4/WT7mh44uG93hb+dzFvFNaK1tqgpPwqQTcGuYCNPTkmLUCgYEA4klP52ho3A4+VWXznjblzL2T/uzQPTTbeLUtLoLfKNGg+JiCTc8rJsVFalTyRXPEK8UHveM3/rR0aCc10mh07XHFG6XD7Md20jtTdHoag4HF+aubW2jY6SmbUXlWDxe7FcxRvaP8R2XxacFyIOT41ehphsS1tghU/ipbEDf01N8CgYEAnwMMIfp0ZGNm0IgYVHHKVmqfTC/ZW6epHGyfr/6mQ8hiU5arp2rHWtGUdF3EQFEJu69n8tUYK8hAoCOoPXrnEzMQdLhi389u+2dh8bKuliFzpJy0Ug0z9y4AIzdvCcuKoBMPGV4Db6adXFEHRgR1NIdsQegrtSjvuzgbGIZiwEsCgYEAxX805QRkmMM5tjEgOlMxp8tCUvl/Ghx6/NQsFe8VNDwZ4T7CY4TP5avBVPfE58cNTSJPCnU41u3Kt2iZegW/H8nvPZ0k7hB87SnoQb2cTHDESI91LYfJ4V5199sNuGh+2ZyVLw3jzrDzzdiPcpRFdfS9vWkMK08EVzzCc9pSrkMCgYBkO4iHVpfNu/bQVil3+W6BAJ6/aJ4Lr2jjOPmD9/IYYhTQ+fXkB2P4tIluvLh7jlmjTFMq9/ZPiuBp0XA4qONF7/dci+oPiHM92BIeR/LTQezig8EKw7XRBtchW80LkJkmhD0NUXy7AXzJ922tThwPa5nrBY2fmVlcW2aBFBzldwKBgQCl7y3eMG77BwD0nHxPHopWL6jsowNwxwMyN9eg40yemhfYol8+AhfouRuzaMCzROY9p5nY1N/jmPRa1dM7lXvZuij0ugwIebQXFhEjRtxtENbY5nRU4wlS7Y69oLSqFrQmW/MZbiCuIa6yXirSbEPIUojhHBI17yqq5yRD1vEHGQ==" +# alipayPrivateKey = "MIIEpAIBAAKCAQEAjI46NiIj+Z19+ll4FFR+xss2N69jD5b31LtZVONM8CqNKCe7eBYx6y2pfslgg8R9Xj67PEmc/30euoG7bW23ow6QCj2fS0K2AZBA+TuEbtDpSFr0CUqS+tc/4nEurSyLOOt53ijNFPfVTT56Kl2h0mXLBDA5nvEKlzZTNimJcM/r4yyz4N72zXqfjT7cVTE/3cx6f4fkD3EsYdrxzIAruAYEywqraexLI1oIotGqufBemUhHdcOJquJJtxRLfYC000nEovHFtq1RhtakKRz8j80Edp0X+Dk1vA6JY1sVXnIFh/9QFyT70uFc77GPgwh7OT/qWvWnkBIbY+TGO7+dVQIDAQABAoIBAHQ0do4g5ctO2UOsyqlMPlBO2/Fn8KeH8jgP+MhE8GwzUebcCpM7DmRYqSRoi4IFZn0Psi8i0UktgcVC0tmi90s5E/9TeSp46g8a24zzFwejcutePxqbbC803N1zI9sK08PocyYoZ32pdNFbEReLt+lCPXmmAU2WDWJ9CIjkCHyaO+eadwqckc8VDGuBZU44pKrDDjlYfaWJk3bi7DJ2YqIGL+i0rm+1vVuK7qFTX9fHeeedperVwuBjjA5SPC6xn8I0Uq55fUQ36KQok53VIOzk5HrtiFw9GRBmULthY4/WT7mh44uG93hb+dzFvFNaK1tqgpPwqQTcGuYCNPTkmLUCgYEA4klP52ho3A4+VWXznjblzL2T/uzQPTTbeLUtLoLfKNGg+JiCTc8rJsVFalTyRXPEK8UHveM3/rR0aCc10mh07XHFG6XD7Md20jtTdHoag4HF+aubW2jY6SmbUXlWDxe7FcxRvaP8R2XxacFyIOT41ehphsS1tghU/ipbEDf01N8CgYEAnwMMIfp0ZGNm0IgYVHHKVmqfTC/ZW6epHGyfr/6mQ8hiU5arp2rHWtGUdF3EQFEJu69n8tUYK8hAoCOoPXrnEzMQdLhi389u+2dh8bKuliFzpJy0Ug0z9y4AIzdvCcuKoBMPGV4Db6adXFEHRgR1NIdsQegrtSjvuzgbGIZiwEsCgYEAxX805QRkmMM5tjEgOlMxp8tCUvl/Ghx6/NQsFe8VNDwZ4T7CY4TP5avBVPfE58cNTSJPCnU41u3Kt2iZegW/H8nvPZ0k7hB87SnoQb2cTHDESI91LYfJ4V5199sNuGh+2ZyVLw3jzrDzzdiPcpRFdfS9vWkMK08EVzzCc9pSrkMCgYBkO4iHVpfNu/bQVil3+W6BAJ6/aJ4Lr2jjOPmD9/IYYhTQ+fXkB2P4tIluvLh7jlmjTFMq9/ZPiuBp0XA4qONF7/dci+oPiHM92BIeR/LTQezig8EKw7XRBtchW80LkJkmhD0NUXy7AXzJ922tThwPa5nrBY2fmVlcW2aBFBzldwKBgQCl7y3eMG77BwD0nHxPHopWL6jsowNwxwMyN9eg40yemhfYol8+AhfouRuzaMCzROY9p5nY1N/jmPRa1dM7lXvZuij0ugwIebQXFhEjRtxtENbY5nRU4wlS7Y69oLSqFrQmW/MZbiCuIa6yXirSbEPIUojhHBI17yqq5yRD1vEHGQ==" +alipayPrivateKey = "MIIEogIBAAKCAQEAilPMZeE7xXewRQrfwmbEbYgfn5oY5NHUR5RSbgaDohp6CdtOXL1IGEMuQ/OA3Zrx7Yd5Et5rX7d+k3BUz42k+7Xxu2opk3mBZB2UGWvBLzMcWCE0K/OQH89cJl8N3NX1V2ylrmhNQIqbRfkFunc1dnovhPZBzgSUDHnRcc4JzRI79/6HMxUN36+gfnkShhp92flM1ZYdpj6dYtwWiz5geaCXCLS9RVDIAN+6wl2ie9fiEu4gL8XWi+BrESGUC0R/r9QjoAir+5c7xAbdIPHqhRnXz18xoJorBtLnaMbYR3hoMZq/b4AgukgOJEPwsiewCGMqsyyZRAli9jFQHPByiQIDAQABAoIBAHncqU13x7iHYPryQX56GsKEEZgBoby0PldxC81yX7UHrkvQsJBzEHiPdsrWUsjoIAoqNzewStfgR9qMM6tGFfrKp1N8i3Qorx0MEdTzYRW76VSaq+Osh2P+wifrxcKvm5yRUsT7jlM1yOU0JR/ItYjSy9pPOFnPHr5+801XPrsx8aC+4ZS9oLewyou8yB0piRbyk4PiY2lf/JP6TkQt85ajNjcTLOTh+xLmIR692Z5mJcRT3N+yekpYrETAs4TiSQNgM/C17KreXjJQ97257rqcvOzdvAQwkus9kpbStFTadGMZAp5Q+ItbfDhKY0n/x9h50thoLUZBBk7Y8Bx3qCECgYEAvSKy0KxgZjr4Zw7utj6VNnSWLzkXVVpD2GjuHQgMe4tWm5xBBAbx8W72Y2sgHBoYUNtnblNmNgA1QI2/EtUWdGRnXePXu6RxB+I21PUDNw2hCXUR0v8dPxd80Yxjii31LSutEPq7NNeWkV3RNJal5ejc6RDT7nhQ9M4y8gXp7xsCgYEAuzrQVO1dVaT+KHXJV2AqjL3EQxOMQ8r9MMsBXicXZdm4faFnwIPdXcRPxBNjKK6UziV/ztNUw5IBQyReh9sG7ZRijz8S5+UF4hTA+5W8xb//EaK5TnJ3rP2zPnTkqCEJu/BERzx1paHVPq7LbxQmlVcHyODVktv5W+OJULFvaysCgYAdNKZ4IqYgIysIfv3NloxkBEzMrfw0aePgHxPl18BVs4aEMPS5MnlZ1tClOX2T2VO36KloF+jIne+bMEg5GD6HapmrnetKRnJNzVi6ObttXOVpGHLQKiTSAUZ89TjJtZ8OgpgO7yjJWCEgAWS0wi6L+hFiy/5t7JZTtyOWy+L70QKBgCOnT4TcrqlgggWyaGT7Kx8iA/3B+zPts8lW3yvOxeXfUAKceeVvNvhkKcxs5LUaibu36F66X6neY98lTdsRGoCjgSFGIZOHSVeEHDvMh+YgabIyCpeltKR8q2V5XRGnOPNRDa+DE+Q2rSUCpDrC25YUvKbEKeeNfC7DZaK4Jz+BAoGAPEYYdZXtQbOCXGyPU6CS6W5a2IlOWIpDFCMD+S+qFZBnkqCtBgS0CtQGLEL5t4gYsOBuWUreIxy0UAUIlFFGsDmwqsHu9jHi49LDcAhkciV886nYb/2qCFXo6oiZRBV65Xfai973dHqaVftmZWBsLT+cKJ7eRYHx//uGyJWe/04=" feieUser = "jianhua.xu@rosy.net.cn" feieKey = "2JfKh8TyheQ9mwss" @@ -233,8 +234,8 @@ dbConnectStr = "root:WebServer@1@tcp(127.0.0.1:3306)/jxd_dev_0?charset=utf8mb4&l getWeixinTokenURL = "http://www.jxc4.com/v2/sys/GetWXToken" getYLYTokenURL = "http://www.jxc4.com/v2/sys/GetYLYToken" -tiktokAppKey = "tta6a1d01c399f264201" -tiktokAppSecret = "5c08a0465cf0f996af254a03b6c2548defef87ad" +tiktokAppKey = "ttaceeda5333d7a7ab01" +tiktokAppSecret = "020c0aa40371cd112eecc034bb3dc094907ff925" tiktokJXDJKey="ttaceeda5333d7a7ab01" #京西到家抖音小程序 TiktokJXDJApiID="ttaceeda5333d7a7ab01" @@ -373,8 +374,8 @@ uuOpenID="8d8464e7c9354c1e88a3f5afa2a7922e" jxPrintAppID = "1000" jxPrintAppKey = "rfBd56ti2SMtYvSg" -tiktokAppKey = "tta6a1d01c399f264201" -tiktokAppSecret = "5c08a0465cf0f996af254a03b6c2548defef87ad" +tiktokAppKey = "ttaceeda5333d7a7ab01" +tiktokAppSecret = "020c0aa40371cd112eecc034bb3dc094907ff925" tiktokJXDJKey="ttaceeda5333d7a7ab01" #京西到家抖音小程序 TiktokJXDJApiID="ttaceeda5333d7a7ab01" @@ -497,8 +498,8 @@ jxPrintAppID = "1000" jxPrintAppKey = "rfBd56ti2SMtYvSg" storeName = "京西果园" -tiktokAppKey = "tta6a1d01c399f264201" -tiktokAppSecret = "5c08a0465cf0f996af254a03b6c2548defef87ad" +tiktokAppKey = "ttaceeda5333d7a7ab01" +tiktokAppSecret = "020c0aa40371cd112eecc034bb3dc094907ff925" tiktokJXDJKey="ttaceeda5333d7a7ab01" #京西到家抖音小程序 TiktokJXDJApiID="ttaceeda5333d7a7ab01" @@ -699,8 +700,8 @@ uuOpenID="8d8464e7c9354c1e88a3f5afa2a7922e" jxPrintAppID = "1000" jxPrintAppKey = "rfBd56ti2SMtYvSg" -tiktokAppKey = "tta6a1d01c399f264201" -tiktokAppSecret = "5c08a0465cf0f996af254a03b6c2548defef87ad" +tiktokAppKey = "ttaceeda5333d7a7ab01" +tiktokAppSecret = "020c0aa40371cd112eecc034bb3dc094907ff925" tiktokJXDJKey="ttaceeda5333d7a7ab01" #京西到家抖音小程序 TiktokJXDJApiID="ttaceeda5333d7a7ab01" diff --git a/controllers/cms_sku.go b/controllers/cms_sku.go index 636461648..86ecde8d1 100644 --- a/controllers/cms_sku.go +++ b/controllers/cms_sku.go @@ -11,6 +11,7 @@ import ( "git.rosy.net.cn/jx-callback/business/partner/purchase/tiktok_store" "git.rosy.net.cn/jx-callback/globals" "github.com/astaxie/beego/server/web" + "strings" "time" ) @@ -742,6 +743,7 @@ func (c *SkuController) RefreshNoImgSku() { // @Param categoryID query int false "商品名所属类别ID" // @Param status query int false "查询起始状态(0:下架,1:正常, -1全部)" // @Param isBySku query bool false "是否将sku拆开,缺省为false" +// @Param bestSeller query int false "是否为畅销品[0-不是/1-是]" // @Param offset query int false "门店列表起始序号(以0开始,缺省为0)" // @Param pageSize query int false "门店列表页大小(缺省为50,-1表示全部)" // @Success 200 {object} controllers.CallResult @@ -751,12 +753,28 @@ func (c *SkuController) GetSkuNamesNew() { c.callGetSkuNamesNew(func(params *tSkuGetSkuNamesNewParams) (retVal interface{}, errCode string, err error) { var skuIDs, skuNameIDs []int if err = jxutils.Strings2Objs(params.SkuIDs, &skuIDs, params.NameIDs, &skuNameIDs); err == nil { - retVal, err = cms.GetSkuNamesNew(params.Ctx, params.Keyword, skuIDs, skuNameIDs, params.CategoryID, params.Status, params.IsBySku, params.Offset, params.PageSize) + retVal, err = cms.GetSkuNamesNew(params.Ctx, params.Keyword, skuIDs, skuNameIDs, params.CategoryID, params.Status, params.IsBySku, params.Offset, params.PageSize, params.BestSeller) } return retVal, "", err }) } +// @Title 设置商品为热销/取消热销商品 +// @Description 设置商品为热销/取消热销商品 +// @Param token header string true "认证token" +// @Param skuNameId query string true "商品nameId,多个用逗号分割" +// @Param bestSeller query int true "是否为热销[0不是/1是]" +// @Success 200 {object} controllers.CallResult +// @Failure 200 {object} controllers.CallResult +// @router /SetSkuBestSeller [post] +func (c *SkuController) SetSkuBestSeller() { + c.callSetSkuBestSeller(func(params *tSkuSetSkuBestSellerParams) (retVal interface{}, errCode string, err error) { + nameIds := strings.Split(params.SkuNameId, ",") + err = cms.SetSkuNameSeller(utils.StringSlice2Int64(nameIds), params.BestSeller) + return nil, "", err + }) +} + // @Title 根据分类id获取平台属性值 // @Description 根据分类id获取平台属性值 // @Param token header string true "认证token" diff --git a/controllers/cms_store_sku.go b/controllers/cms_store_sku.go index b70369015..36c3d0008 100644 --- a/controllers/cms_store_sku.go +++ b/controllers/cms_store_sku.go @@ -2,6 +2,7 @@ package controllers import ( "git.rosy.net.cn/baseapi/platformapi/jdapi" + "git.rosy.net.cn/baseapi/utils" "git.rosy.net.cn/jx-callback/business/auth2" "git.rosy.net.cn/jx-callback/business/model" @@ -1039,3 +1040,18 @@ func (c *StoreSkuController) CopyMtToJd() { return retVal, "", err }) } + +// @Title 美团门店复制到美团 +// @Description 美团门店复制到美团 +// @Param token header string true "认证token" +// @Param fromStoreID formData string true "被复制门店id" +// @Param toStoreID formData string true "复制到门店id" +// @Success 200 {object} controllers.CallResult +// @Failure 200 {object} controllers.CallResult +// @router /CopyMtToMt [post] +func (c *StoreSkuController) CopyMtToMt() { + c.callCopyMtToMt(func(params *tStoreSkuCopyMtToMtParams) (retVal interface{}, errCode string, err error) { + retVal, err = cms.CopyOnStoreSkuToOther(params.Ctx, utils.Str2Int(params.FromStoreID), utils.Str2Int(params.ToStoreID), false) + return retVal, errCode, err + }) +} diff --git a/controllers/im.go b/controllers/im.go index 493b6455c..421aafb8e 100644 --- a/controllers/im.go +++ b/controllers/im.go @@ -2,7 +2,6 @@ package controllers import ( "encoding/json" - "git.rosy.net.cn/jx-callback/business/partner/purchase/im" "github.com/astaxie/beego/server/web" ) @@ -16,13 +15,9 @@ type IMController struct { // @Success 200 {object} controllers.CallResult // @Failure 200 {object} controllers.CallResult // @router /StartWebSocket [get] -//func (c *IMController) StartWebSocket() { -// var ( -// w http.ResponseWriter -// r *http.Request -// ) -// im.StartWebSocket(w, r) -//} +func (c *IMController) StartWebSocket() { + im.StartWebSocket(c.Ctx.ResponseWriter, c.Ctx.Request) +} // @Title IM获取门店用户聊天列表 // @Description IM获取门店用户聊天列表 diff --git a/controllers/jx_order.go b/controllers/jx_order.go index ffa5c3071..f5fad4a41 100644 --- a/controllers/jx_order.go +++ b/controllers/jx_order.go @@ -2,6 +2,7 @@ package controllers import ( "encoding/json" + "errors" "fmt" "git.rosy.net.cn/jx-callback/business/bidding" "strings" @@ -827,6 +828,46 @@ func (c *OrderController) RefreshHistoryOrdersEarningPrice() { // @router /PartRefundOrder [put] func (c *OrderController) PartRefundOrder() { c.callPartRefundOrder(func(params *tOrderPartRefundOrderParams) (retVal interface{}, errCode string, err error) { + var skuList []*model.OrderSku + err = jxutils.Strings2Objs(params.RefundSkuList, &skuList) + if err == nil { + if params.VendorID == model.VendorIDJX { + return nil, "", errors.New("京西小程序暂未开启此功能") + } + _, _, skuList = skuList2Map(skuList) + var order *model.GoodsOrder + order, err = partner.CurOrderManager.LoadOrder(params.VendorOrderID, params.VendorID) + if err == nil { + removedAll, err2 := fillSkuList(skuList, order.Skus) + if err = err2; err == nil { + if removedAll { + err = defsch.FixedScheduler.RefundOrder(params.Ctx, order, params.Reason) + } else { + err = defsch.FixedScheduler.PartRefundOrder(params.Ctx, order, skuList, params.Reason) + } + } + } + } + return retVal, "", err + }) +} + +// @Title 小程序用户申请售后(退款) +// @Description 小程序用户申请售后(退款) +// @Param token header string true "认证token" +// @Param vendorOrderID formData string true "订单ID" +// @Param vendorID formData int true "订单所属厂商ID" +// @Param refundSkuList formData string true "要去除的商品信息,只有skuID与Count字段有效" +// @Param reason formData string true "原因" +// @Success 200 {object} controllers.CallResult +// @Failure 200 {object} controllers.CallResult +// @router /ApplyRefundOrder [post] +func (c *OrderController) ApplyRefundOrder() { + c.callApplyRefundOrder(func(params *tOrderApplyRefundOrderParams) (retVal interface{}, errCode string, err error) { + // 微信,支付宝-通联,(抖音-抖音支付,快手-快手支付) 小程序,下单时不区分平台,支付时区分() + + // 1- 创建afsOrder 售后单 + // 2- var skuList []*model.OrderSku err = jxutils.Strings2Objs(params.RefundSkuList, &skuList) if err == nil { diff --git a/controllers/kuaishou_callback.go b/controllers/kuaishou_callback.go new file mode 100644 index 000000000..2e4e0b17b --- /dev/null +++ b/controllers/kuaishou_callback.go @@ -0,0 +1,72 @@ +package controllers + +import ( + "git.rosy.net.cn/baseapi/platformapi/kuaishou_mini" + "git.rosy.net.cn/baseapi/utils" + "git.rosy.net.cn/jx-callback/business/partner/purchase/jx/localjx" + "git.rosy.net.cn/jx-callback/globals" + "git.rosy.net.cn/jx-callback/globals/api" + "github.com/astaxie/beego/server/web" +) + +type KuaiShouController struct { + web.Controller +} + +// KuaiShouCallBack 快手回调 +func (c *KuaiShouController) KuaiShouCallback() { + payOrder, refundOrder, payType, msgId, err := api.KuaiShouApi.KauiShouCallback(c.Ctx.Request) + globals.SugarLogger.Debugf("KuaiShouCallBack payOrder =: %s", utils.Format4Output(payOrder, false)) + globals.SugarLogger.Debugf("KuaiShouCallBack refundOrder=: %s", refundOrder) + globals.SugarLogger.Debugf("KuaiShouCallBack payType=: %s", payType) + globals.SugarLogger.Debugf("KuaiShouCallBack err=: %s", utils.Format4Output(err, false)) + if err != nil { + c.Data["json"] = CallBackFail(msgId) + c.ServeJSON() + return + } + + switch payType { + case kuaishou_mini.CallbackTypePay: + err = localjx.OnKSPayCallback(payOrder, nil, payType) + case kuaishou_mini.CallbackTypeRefund: + err = localjx.OnKSPayCallback(nil, refundOrder, payType) + case kuaishou_mini.CallbackTypeSettle: + c.Data["json"] = CallBackFail(msgId) + c.ServeJSON() + return + default: + c.Data["json"] = CallBackFail(msgId) + c.ServeJSON() + return + } + + if err != nil { + c.Data["json"] = CallBackFail(msgId) + c.ServeJSON() + return + } + + c.Data["json"] = CallBackSuccess(msgId) + c.ServeJSON() + return +} + +type CallBackResult struct { + Result string `json:"result"` + MessageId string `json:"message_id"` +} + +func CallBackSuccess(msgId string) *CallBackResult { + return &CallBackResult{ + Result: "1", + MessageId: msgId, + } +} + +func CallBackFail(msgId string) *CallBackResult { + return &CallBackResult{ + Result: "-1", + MessageId: msgId, + } +} diff --git a/routers/commentsRouter_controllers.go b/routers/commentsRouter_controllers.go index 2bcb2583c..6e2ea4650 100644 --- a/routers/commentsRouter_controllers.go +++ b/routers/commentsRouter_controllers.go @@ -1466,6 +1466,15 @@ func init() { Filters: nil, Params: nil}) + web.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:OrderController"] = append(web.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:OrderController"], + web.ControllerComments{ + Method: "ApplyRefundOrder", + Router: `/ApplyRefundOrder`, + AllowHTTPMethods: []string{"post"}, + MethodParams: param.Make(), + Filters: nil, + Params: nil}) + web.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:OrderController"] = append(web.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:OrderController"], web.ControllerComments{ Method: "PrintOrder", @@ -1862,6 +1871,15 @@ func init() { Filters: nil, Params: nil}) + web.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:SkuController"] = append(web.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:SkuController"], + web.ControllerComments{ + Method: "SetSkuBestSeller", + Router: `/SetSkuBestSeller`, + AllowHTTPMethods: []string{"post"}, + MethodParams: param.Make(), + Filters: nil, + Params: nil}) + web.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:SkuController"] = append(web.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:SkuController"], web.ControllerComments{ Method: "GetTiktokCategoryValue", @@ -3200,6 +3218,15 @@ func init() { Filters: nil, Params: nil}) + web.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:StoreSkuController"] = append(web.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:StoreSkuController"], + web.ControllerComments{ + Method: "CopyMtToMt", + Router: `/CopyMtToMt`, + AllowHTTPMethods: []string{"post"}, + MethodParams: param.Make(), + Filters: nil, + Params: nil}) + web.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:StoreSkuController"] = append(web.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:StoreSkuController"], web.ControllerComments{ Method: "GetStoresSkusSaleInfo", @@ -4329,14 +4356,14 @@ func init() { MethodParams: param.Make(), Filters: nil, Params: nil}) - //web.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:IMController"] = append(web.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:IMController"], - // web.ControllerComments{ - // Method: "StartWebSocket", - // Router: `/StartWebSocket`, - // AllowHTTPMethods: []string{"get"}, - // MethodParams: param.Make(), - // Filters: nil, - // Params: nil}) + web.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:IMController"] = append(web.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:IMController"], + web.ControllerComments{ + Method: "StartWebSocket", + Router: `/StartWebSocket`, + AllowHTTPMethods: []string{"get"}, + MethodParams: param.Make(), + Filters: nil, + Params: nil}) //web.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:FnController"] = append(web.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:FnController"], // web.ControllerComments{