diff --git a/business/jxcallback/scheduler/defsch/defsch.go b/business/jxcallback/scheduler/defsch/defsch.go index 6911d861e..23ab462f1 100644 --- a/business/jxcallback/scheduler/defsch/defsch.go +++ b/business/jxcallback/scheduler/defsch/defsch.go @@ -1514,7 +1514,8 @@ func (s *DefScheduler) updateBillsInfo(savedOrderInfo *WatchOrderInfo, bill *mod func (s *DefScheduler) autoPickupGood(savedOrderInfo *WatchOrderInfo) (err error) { order := savedOrderInfo.order - flag := model.IsOrderDeliveryByStore(order) || model.IsOrderDeliveryBySelf(order) + store, _ := dao.GetStoreDetail(dao.GetDB(), order.JxStoreID, order.VendorID, "") + flag := (model.IsOrderDeliveryByStore(order) || model.IsOrderDeliveryBySelf(order)) && store.AutoPickup == model.YES if err = s.PickupGoods(order, flag, "autoPickup"); err == nil { order.DeliveryFlag |= model.OrderDeliveryFlagMaskAutoPickup partner.CurOrderManager.UpdateOrderFields(order, []string{"DeliveryFlag"}) diff --git a/business/jxstore/cms/sync_store_sku.go b/business/jxstore/cms/sync_store_sku.go index e821bf171..b4f2b805a 100644 --- a/business/jxstore/cms/sync_store_sku.go +++ b/business/jxstore/cms/sync_store_sku.go @@ -4,6 +4,7 @@ import ( "errors" "fmt" "github.com/astaxie/beego/server/web" + beego "github.com/astaxie/beego/server/web" "regexp" "sort" "strings" @@ -69,13 +70,28 @@ func CreateStoreCategoryByStoreSku(ctx *jxcontext.Context, vendorID, storeID int } func SyncStoreCategories(ctx *jxcontext.Context, parentTask tasksch.ITask, vendorID, storeID int, vendorStoreID string, nameIDs, skuIDs []int, isAsync, isContinueWhenError bool) (hint string, err error) { - // 668594 正式服印象汇 668469 测试服芬姐 + db := dao.GetDB() + // 668594 正式服印象汇 668469 测试服芬姐(淘宝所有门店公用分类) if storeID != 668594 && storeID != 668469 && vendorID == model.VendorIDTaoVegetable { + var totalCategory []*model.StoreSkuCategoryMap + switch beego.BConfig.RunMode { + case "dev": + totalCategory, _ = dao.GetDetailStoreSkuCategoryMap(db, 668469) + case "jxgy": + + default: + totalCategory, _ = dao.GetDetailStoreSkuCategoryMap(db, 668594) + } + if totalCategory != nil { + for _, v := range totalCategory { + dao.UpdateStoreSkuCategory(db, v.CategoryID, storeID, v.TaoID) + } + } + return "", nil } handler := partner.GetPurchasePlatformFromVendorID(vendorID).(partner.ISingleStoreStoreSkuHandler) num := 0 - db := dao.GetDB() rootTask := tasksch.NewSeqTask(fmt.Sprintf("%s SyncStoreCategory step1", model.VendorChineseNames[vendorID]), ctx, func(rootTask *tasksch.SeqTask, step int, params ...interface{}) (result interface{}, err error) { level := step + 1 diff --git a/business/model/dao/store_sku.go b/business/model/dao/store_sku.go index 15a1b91d8..53a85d790 100644 --- a/business/model/dao/store_sku.go +++ b/business/model/dao/store_sku.go @@ -3,6 +3,7 @@ package dao import ( "errors" "fmt" + beego "github.com/astaxie/beego/server/web" "strings" "time" @@ -2011,6 +2012,40 @@ func GetStoreSkuCategoryMap(db *DaoDB, categoryID, storeID int) (storeSkuCategor return storeSkuCategoryMap, err } +// GetDetailStoreSkuCategoryMap 淘宝是所有门店公用一套分类 用默认门店赋值其余门店 +func GetDetailStoreSkuCategoryMap(db *DaoDB, storeId int) (storeSkuCategoryMap []*model.StoreSkuCategoryMap, err error) { + sql := ` + SELECT * + FROM store_sku_category_map + WHERE deleted_at = ? + ` + sqlParams := []interface{}{utils.DefaultTimeValue} + + if storeId != 0 { + sql += " AND store_id = ? " + sqlParams = append(sqlParams, storeId) + } else { + switch beego.BConfig.RunMode { + case "jxgy": + storeId = 0 + case "dev": + storeId = 668469 // 测试服芬姐(淘宝所有门店公用分类) + default: + storeId = 668594 // 正式服印象汇 + } + } + + GetRows(db, &storeSkuCategoryMap, sql, sqlParams) + return storeSkuCategoryMap, err +} + +// UpdateStoreSkuCategory 修改淘宝门店的分类code以及同步装太 +func UpdateStoreSkuCategory(db *DaoDB, categoryId int, storeID int, vendorCode string) { + sql := ` UPDATE store_sku_category_map SET tao_id = ? ,tao_sync_status = ? WHERE store_id = ? AND category_id = ?` + param := []interface{}{vendorCode, 0, storeID, categoryId} + ExecuteSQL(db, sql, param...) +} + func GetStoreSkuListWithVendor(db *DaoDB, storeID, vendorID int, vendorOrgCode string) (skuList []*StoreSkuSyncInfo, err error) { sql := ` SELECT DISTINCT b.*, c.vendor_thing_id vendor_sku_id diff --git a/business/partner/purchase/tao_vegetable/order.go b/business/partner/purchase/tao_vegetable/order.go index 64a7670bf..0c8bc9c2b 100644 --- a/business/partner/purchase/tao_vegetable/order.go +++ b/business/partner/purchase/tao_vegetable/order.go @@ -494,7 +494,6 @@ func (c *PurchaseHandler) AcceptOrRefuseOrder(order *model.GoodsOrder, isAcceptI // PickupGoods 拣货 func (c *PurchaseHandler) PickupGoods(order *model.GoodsOrder, isSelfDelivery bool, userName string) (err error) { - globals.SugarLogger.Debugf("PickupGoods 自动拣货:%s, %s", utils.Format4Output(isSelfDelivery, false), utils.Format4Output(order, false)) if isSelfDelivery { param, err := orderStatusChangeNotice(order, tao_vegetable.OrderStatusPickedUp) if err != nil { @@ -504,9 +503,8 @@ func (c *PurchaseHandler) PickupGoods(order *model.GoodsOrder, isSelfDelivery bo globals.SugarLogger.Debugf("PickupGoods 拣货失败可能是BizSubOrderId 没填写 : %s", err.Error()) return err } + c.postFakeMsg(order.VendorOrderID, tao_vegetable.OrderStatusPickedUp, tao_vegetable.OrderStatusPickedUp) } - - c.postFakeMsg(order.VendorOrderID, tao_vegetable.OrderStatusPickedUp, tao_vegetable.OrderStatusPickedUp) return err } @@ -682,52 +680,69 @@ func (c *PurchaseHandler) CancelOrder(ctx *jxcontext.Context, order *model.Goods return err } -// AdjustOrder 商户发起部分退款(取消订单部分商品) +// AdjustOrder 商户发起部分退款(取消订单部分商品),淘宝没有部分退款,所以调整订单的时候就是在拣货,把缺货的部分排除 +// 1、子单部分缺货,骑手妥投的时候退款给用户 +// 2、子单整单缺货,商家打包完成退款给用户 +// 3、整单缺货,拣货完成退款给用户 func (c *PurchaseHandler) AdjustOrder(ctx *jxcontext.Context, order *model.GoodsOrder, removedSkuList []*model.OrderSku, reason string) (err error) { api := getAPI(order.VendorOrgCode, jxutils.GetSaleStoreIDFromOrder(order), "") - // 美团外卖必须要确认订单后才能调整单 - if order.Status < model.OrderStatusFinishedPickup { - if err = c.PickupGoods(order, false, ctx.GetUserName()); err != nil { - return err - } + + globals.SugarLogger.Debugf("removedSkuList := %s", utils.Format4Output(removedSkuList, false)) + // 获取需要退货商品的子订单id + refundSkuOrderID := make(map[int]*model.OrderSku, 0) + for _, v := range removedSkuList { + refundSkuOrderID[v.SkuID] = v } - // 获取订单的子订单id - requestParam := &request591.AlibabaAelophyOrderGetRequest{OrderGetRequest: &domain591.AlibabaAelophyOrderGetOrderGetRequest{ + param := &request591.AlibabaAelophyOrderWorkCallbackRequest{} + param.WorkCallbackRequest = &domain591.AlibabaAelophyOrderWorkCallbackWorkCallbackRequest{ StoreId: utils.String2Pointer(order.VendorStoreID), BizOrderId: utils.Int64ToPointer(utils.Str2Int64(order.VendorOrderID)), - }} - orderDetail, err := api.QueryOrderDetail(requestParam) + Status: utils.String2Pointer(tao_vegetable.OrderStatusPickedUp), + } + + workCallbackSubOrderInfoList := make([]domain591.AlibabaAelophyOrderWorkCallbackWorkCallbackSubOrderInfo, 0, 0) + + orderDetail, err := getAPI(order.VendorOrgCode, 0, "").QueryOrderDetail(&request591.AlibabaAelophyOrderGetRequest{OrderGetRequest: &domain591.AlibabaAelophyOrderGetOrderGetRequest{ + StoreId: utils.String2Pointer(order.VendorStoreID), + BizOrderId: utils.Int64ToPointer(utils.Str2Int64(order.VendorOrderID)), + }}) if err != nil { return err } - - skuMap := make(map[string]string, 0) for _, v := range *orderDetail.SubOrderResponseList { - skuMap[*v.SkuCode] = *v.OutSubOrderId - } - - // 获取需要退货商品的子订单id - refundSkuOrderID := make([]string, 0, len(removedSkuList)) - for _, v := range removedSkuList { - if orderId, ok := skuMap[v.VendorSkuID]; ok { - refundSkuOrderID = append(refundSkuOrderID, orderId) + // 缺货 + if refundSkuOrderID[utils.Str2Int(*v.SkuCode)] != nil { + if refundSkuOrderID[utils.Str2Int(*v.SkuCode)].Count > utils.Float64TwoInt(*v.BuyStockQuantity) { + return fmt.Errorf("商品[%s],缺货数量[%d],大于订单数量[%d],请重新调整", refundSkuOrderID[utils.Str2Int(*v.SkuCode)].SkuName, refundSkuOrderID[utils.Str2Int(*v.SkuCode)].Count, utils.Float64TwoInt(*v.BuyStockQuantity)) + } + workCallbackSubOrderInfo := domain591.AlibabaAelophyOrderWorkCallbackWorkCallbackSubOrderInfo{ + BizSubOrderId: v.BizSubOrderId, + SkuCode: v.SkuCode, + PickSaleQuantity: utils.String2Pointer(utils.Int2Str(utils.Float64TwoInt(*v.BuySaleQuantity) - refundSkuOrderID[utils.Str2Int(*v.SkuCode)].Count)), + PickStockQuantity: utils.String2Pointer(utils.Int2Str(utils.Float64TwoInt(*v.BuyStockQuantity) - refundSkuOrderID[utils.Str2Int(*v.SkuCode)].Count)), + } + workCallbackSubOrderInfoList = append(workCallbackSubOrderInfoList, workCallbackSubOrderInfo) + } else { + workCallbackSubOrderInfo := domain591.AlibabaAelophyOrderWorkCallbackWorkCallbackSubOrderInfo{ + BizSubOrderId: v.BizSubOrderId, + SkuCode: v.SkuCode, + PickSaleQuantity: utils.String2Pointer(utils.Float64ToStr(*v.BuySaleQuantity)), + PickStockQuantity: utils.String2Pointer(utils.Float64ToStr(*v.BuyStockQuantity)), + } + workCallbackSubOrderInfoList = append(workCallbackSubOrderInfoList, workCallbackSubOrderInfo) } } - // 商家申请退货 - param := &request3156.AlibabaTclsAelophyRefundCsapplyRequest{ - RefundCsApplyDTO: &domain3156.AlibabaTclsAelophyRefundCsapplyRefundCsApplyDto{ - ReasonId: utils.Int64ToPointer(1111), - OutOrderId: utils.String2Pointer(order.VendorOrderID), - StoreId: utils.String2Pointer(order.VendorStoreID), - RequestId: utils.String2Pointer(fmt.Sprintf("%s%d", order.VendorStoreID, time.Now().UnixNano())), - OutSubOrderIds: &refundSkuOrderID, - Memo: utils.String2Pointer(reason), - }, - } + // 出库 + param.WorkCallbackRequest.WorkCallbackSubOrderInfoList = &workCallbackSubOrderInfoList - return api.PartialRefund(param) + if err = api.DeliveryFinish(param); err != nil { + globals.SugarLogger.Debugf("PickupGoods 拣货失败可能是BizSubOrderId 没填写 : %s", err.Error()) + return err + } + c.postFakeMsg(order.VendorOrderID, tao_vegetable.OrderStatusPickedUp, tao_vegetable.OrderStatusPickedUp) + return nil } // ListOrders 获取门店订单列表(补全遗漏订单) diff --git a/business/partner/purchase/tao_vegetable/store_sku2.go b/business/partner/purchase/tao_vegetable/store_sku2.go index 0ccdc2c85..eb7880ea4 100644 --- a/business/partner/purchase/tao_vegetable/store_sku2.go +++ b/business/partner/purchase/tao_vegetable/store_sku2.go @@ -312,24 +312,25 @@ func createTaoVegetable(ctx *jxcontext.Context, api *tao_vegetable.API, storeSku DeliverySpec: utils.String2Pointer(utils.Int2Str(model.YES)), MemberPrice: price, Storage: utils.String2Pointer(tao_vegetable.CreateStorage), - PickFloatRate: utils.String2Pointer(utils.Int2Str(model.NO)), // ? 0 - ForbidReceiveDays: utils.Int64ToPointer(tao_vegetable.CreateShelfLife), // ? 7 - ForbidSalesDays: utils.Int64ToPointer(model.NO), // ? 0 - OverloadRate: utils.String2Pointer(utils.Int2Str(model.NO)), // ? 0 - WarnDays: utils.Int64ToPointer(model.NO), // ? 0 - FixedFlag: utils.Int64ToPointer(model.NO), // ? 0 - PurchaseSpec: utils.String2Pointer(utils.Int2Str(model.YES)), // ? 1 - //PurchaseUnit: utils.String2Pointer(storeSku.Unit), // ? 同上 - PurchaseUnit: utils.String2Pointer("份"), // ? 同上 - LabelStyleType: utils.String2Pointer(tao_vegetable.CreateLabelStyleType), // 库存单位 - ItemTypeNew: utils.Int64ToPointer(tao_vegetable.CreateItemTypeNewVegetable), - SkuPrice: price, // 优先使用skuPrice 靠后SalePrice - Period: utils.Int64ToPointer(tao_vegetable.CreateShelfLife), // 优先使用period 靠后shelf_life - FragileFlag: utils.Int64ToPointer(model.YES), - DeliveryStorage: utils.String2Pointer(tao_vegetable.CreateItemDeliveryStorage), - TemporaryFlag: utils.Int64ToPointer(model.NO), - IsOnline: utils.Int64ToPointer(tao_vegetable.CreateIsOnline), - MerchantCatCode: utils.String2Pointer(storeSku.VendorCatID), // 优先使用 靠后 category_code + PickFloatRate: utils.String2Pointer(utils.Int2Str(model.NO)), // ? 0 + ForbidReceiveDays: utils.Int64ToPointer(tao_vegetable.CreateShelfLife), // ? 7 + ForbidSalesDays: utils.Int64ToPointer(model.NO), // ? 0 + OverloadRate: utils.String2Pointer(utils.Int2Str(model.NO)), // ? 0 + WarnDays: utils.Int64ToPointer(model.NO), // ? 0 + FixedFlag: utils.Int64ToPointer(model.NO), // ? 0 + PurchaseSpec: utils.String2Pointer(utils.Int2Str(model.YES)), // ? 1 + PurchaseUnit: utils.String2Pointer("份"), // ? 同上 + LabelStyleType: utils.String2Pointer(tao_vegetable.CreateLabelStyleType), // 库存单位 + ItemTypeNew: utils.Int64ToPointer(tao_vegetable.CreateItemTypeNewVegetable), + SkuPrice: price, // 优先使用skuPrice 靠后SalePrice + Period: utils.Int64ToPointer(tao_vegetable.CreateShelfLife), // 优先使用period 靠后shelf_life + FragileFlag: utils.Int64ToPointer(model.YES), + DeliveryStorage: utils.String2Pointer(tao_vegetable.CreateItemDeliveryStorage), + TemporaryFlag: utils.Int64ToPointer(model.NO), + IsOnline: utils.Int64ToPointer(tao_vegetable.CreateIsOnline), + MerchantCatCode: utils.String2Pointer(storeSku.VendorCatID), // 优先使用 靠后 category_code + RichText: utils.String2Pointer(storeSku.Name), + AllowAppSale: utils.Int64ToPointer(tao_vegetable.IsAllowAppSale), } sku.SkuPicUrls = uploadImg(api, []string{storeSku.ImgOrigin, storeSku.Img, storeSku.Img2, storeSku.Img3, storeSku.Img4, storeSku.Img5, storeSku.DescImg}) if sku.SkuPicUrls == nil { diff --git a/controllers/jx_order.go b/controllers/jx_order.go index 9641411c2..40c481ae6 100644 --- a/controllers/jx_order.go +++ b/controllers/jx_order.go @@ -636,6 +636,9 @@ func (c *OrderController) AdjustOrder() { func (c *OrderController) CancelOrder() { c.callCancelOrder(func(params *tOrderCancelOrderParams) (retVal interface{}, errCode string, err error) { order, err := partner.CurOrderManager.LoadOrder(params.VendorOrderID, params.VendorID) + if order.Status >= model.OrderStatusEndBegin { + return nil, "", fmt.Errorf("订单处于完成状态,不支持取消操作!请走售后流程") + } if err == nil { err = defsch.FixedScheduler.CancelOrder(params.Ctx, order, params.Reason) }