diff --git a/business/jxcallback/orderman/order.go b/business/jxcallback/orderman/order.go index b8254c1d3..b99e0d1c4 100644 --- a/business/jxcallback/orderman/order.go +++ b/business/jxcallback/orderman/order.go @@ -7,6 +7,8 @@ import ( "strings" "time" + "git.rosy.net.cn/baseapi/platformapi/jdeclpapi" + "git.rosy.net.cn/jx-callback/business/jxstore/common" "git.rosy.net.cn/jx-callback/business/jxutils/ddmsg" "git.rosy.net.cn/jx-callback/business/jxutils/tasksch" @@ -341,7 +343,13 @@ func (c *OrderManager) updateOrderSkuOtherInfo(order *model.GoodsOrder, db *dao. } } if len(vendorSkuIDs) > 0 { - l, err := dao.GetStoreSkuPriceAndWeight(db, order.VendorStoreID, order.VendorID, vendorSkuIDs) + var vendorStoreID string + if order.VendorID == model.VendorIDJDShop { + vendorStoreID = model.JdShopMainVendorStoreID + } else { + vendorStoreID = order.VendorStoreID + } + l, err := dao.GetStoreSkuPriceAndWeight(db, vendorStoreID, order.VendorID, vendorSkuIDs) if err != nil { globals.SugarLogger.Warnf("updateOrderSkuOtherInfo orderID:%s failed with err:%v", order.VendorOrderID, err) return err @@ -357,13 +365,30 @@ func (c *OrderManager) updateOrderSkuOtherInfo(order *model.GoodsOrder, db *dao. if skuBindInfo == nil { globals.SugarLogger.Infof("updateOrderSkuOtherInfo [运营%s]%s订单sku找不到门店价格(或商品映射),orderID:%s, StoreID:%d, VendorSkuID:%s, sku:%v", opNumStr, model.VendorChineseNames[order.VendorID], order.VendorOrderID, jxStoreID, v.VendorSkuID, v) } else { - v.JxSkuID = skuBindInfo.SkuID // TODO 客户端当前逻辑认为SkuID为0为赠品 if v.SkuID == 0 { v.SkuID = v.JxSkuID } - v.ShopPrice = int64(skuBindInfo.Price) + v.JxSkuID = skuBindInfo.SkuID + //京东商城的话,门店里可能取不到对应商品 + if order.VendorID == model.VendorIDJDShop { + v.JxSkuID = v.SkuID + storeSkus, _ := dao.GetStoresSkusInfo(db, []int{order.StoreID}, []int{v.SkuID}) + if len(storeSkus) > 0 { + v.ShopPrice = int64(storeSkus[0].Price) + } else { + v.ShopPrice = v.SalePrice * 70 / 100 + } + } else { + v.ShopPrice = int64(skuBindInfo.Price) + } v.Weight = skuBindInfo.Weight // 以本地信息中的WEIGHT为准 + //饿鲜达的订单做一下处理 + if strings.Contains(order.StoreName, model.ExdStoreName) { + if v.SkuID == 0 && !strings.Contains(v.SkuName, "免费") { + v.SkuID = v.JxSkuID + } + } if skuBindInfo.Price == 0 { globals.SugarLogger.Infof("updateOrderSkuOtherInfo [运营%s]%s订单sku门店价格为零(一般原因为没有门店价格信息),orderID:%s, StoreID:%d, SkuID:%d, sku:%v", opNumStr, model.VendorChineseNames[order.VendorID], order.VendorOrderID, jxStoreID, v.JxSkuID, v) } @@ -434,9 +459,6 @@ func updateSingleOrderEarningPrice(order *model.GoodsOrder, db *dao.DaoDB) { } } if len(skuIDMap) > 0 { - if order.VendorOrderID == "5000356075877900459" { - fmt.Println("testupdateSingleOrderEarningPrice", order.VendorOrderID) - } actStoreSkuList, err := dao.GetEffectiveActStoreSkuInfo(db, 0, []int{order.VendorID}, model.ActTypeAll, []int{jxStoreID}, jxutils.IntMap2List(skuIDMap), order.OrderCreatedAt, order.OrderCreatedAt) if err != nil { globals.SugarLogger.Errorf("updateOrderSkuOtherInfo can not get sku promotion info for error:%v", err) @@ -1004,19 +1026,29 @@ func GetOrderSimpleInfo(ctx *jxcontext.Context, vendorOrderID string) (getOrderS func SaveJdsOrders(ctx *jxcontext.Context, orderCreatedStart, orderCreatedEnd time.Time) (err error) { var ( - pageNo = 1 - pageSize = 10 + pageSize = 20 ) - orderResult, err := jdshop.CurPurchaseHandler.GetJdsOrders(ctx, utils.Time2Str(orderCreatedStart), utils.Time2Str(orderCreatedEnd), pageNo, pageSize) + orderResult, err := jdshop.CurPurchaseHandler.GetJdsOrders(ctx, utils.Time2Str(orderCreatedStart), utils.Time2Str(orderCreatedEnd), 1, pageSize) if err != nil { noticeMsg := fmt.Sprintf("京东商城保存订单出错!(多半是cookie过期了),err :[%v]", err) ddmsg.SendUserMessage(dingdingapi.MsgTyeText, "DDC5657B43EE11E9A9FF525400E86DC0", "cookie", noticeMsg) ddmsg.SendUserMessage(dingdingapi.MsgTyeText, "1439B3E07D3911EA881A525400E86DC0", "cookie", noticeMsg) - globals.SugarLogger.Errorf("SaveJdsOrders : %v", err) + return err } orders, err := result2Orders(ctx, orderResult) + if orderResult.TotalCount > pageSize { + for pageNO := 2; pageNO < orderResult.TotalCount/pageSize+1; pageNO++ { + orderResult, _ := jdshop.CurPurchaseHandler.GetJdsOrders(ctx, utils.Time2Str(orderCreatedStart), utils.Time2Str(orderCreatedEnd), pageNO, pageSize) + orders2, _ := result2Orders(ctx, orderResult) + orders = append(orders, orders2...) + } + } for _, order := range orders { - // partner.CurOrderManager.OnOrderNew(order, model.Order2Status(order)) + order.StoreID = 102919 + order.JxStoreID = 102919 + order.StoreName = "商城模板(成都发货)" + order.VendorStoreID = model.JdShopMainVendorStoreID + partner.CurOrderManager.OnOrderNew(order, model.Order2Status(order)) globals.SugarLogger.Debugf("SaveJdsOrders, order: [%v]", utils.Format4Output(order, false)) noticeMsg := fmt.Sprintf("京东商城新订单,订单号:[%v] ,将要发到的门店id:[%v] , 门店名:[%v]", order.VendorOrderID, order.StoreID, order.StoreName) ddmsg.SendUserMessage(dingdingapi.MsgTyeText, "DDC5657B43EE11E9A9FF525400E86DC0", "京东商城来新订单了!", noticeMsg) @@ -1043,7 +1075,7 @@ func result2Orders(ctx *jxcontext.Context, result *jdshopapi.AllOrdersResult) (o } order := &model.GoodsOrder{ VendorOrderID2: utils.Int64ToStr(jdsOrder.OrderID), - VendorOrderID: utils.Int64ToStr(jdsOrder.OrderID) + "01", + VendorOrderID: utils.Int64ToStr(jdsOrder.OrderID) + "001", VendorID: model.VendorIDJDShop, BaseFreightMoney: jxutils.StandardPrice2Int(jdsOrder.Freight), VendorStatus: utils.Int2Str(jdsOrder.OrderStatus), @@ -1058,6 +1090,10 @@ func result2Orders(ctx *jxcontext.Context, result *jdshopapi.AllOrdersResult) (o ActualPayPrice: orderDetail.ActualPayPrice, Status: model.OrderStatusNew, TotalShopMoney: utils.Float64TwoInt64(math.Round(utils.Int64ToFloat64(orderDetail.ActualPayPrice) * jdshopapi.JdsPayPercentage)), + DeliveryFlag: model.OrderDeliveryFlagMaskScheduleDisabled, + DeliveryType: model.OrderDeliveryTypeStoreSelf, + StatusTime: utils.Str2Time(jdsOrder.OrderCreateTime + ":00"), + OrderSeq: 0, } //获取真实手机号 fakeMobile, err := api.JdShopAPI.PhoneSensltiveInfo(order.VendorOrderID2, orderDetail.MobileKey) @@ -1075,31 +1111,28 @@ func result2Orders(ctx *jxcontext.Context, result *jdshopapi.AllOrdersResult) (o order.ConsigneeLng = jxutils.StandardCoordinate2Int(lng) order.ConsigneeLat = jxutils.StandardCoordinate2Int(lat) } - if order.StoreName != "" { - storeMaps, _ := dao.GetStoresMapList(dao.GetDB(), []int{model.VendorIDJDShop}, nil, nil, model.StoreStatusAll, model.StoreIsSyncAll, "", order.StoreName) - if len(storeMaps) > 0 { - order.StoreID = storeMaps[0].StoreID - order.VendorStoreID = storeMaps[0].VendorStoreID - } - } else { - storeList, err := common.GetStoreListByLocation(ctx, jxutils.IntCoordinate2Standard(order.ConsigneeLng), jxutils.IntCoordinate2Standard(order.ConsigneeLat), 5000, false, true) - if err != nil { - globals.SugarLogger.Debugf("jds GetStoreListByLocation error: %v", err.Error()) - continue - } - order.StoreID = storeList[0].ID - order.StoreName = storeList[0].Name + storeList, err := common.GetStoreListByLocation(ctx, jxutils.IntCoordinate2Standard(order.ConsigneeLng), jxutils.IntCoordinate2Standard(order.ConsigneeLat), 5000, false, true) + if err != nil { + globals.SugarLogger.Debugf("jds GetStoreListByLocation error: %v", err.Error()) + continue + } + order.StoreID = storeList[0].ID + order.StoreName = storeList[0].Name + storeMaps, _ := dao.GetStoresMapList(dao.GetDB(), []int{model.VendorIDJDShop}, []int{order.StoreID}, nil, model.StoreStatusAll, model.StoreIsSyncAll, "", "") + if len(storeMaps) > 0 { + order.VendorStoreID = storeMaps[0].VendorStoreID } //如果是暂停,表示是预订单 if jdsOrder.OrderStatus == jdshopapi.JdsOrderStatusPause { order.BusinessType = model.BusinessTypeDingshida order.ExpectedDeliveredTime = utils.Str2Time(orderDetail.ExpectedDeliveredTime) } else if jdsOrder.OrderStatus == jdshopapi.JdsOrderStatusWaittingExport { - order.ExpectedDeliveredTime = order.CreatedAt.Add(time.Hour) + order.ExpectedDeliveredTime = order.OrderCreatedAt.Add(time.Hour) order.BusinessType = model.BusinessTypeImmediate } else { globals.SugarLogger.Errorf("未知的京东商城订单状态!status : %v", jdsOrder.OrderStatus) } + setJdsOrderSeq(order) for _, v := range jdsOrder.OrderItems { sku := &model.OrderSku{ VendorID: model.VendorIDJDShop, @@ -1128,6 +1161,19 @@ func result2Orders(ctx *jxcontext.Context, result *jdshopapi.AllOrdersResult) (o return orders, err } +func setJdsOrderSeq(order *model.GoodsOrder) (err error) { + var count int + sql := ` + SELECT count(*) FROM goods_order WHERE store_id = ? AND order_create_at >= ? AND order_create_at <= ? AND vendor_id = ? + ` + sqlParams := []interface{}{ + order.StoreID, utils.Time2Date(time.Now()), utils.Time2Date(time.Now().AddDate(0, 0, 1)), order.VendorID, + } + err = dao.GetRow(dao.GetDB(), &count, sql, sqlParams) + order.OrderSeq = count + 1 + return err +} + func TransferJdsOrder(ctx *jxcontext.Context, vendorOrderID string, storeID int) (vendorOrderIDJds string, err error) { globals.SugarLogger.Debugf("jds TransferJdsOrder vendorOrderID: %v, storeID : %v", vendorOrderID, storeID) var ( @@ -1138,7 +1184,7 @@ func TransferJdsOrder(ctx *jxcontext.Context, vendorOrderID string, storeID int) if err != nil || order == nil { return "", fmt.Errorf("未查询到该订单!订单号:[%v]", vendorOrderID) } - if order.Status >= model.OrderStatusDelivering { + if order.Status >= model.OrderStatusDelivering && order.Status != model.OrderStatusCanceled { return "", fmt.Errorf("暂不支持此状态的订单进行转移!") } if order.VendorID != model.VendorIDJDShop { @@ -1159,10 +1205,12 @@ func TransferJdsOrder(ctx *jxcontext.Context, vendorOrderID string, storeID int) waybill = v } } - handler := partner.DeliveryPlatformHandlers[waybill.WaybillVendorID] - err = handler.Handler.CancelWaybill(waybill, 0, "订单转移被取消") - if err != nil { - return "", err + if waybill.WaybillVendorID != model.VendorIDJDWL { + handler := partner.DeliveryPlatformHandlers[waybill.WaybillVendorID] + err = handler.Handler.CancelWaybill(waybill, 0, "订单转移被取消") + if err != nil { + return "", err + } } } err = jdshop.ChangeOrderStatus(vendorOrderID, model.OrderStatusCanceled, "订单转移被取消") @@ -1170,23 +1218,30 @@ func TransferJdsOrder(ctx *jxcontext.Context, vendorOrderID string, storeID int) return "", err } //重新构建order的数据 - storeMaps, err := dao.GetStoresMapList(db, []int{order.VendorID}, []int{order.StoreID}, nil, model.StoreStatusAll, model.StoreIsSyncAll, "", "") - if len(storeMaps) > 0 { + storeMaps, err := dao.GetStoresMapList(db, []int{order.VendorID}, []int{storeID}, nil, model.StoreStatusAll, model.StoreIsSyncAll, "", "") + stores, err := dao.GetStoreList(db, []int{storeID}, nil, nil, nil, "") + if len(storeMaps) > 0 && len(stores) > 0 { order.StoreID = storeID - order.StoreName = storeMaps[0].StoreName + order.StoreName = stores[0].Name + order.VendorStoreID = storeMaps[0].VendorStoreID } else { return "", fmt.Errorf("未查询到该门店对应的平台信息!门店:[%v]", order.StoreID) } if len(order.VendorOrderID) > 12 { suffix := utils.Str2Int(order.VendorOrderID[12:len(order.VendorOrderID)]) suffix++ - order.VendorOrderID = order.VendorOrderID2 + utils.Int2Str(suffix) + order.VendorOrderID = utils.Int64ToStr(utils.Str2Int64(order.VendorOrderID2)*100) + utils.Int2Str(suffix) } for _, sku := range skus { sku.VendorOrderID = order.VendorOrderID + sku.ID = 0 order.Skus = append(order.Skus, sku) } + if storeID != model.JdShopMainStoreID { + order.DeliveryFlag = model.NO + } order.Status = model.OrderStatusNew + setJdsOrderSeq(order) err = partner.CurOrderManager.OnOrderNew(order, model.Order2Status(order)) vendorOrderIDJds = order.VendorOrderID return vendorOrderIDJds, err @@ -1218,8 +1273,64 @@ func SendJdwlForJdsOrder(ctx *jxcontext.Context, vendorOrderID string) (err erro return err } } - handler := partner.DeliveryPlatformHandlers[model.VendorIDJDWL] - waybill2, err := handler.Handler.CreateWaybill(order, 0) - jdshop.CurPurchaseHandler.OrderExport(ctx, vendorOrderID, waybill2.VendorWaybillID, false) + var vendorWaybillID string + if order.StoreID == model.JdShopMainStoreID { + var ( + goodsNos []string + prices []string + quantities []string + ) + for _, v := range order.Skus { + skus, err := dao.GetSkus(db, []int{v.SkuID}, nil, nil, nil, nil) + if err != nil || len(skus) == 0 { + continue + } + goodsNos = append(goodsNos, skus[0].EclpID) + prices = append(prices, "0") + quantities = append(quantities, utils.Int2Str(v.Count)) + } + eclpSoNo, err := api.JdEclpAPI.AddOrder(&jdeclpapi.AddOrderParam{ + IsvUUID: order.VendorOrderID, + IsvSource: jdeclpapi.IsvSource, + ShopNo: jdeclpapi.ShopNo, + DepartmentNo: jdeclpapi.DepartmentNo, + WarehouseNo: jdeclpapi.WarehouseNo, + SalesPlatformOrderNo: order.VendorOrderID, + SalePlatformSource: jdeclpapi.SalePlatformSource, + ConsigneeName: order.ConsigneeName, + ConsigneeMobile: order.ConsigneeMobile, + ConsigneeAddress: order.ConsigneeAddress, + OrderMark: jdeclpapi.OrderMark, + GoodsNo: strings.Join(goodsNos, ","), + Price: strings.Join(prices, ","), + Quantity: strings.Join(quantities, ","), + }) + waybill := &model.Waybill{ + VendorOrderID: order.VendorOrderID, + OrderVendorID: model.VendorIDJX, + VendorWaybillID: eclpSoNo, + WaybillVendorID: model.VendorIDJDWL, + Status: model.WaybillStatusDelivering, + WaybillCreatedAt: time.Now(), + StatusTime: time.Now(), + WaybillFinishedAt: utils.DefaultTimeValue, + DeliveryFlag: model.OrderDeliveryFlagMaskScheduleDisabled, + } + dao.CreateEntity(db, waybill) + if err != nil { + return err + } + order.EclpOutID = eclpSoNo + dao.UpdateEntity(db, order, "EclpOutID") + vendorWaybillID = eclpSoNo + } else { + handler := partner.DeliveryPlatformHandlers[model.VendorIDJDWL] + waybill2, err := handler.Handler.CreateWaybill(order, 0) + if err != nil { + return err + } + vendorWaybillID = waybill2.VendorWaybillID + } + jdshop.CurPurchaseHandler.OrderExport(ctx, vendorOrderID, vendorWaybillID, false) return err } diff --git a/business/jxcallback/orderman/order_afs.go b/business/jxcallback/orderman/order_afs.go index dbb58cae3..6cc91da54 100644 --- a/business/jxcallback/orderman/order_afs.go +++ b/business/jxcallback/orderman/order_afs.go @@ -295,6 +295,7 @@ func (c *OrderManager) updateAfsOrderSkuOtherInfo(db *dao.DaoDB, order *model.Af globals.SugarLogger.Infof("updateAfsOrderSkuOtherInfo [运营%s]%s订单sku找不到门店价格(或商品映射),orderID:%s, StoreID:%d, VendorSkuID:%s, sku:%v", opNumStr, model.VendorChineseNames[order.VendorID], order.VendorOrderID, jxStoreID, v.VendorSkuID, v) } else { v.JxSkuID = skuBindInfo.SkuID + v.ShopPrice = int64(skuBindInfo.Price) } } if actStoreSkuMap != nil { diff --git a/business/jxcallback/scheduler/defsch/defsch.go b/business/jxcallback/scheduler/defsch/defsch.go index 94c9ad097..643de03df 100644 --- a/business/jxcallback/scheduler/defsch/defsch.go +++ b/business/jxcallback/scheduler/defsch/defsch.go @@ -6,6 +6,12 @@ import ( "sync" "time" + "github.com/astaxie/beego" + + "git.rosy.net.cn/jx-callback/business/jxstore/cms" + + "git.rosy.net.cn/jx-callback/business/authz" + "git.rosy.net.cn/jx-callback/business/authz/autils" "git.rosy.net.cn/jx-callback/business/jxutils/ddmsg" "git.rosy.net.cn/jx-callback/business/partner/purchase/jdshop" @@ -1384,9 +1390,11 @@ func (s *DefScheduler) notifyNewOrder(order *model.GoodsOrder) { } else { weixinmsg.NotifyNewOrder(order) } - smsmsg.NotifyNewOrder(order) OrderProfitWarning(order) - smsmsg.NotifyNewUserOrder(order) + if order.VendorID != model.VendorIDJDShop { + smsmsg.NotifyNewOrder(order) + smsmsg.NotifyNewUserOrder(order) + } }) } } @@ -1440,18 +1448,49 @@ func OrderProfitWarning(order *model.GoodsOrder) { storeDetail, err := dao.GetStoreDetail(db, storeID, order.VendorID) if storeDetail != nil && err == nil { payPercentage := storeDetail.PayPercentage - if payPercentage >= 50 { - profit = utils.Str2Float64(utils.Int64ToStr(order.TotalShopMoney-order.EarningPrice)) / 100 + if beego.BConfig.RunMode == "jxgy" { + if payPercentage >= 50 { + profit = utils.Str2Float64(utils.Int64ToStr(order.TotalShopMoney-order.EarningPrice)) / 100 + } else { + profit = utils.Str2Float64(utils.Int64ToStr(order.TotalShopMoney*int64(payPercentage)/200)) / 100 + } } else { - profit = utils.Str2Float64(utils.Int64ToStr(order.TotalShopMoney*int64(payPercentage)/200)) / 100 + if payPercentage >= 50 { + profit = utils.Str2Float64(utils.Int64ToStr(order.TotalShopMoney-order.ShopPrice)) / 100 + } else { + profit = utils.Str2Float64(utils.Int64ToStr(order.TotalShopMoney*int64(payPercentage)/200)) / 100 + } } if profit < 0 { operatorPhone, operatorName := getOrderOperatorInfo(order, storeDetail) + operatorRole := getOrderOperatorRoleInfo(order, storeDetail) if operatorPhone != "" { + var ( + roleList []*authz.RoleInfo + userIDs []string + flag = false + ) + roleList = append(roleList, autils.NewRole(operatorRole, 0)) + userIDMap, err := cms.GetRolesUserList(jxcontext.AdminCtx, roleList) noticeMsg := fmt.Sprintf("利润 :[%v],运营负责人:[%v],门店ID:[%v],平台门店ID[%v],门店名:[%v],订单序号:[%v],订单号(点击进入详情):%v", profit, operatorName, order.StoreID, order.VendorStoreID, order.StoreName, order.OrderSeq, globals.BackstageHost+"/#/ordermanager/"+order.VendorOrderID) user, err := dao.GetUserByID(db, "mobile", operatorPhone) if user != nil && err == nil { - ddmsg.SendUserMessage(dingdingapi.MsgTyeText, user.UserID, "警告!此订单利润低于0", noticeMsg) + for _, v := range userIDMap { + for _, vv := range v { + userIDs = append(userIDs, vv) + } + } + for _, v := range userIDs { + if v == user.UserID { + flag = true + } + } + if !flag { + userIDs = append(userIDs, user.UserID) + } + for _, v := range userIDs { + ddmsg.SendUserMessage(dingdingapi.MsgTyeText, v, "警告!此订单利润低于0", noticeMsg) + } } } } @@ -1500,3 +1539,15 @@ func getOrderOperatorInfo(order *model.GoodsOrder, storeDetail *dao.StoreDetail) } return operatorPhone, operatorName } + +func getOrderOperatorRoleInfo(order *model.GoodsOrder, storeDetail *dao.StoreDetail) (roleName string) { + switch order.VendorID { + case model.VendorIDJD: + roleName = storeDetail.OperatorRole + case model.VendorIDMTWM: + roleName = storeDetail.OperatorRole2 + case model.VendorIDEBAI: + roleName = storeDetail.OperatorRole3 + } + return roleName +} diff --git a/business/jxstore/cms/sku.go b/business/jxstore/cms/sku.go index deac305ac..9d9d6d5f2 100644 --- a/business/jxstore/cms/sku.go +++ b/business/jxstore/cms/sku.go @@ -588,6 +588,9 @@ func GetSkuNames(ctx *jxcontext.Context, keyword string, isBySku, isQueryMidPric t1.price, t1.img, t1.img2, + t1.img3, + t1.img_watermark, + t1.img_mix, t1.status, t1.is_spu, t1.desc_img, @@ -596,7 +599,8 @@ func GetSkuNames(ctx *jxcontext.Context, keyword string, isBySku, isQueryMidPric t1.ex_prefix_begin, t1.ex_prefix_end, t1.yb_name_suffix, - t1.jds_stock_switch + t1.jds_stock_switch, + t1.preparation_time ` if isQueryMidPrice { sql += `, @@ -624,6 +628,9 @@ func GetSkuNames(ctx *jxcontext.Context, keyword string, isBySku, isQueryMidPric t1.price, t1.img, t1.img2, + t1.img3, + t1.img_watermark, + t1.img_mix, t1.status, t1.is_spu, t1.desc_img, @@ -637,6 +644,7 @@ func GetSkuNames(ctx *jxcontext.Context, keyword string, isBySku, isQueryMidPric t1.ex_prefix_end, t1.yb_name_suffix, t1.jds_stock_switch, + t1.preparation_time, ` if isQueryMidPrice { sqlData += " t4.mid_unit_price," @@ -903,7 +911,7 @@ func UpdateSkuName(ctx *jxcontext.Context, nameID int, payload map[string]interf } } globals.SugarLogger.Debugf("UpdateSkuName valid:%s", utils.Format4Output(valid, false)) - for _, imgName := range []string{"img", "img2"} { + for _, imgName := range []string{"img", "img2", "img3"} { if valid[imgName] != nil { if imgStr := utils.Interface2String(valid[imgName]); imgStr != "" { _, err2 := datares.TryRegisterDataResource(ctx, skuName.Name, valid[imgName].(string), model.ImgTypeMain, true) @@ -1517,7 +1525,7 @@ func GetJdUpcCodeByName(ctx *jxcontext.Context, name, upcCode string) (productIn return productInfos, err } -func UpdateSkuNamesExPrefix(ctx *jxcontext.Context, nameIDs []int, exPrefix, fromTime, toTime string, isAsync, isContinueWhenError bool) (hint string, err error) { +func UpdateSkuNamesExPrefix(ctx *jxcontext.Context, nameIDs []int, imgWaterMark string, vendorID int, exPrefix, fromTime, toTime string, isAsync, isContinueWhenError bool) (hint string, err error) { var ( fromTimeP time.Time toTimeP time.Time @@ -1545,24 +1553,30 @@ func UpdateSkuNamesExPrefix(ctx *jxcontext.Context, nameIDs []int, exPrefix, fro "exPrefix": exPrefix, "exPrefixBegin": fromTimeP, "exPrefixEnd": toTimeP, + "imgWaterMark": imgWaterMark, + "exVendorID": vendorID, } - if now.Sub(toTimeP) <= 0 && now.Sub(fromTimeP) >= 0 { + if now.Sub(toTimeP) <= 0 && now.Sub(fromTimeP) <= 0 { _, err = UpdateSkuName(ctx, nameID, payload, false) } else if now.Sub(fromTimeP) > 0 && now.Sub(toTimeP) > 0 { payload["exPrefixBegin"] = nil payload["exPrefixEnd"] = nil + payload["imgWaterMark"] = nil + payload["exVendorID"] = nil _, err = UpdateSkuName(ctx, nameID, payload, false) } else { skuList, err := dao.GetSkus(db, nil, []int{nameID}, nil, nil, nil) if err == nil && len(skuList) > 0 { if skuList[0].ExPrefixBegin != nil { _, err = UpdateSkuName(ctx, nameID, payload, false) - CurVendorSync.SyncStoresSkus2(ctx, nil, 0, db, partner.GetSingleStoreVendorIDs(), nil, false, []int{skuList[0].ID}, nil, model.SyncFlagModifiedMask, true, true) + CurVendorSync.SyncStoresSkus2(ctx, nil, 0, db, []int{vendorID}, nil, false, []int{skuList[0].ID}, nil, model.SyncFlagModifiedMask, true, true) } else { skuName := &model.SkuName{ ExPrefix: exPrefix, ExPrefixBegin: &fromTimeP, ExPrefixEnd: &toTimeP, + ImgWatermark: imgWaterMark, + ExVendorID: vendorID, } skuName.ID = nameID skuName.LastOperator = ctx.GetLoginID() @@ -1574,7 +1588,7 @@ func UpdateSkuNamesExPrefix(ctx *jxcontext.Context, nameIDs []int, exPrefix, fro panic(r) } }() - _, err = dao.UpdateEntity(db, skuName, "ExPrefix", "ExPrefixBegin", "ExPrefixEnd", "LastOperator", "UpdatedAt") + _, err = dao.UpdateEntity(db, skuName, "ImgWatermark", "ExVendorID", "ExPrefix", "ExPrefixBegin", "ExPrefixEnd", "LastOperator", "UpdatedAt") dao.Commit(db) } } @@ -1592,7 +1606,7 @@ func UpdateSkuNamesExPrefix(ctx *jxcontext.Context, nameIDs []int, exPrefix, fro for _, v := range skuList { skuIDs = append(skuIDs, v.ID) } - CurVendorSync.SyncStoresSkus2(ctx, nil, 0, db, partner.GetSingleStoreVendorIDs(), nil, false, skuIDs, nil, model.SyncFlagModifiedMask, true, true) + CurVendorSync.SyncStoresSkus2(ctx, nil, 0, db, []int{vendorID}, nil, false, skuIDs, nil, model.SyncFlagModifiedMask, true, true) } } } @@ -2520,3 +2534,72 @@ func deleteJdsSku(db *dao.DaoDB, skuID int) (err error) { } return err } + +func UpdateSkuExinfoMap(ctx *jxcontext.Context, nameIDs []int, imgWaterMark string, vendorID int, exPrefix, fromTime, toTime string, isAsync, isContinueWhenError bool) (hint string, err error) { + var ( + fromTimeP time.Time + toTimeP time.Time + db = dao.GetDB() + ) + if fromTime != "" { + fromTimeP = utils.Time2Date(utils.Str2Time(fromTime)) + } + if toTime != "" { + toTimeP = utils.Time2Date(utils.Str2Time(toTime)) + } + if toTimeP.Before(fromTimeP) { + return "", fmt.Errorf("结束时间不可以小于开始时间!开始时间:[%v],结束时间:[%v]", fromTimeP, toTimeP) + } + task := tasksch.NewParallelTask("UpdateSkuExinfoMap", tasksch.NewParallelConfig().SetIsContinueWhenError(isContinueWhenError), ctx, + func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { + nameID := batchItemList[0].(int) + skuEx := &model.SkuExinfoMap{ + NameID: nameID, + ImgWatermark: imgWaterMark, + ExPrefix: exPrefix, + VendorID: vendorID, + BeginAt: fromTimeP, + EndAt: toTimeP, + } + dao.WrapAddIDCULDEntity(skuEx, ctx.GetUserName()) + skuExs, _ := dao.GetSkuExinfos(db, []int{nameID}, []int{vendorID}, "", utils.ZeroTimeValue, utils.ZeroTimeValue) + if len(skuExs) > 0 { + skuEx2 := skuExs[0] + skuEx2.DeletedAt = time.Now() + skuEx2.LastOperator = ctx.GetUserName() + dao.UpdateEntity(db, skuEx2, "DeletedAt", "LastOperator") + dao.CreateEntity(db, skuEx) + } else { + dao.CreateEntity(db, skuEx) + } + now := utils.Time2Date(time.Now()) + if now.Sub(fromTimeP) >= 0 && now.Sub(toTimeP) <= 0 { + var skuIDs []int + skuList, err2 := dao.GetSkus(db, nil, []int{nameID}, nil, nil, nil) + if err = err2; err == nil { + if len(skuList) > 0 { + for _, v := range skuList { + skuIDs = append(skuIDs, v.ID) + } + if partner.IsMultiStore(vendorID) { + for _, v := range skuIDs { + OnUpdateThing(ctx, db, nil, int64(v), model.ThingTypeSku) + } + CurVendorSync.SyncSkus(ctx, db, nil, skuIDs, isAsync, isContinueWhenError, ctx.GetUserName()) + } else { + CurVendorSync.SyncStoresSkus2(ctx, nil, 0, db, []int{vendorID}, nil, false, skuIDs, nil, model.SyncFlagModifiedMask, isAsync, isContinueWhenError) + } + } + } + } + return retVal, err + }, nameIDs) + tasksch.HandleTask(task, nil, true).Run() + if isAsync { + hint = task.GetID() + } else { + _, err = task.GetResult(0) + hint = "1" + } + return hint, err +} diff --git a/business/jxstore/cms/store.go b/business/jxstore/cms/store.go index 714fe5943..4f8f76c24 100644 --- a/business/jxstore/cms/store.go +++ b/business/jxstore/cms/store.go @@ -370,6 +370,17 @@ func getStoresSql(ctx *jxcontext.Context, keyword string, params map[string]inte } } + if params["storeLevels"] != nil { + var storeLevels []string + if err = jxutils.Strings2Objs(utils.Interface2String(params["storeLevels"]), &storeLevels); err != nil { + return "", nil, "", nil, err + } + if len(storeLevels) > 0 { + sqlWhere += " AND t1.store_level IN (" + dao.GenQuestionMarks(len(storeLevels)) + ")" + sqlWhereParams = append(sqlWhereParams, storeLevels) + } + } + sql = sqlFrom + sqlWhere sqlParams = append(sqlParams, sqlFromParams...) sqlParams = append(sqlParams, sqlWhereParams...) diff --git a/business/jxstore/cms/store_sku.go b/business/jxstore/cms/store_sku.go index 80c7637ed..c2d2c3ffe 100644 --- a/business/jxstore/cms/store_sku.go +++ b/business/jxstore/cms/store_sku.go @@ -13,6 +13,8 @@ import ( "time" "unicode" + "github.com/astaxie/beego" + "git.rosy.net.cn/baseapi/platformapi/jdshopapi" "git.rosy.net.cn/jx-callback/globals/api" @@ -843,8 +845,7 @@ func UpdateStoreSkus(ctx *jxcontext.Context, causeFlag, storeID int, skuBindInfo func UpdateStoresSkus(ctx *jxcontext.Context, causeFlag int, storeIDs []int, skuBindInfos []*StoreSkuBindInfo, isScale, isRefreshHigh, isAsync, isContinueWhenError bool) (hint string, err error) { globals.SugarLogger.Debugf("UpdateStoresSkus:%s, storeIDs:%v, skuBindInfos:%s", ctx.GetTrackInfo(), storeIDs, utils.Format4Output(skuBindInfos, true)) - flag, err := doStoreSkuAudit(ctx, storeIDs, skuBindInfos) - if !flag { + if beego.BConfig.RunMode == "jxgy" { var num int64 db := dao.GetDB() skuIDs, err := updateStoresSkusWithoutSync(ctx, db, storeIDs, skuBindInfos, isScale, isRefreshHigh) @@ -859,6 +860,24 @@ func UpdateStoresSkus(ctx *jxcontext.Context, causeFlag int, storeIDs []int, sku if num == 0 || !isAsync || hint == "" { hint = utils.Int64ToStr(num) } + } else { + flag, _ := doStoreSkuAudit(ctx, storeIDs, skuBindInfos) + if !flag { + var num int64 + db := dao.GetDB() + skuIDs, err := updateStoresSkusWithoutSync(ctx, db, storeIDs, skuBindInfos, isScale, isRefreshHigh) + if err != nil { + return "", err + } + isAsync = asyncStoreSkuOpFilter(ctx, isAsync) + num = int64(len(skuIDs)) + if num > 0 { + hint, err = CurVendorSync.SyncStoresSkus(ctx, nil, causeFlag, db, nil, storeIDs, skuIDs, false, isAsync, isContinueWhenError) + } + if num == 0 || !isAsync || hint == "" { + hint = utils.Int64ToStr(num) + } + } } return hint, err } @@ -1107,7 +1126,7 @@ func updateStoresSkusWithoutSync(ctx *jxcontext.Context, db *dao.DaoDB, storeIDs skuBind.Status = tmpStatus } if globals.IsAddEvent { - err = AddEventDetail(db, ctx, model.OperateAdd, v.RealSkuID, model.ThingTypeSku, storeID, "", "") + err = AddEventDetail(db, ctx, model.OperateAdd, v.RealSkuID, model.ThingTypeSku, storeID, "", utils.Int2Str(skuBind.UnitPrice)) } setStoreSkuBindStatus(skuBind, model.SyncFlagNewMask) dao.WrapAddIDCULDEntity(skuBind, userName) @@ -2351,7 +2370,7 @@ func ReCalculateJxPrice(db *dao.DaoDB, ctx *jxcontext.Context, storeIDs []int) ( if storeSkuList, err := dao.GetStoresSkusInfo(db, []int{storeID}, nil); err == nil { for _, skuBind := range storeSkuList { skuBind.JxPrice = jxutils.CaculatePriceByPricePack(storeDetail.PricePercentagePackObj, int(storeDetail.PricePercentage), skuBind.Price) - dao.UpdateEntity(db, skuBind) + dao.UpdateEntity(db, skuBind, "JxPrice") } } else { return nil, err @@ -4504,6 +4523,14 @@ func doStoreSkuAudit(ctx *jxcontext.Context, storeIDs []int, skuBindInfos []*Sto time.Sleep(time.Second / 5) db := dao.GetDB() for _, storeID := range storeIDs { + stores, _ := dao.GetStoreList(db, []int{storeID}, nil, nil, nil, "") + //扣点的门店改价不进审核 + if len(stores) > 0 { + if stores[0].PayPercentage <= 50 || stores[0].StoreLevel == "E" { + globals.SugarLogger.Debugf("doStoreSkuAudit return0 storeID : %v", storeID) + return false, err + } + } 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) @@ -4584,7 +4611,7 @@ func StoreSkuPriceAudit(ctx *jxcontext.Context, storeSkuAudits []*model.StoreSku if status == model.StoreAuditStatusOnline { return "", fmt.Errorf("审核标志不正确!") } - task := tasksch.NewParallelTask("StoreSkuPriceAudit", tasksch.NewParallelConfig().SetParallelCount(1).SetIsContinueWhenError(isContinueWhenError), ctx, + task := tasksch.NewParallelTask("StoreSkuPriceAudit", tasksch.NewParallelConfig().SetParallelCount(5).SetIsContinueWhenError(isContinueWhenError), ctx, func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { storeAudit := batchItemList[0].(*model.StoreSkuAudit) storeAudits, err := dao.GetStoreSkuAuditLight(db, []int{storeAudit.StoreID}, []int{storeAudit.NameID}, model.StoreAuditStatusOnline) @@ -4594,10 +4621,10 @@ func StoreSkuPriceAudit(ctx *jxcontext.Context, storeSkuAudits []*model.StoreSku if len(storeAudits) > 1 { return retVal, fmt.Errorf("查询到该门店该商品的待审核信息大于1条!storeID: %v, nameID: %v", storeAudit.StoreID, storeAudit.NameID) } - flag := false + // flag := false //审核通过 if status == model.StoreAuditStatusCreated { - flag = true + // flag = true storeAudits[0].UserID = ctx.GetUserID() storeAudits[0].Status = model.StoreAuditStatusCreated storeAudits[0].Remark = storeAudit.Remark @@ -4640,19 +4667,20 @@ func StoreSkuPriceAudit(ctx *jxcontext.Context, storeSkuAudits []*model.StoreSku } else { return retVal, fmt.Errorf("审核标志不正确!") } + //TODO 暂时先不推消息了 if err == nil { - if globals.IsProductEnv() { - skuAndNames, err := dao.GetSkus(db, nil, []int{storeAudit.NameID}, nil, nil, nil) - if len(skuAndNames) > 0 && err == nil { - price := 0 - if storeAudit.AuditPrice != 0 { - price = storeAudit.AuditPrice - } else { - price = storeAudits[0].UnitPrice - } - weixinmsg.NotifyStoreOpRequestStatus(flag, storeAudit.StoreID, storeAudit.NameID, jxutils.ComposeSpuName(skuAndNames[0].Prefix, skuAndNames[0].Name, 0), storeAudits[0].OriginUnitPrice, price, storeAudit.Remark) - } - } + // if globals.IsProductEnv() { + // skuAndNames, err := dao.GetSkus(db, nil, []int{storeAudit.NameID}, nil, nil, nil) + // if len(skuAndNames) > 0 && err == nil { + // price := 0 + // if storeAudit.AuditPrice != 0 { + // price = storeAudit.AuditPrice + // } else { + // price = storeAudits[0].UnitPrice + // } + // weixinmsg.NotifyStoreOpRequestStatus(flag, storeAudit.StoreID, storeAudit.NameID, jxutils.ComposeSpuName(skuAndNames[0].Prefix, skuAndNames[0].Name, 0), storeAudits[0].OriginUnitPrice, price, storeAudit.Remark) + // } + // } } return retVal, err }, storeSkuAudits) diff --git a/business/jxstore/cms/sync.go b/business/jxstore/cms/sync.go index e85044885..54fa95b53 100644 --- a/business/jxstore/cms/sync.go +++ b/business/jxstore/cms/sync.go @@ -7,6 +7,7 @@ import ( "time" "git.rosy.net.cn/jx-callback/business/partner/putils" + "git.rosy.net.cn/jx-callback/globals/api" "git.rosy.net.cn/baseapi" "git.rosy.net.cn/baseapi/platformapi/dingdingapi" @@ -677,6 +678,7 @@ func (v *VendorSync) LoopStoresMap2(ctx *jxcontext.Context, parentTask tasksch.I resultList, err2 := task.GetResult(0) if len(task.GetFailedList()) > 0 { err2 = buildErrMsg(task) + err = err2 } if err = err2; err == nil { if len(resultList) == 0 { @@ -1088,58 +1090,96 @@ func (v *VendorSync) SyncJdsStoresSkus(ctx *jxcontext.Context, storeIDs []int, i var ( db = dao.GetDB() ) + storeSkus, _ := dao.GetStoresSkusInfo(db, []int{model.JdShopMainStoreID}, nil) _, hint, err = v.LoopStoresMap2(ctx, nil, db, fmt.Sprintf("同步京东商城库存商品信息:%v", storeIDs), isAsync, true, []int{model.VendorIDJDShop}, storeIDs, false, func(t *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (interface{}, error) { loopMapInfo := batchItemList[0].(*LoopStoreMapInfo) if handler := v.GetStoreHandler(loopMapInfo.VendorID); handler != nil { - parallelCount := 5 - if model.MultiStoresVendorMap[loopMapInfo.VendorID] == 1 { - parallelCount = 2 + for _, storeMap := range loopMapInfo.StoreMapList { + if storeMap.Status > model.StoreStatusDisabled && storeMap.StoreID != model.JdShopMainStoreID && storeMap.SyncRule != 0 { + err = syncJdsStoresSkus(ctx, db, nil, storeMap, isAsync, isContinueWhenError) + } + err = syncJdsStoreStock(ctx, db, storeSkus, storeMap) } - loopStoreTask := tasksch.NewParallelTask(fmt.Sprintf("处理平台%s", model.VendorChineseNames[loopMapInfo.VendorID]), - tasksch.NewParallelConfig().SetParallelCount(parallelCount).SetIsContinueWhenError(isContinueWhenError), ctx, - func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { - storeMap := batchItemList[0].(*model.StoreMap) - if storeMap.Status > model.StoreStatusDisabled && storeMap.StoreID != model.JdShopMainStoreID && storeMap.SyncRule != 0 { - err = syncJdsStoresSkus(ctx, db, task, storeMap, isAsync, isContinueWhenError) - } - return nil, err - }, loopMapInfo.StoreMapList) - t.AddChild(loopStoreTask).Run() - _, err = loopStoreTask.GetResult(0) } return nil, partner.AddVendorInfo2Err(err, loopMapInfo.VendorID) }, isContinueWhenError) return hint, err } +func syncJdsStoreStock(ctx *jxcontext.Context, db *dao.DaoDB, storeSkus []*model.StoreSkuBind, storeMap *model.StoreMap) (err error) { + for _, storeSku := range storeSkus { + stock := 0 + if storeSku.Status == model.StoreSkuBindStatusNormal { + stock = 9999 + } + storeSku2, _ := dao.GetStoresSkusInfo(db, []int{storeMap.StoreID}, []int{storeSku.SkuID}) + if storeSku.JdsID != 0 && len(storeSku2) > 0 { + if storeSku.Status != storeSku2[0].Status { + err = api.JdShopAPI.UpdateSkuSiteStock(storeSku.JdsID, stock, utils.Str2Int(storeMap.VendorStoreID)) + } + } + } + // task := tasksch.NewParallelTask("syncJdsStoreStock", tasksch.NewParallelConfig().SetIsContinueWhenError(true), ctx, + // func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { + // storeSku := batchItemList[0].(*model.StoreSkuBind) + + // return retVal, err + // }, storeSkus) + // tasksch.HandleTask(task, nil, true).Run() + // _, err = task.GetResult(0) + return err +} + func syncJdsStoresSkus(ctx *jxcontext.Context, db *dao.DaoDB, parentTask tasksch.ITask, storeMap *model.StoreMap, isAsync, isContinueWhenError bool) (err error) { var ( - mainSkusMap = make(map[int]*model.StoreSkuBind) - skusMap = make(map[int]*model.StoreSkuBind) - updateList []*model.StoreSkuBind - addList []*model.StoreSkuBind + mainSkusMap = make(map[int][]*dao.StoreSkuSyncInfo) + skusMap = make(map[int][]*dao.StoreSkuSyncInfo) + updateList []*dao.StoreSkuSyncInfo + addList []*dao.StoreSkuSyncInfo skuBindInfos1 []*StoreSkuBindInfo skuBindInfos2 []*StoreSkuBindInfo ) - storeSkusMain, err := dao.GetStoresSkusInfo(db, []int{model.JdShopMainStoreID}, nil) + storeSkusMain, err := dao.GetStoreSkusByNameIDs(db, []int{model.JdShopMainStoreID}, 0) for _, v := range storeSkusMain { - mainSkusMap[v.SkuID] = v + mainSkusMap[v.NameID] = append(mainSkusMap[v.NameID], v) } - storeSkus, err := dao.GetStoresSkusInfo(db, []int{storeMap.StoreID}, nil) + storeSkus, err := dao.GetStoreSkusByNameIDs(db, []int{storeMap.StoreID}, 0) for _, v := range storeSkus { - skusMap[v.SkuID] = v - if mainSkusMap[v.SkuID] != nil && mainSkusMap[v.SkuID].Status != v.Status { - updateList = append(updateList, mainSkusMap[v.SkuID]) + skusMap[v.NameID] = append(skusMap[v.NameID], v) + } + for k, v := range skusMap { + if mainSkusMap[k] != nil { + flag := false + for _, storeSku := range v { + if storeSku.StoreSkuStatus == model.StoreSkuBindStatusNormal { + flag = true + } + } + if !flag { + continue + } + for _, storeSku := range v { + for _, storeSkuMain := range mainSkusMap[k] { + if storeSkuMain.StoreSkuStatus == model.StoreSkuBindStatusNormal && storeSku.StoreSkuStatus == model.StoreSkuBindStatusDontSale && + storeSkuMain.SkuID == storeSku.SkuID { + updateList = append(updateList, storeSkuMain) + } + } + } } } for k, v := range mainSkusMap { if skusMap[k] == nil { if storeMap.SyncRule == 2 { - addList = append(addList, v) + for _, storeSkuMain := range v { + addList = append(addList, storeSkuMain) + } } } } + // fmt.Println("updateList", utils.Format4Output(updateList, false)) + // fmt.Println("addList", utils.Format4Output(addList, false)) if len(updateList) > 0 { for _, v := range updateList { skuBindInfos1 = append(skuBindInfos1, buildStoreSkuBindInfo(db, storeMap.StoreID, v, false)) @@ -1149,18 +1189,14 @@ func syncJdsStoresSkus(ctx *jxcontext.Context, db *dao.DaoDB, parentTask tasksch if len(addList) > 0 { for _, v := range addList { - skuBindInfos2 = append(skuBindInfos2, buildStoreSkuBindInfo(db, storeMap.StoreID, v, false)) + skuBindInfos2 = append(skuBindInfos2, buildStoreSkuBindInfo(db, storeMap.StoreID, v, true)) } _, err = UpdateStoresSkusByBind(ctx, parentTask, skuBindInfos2, isAsync, isContinueWhenError, false) } return err } -func buildStoreSkuBindInfo(db *dao.DaoDB, storeID int, storeBind *model.StoreSkuBind, isFocus bool) (skuBindInfo *StoreSkuBindInfo) { - result, err := dao.GetSkus(db, []int{storeBind.SkuID}, nil, nil, nil, nil) - if err != nil || len(result) == 0 { - return nil - } +func buildStoreSkuBindInfo(db *dao.DaoDB, storeID int, storeBind *dao.StoreSkuSyncInfo, isFocus bool) (skuBindInfo *StoreSkuBindInfo) { skus := []*StoreSkuBindSkuInfo{ &StoreSkuBindSkuInfo{ SkuID: storeBind.SkuID, @@ -1168,12 +1204,12 @@ func buildStoreSkuBindInfo(db *dao.DaoDB, storeID int, storeBind *model.StoreSku } skuBindInfo = &StoreSkuBindInfo{ StoreID: storeID, - NameID: result[0].NameID, + NameID: storeBind.NameID, } if isFocus { skuBindInfo.IsFocus = 1 } - if storeBind.Status == model.SkuStatusNormal { + if storeBind.StoreSkuStatus == model.SkuStatusNormal { skus[0].IsSale = 1 } else { skus[0].IsSale = -1 @@ -1181,3 +1217,31 @@ func buildStoreSkuBindInfo(db *dao.DaoDB, storeID int, storeBind *model.StoreSku skuBindInfo.Skus = skus return skuBindInfo } + +func SyncSkuExperfixAndWatermark(ctx *jxcontext.Context) (err error) { + var ( + db = dao.GetDB() + ) + skuExinfos, err := dao.GetSkuExinfos(db, nil, []int{model.VendorIDMTWM, model.VendorIDEBAI, model.VendorIDJD}, "", utils.ZeroTimeValue, utils.ZeroTimeValue) + task := tasksch.NewParallelTask("SyncSkuExperfixAndWatermark", tasksch.NewParallelConfig().SetIsContinueWhenError(true), ctx, + func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { + skuExinfo := batchItemList[0].(*model.SkuExinfoMap) + skus, err := dao.GetSkus(db, nil, []int{skuExinfo.NameID}, nil, nil, nil) + var skuIDs []int + for _, v := range skus { + skuIDs = append(skuIDs, v.ID) + } + if partner.IsMultiStore(skuExinfo.VendorID) { + for _, v := range skuIDs { + OnUpdateThing(ctx, db, nil, int64(v), model.ThingTypeSku) + } + CurVendorSync.SyncSkus(ctx, db, nil, skuIDs, true, true, ctx.GetUserName()) + } else { + CurVendorSync.SyncStoresSkus2(ctx, nil, 0, db, []int{skuExinfo.VendorID}, nil, false, skuIDs, nil, model.SyncFlagModifiedMask, true, true) + } + return retVal, err + }, skuExinfos) + tasksch.HandleTask(task, nil, true).Run() + _, err = task.GetResult(0) + return err +} diff --git a/business/jxstore/cms/sync2.go b/business/jxstore/cms/sync2.go index 6316c4ce0..54546dcf3 100644 --- a/business/jxstore/cms/sync2.go +++ b/business/jxstore/cms/sync2.go @@ -147,7 +147,12 @@ func SyncSkus(ctx *jxcontext.Context, parentTask tasksch.ITask, vendorIDs []int, if skuVendorInfo.ExdSkuID != "" { return nil, err } - skuVendorInfo.SkuName = jxutils.ComposeSkuName(skuVendorInfo.Prefix, skuVendorInfo.Name, skuVendorInfo.Comment, skuVendorInfo.Unit, skuVendorInfo.SpecQuality, skuVendorInfo.SpecUnit, 0, skuVendorInfo.ExPrefix, skuVendorInfo.ExPrefixBegin, skuVendorInfo.ExPrefixEnd) + skuVendorInfo.SkuName = jxutils.ComposeSkuNameSync(skuVendorInfo.Prefix, skuVendorInfo.Name, skuVendorInfo.Comment, skuVendorInfo.Unit, skuVendorInfo.SpecQuality, skuVendorInfo.SpecUnit, 0, skuVendorInfo.ExPrefix, skuVendorInfo.ExPrefixBegin, skuVendorInfo.ExPrefixEnd) + skuVendorInfo.SkuNameOrigin = jxutils.ComposeSkuNameOriginal(skuVendorInfo.Prefix, skuVendorInfo.Name, skuVendorInfo.Comment, skuVendorInfo.Unit, skuVendorInfo.SpecQuality, skuVendorInfo.SpecUnit, 0) + if skuVendorInfo.ImgWatermark != "" { + downLoad, _ := uploadImgStandard(skuVendorInfo.ImgWatermark) + skuVendorInfo.ImgMix = jxutils.MixWatermarkImg(downLoad, skuVendorInfo.Img, skuVendorInfo.ExPrefixBegin, skuVendorInfo.ExPrefixEnd) + } skuVendorInfo.MergedStatus = jxutils.MergeSkuStatus(skuVendorInfo.Status, skuVendorInfo.NameStatus) if multiStoresHandler, ok := partner.GetPurchasePlatformFromVendorID(skuVendorInfo.VendorID).(partner.IMultipleStoresHandler); ok { if model.IsSyncStatusDelete(skuVendorInfo.SkuSyncStatus) { //删除 diff --git a/business/jxstore/cms/sync_store_sku.go b/business/jxstore/cms/sync_store_sku.go index d5f5786a9..e54cb3d2c 100644 --- a/business/jxstore/cms/sync_store_sku.go +++ b/business/jxstore/cms/sync_store_sku.go @@ -280,6 +280,12 @@ func formalizeStoreSkuList(inSkuList []*dao.StoreSkuSyncInfo) []*dao.StoreSkuSyn } skuItem.MergedStatus = jxutils.MergeSkuStatus(jxutils.MergeSkuStatus(skuItem.NameStatus, skuItem.Status), skuItem.StoreSkuStatus) skuItem.SkuName = jxutils.ComposeSkuNameSync(skuItem.Prefix, skuItem.Name, skuItem.Comment, skuItem.Unit, skuItem.SpecQuality, skuItem.SpecUnit, 0, skuItem.ExPrefix, skuItem.ExPrefixBegin, skuItem.ExPrefixEnd) + skuItem.SkuNameOrigin = jxutils.ComposeSkuNameOriginal(skuItem.Prefix, skuItem.Name, skuItem.Comment, skuItem.Unit, skuItem.SpecQuality, skuItem.SpecUnit, 0) + if skuItem.ImgWatermark != "" { + downLoad, _ := uploadImgStandard(skuItem.ImgWatermark) + fmt.Println("testdo", downLoad) + skuItem.ImgMix = jxutils.MixWatermarkImg(downLoad, skuItem.ImgOrigin, skuItem.ExPrefixBegin, skuItem.ExPrefixEnd) + } } } return inSkuList diff --git a/business/jxstore/event/event.go b/business/jxstore/event/event.go index 7dc392dde..fa2557df5 100644 --- a/business/jxstore/event/event.go +++ b/business/jxstore/event/event.go @@ -11,10 +11,8 @@ import ( "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/business/partner/purchase/jd" "git.rosy.net.cn/jx-callback/globals" "git.rosy.net.cn/jx-callback/globals/api" - "git.rosy.net.cn/jx-callback/globals/api/apimanager" ) var ( @@ -149,78 +147,52 @@ func GetCheckVendorCookie(ctx *jxcontext.Context, vendorIDs []int, isAuto bool) errMsg = "" ) for _, v := range vendorIDs { - appOrgCodeList := apimanager.CurAPIManager.GetAppOrgCodeList(v) - if len(appOrgCodeList) > 0 { - for _, vv := range appOrgCodeList { - cc := &CheckCookie{} - var flag = false - switch v { - case model.VendorIDEBAI: - resultMap, err := api.EbaiAPI.GetStoreOrderInfo(ebaiOrderID) - if len(resultMap) < 1 && err != nil { - if strings.Contains(err.Error(), ebaiErr) || strings.Contains(err.Error(), ebaiErr2) { - errMsg += fmt.Sprintf(" 饿百账号:[%v]的Cookie无效了!", vv) - flag = true - } - } - // result, err := api.Ebai2API.GetEbaiDepotSku(ebaiapi.EbaiWholeCountryStore, "190700570") - // if err != nil || len(result) < 1 { - // cc := &CheckCookie{} - // cc.VendorID = v - // cc.VendorOrgCode = "饿百后台饿鲜达全国账号" - // cc.Status = "无效" - // ccList = append(ccList, cc) - // errMsg += fmt.Sprintf(" 饿百账号:[饿百后台饿鲜达全国账号]的Cookie无效了!", vv) - // flag = true - // } - // result2, err2 := api.EbaiAPI.GetExianDaSkuDepot("190600741") - // if err2 != nil || result2 == nil { - // cc := &CheckCookie{} - // cc.VendorID = v - // cc.VendorOrgCode = "饿鲜达供应链系统" - // cc.Status = "无效" - // ccList = append(ccList, cc) - // errMsg += fmt.Sprintf(" 饿百账号:[饿鲜达供应链系统]的Cookie无效了!", vv) - // flag = true - // } - case model.VendorIDMTWM: - _, err := api.MtwmAPI.PackagePriceGet(mtStoreID) - if err != nil { - if strings.Contains(err.Error(), mtErr) { - errMsg += fmt.Sprintf(" 美团账号:[%v]的Cookie无效了!", vv) - flag = true - } - globals.SugarLogger.Debugf("cookieCheck", err) - } - case model.VendorIDJD: - result, err := jd.GetAPI(vv).GetJdUpcCodeByName("", jdUpcCode, 1, 5) - if len(result) < 1 && err != nil { - if strings.Contains(err.Error(), jdErr) { - errMsg += fmt.Sprintf(" 京东账号:[%v]的Cookie无效了!", vv) - flag = true - } - } - result2, err2 := api.JdPageAPI.GetCorporationInfo("11926674", "92510108MA68KK3M8P") - if err2 != nil || result2 == nil { - cc := &CheckCookie{} - cc.VendorID = v - cc.VendorOrgCode = "京东page账号" - cc.Status = "无效" - ccList = append(ccList, cc) - errMsg += fmt.Sprintf(" 京东page账号:的Cookie无效了!", vv) - flag = true - } + cc := &CheckCookie{} + var flag = false + switch v { + case model.VendorIDEBAI: + resultMap, err := api.EbaiAPI.GetStoreOrderInfo(ebaiOrderID) + if len(resultMap) < 1 && err != nil { + if strings.Contains(err.Error(), ebaiErr) || strings.Contains(err.Error(), ebaiErr2) { + errMsg += fmt.Sprintf(" 饿百账号:[%v]的Cookie无效了!") + flag = true } - cc.VendorID = v - cc.VendorOrgCode = vv - if flag { - cc.Status = "无效" - } else { - cc.Status = "有效" + } + case model.VendorIDMTWM: + _, err := api.MtwmAPI.PackagePriceGet(mtStoreID) + if err != nil { + if strings.Contains(err.Error(), mtErr) { + errMsg += fmt.Sprintf(" 美团账号:[%v]的Cookie无效了!") + flag = true } - ccList = append(ccList, cc) + globals.SugarLogger.Debugf("cookieCheck", err) + } + case model.VendorIDJD: + result, err := api.JdAPI.GetJdUpcCodeByName("", jdUpcCode, 1, 5) + if len(result) < 1 && err != nil { + if strings.Contains(err.Error(), jdErr) { + errMsg += fmt.Sprintf(" 京东账号:[%v]的Cookie无效了!") + flag = true + } + } + case model.VendorIDJDShop: + _, err := api.JdShopAPI.OrderDetail("124350112427") + if err != nil { + if strings.Contains(err.Error(), "登录") { + errMsg += fmt.Sprintf("京东商城:[%v]的Cookie无效了!") + flag = true + } + globals.SugarLogger.Debugf("cookieCheck", err) } } + cc.VendorID = v + cc.VendorOrgCode = "" + if flag { + cc.Status = "无效" + } else { + cc.Status = "有效" + } + ccList = append(ccList, cc) } if isAuto && errMsg != "" { globals.SugarLogger.Warnf("GetCheckVendorCookie:[%v]", errMsg) diff --git a/business/jxstore/misc/misc.go b/business/jxstore/misc/misc.go index 88538c5e4..dd402e730 100644 --- a/business/jxstore/misc/misc.go +++ b/business/jxstore/misc/misc.go @@ -164,7 +164,7 @@ func Init() { ScheduleTimerFunc("doDailyWork2", doDailyWork2, dailyWorkTimeList2) ScheduleTimerFuncByInterval(func() { - orderman.SaveJdsOrders(jxcontext.AdminCtx, time.Now().Add(-15*time.Minute), time.Now()) + orderman.SaveJdsOrders(jxcontext.AdminCtx, time.Now().Add(-20*time.Minute), time.Now()) }, 10*time.Second, 10*time.Minute) ScheduleTimerFuncByInterval(func() { @@ -205,7 +205,7 @@ func Init() { cms.AutoFocusStoreSkusForTopSkus(jxcontext.AdminCtx, true, true) }, createStorePriceTimeList) ScheduleTimerFunc("GetCheckVendorCookie", func() { - event.GetCheckVendorCookie(jxcontext.AdminCtx, []int{model.VendorIDEBAI, model.VendorIDJD, model.VendorIDMTWM, model.VendorIDMTPS}, true) + event.GetCheckVendorCookie(jxcontext.AdminCtx, []int{model.VendorIDEBAI, model.VendorIDJD, model.VendorIDMTWM, model.VendorIDMTPS, model.VendorIDJDShop}, true) }, checkCookieList) ScheduleTimerFunc("SendSeckillSkusCountMsg", func() { cms.SendSeckillSkusCountMsg(jxcontext.AdminCtx, []int{model.VendorIDEBAI, model.VendorIDJD, model.VendorIDMTWM}, false, true) @@ -419,6 +419,8 @@ func doDailyWork() { orderman.RefreshJdShopOrdersEarningPrice(jxcontext.AdminCtx, time.Now().AddDate(0, 0, -3).Format("20060102"), time.Now().Format("20060102")) //同步上架京东商城待售商品 cms.RefreshJdsSkusStatus(jxcontext.AdminCtx) + //同步商品额外前缀和水印图 + cms.SyncSkuExperfixAndWatermark(jxcontext.AdminCtx) } func RefreshRealMobile(ctx *jxcontext.Context, vendorID int, fromTime, toTime time.Time, isAsync, isContinueWhenError bool) (hint string, err error) { diff --git a/business/jxstore/tempop/tempop.go b/business/jxstore/tempop/tempop.go index 59bd8017c..3f33d72d7 100644 --- a/business/jxstore/tempop/tempop.go +++ b/business/jxstore/tempop/tempop.go @@ -1611,10 +1611,295 @@ func UploadJdsImage(ctx *jxcontext.Context) (err error) { // continue // } // } - _, err = api.JdShopAPI.AllOrders(&jdshopapi.AllOrdersParam{ - Current: 1, - PageSize: 10, - }) + var jdsIds = []int64{69355523686, + 69353698875, + 69353633443, + 69353579080, + 69353592976, + 69353575450, + 69353669915, + 69353617240, + 69353711276, + 69355552630, + 69353579078, + 69633169613, + 69353608855, + 69634881612, + 69353634806, + 69353675911, + 69353698186, + 69353698877, + 69607962771, + 69608002604, + 69666543870, + 69353541693, + 69411607058, + 69353594629, + 69353602818, + 69353698187, + 69355538267, + 69353633269, + 69355549016, + 69411607059, + 69593365617, + 69353589341, + 69353618034, + 69353633445, + 69353644658, + 69353644659, + 69353664332, + 69355505481, + 69355531215, + 69355552632, + 69353618035, + 69353619589, + 69353684423, + 69353687174, + 69353722053, + 69355493882, + 69627859883, + 69680935348, + 69353555847, + 69353570677, + 69353589397, + 69353592975, + 69353594611, + 69353602819, + 69353616402, + 69353624528, + 69353654004, + 69353668114, + 69353687173, + 69353701089, + 69353722052, + 69353723922, + 69355527850, + 69355552631, + 69628257042, + 69636525703, + 69680935349, + 69353579081, + 69353589342, + 69353632136, + 69353654006, + 69353726354, + 69355496067, + 69355515747, + 69355516049, + 69355527036, + 69355532703, + 69355558164, + 69355560640, + 69608002434, + 69608089252, + 69626869676, + 69628142211, + 69651275202, + 69665458721, + 69980157422, + 69353511255, + 69353550931, + 69353555846, + 69353579079, + 69353593375, + 69353595563, + 69353603501, + 69353608856, + 69353618036, + 69353628469, + 69353628470, + 69353632137, + 69353633267, + 69353633444, + 69353651935, + 69353668115, + 69353683331, + 69353684157, + 69353701088, + 69353723844, + 69353723845, + 69353726353, + 69355490631, + 69355493881, + 69355493884, + 69355520278, + 69355523687, + 69355532705, + 69355533814, + 69355536851, + 69355538268, + 69355538269, + 69593321185, + 69593321186, + 69607997022, + 69626638026, + 69626638027, + 69626872037, + 69627693305, + 69627954144, + 69628180933, + 69633580083, + 69633580085, + 69634881613, + 69635037810, + 69635204944, + 69636212985, + 69636446354, + 69659137913, + 69659219611, + 69665406179, + 69666460731, + 69673523007, + 69680905913, + 69681869918, + 69821176674, + 69913341309, + 69916445013, + 69353511254, + 69353570678, + 69353581400, + 69353589343, + 69353589398, + 69353593376, + 69353594630, + 69353609816, + 69353616406, + 69353617241, + 69353619591, + 69353633268, + 69353634833, + 69353642793, + 69353647695, + 69353651934, + 69353654005, + 69353664333, + 69353669914, + 69353673334, + 69353684159, + 69353684603, + 69353684604, + 69353684605, + 69353684607, + 69353698876, + 69353701090, + 69353711277, + 69353711278, + 69353726357, + 69355496066, + 69355520277, + 69355523688, + 69355527851, + 69355533813, + 69355533815, + 69355538270, + 69355559874, + 69355559875, + 69355559876, + 69355560641, + 69607988687, + 69608089253, + 69625036409, + 69625436705, + 69626674146, + 69626756838, + 69626849783, + 69626872040, + 69627211928, + 69627823696, + 69627823697, + 69627824429, + 69627859882, + 69627954146, + 69628055157, + 69628209840, + 69628220046, + 69628244518, + 69628620179, + 69628645373, + 69633038980, + 69633169614, + 69633311068, + 69633433209, + 69634285577, + 69634285578, + 69634566319, + 69634566320, + 69634620948, + 69635037811, + 69635075404, + 69635108188, + 69636525704, + 69636563250, + 69636658901, + 69636658902, + 69651265114, + 69659219612, + 69659883978, + 69662122661, + 69666543871, + 69666543872, + 69666660395, + 69666907986, + 69666931214, + 69673508504, + 69680887348, + 69818078270, + 69881553035, + 69901783885, + 69913362221, + 69916396643, + 69925717199, + 69933144351, + 69933974117, + 69935756246, + 69935768981, + 69935855227, + 69935915640, + 69937601360, + 69937642148, + 69939562884, + 69939571687, + 69948026907, + } + db := dao.GetDB() + for _, v := range jdsIds { + vendorSku, _ := api.JdShopAPI.FindSkuById(v) + var sku *model.Sku + sql := ` + SELECT b.* FROM store_sku_bind a,sku b WHERE a.sku_id = b.id AND a.store_id = 102919 AND a.jds_id = ? + ` + sqlParams := []interface{}{v} + err = dao.GetRow(db, &sku, sql, sqlParams) + skus, _ := dao.GetStoreSkus(db, model.VendorIDJDShop, model.JdShopMainStoreID, []int{sku.ID}) + storeSku := skus[0] + if sku.Comment != "" { + var specQuality = utils.Float64ToStr(float64(storeSku.SpecQuality)) + storeSku.SpecUnit + vendorSkuAttr := vendorSku.SaleAttrs[0].AttrValueAlias[0] + if vendorSkuAttr == specQuality { + err = api.JdShopAPI.UpdateWareSaleAttrvalueAlias(&jdshopapi.UpdateWareSaleAttrvalueAliasParam{ + WareID: vendorSku.WareID, + Props: []*jdshopapi.CreateSkuParamAttrs2{ + &jdshopapi.CreateSkuParamAttrs2{ + AttrID: vendorSku.SaleAttrs[0].AttrID, + AttrValues: []string{vendorSku.SaleAttrs[0].AttrValues[0]}, + AttrValueAlias: []string{sku.Comment}, + Type: "com.jd.pop.ware.ic.api.domain.prop", + Type2: "com.jd.pop.ware.ic.api.domain.Prop", + }, + }, + }) + } else { + if vendorSkuAttr != sku.Comment { + _, maxNo, _ := api.JdShopAPI.FindValuesByAttrId(utils.Str2Int(vendorSku.SaleAttrs[0].AttrID)) + api.JdShopAPI.SaveVenderAttrValue(sku.Comment, utils.Str2Int(vendorSku.SaleAttrs[0].AttrID), int(storeSku.VendorVendorCatID), maxNo+1) + } + } + } + // attrValue := vendorSku.SaleAttrs[0].AttrValueAlias[0] + // if storeSkus != nil { + // cms.CurVendorSync.SyncStoresSkus(ctx, nil, 0, db, []int{model.VendorIDJDShop}, []int{model.JdShopMainStoreID}, []int{storeSkus.SkuID}, false, true, true) + // } + } return err } diff --git a/business/jxutils/jxutils.go b/business/jxutils/jxutils.go index 945b0f832..6a878ed2c 100644 --- a/business/jxutils/jxutils.go +++ b/business/jxutils/jxutils.go @@ -161,6 +161,8 @@ func GetPossibleVendorIDFromVendorOrderID(vendorOrderID string) (vendorID int) { vendorID = model.VendorIDWSC } else if orderIDLen == len("1000004390") { vendorID = model.VendorIDJX + } else if orderIDLen == len("124557362562002") { + vendorID = model.VendorIDJDShop } } return vendorID @@ -916,3 +918,24 @@ func PKCS5UnPadding(origData []byte) []byte { unpadding := int(origData[length-1]) return origData[:(length - unpadding)] } + +//合成水印图 +func MixWatermarkImg(imgWatermark, img string, exPrefixBegin, exPrefixEnd *time.Time) (imgMix string) { + if exPrefixBegin != nil && exPrefixEnd != nil { + if utils.Time2Date(time.Now().Add(6*time.Hour)).Sub(*exPrefixBegin) >= 0 && utils.Time2Date(time.Now()).Sub(*exPrefixEnd) <= 0 { + baseURL := base64.URLEncoding.EncodeToString([]byte(imgWatermark)) + imgUrl := img + "?imageView2/0/q/75|watermark/1/image/" + baseURL + "/dissolve/100/gravity/Center/dx/0/dy/0" + if resBinary, _, err := DownloadFileByURL(imgUrl); err == nil { + if downloadURL, err := UploadExportContent(resBinary, utils.Int64ToStr(time.Now().Unix())+img[strings.LastIndex(img, "/")+1:len(img)]); err == nil { + if err == nil { + return downloadURL + } + } + } + } + if utils.Time2Date(time.Now().Add(6*time.Hour)).Sub(*exPrefixEnd) > 0 { + return imgMix + } + } + return imgMix +} diff --git a/business/model/api.go b/business/model/api.go index b70527b5f..ebf5aeead 100644 --- a/business/model/api.go +++ b/business/model/api.go @@ -35,9 +35,10 @@ type GoodsOrderExt struct { WaybillCreatedAt time.Time `orm:"type(datetime);index" json:"waybillCreatedAt"` WaybillFinishedAt time.Time `orm:"type(datetime)" json:"waybillFinishedAt"` - DistrictName string `json:"districtName"` - CityName string `json:"cityName"` - PayPercentage int `json:"payPercentage"` + DistrictName string `json:"districtName"` + CityName string `json:"cityName"` + PayPercentage int `json:"payPercentage"` + OldPayPercentage int `json:"oldPayPercentage"` SkuInfo string `json:"skuInfo,omitempty"` SkuInfo2 string `json:"skuInfo2,omitempty"` diff --git a/business/model/api_config.go b/business/model/api_config.go index fb5b25ad0..ab6d1ffb4 100644 --- a/business/model/api_config.go +++ b/business/model/api_config.go @@ -26,7 +26,8 @@ const ( VendorIDDada = 101 VendorIDMTPS = 102 VendorIDFengNiao = 103 - VendorIDDeliveryEnd = 200 + VendorIDJDWL = 401 //京东物流 + VendorIDDeliveryEnd = 500 VendorIDPrinterBegin = 201 VendorIDFeiE = 201 // 飞鹅打印机 @@ -48,7 +49,6 @@ const ( VendorIDQiNiuCloud = 323 // 七牛云 VendorIDShowAPI = 325 // 万维易源 - VendorIDJDWL = 401 //京东物流 ) type VendorInfo struct { @@ -82,6 +82,7 @@ var ( VendorIDZhongWu: "ZhongWu", VendorIDQiNiuCloud: "Qiniu", + VendorIDJDWL: "Jdwl", } VendorTypeName = map[int]string{ diff --git a/business/model/dao/dao_order.go b/business/model/dao/dao_order.go index 6f090329b..eeceaa567 100644 --- a/business/model/dao/dao_order.go +++ b/business/model/dao/dao_order.go @@ -767,7 +767,7 @@ func GetOrders(db *DaoDB, ids []int64, isIncludeSku, isIncludeFake bool, fromDat CAST(IF(t1.earning_price <> 0, t1.earning_price, IF(t1.shop_price <> 0 && t1.shop_price < t1.sale_price, t1.shop_price, t1.sale_price) * IF(t5.pay_percentage > 0, t5.pay_percentage, %d) / 100) AS SIGNED) earning_price, t2.status waybill_status, t2.courier_name, t2.courier_mobile, t2.actual_fee, t2.desired_fee, t2.waybill_created_at, t2.waybill_finished_at, - t5.pay_percentage, + t5.pay_percentage, t5.old_pay_percentage, city.name city_name, district.name district_name`, model.DefaultEarningPricePercentage) if isIncludeSku { sql += `, diff --git a/business/model/dao/sku.go b/business/model/dao/sku.go index be89fa4a9..6bbab2c14 100644 --- a/business/model/dao/sku.go +++ b/business/model/dao/sku.go @@ -1,6 +1,8 @@ package dao import ( + "time" + "git.rosy.net.cn/baseapi/platformapi/aliupcapi" "git.rosy.net.cn/baseapi/utils" "git.rosy.net.cn/jx-callback/business/model" @@ -255,11 +257,8 @@ func GetSkusWithVendor(db *DaoDB, vendorIDs []int, appOrgCodes []string, nameIDs IF(t11.resource_type IS NULL OR t11.resource_type <> ?, t2.img, '') img, IF(t12.resource_type IS NULL OR t12.resource_type <> ?, t2.img2, '') img2, t2.desc_img, - t2.ex_prefix, - t2.ex_prefix_begin, - t2.ex_prefix_end, t3.jd_category_id vendor_vendor_cat_id, - + tsu.ex_prefix, tsu.begin_at ex_prefix_begin, tsu.end_at ex_prefix_end, tsu.img_watermark, t3m.sync_status cat_sync_status, t3m.vendor_thing_id vendor_cat_id @@ -286,9 +285,10 @@ func GetSkusWithVendor(db *DaoDB, vendorIDs []int, appOrgCodes []string, nameIDs AND t3m.vendor_id = t1m.vendor_id AND t3m.vendor_org_code = t1m.vendor_org_code LEFT JOIN data_resource t11 ON t11.main_url = t2.img LEFT JOIN data_resource t12 ON t12.main_url = t2.img2 + LEFT JOIN sku_exinfo_map tsu ON tsu.name_id = t2.id AND tsu.deleted_at = ? AND tsu.vendor_id = t1m.vendor_id WHERE 1 = 1 ` - sqlParams = append(sqlParams, model.ThingTypeCategory, utils.DefaultTimeValue) + sqlParams = append(sqlParams, model.ThingTypeCategory, utils.DefaultTimeValue, utils.DefaultTimeValue) if mustDirty { sql += " AND t1m.sync_status IS NOT NULL AND t1m.sync_status <> 0" } else { @@ -379,3 +379,34 @@ func InsertUpcDepot(db *DaoDB, result *aliupcapi.GetAliUpcInfoResult) (err error _, err = ExecuteSQL(db, sql, sqlParams) return err } + +func GetSkuExinfos(db *DaoDB, nameIDs []int, vendorIDs []int, exPrefix string, fromTime, toTime time.Time) (skuExinfoMaps []*model.SkuExinfoMap, err error) { + sql := ` + SELECT * + FROM sku_exinfo_map + WHERE deleted_at = ? + ` + sqlParams := []interface{}{ + utils.DefaultTimeValue, + } + if len(nameIDs) > 0 { + sql += " AND name_id IN (" + GenQuestionMarks(len(nameIDs)) + ")" + sqlParams = append(sqlParams, nameIDs) + } + if len(vendorIDs) > 0 { + sql += " AND vendor_id IN (" + GenQuestionMarks(len(vendorIDs)) + ")" + sqlParams = append(sqlParams, vendorIDs) + } + if exPrefix != "" { + sql += " AND ex_prefix LIKE ?" + sqlParams = append(sqlParams, "%"+exPrefix+"%") + } + if fromTime != utils.ZeroTimeValue && toTime != utils.ZeroTimeValue { + sql += " AND NOT (begin_at > ? OR end_at < ?)" + sqlParams = append(sqlParams, toTime, fromTime) + } + if err = GetRows(db, &skuExinfoMaps, sql, sqlParams...); err == nil { + return skuExinfoMaps, nil + } + return nil, err +} diff --git a/business/model/dao/store_sku.go b/business/model/dao/store_sku.go index 404a477e4..f9250a351 100644 --- a/business/model/dao/store_sku.go +++ b/business/model/dao/store_sku.go @@ -75,23 +75,29 @@ type StoreSkuSyncInfo struct { ExPrefix string ExPrefixBegin *time.Time ExPrefixEnd *time.Time + // NameID int `orm:"column(name_id)"` - VendorNameID string `orm:"column(vendor_name_id)"` // 暂时无用 - Name string - Unit string - Upc string - IsGlobal int8 `orm:"default(1)" json:"isGlobal"` // 是否是全部(全国)可见,如果否的话,可见性由SkuPlace决定 - NameStatus int - SellCities []string - NameCategoryID int `orm:"column(name_category_id)"` - YbNameSuffix string //银豹的商品条码后缀 - YbBarCode string //银豹的商品条码 - JdsStockSwitch int + VendorNameID string `orm:"column(vendor_name_id)"` // 暂时无用 + Name string + Unit string + Upc string + IsGlobal int8 `orm:"default(1)" json:"isGlobal"` // 是否是全部(全国)可见,如果否的话,可见性由SkuPlace决定 + NameStatus int + SellCities []string + NameCategoryID int `orm:"column(name_category_id)"` + YbNameSuffix string //银豹的商品条码后缀 + YbBarCode string //银豹的商品条码 + JdsStockSwitch int + PreparationTime int // 平台相关的图片信息 - Img string - Img2 string - DescImg string + Img string + Img2 string + Img3 string + DescImg string + ImgWatermark string `json:"imgWatermark"` //图片水印 + ImgMix string //合成水印后的图片 + ImgOrigin string //skuname里的img VendorVendorCatID int64 `orm:"column(vendor_vendor_cat_id)"` // 平台商品分类(叶子结点) CategoryName string `json:"categoryName"` //分类名 @@ -108,6 +114,7 @@ type StoreSkuSyncInfo struct { MergedStatus int SkuName string + SkuNameOrigin string StatusSaleBegin int16 `json:"statusSaleBegin"` //商品可售时间范围 StatusSaleEnd int16 `json:"statusSaleEnd"` @@ -403,19 +410,22 @@ func GetStoreSkus2(db *DaoDB, vendorID, storeID int, skuIDs []int, mustDirty boo %s vendor_sku_id, t1.%s_sync_status sku_sync_status, t1.%s_price vendor_price, t1.%s_lock_time lock_time, t1.store_id, t1.deleted_at bind_deleted_at,t1.status_sale_begin,t1.status_sale_end, t1.jds_ware_id, t2.*, - t3.id name_id, t3.prefix, t3.name, t3.unit, t3.upc, t3.status name_status, t3.ex_prefix, t3.ex_prefix_begin, t3.ex_prefix_end, t3.category_id name_category_id, t3.yb_name_suffix, - t3.jds_stock_switch, + t3.id name_id, t3.prefix, t3.name, t3.unit, t3.upc, t3.status name_status, t3.category_id name_category_id, t3.yb_name_suffix, + t3.jds_stock_switch, t3.preparation_time, t3.img_watermark, t3.ex_vendor_id, t3.img img_origin, IF(t11.%s <> '', t11.%s, t3.img) img, IF(t12.%s <> '', t12.%s, t3.img2) img2, + IF(t15.%s <> '', t15.%s, t3.img3) img3, IF(t13.%s <> '', t13.%s, t3.desc_img) desc_img, t4.%s_category_id vendor_vendor_cat_id, t4.name category_name, - ts.name store_name` + ts.name store_name, + tsu.ex_prefix, tsu.begin_at ex_prefix_begin, tsu.end_at ex_prefix_end, tsu.img_watermark` fmtParams := []interface{}{ skuVendorIDField, fieldPrefix, fieldPrefix, fieldPrefix, GetDataResFieldName(vendorID), GetDataResFieldName(vendorID), GetDataResFieldName(vendorID), GetDataResFieldName(vendorID), GetDataResFieldName(vendorID), GetDataResFieldName(vendorID), + GetDataResFieldName(vendorID), GetDataResFieldName(vendorID), fieldPrefix, } if isSingleStorePF { @@ -441,7 +451,9 @@ func GetStoreSkus2(db *DaoDB, vendorID, storeID int, skuIDs []int, mustDirty boo LEFT JOIN sku_category t4 ON t3.category_id = t4.id AND t4.deleted_at = ? LEFT JOIN data_resource t11 ON t11.main_url = t3.img LEFT JOIN data_resource t12 ON t12.main_url = t3.img2 + LEFT JOIN data_resource t15 ON t15.main_url = t3.img3 LEFT JOIN data_resource t13 ON t13.main_url = t3.desc_img + LEFT JOIN sku_exinfo_map tsu ON tsu.name_id = t3.id AND tsu.deleted_at = ? AND tsu.vendor_id = t14.vendor_id ` sqlParams := []interface{}{ vendorID, utils.DefaultTimeValue, @@ -449,6 +461,7 @@ func GetStoreSkus2(db *DaoDB, vendorID, storeID int, skuIDs []int, mustDirty boo utils.DefaultTimeValue, // model.SkuStatusNormal, utils.DefaultTimeValue, utils.DefaultTimeValue, + utils.DefaultTimeValue, } if globals.IsStoreSkuAct { sql += ` @@ -606,7 +619,6 @@ func GetStoreSkuPriceAndWeight(db *DaoDB, vendorStoreID string, vendorID int, ve } else { sqlParams = append(sqlParams, vendorSkuIDs) } - // globals.SugarLogger.Debugf(sql) err = GetRows(db, &l, sql, sqlParams...) return l, err } @@ -965,17 +977,20 @@ func DeleteSkuNameExPrefixOverdue(db *DaoDB) (num int64, err error) { func GetStoreSkusByNameIDs(db *DaoDB, storeIDs []int, nameID int) (skuList []*StoreSkuSyncInfo, err error) { sql := ` - SELECT a.*,c.unit,c.name + SELECT a.*, c.unit, c.name, b.name_id, a.status store_sku_status FROM store_sku_bind a JOIN sku b ON a.sku_id = b.id JOIN sku_name c ON b.name_id = c.id - WHERE b.name_id = ? + WHERE 1=1 AND a.deleted_at = ? ` sqlParams := []interface{}{ - nameID, utils.DefaultTimeValue, } + if nameID != 0 { + sql += " AND b.name_id = ?" + sqlParams = append(sqlParams, nameID) + } if len(storeIDs) > 0 { sql += " AND a.store_id in (" + GenQuestionMarks(len(storeIDs)) + ")" sqlParams = append(sqlParams, storeIDs) @@ -1522,13 +1537,14 @@ func UpdateYbOtherSku(db *DaoDB, storeSkuSyncInfo *StoreSkuSyncInfo) (err error) func UpdateJdsWareID(db *DaoDB, storeSkuSyncInfo *StoreSkuSyncInfo) (err error) { sql := ` UPDATE store_sku_bind - SET jds_ware_id = ? + SET jds_ware_id = ?, jds_id = ? WHERE store_id = ? AND sku_id = ? AND deleted_at = ? ` sqlParams := []interface{}{ storeSkuSyncInfo.JdsWareID, + storeSkuSyncInfo.VendorSkuID, storeSkuSyncInfo.StoreID, storeSkuSyncInfo.SkuID, utils.DefaultTimeValue, @@ -1550,6 +1566,7 @@ type tStoreSkuAudit struct { MidUnitPrice int `json:"midUnitPrice"` CityName string `json:"cityName"` PayPercentage int `json:"payPercentage"` + StoreLevel string `json:"storeLevel"` } func GetStoreSkuAudit(db *DaoDB, storeIDs, nameIDs, skuIDs, statuss, types []int, name, remark, keyword, marketManPhone, cityName string, applyTimeStart, applyTimeEnd, auditTimeStart, auditTimeEnd time.Time, pageSize, offset int) (pagedInfo *model.PagedInfo, err error) { @@ -1557,7 +1574,7 @@ func GetStoreSkuAudit(db *DaoDB, storeIDs, nameIDs, skuIDs, statuss, types []int sql := ` SELECT SQL_CALC_FOUND_ROWS DISTINCT a.*, c.name sku_name, c.prefix, c.unit, c.spec_quality, c.spec_unit, c.img, - d.name store_name, b.name, e.mid_unit_price, f.name city_name, d.pay_percentage + d.name store_name, b.name, e.mid_unit_price, f.name city_name, d.pay_percentage, d.store_level FROM store_sku_audit a LEFT JOIN user b ON a.user_id = b.user_id LEFT JOIN sku_name c ON c.id = a.name_id AND c.deleted_at = ? @@ -1596,7 +1613,7 @@ func GetStoreSkuAudit(db *DaoDB, storeIDs, nameIDs, skuIDs, statuss, types []int } if auditTimeStart != utils.ZeroTimeValue && auditTimeEnd != utils.ZeroTimeValue { sql += " AND a.updated_at BETWEEN ? AND ?" - sqlParams = append(sqlParams, applyTimeStart, applyTimeEnd) + sqlParams = append(sqlParams, auditTimeStart, auditTimeEnd) } if len(types) > 0 { sql += " AND a.type IN (" + GenQuestionMarks(len(types)) + ")" @@ -1614,7 +1631,7 @@ func GetStoreSkuAudit(db *DaoDB, storeIDs, nameIDs, skuIDs, statuss, types []int sql += " AND f.name LIKE ? " sqlParams = append(sqlParams, "%"+cityName+"%") } - sql += " ORDER BY a.updated_at DESC LIMIT ? OFFSET ?" + sql += " ORDER BY a.updated_at LIMIT ? OFFSET ?" pageSize = jxutils.FormalizePageSize(pageSize) sqlParams = append(sqlParams, pageSize, offset) Begin(db) diff --git a/business/model/sku.go b/business/model/sku.go index 04c154089..85f560d70 100644 --- a/business/model/sku.go +++ b/business/model/sku.go @@ -154,12 +154,13 @@ func (*SkuCategory) TableUnique() [][]string { type SkuName struct { ModelIDCULD - Prefix string `orm:"size(255)" json:"prefix"` - Name string `orm:"size(255)" json:"name"` - ExPrefix string `orm:"size(255)" json:"exPrefix"` + Prefix string `orm:"size(255)" json:"prefix"` + Name string `orm:"size(255)" json:"name"` + ExPrefix string `orm:"size(255)" json:"exPrefix"` ExPrefixBegin *time.Time `orm:"null" json:"exPrefixBegin"` ExPrefixEnd *time.Time `orm:"null" json:"exPrefixEnd"` + ExVendorID int `orm:"column(ex_vendor_id)" json:"exVendorID"` BrandID int `orm:"column(brand_id);default(0)" json:"brandID"` // todo,此属性暂时没有使用,且有问题,应该是不同平台都有一个brandid CategoryID int `orm:"column(category_id);index" json:"categoryID"` // 标准类别 @@ -171,8 +172,11 @@ type SkuName struct { SpecUnit string `orm:"size(8)" json:"-"` // 为份必然为克,这个主要作用只是用于确保SkuName的唯一性 Price int `json:"price"` // 单位为分,标准价,不为份的就为实际标准价,为份的为每市斤价,实际还要乘质量。todo 为份的确定必须有质量 - Img string `orm:"size(512)" json:"img"` - Img2 string `orm:"size(512)" json:"img2"` // 第二张图片 + Img string `orm:"size(512)" json:"img"` + Img2 string `orm:"size(512)" json:"img2"` // 第二张图片 + Img3 string `orm:"size(512)" json:"img3"` //第三张图片 + ImgWatermark string `orm:"size(512)" json:"imgWatermark"` //图片水印 + ImgMix string `orm:"size(512)" json:"imgMix"` //图片混合水印的图片 // ImgEbai string `orm:"size(255)" json:"imgEbai"` // 饿百图片地址 // ImgHashCode string `orm:"size(255);index" json:"img_hash_code"` @@ -187,8 +191,9 @@ type SkuName struct { // JdSyncStatus int8 `orm:"default(2)" json:"jdSyncStatus"` // LinkID int `orm:"column(link_id);null;index" json:"linkID"` - YbNameSuffix string `json:"ybNameSuffix"` //银豹商品后缀 - JdsStockSwitch int8 `orm:"default(1)" json:"jdsStockSwitch"` + YbNameSuffix string `json:"ybNameSuffix"` //银豹商品后缀 + JdsStockSwitch int8 `orm:"default(1)" json:"jdsStockSwitch"` //京东商城总库存 + PreparationTime int `orm:"default(1)" json:"preparationTime"` //商品准备时长 } func (*SkuName) TableUnique() [][]string { @@ -279,3 +284,20 @@ type SkuNameExt struct { PlacesStr string `json:"-"` MidUnitPrice int `json:"midUnitPrice"` } + +type SkuExinfoMap struct { + ModelIDCULD + + NameID int `orm:"column(name_id)" json:"nameID"` + VendorID int `orm:"column(vendor_id)" json:"vendorID"` + BeginAt time.Time `orm:"type(datetime);index" json:"beginAt"` //设置起始时间 + EndAt time.Time `orm:"type(datetime);index" json:"endAt"` //设置结束时间 + ExPrefix string `orm:"size(255)" json:"exPrefix"` //额外前缀 + ImgWatermark string `orm:"size(512)" json:"imgWatermark"` //图片水印 +} + +func (*SkuExinfoMap) TableIndex() [][]string { + return [][]string{ + []string{"NameID", "VendorID", "BeginAt", "EndAt"}, + } +} diff --git a/business/model/store.go b/business/model/store.go index 918c4e38d..4acfb3ba0 100644 --- a/business/model/store.go +++ b/business/model/store.go @@ -292,6 +292,7 @@ type Store struct { 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"` // 门店等级(筛选用,京西的) PrinterDisabled int8 `orm:"default(0)" json:"printerDisabled"` // 是否禁用网络打印机 PrinterFontSize int8 `orm:"default(0)" json:"printerFontSize"` // 打印字体-1:小,0:正常,1:大 @@ -335,6 +336,7 @@ type Store struct { PayeeBankBranchName string `orm:"size(255)" json:"payeeBankBranchName"` // 开户支行 PayeeBankCode string `orm:"size(8)" json:"payeeBankCode"` // 开户行代码 PayPercentage int `json:"payPercentage"` + OldPayPercentage int `json:"oldPayPercentage"` // OperatorName string `orm:"size(8)" json:"operatorName"` // 运营人姓名 OperatorPhone string `orm:"size(16)" json:"operatorPhone"` // 京东运营人电话 diff --git a/business/partner/delivery/jdeclp/waybill.go b/business/partner/delivery/jdeclp/waybill.go index 0a86dae61..c781d6104 100644 --- a/business/partner/delivery/jdeclp/waybill.go +++ b/business/partner/delivery/jdeclp/waybill.go @@ -94,3 +94,7 @@ func (c *DeliveryHandler) GetWaybillFee(order *model.GoodsOrder) (deliveryFeeInf func (c *DeliveryHandler) ComplaintRider(bill *model.Waybill, resonID int, resonContent string) (err error) { return err } + +func (c *DeliveryHandler) OnWaybillMsg() { + +} diff --git a/business/partner/delivery/jdeclp/waybill_test.go b/business/partner/delivery/jdeclp/waybill_test.go index a8b1b4a51..b954e8be9 100644 --- a/business/partner/delivery/jdeclp/waybill_test.go +++ b/business/partner/delivery/jdeclp/waybill_test.go @@ -1 +1,7 @@ package jdeclp + +import "git.rosy.net.cn/jx-callback/globals/testinit" + +func init() { + testinit.Init() +} diff --git a/business/partner/delivery/mtps/waybill.go b/business/partner/delivery/mtps/waybill.go index 20c18c817..09fc6e264 100644 --- a/business/partner/delivery/mtps/waybill.go +++ b/business/partner/delivery/mtps/waybill.go @@ -1,8 +1,13 @@ package mtps import ( + "crypto/sha1" "errors" "fmt" + "net/http" + "net/url" + "sort" + "strings" "time" "git.rosy.net.cn/baseapi/platformapi/mtpsapi" @@ -99,9 +104,72 @@ func (c *DeliveryHandler) onWaybillMsg(msg *mtpsapi.CallbackOrderMsg) (retVal *m globals.SugarLogger.Warnf("onWaybillMsg unknown msg:%v", msg) return mtpsapi.SuccessResponse } + c.pushToGy(order, msg) + globals.SugarLogger.Debugf("onWaybillMsg test, %v", msg) return mtpsapi.Err2CallbackResponse(partner.CurOrderManager.OnWaybillStatusChanged(order), order.VendorStatus) } +func (c *DeliveryHandler) pushToGy(waybill *model.Waybill, msg *mtpsapi.CallbackOrderMsg) { + order, _ := dao.GetSimpleOrder(dao.GetDB(), waybill.VendorOrderID) + //查不到订单可能就是果园的订单 + if order == nil { + cl := http.Client{} + params := make(map[string]interface{}) + params["mt_peisong_id"] = msg.MtPeisongID + params["courier_name"] = msg.CourierName + params["delivery_id"] = msg.DeliveryID + params["appkey"] = msg.AppKey + params["order_id"] = msg.OrderID + params["courier_phone"] = msg.CourierPhone + params["status"] = msg.Status + params["timestamp"] = msg.Timestamp + params["cancel_reason_id"] = msg.CancelReasonId + params["cancel_reason"] = msg.CancelReason + urls := utils.Map2URLValues(params) + sign := signParams(urls) + params["sign"] = sign + request, err := http.NewRequest(http.MethodPost, "http://callback-jxgy.jxc4.com/mtps/status", strings.NewReader(utils.Map2URLValues(params).Encode())) + if err != nil { + return + } + request.PostForm.Set("mt_peisong_id", msg.MtPeisongID) + request.PostForm.Set("courier_name", msg.CourierName) + request.PostForm.Set("delivery_id", utils.Int64ToStr(msg.DeliveryID)) + request.PostForm.Set("appkey", msg.AppKey) + request.PostForm.Set("order_id", msg.OrderID) + request.PostForm.Set("courier_phone", msg.CourierPhone) + request.PostForm.Set("status", utils.Int2Str(msg.Status)) + request.PostForm.Set("timestamp", utils.Int64ToStr(msg.Timestamp)) + request.PostForm.Set("cancel_reason_id", utils.Int2Str(msg.CancelReasonId)) + request.PostForm.Set("cancel_reason", msg.CancelReason) + request.PostForm.Set("sign", sign) + fmt.Println("testgy request : %v", request.FormValue("sign")) + request.Header.Set("content_type", "application/x-www-form-urlencoded; charset=UTF-8") + cl.Do(request) + } +} + +func signParams(params url.Values) string { + keys := make([]string, 0) + for k := range params { + if k != "sign" { + keys = append(keys, k) + } + } + + sort.Strings(keys) + finalStr := "b1M}9?:sTbsB[OF2gNORnN(|(iy9rB8(`7]|[wGLnbmt`evfM>E:A90DjHAW:UPE" + for _, key := range keys { + valStr := strings.Join(params[key], "") + if valStr != "" { + finalStr += key + valStr + } + } + + // baseapi.SugarLogger.Debug(finalStr) + return fmt.Sprintf("%x", sha1.Sum([]byte(finalStr))) +} + func (c *DeliveryHandler) callbackMsg2Waybill(msg *mtpsapi.CallbackOrderMsg) (retVal *model.Waybill) { retVal = &model.Waybill{ VendorWaybillID: msg.MtPeisongID, diff --git a/business/partner/printer/feie/feie.go b/business/partner/printer/feie/feie.go index 95df6cd28..d9819d284 100644 --- a/business/partner/printer/feie/feie.go +++ b/business/partner/printer/feie/feie.go @@ -59,7 +59,7 @@ func (c *PrinterHandler) getOrderContent(order *model.GoodsOrder, storeTel strin
商品明细:
-品名 数量 单价 小计
+品名 数量
--------------------------------
` // 实际支付:%s
orderParams := []interface{}{ @@ -79,8 +79,9 @@ func (c *PrinterHandler) getOrderContent(order *model.GoodsOrder, storeTel strin for _, sku := range order.Skus { orderFmt += `%s
` - orderFmt += `%8s%10s%10s
` - orderParams = append(orderParams, sku.SkuName, "x"+utils.Int2Str(sku.Count), jxutils.IntPrice2StandardCurrencyString(sku.SalePrice), jxutils.IntPrice2StandardCurrencyString(sku.SalePrice*int64(sku.Count))) + orderFmt += `%8s
` + orderParams = append(orderParams, sku.SkuName, "x"+utils.Int2Str(sku.Count)) + //jxutils.IntPrice2StandardCurrencyString(sku.SalePrice), jxutils.IntPrice2StandardCurrencyString(sku.SalePrice*int64(sku.Count)) } orderFmt += `
共%d种%d件商品 @@ -133,7 +134,7 @@ func (c *PrinterHandler) getOrderContentBig(order *model.GoodsOrder, storeTel st
商品明细:
-品名数量单价小计
+品名 数量
--------------------------------
` // 实际支付:%s
orderParams := []interface{}{ @@ -153,8 +154,9 @@ func (c *PrinterHandler) getOrderContentBig(order *model.GoodsOrder, storeTel st for _, sku := range order.Skus { orderFmt += `%s
` - orderFmt += `%s %s %s

` - orderParams = append(orderParams, sku.SkuName, "x"+utils.Int2Str(sku.Count), jxutils.IntPrice2StandardCurrencyString(sku.SalePrice), jxutils.IntPrice2StandardCurrencyString(sku.SalePrice*int64(sku.Count))) + orderFmt += `%s

` + orderParams = append(orderParams, sku.SkuName, "x"+utils.Int2Str(sku.Count)) + //jxutils.IntPrice2StandardCurrencyString(sku.SalePrice), jxutils.IntPrice2StandardCurrencyString(sku.SalePrice*int64(sku.Count)) } orderFmt += `
共%d种%d件商品 diff --git a/business/partner/printer/xiaowm/xiaowm.go b/business/partner/printer/xiaowm/xiaowm.go index 036ae90ed..9ea887829 100644 --- a/business/partner/printer/xiaowm/xiaowm.go +++ b/business/partner/printer/xiaowm/xiaowm.go @@ -60,7 +60,7 @@ func (c *PrinterHandler) getOrderContent(order *model.GoodsOrder, storeTel strin 客户备注: * %s* 商品明细: * -品名 数量 单价 小计 +品名 数量 --------------------------------* ` // 实际支付: %s* @@ -81,7 +81,8 @@ func (c *PrinterHandler) getOrderContent(order *model.GoodsOrder, storeTel strin for _, sku := range order.Skus { orderFmt += `%s*` orderFmt += `%8s%10s%10s*` - orderParams = append(orderParams, sku.SkuName, "x"+utils.Int2Str(sku.Count), jxutils.IntPrice2StandardCurrencyString(sku.SalePrice), jxutils.IntPrice2StandardCurrencyString(sku.SalePrice*int64(sku.Count))) + orderParams = append(orderParams, sku.SkuName, "x"+utils.Int2Str(sku.Count)) + // jxutils.IntPrice2StandardCurrencyString(sku.SalePrice), jxutils.IntPrice2StandardCurrencyString(sku.SalePrice*int64(sku.Count)) } orderFmt += ` * @@ -135,7 +136,7 @@ func (c *PrinterHandler) getOrderContentBig(order *model.GoodsOrder, storeTel st 客户备注: * %s* 商品明细: * -品名数量单价小计* +品名 数量* --------------------------------* ` // 实际支付: %s* @@ -155,8 +156,9 @@ func (c *PrinterHandler) getOrderContentBig(order *model.GoodsOrder, storeTel st } for _, sku := range order.Skus { orderFmt += `%s*` - orderFmt += `%s %s %s*` - orderParams = append(orderParams, sku.SkuName, "x"+utils.Int2Str(sku.Count), jxutils.IntPrice2StandardCurrencyString(sku.SalePrice), jxutils.IntPrice2StandardCurrencyString(sku.SalePrice*int64(sku.Count))) + orderFmt += `%s*` + orderParams = append(orderParams, sku.SkuName, "x"+utils.Int2Str(sku.Count)) + // jxutils.IntPrice2StandardCurrencyString(sku.SalePrice), jxutils.IntPrice2StandardCurrencyString(sku.SalePrice*int64(sku.Count)) } orderFmt += ` 共%d种%d件商品* @@ -231,7 +233,7 @@ func (c *PrinterHandler) getOrderContent2(order *model.GoodsOrder, storeTel stri } for _, sku := range order.Skus { orderFmt += `|5%s` - orderFmt += `|5%8s%10s%10s` + orderFmt += `|5%8s` orderParams = append(orderParams, sku.SkuName, "x"+utils.Int2Str(sku.Count), jxutils.IntPrice2StandardCurrencyString(sku.SalePrice), jxutils.IntPrice2StandardCurrencyString(sku.SalePrice*int64(sku.Count))) } orderFmt += ` diff --git a/business/partner/printer/yilianyun/yilianyun.go b/business/partner/printer/yilianyun/yilianyun.go index f9036496f..45fd1e948 100644 --- a/business/partner/printer/yilianyun/yilianyun.go +++ b/business/partner/printer/yilianyun/yilianyun.go @@ -36,6 +36,7 @@ func (c *PrinterHandler) getOrderContent(order *model.GoodsOrder, storeTel strin if order.VendorID == model.VendorIDEBAI { getCode = fmt.Sprintf("饿百取货码:%s\\n\n", jxutils.GetEbaiOrderGetCode(order)) } + //TODO 去掉单价和小计,2020-06-18 orderFmt := `
%s
\n\n
手机买菜上京西
@@ -57,7 +58,7 @@ func (c *PrinterHandler) getOrderContent(order *model.GoodsOrder, storeTel strin \n \n 商品明细: \n -品名 数量 单价 小计\n +品名 数量 \n --------------------------------\n` // 实际支付:%s\n orderParams := []interface{}{ @@ -77,8 +78,9 @@ func (c *PrinterHandler) getOrderContent(order *model.GoodsOrder, storeTel strin for _, sku := range order.Skus { orderFmt += `%s\n` - orderFmt += `%8s%10s%10s\n` - orderParams = append(orderParams, sku.SkuName, "x"+utils.Int2Str(sku.Count), jxutils.IntPrice2StandardCurrencyString(sku.SalePrice), jxutils.IntPrice2StandardCurrencyString(sku.SalePrice*int64(sku.Count))) + orderFmt += `%8s\n` + orderParams = append(orderParams, sku.SkuName, "x"+utils.Int2Str(sku.Count)) + //jxutils.IntPrice2StandardCurrencyString(sku.SalePrice), jxutils.IntPrice2StandardCurrencyString(sku.SalePrice*int64(sku.Count)) } orderFmt += `\n 共%d种%d件商品 @@ -125,7 +127,7 @@ func (c *PrinterHandler) getOrderContentBig(order *model.GoodsOrder, storeTel st \n \n 商品明细: \n -品名数量单价小计\n +品名 数量\n --------------------------------\n` // 实际支付:%s\n orderParams := []interface{}{ @@ -145,8 +147,9 @@ func (c *PrinterHandler) getOrderContentBig(order *model.GoodsOrder, storeTel st for _, sku := range order.Skus { orderFmt += `%s\n` - orderFmt += `%s %s %s\n\n` - orderParams = append(orderParams, sku.SkuName, "x"+utils.Int2Str(sku.Count), jxutils.IntPrice2StandardCurrencyString(sku.SalePrice), jxutils.IntPrice2StandardCurrencyString(sku.SalePrice*int64(sku.Count))) + orderFmt += `%s\n\n` + orderParams = append(orderParams, sku.SkuName, "x"+utils.Int2Str(sku.Count)) + //jxutils.IntPrice2StandardCurrencyString(sku.SalePrice), jxutils.IntPrice2StandardCurrencyString(sku.SalePrice*int64(sku.Count)) } orderFmt += `\n 共%d种%d件商品 diff --git a/business/partner/printer/zhongwu/zhongwu.go b/business/partner/printer/zhongwu/zhongwu.go index 312c8979f..9eff3d4e1 100644 --- a/business/partner/printer/zhongwu/zhongwu.go +++ b/business/partner/printer/zhongwu/zhongwu.go @@ -58,7 +58,7 @@ func (c *PrinterHandler) getOrderContent(order *model.GoodsOrder, storeTel strin 商品明细: -品名 数量 单价 小计 +品名 数量 ********************************` // 实际支付:%s orderParams := []interface{}{ @@ -78,8 +78,9 @@ func (c *PrinterHandler) getOrderContent(order *model.GoodsOrder, storeTel strin for _, sku := range order.Skus { orderFmt += `%s` - orderFmt += `%8s%10s%10s` - orderParams = append(orderParams, sku.SkuName, "x"+utils.Int2Str(sku.Count), jxutils.IntPrice2StandardCurrencyString(sku.SalePrice), jxutils.IntPrice2StandardCurrencyString(sku.SalePrice*int64(sku.Count))) + orderFmt += `%8s` + orderParams = append(orderParams, sku.SkuName, "x"+utils.Int2Str(sku.Count)) + //jxutils.IntPrice2StandardCurrencyString(sku.SalePrice), jxutils.IntPrice2StandardCurrencyString(sku.SalePrice*int64(sku.Count)) } orderFmt += ` 共%d种%d件商品 @@ -126,7 +127,7 @@ func (c *PrinterHandler) getOrderContentBig(order *model.GoodsOrder, storeTel st 商品明细: -品名数量单价小计 +品名 数量 ********************************` // 实际支付:%s orderParams := []interface{}{ @@ -146,8 +147,9 @@ func (c *PrinterHandler) getOrderContentBig(order *model.GoodsOrder, storeTel st for _, sku := range order.Skus { orderFmt += `%s` - orderFmt += `%s %s %s` - orderParams = append(orderParams, sku.SkuName, "x"+utils.Int2Str(sku.Count), jxutils.IntPrice2StandardCurrencyString(sku.SalePrice), jxutils.IntPrice2StandardCurrencyString(sku.SalePrice*int64(sku.Count))) + orderFmt += `%s` + orderParams = append(orderParams, sku.SkuName, "x"+utils.Int2Str(sku.Count)) + //jxutils.IntPrice2StandardCurrencyString(sku.SalePrice), jxutils.IntPrice2StandardCurrencyString(sku.SalePrice*int64(sku.Count)) } orderFmt += ` 共%d种%d件商品 diff --git a/business/partner/purchase/ebai/order.go b/business/partner/purchase/ebai/order.go index 067fbeb2d..ce6549398 100644 --- a/business/partner/purchase/ebai/order.go +++ b/business/partner/purchase/ebai/order.go @@ -134,6 +134,7 @@ func (p *PurchaseHandler) GetOrder4PartRefund(vendorOrderID string) (order *mode order.DiscountMoney = discountMoney order.Skus = append(order.Skus, giftSkus...) order.ActualPayPrice = utils.MustInterface2Int64(result2["user_fee"]) + order.TotalShopMoney = utils.MustInterface2Int64(result2["shop_fee"]) jxutils.RefreshOrderSkuRelated(order) } else if err2Ext, ok := err2.(*utils.ErrorWithCode); !ok || err2Ext.IntCode() != ebaiapi.ErrOrderIsNotPartRefund { err = err2 diff --git a/business/partner/purchase/ebai/order_afs.go b/business/partner/purchase/ebai/order_afs.go index d06c917a0..f9f67f0c7 100644 --- a/business/partner/purchase/ebai/order_afs.go +++ b/business/partner/purchase/ebai/order_afs.go @@ -204,10 +204,24 @@ func (c *PurchaseHandler) ConfirmReceivedReturnGoods(ctx *jxcontext.Context, ord // 发起全款退款 func (c *PurchaseHandler) RefundOrder(ctx *jxcontext.Context, order *model.GoodsOrder, reason string) (err error) { - return fmt.Errorf("%s不支持售后全额退款,请让买家发起退款", model.VendorChineseNames[model.VendorIDEBAI]) + return c.PartRefundOrder(ctx, order, order.Skus, reason) } // 发起部分退款 func (c *PurchaseHandler) PartRefundOrder(ctx *jxcontext.Context, order *model.GoodsOrder, refundSkuList []*model.OrderSku, reason string) (err error) { - return fmt.Errorf("%s不支持售后部分退款,请让买家发起退款", model.VendorChineseNames[model.VendorIDEBAI]) + if globals.EnableEbaiStoreWrite { + err = api.EbaiAPI.OrderPartRefund(order.VendorOrderID, orderSkus2AfsSkus(refundSkuList)) + } + return err +} + +func orderSkus2AfsSkus(refundSkuList []*model.OrderSku) (removeSkuList []*ebaiapi.RefundSku) { + for _, v := range refundSkuList { + refundSku := &ebaiapi.RefundSku{ + CustomeSkuID: utils.Int2Str(v.SkuID), + Number: utils.Int2Str(v.Count), + } + removeSkuList = append(removeSkuList, refundSku) + } + return removeSkuList } diff --git a/business/partner/purchase/ebai/store_sku2.go b/business/partner/purchase/ebai/store_sku2.go index be00e1a67..22b40fc7a 100644 --- a/business/partner/purchase/ebai/store_sku2.go +++ b/business/partner/purchase/ebai/store_sku2.go @@ -28,6 +28,14 @@ var ( 175: "赠品专区", 18: "烧烤吧台", } + + //果园果切的饿百分类ID + gygqVendorCatID = map[int]int{ + 201227732: 1, + 201220933: 1, + 201223525: 1, + 201220334: 1, + } ) func (p *PurchaseHandler) GetStoreSkusBatchSize(funcID int) (batchSize int) { @@ -316,10 +324,16 @@ func (p *PurchaseHandler) UpdateStoreSkusStock(ctx *jxcontext.Context, vendorOrg } func genSkuParamsFromStoreSkuInfo2(storeSku *dao.StoreSkuSyncInfo, isCreate, isExd bool) (params map[string]interface{}) { + var img string + if storeSku.ImgMix != "" { + img = storeSku.ImgMix + } else { + img = storeSku.Img + } photos := []map[string]interface{}{ map[string]interface{}{ "is_master": true, - "url": storeSku.Img, + "url": img, }, } if storeSku.Img2 != "" { @@ -328,14 +342,21 @@ func genSkuParamsFromStoreSkuInfo2(storeSku *dao.StoreSkuSyncInfo, isCreate, isE "url": storeSku.Img2, }) } + if storeSku.Img3 != "" { + photos = append(photos, map[string]interface{}{ + "is_master": false, + "url": storeSku.Img3, + }) + } params = map[string]interface{}{ // "name": utils.LimitMixedStringLen(storeSku.SkuName, ebaiapi.MaxSkuNameByteCount), "left_num": model.MaxStoreSkuStockQty, // "category_id": utils.Str2Int64(storeSku.VendorCatID), "predict_cat": 0, // 不使用推荐类目 // "cat3_id": getEbaiCat(storeSku.VendorVendorCatID), - "weight": storeSku.Weight, - "photos": photos, + "weight": storeSku.Weight, + "photos": photos, + "preparation_time": storeSku.PreparationTime, } if !isExd { params["category_id"] = utils.Str2Int64(storeSku.VendorCatID) @@ -347,6 +368,21 @@ func genSkuParamsFromStoreSkuInfo2(storeSku *dao.StoreSkuSyncInfo, isCreate, isE params["cat3_id"] = storeSku.ExdCategoryThirdID params["category_id"] = utils.Str2Int64WithDefault(storeSku.VendorCatID, 0) } + //证明是果园的几个果切分类,需要填加工服务 + if gygqVendorCatID[int(storeSku.VendorVendorCatID)] == 1 { + params["process_type"] = model.YES + processDetail := []map[string]interface{}{ + map[string]interface{}{ + "type": "去皮", + "time": 2, + }, + map[string]interface{}{ + "type": "不加工", + "time": 0, + }, + } + params["process_detail"] = processDetail + } if storeSku.DescImg != "" { params["rtf"] = storeSku.DescImg } diff --git a/business/partner/purchase/jd/sku2.go b/business/partner/purchase/jd/sku2.go index 5d2717984..f9da68b38 100644 --- a/business/partner/purchase/jd/sku2.go +++ b/business/partner/purchase/jd/sku2.go @@ -164,9 +164,15 @@ func skuInfo2Param(ctx *jxcontext.Context, sku *dao.StoreSkuSyncInfo) (param *jd FixedStatus: jxStatus2jdStatus(sku.MergedStatus), IsSale: jdapi.IsSaleNo, // todo ? - Upc: sku.Upc, - Images: jxutils.BatchString2Slice(sku.Img, sku.Img2), + Upc: sku.Upc, + // Images: jxutils.BatchString2Slice(sku.Img, sku.Img2), } + if sku.ImgMix != "" { + param.Images = jxutils.BatchString2Slice(sku.ImgMix, sku.Img2) + } else { + param.Images = jxutils.BatchString2Slice(sku.Img, sku.Img2) + } + if param.CategoryID == 0 { param.CategoryID = int64(getDefJdCategoryID()) } diff --git a/business/partner/purchase/jd/store.go b/business/partner/purchase/jd/store.go index aca822b80..14e966040 100644 --- a/business/partner/purchase/jd/store.go +++ b/business/partner/purchase/jd/store.go @@ -148,7 +148,7 @@ func (p *PurchaseHandler) UpdateStore(db *dao.DaoDB, storeID int, userName strin StationNo: store.VendorStoreID, Operator: userName, Phone: phone, - Mobile: store.Tel2, + Mobile: store.Tel1, } if store.SyncStatus&model.SyncFlagDeletedMask == 0 { storeParams.OutSystemID = utils.Int2Str(int(store.ID)) diff --git a/business/partner/purchase/jdshop/order.go b/business/partner/purchase/jdshop/order.go index 7b37f7363..219514524 100644 --- a/business/partner/purchase/jdshop/order.go +++ b/business/partner/purchase/jdshop/order.go @@ -62,9 +62,9 @@ func (p *PurchaseHandler) PickupGoods(order *model.GoodsOrder, isSelfDelivery bo status, err := p.GetOrderStatus("", order.VendorOrderID2) //说明此时该订单在平台上已经取消了 if status == model.OrderStatusApplyCancel { - err = ChangeOrderStatus(order.VendorOrderID, model.OrderStatusFinishedPickup, "自动拣货完成") - } else { err = ChangeOrderStatus(order.VendorOrderID, model.OrderStatusCanceled, "订单状态发生了改变") + } else { + err = ChangeOrderStatus(order.VendorOrderID, model.OrderStatusFinishedPickup, "自动拣货完成") } return err } @@ -100,6 +100,7 @@ func (p *PurchaseHandler) AgreeOrRefuseCancel(ctx *jxcontext.Context, order *mod return err } func (p *PurchaseHandler) CancelOrder(ctx *jxcontext.Context, order *model.GoodsOrder, reason string) (err error) { + ChangeOrderStatus(order.VendorOrderID, model.OrderStatusCanceled, reason) return err } func (p *PurchaseHandler) AdjustOrder(ctx *jxcontext.Context, order *model.GoodsOrder, removedSkuList []*model.OrderSku, reason string) (err error) { diff --git a/business/partner/purchase/jdshop/store_sku.go b/business/partner/purchase/jdshop/store_sku.go index c824cb56d..fbfa20e7c 100644 --- a/business/partner/purchase/jdshop/store_sku.go +++ b/business/partner/purchase/jdshop/store_sku.go @@ -122,6 +122,7 @@ func (p *PurchaseHandler) UpdateStoreSkus(ctx *jxcontext.Context, storeID int, v VenderID: jdshopapi.VenderID, PromiseID: jdshopapi.JdsPromiseID, ShopCategorys: []int{utils.Str2Int(v.VendorCatID)}, + JdPrice: jxutils.IntPrice2Standard(v.UnitPrice), } var desc string if v.DescImg != "" { @@ -178,11 +179,7 @@ func (p *PurchaseHandler) UpdateStoreSkus(ctx *jxcontext.Context, storeID int, v imageURL, err = uploadImg(img, name, "tou") } } - err2 := api.JdShopAPI.TransparentImageAdd(v.JdsWareID, imageURL) - if err2 != nil { - failedList = putils.GetErrMsg2FailedSingleList(storeSkuList, err, storeID, model.VendorChineseNames[model.VendorIDJDShop], "更新商品基础信息") - return failedList, err - } + api.JdShopAPI.TransparentImageAdd(v.JdsWareID, imageURL) } for _, vv := range v.StoreSkuSyncInfoJds { updateSkusParam, err := buildUpdateSkusParam(v, vv, false) @@ -190,8 +187,7 @@ func (p *PurchaseHandler) UpdateStoreSkus(ctx *jxcontext.Context, storeID int, v failedList = putils.GetErrMsg2FailedSingleList(storeSkuList, err, storeID, model.VendorChineseNames[model.VendorIDJDShop], "更新商品基础信息") return failedList, err } - vendorSkuID, err := api.JdShopAPI.UpdateSkus(updateSkusParam) - vv.VendorSkuID = vendorSkuID + _, err = api.JdShopAPI.UpdateSkus(updateSkusParam) } } if err != nil { @@ -209,9 +205,10 @@ func (p *PurchaseHandler) DeleteStoreSkus(ctx *jxcontext.Context, storeID int, v if err == nil { err = api.JdShopAPI.DeleteWare(utils.Str2Int(v.VendorSkuID2)) } - } - if err != nil { - failedList = putils.GetErrMsg2FailedSingleList(storeSkuList, err, storeID, model.VendorChineseNames[model.VendorIDJDShop], "删除商品") + if err != nil { + failedList = append(failedList, putils.GetErrMsg2FailedSingleList(storeSkuList, err, storeID, model.VendorChineseNames[model.VendorIDJDShop], "删除商品")...) + + } } } return failedList, err @@ -240,10 +237,10 @@ func (p *PurchaseHandler) UpdateStoreSkusStatus(ctx *jxcontext.Context, vendorOr if globals.EnableJdShopWrite { var stock = 0 for _, v := range storeSkuList { - if status == model.SkuStatusNormal { - stock = 9999 - } if storeID == model.JdShopMainStoreID { + if status == model.SkuStatusNormal { + stock = 9999 + } if v.JdsStockSwitch == model.NO { stock = 0 } @@ -253,6 +250,9 @@ func (p *PurchaseHandler) UpdateStoreSkusStatus(ctx *jxcontext.Context, vendorOr err = err2 if len(storeSkus) > 0 { if storeSkus[0].JdsID != 0 && vendorStoreID != "" { + if storeSkus[0].Status == model.SkuStatusNormal { + stock = 9999 + } err = api.JdShopAPI.UpdateSkuSiteStock(storeSkus[0].JdsID, stock, utils.Str2Int(vendorStoreID)) } } @@ -269,9 +269,9 @@ func (p *PurchaseHandler) UpdateStoreSkusPrice(ctx *jxcontext.Context, vendorOrg if globals.EnableJdShopWrite && vendorStoreID == model.JdShopMainVendorStoreID { for _, v := range storeSkuList { err = api.JdShopAPI.UpdateSkuJdPrice(utils.Str2Int(v.VendorSkuID), jxutils.IntPrice2Standard(v.VendorPrice)) - } - if err != nil { - failedList = putils.GetErrMsg2FailedSingleList(storeSkuList, err, storeID, model.VendorChineseNames[model.VendorIDJDShop], "修改商品价格") + if err != nil { + failedList = append(failedList, putils.GetErrMsg2FailedSingleList(storeSkuList, err, storeID, model.VendorChineseNames[model.VendorIDJDShop], "修改商品价格")...) + } } } return failedList, err @@ -660,9 +660,17 @@ func buildCreateWareParam(storeSku *dao.StoreSkuSyncInfo) (createSkuParamWare *j ggValueID int64 //规格的属性id attrsPropSku []*jdshopapi.CreateSkuParamAttrs multiPropSku []*jdshopapi.CreateSkuParamAttrs + specQuality string ) valuesSku, maxNo, _ := api.JdShopAPI.FindValuesByAttrId(attrIDs["规格"]) - specQuality := utils.Float64ToStr(float64(v.SpecQuality)) + v.SpecUnit + if v.SpecUnit == model.SpecUnitNames[1] || v.SpecUnit == model.SpecUnitNames[2] { + specQuality = strings.TrimRight(fmt.Sprintf("%.2f", float64(v.SpecQuality)), "0.") + v.SpecUnit + } else { + specQuality = utils.Float64ToStr(float64(v.SpecQuality)) + v.SpecUnit + } + if v.Comment != "" { + specQuality = v.Comment + } for _, v := range valuesSku { if v.Name == specQuality { ggValueID = v.ID @@ -754,40 +762,16 @@ func filterSensitiveWord(name string) (result string) { } func buildUpdateSkusParam(storeSku *dao.StoreSkuSyncInfo, v *dao.StoreSkuSyncInfo, isCreate bool) (updateSkusParam *jdshopapi.UpdateSkusParam, err error) { - updateSkusParam = &jdshopapi.UpdateSkusParam{ - WareID: storeSku.JdsWareID, - } - attrIDs := make(map[string]int) - attrs, err := api.JdShopAPI.FindAttrs(int(storeSku.VendorVendorCatID)) - for _, v := range attrs { - if v.Name == "规格" { - attrIDs[v.Name] = v.ID - } else if v.Name == "类别" { - attrIDs[v.Name] = v.ID - } - } var ( ggValueID int64 //规格的属性id attrsPropSku []*jdshopapi.CreateSkuParamAttrs skus []*jdshopapi.UpdateSkusParamSkus multiPropSku []*jdshopapi.CreateSkuParamAttrs + specQuality string ) - valuesSku, maxNo, _ := api.JdShopAPI.FindValuesByAttrId(attrIDs["规格"]) - specQuality := utils.Float64ToStr(float64(v.SpecQuality)) + v.SpecUnit - for _, v := range valuesSku { - if v.Name == specQuality { - ggValueID = v.ID - } + updateSkusParam = &jdshopapi.UpdateSkusParam{ + WareID: storeSku.JdsWareID, } - if ggValueID == 0 { //说明没有建这个规格,要建上 - catID, _ := api.JdShopAPI.SaveVenderAttrValue(specQuality, attrIDs["规格"], int(storeSku.VendorVendorCatID), maxNo+1) - ggValueID = catID - } - attrSku := &jdshopapi.CreateSkuParamAttrs{ - AttrID: utils.Int2Str(attrIDs["规格"]), - AttrValues: []string{utils.Int64ToStr(ggValueID)}, - } - attrsPropSku = append(attrsPropSku, attrSku) sku := &jdshopapi.UpdateSkusParamSkus{ WareID: storeSku.JdsWareID, JdPrice: jxutils.IntPrice2Standard(v.VendorPrice), @@ -795,17 +779,20 @@ func buildUpdateSkusParam(storeSku *dao.StoreSkuSyncInfo, v *dao.StoreSkuSyncInf Type2: "com.jd.pop.ware.ic.api.domain.Sku", OuterID: utils.Int2Str(v.SkuID), } - sku.SaleAttrs = attrsPropSku - if v.Status == model.SkuStatusNormal { + //库存设置 + if v.StoreSkuStatus == model.SkuStatusNormal { sku.StockNum = "9999" } else { sku.StockNum = "0" } - if !isCreate { - result, err2 := api.JdShopAPI.FindSkuById(utils.Str2Int64(v.VendorSkuID)) - err = err2 - if specQuality != result.SaleAttrs[0].AttrValueAlias[0] { - api.JdShopAPI.DeleteSku(utils.Str2Int64(v.VendorSkuID)) + //规格类别设置 + attrIDs := make(map[string]int) + attrs, err := api.JdShopAPI.FindAttrs(int(storeSku.VendorVendorCatID)) + for _, v := range attrs { + if v.Name == "规格" { + attrIDs[v.Name] = v.ID + } else if v.Name == "类别" { + attrIDs[v.Name] = v.ID } } if attrIDs["类别"] != 0 { @@ -819,6 +806,58 @@ func buildUpdateSkusParam(storeSku *dao.StoreSkuSyncInfo, v *dao.StoreSkuSyncInf multiPropSku = append(multiPropSku, attrlb) } sku.MultiCateProps = multiPropSku + if v.SpecUnit == model.SpecUnitNames[1] || v.SpecUnit == model.SpecUnitNames[2] { + specQuality = strings.TrimRight(fmt.Sprintf("%.2f", float64(v.SpecQuality)), "0.") + v.SpecUnit + } else { + specQuality = utils.Float64ToStr(float64(v.SpecQuality)) + v.SpecUnit + } + valuesSku, maxNo, _ := api.JdShopAPI.FindValuesByAttrId(attrIDs["规格"]) + if isCreate { + for _, vv := range valuesSku { + if vv.Name == specQuality { + ggValueID = vv.ID + break + } + } + if ggValueID == 0 { //说明没有建这个规格,要建上 + catID, _ := api.JdShopAPI.SaveVenderAttrValue(specQuality, attrIDs["规格"], int(storeSku.VendorVendorCatID), maxNo+1) + ggValueID = catID + } + attrSku := &jdshopapi.CreateSkuParamAttrs{ + AttrID: utils.Int2Str(attrIDs["规格"]), + AttrValues: []string{utils.Int64ToStr(ggValueID)}, + } + attrsPropSku = append(attrsPropSku, attrSku) + sku.SaleAttrs = attrsPropSku + } else { + vendorSku, err2 := api.JdShopAPI.FindSkuById(utils.Str2Int64(v.VendorSkuID)) + err = err2 + vendorAttrValue := vendorSku.SaleAttrs[0].AttrValueAlias[0] + if v.Comment != "" { + specQuality = v.Comment + } + if v.Comment != vendorAttrValue { + err = api.JdShopAPI.UpdateWareSaleAttrvalueAlias(&jdshopapi.UpdateWareSaleAttrvalueAliasParam{ + WareID: v.JdsWareID, + Props: []*jdshopapi.CreateSkuParamAttrs2{ + &jdshopapi.CreateSkuParamAttrs2{ + AttrID: vendorSku.SaleAttrs[0].AttrID, + AttrValues: []string{vendorSku.SaleAttrs[0].AttrValues[0]}, + AttrValueAlias: []string{specQuality}, + Type: "com.jd.pop.ware.ic.api.domain.prop", + Type2: "com.jd.pop.ware.ic.api.domain.Prop", + }, + }, + }) + sku.SkuID = utils.Str2Int64(v.VendorSkuID) + } + attrSku := &jdshopapi.CreateSkuParamAttrs{ + AttrID: vendorSku.SaleAttrs[0].AttrID, + AttrValues: []string{vendorSku.SaleAttrs[0].AttrValues[0]}, + } + attrsPropSku = append(attrsPropSku, attrSku) + sku.SaleAttrs = attrsPropSku + } skus = append(skus, sku) updateSkusParam.Skus = skus return updateSkusParam, err diff --git a/business/partner/purchase/jx/localjx/order.go b/business/partner/purchase/jx/localjx/order.go index 7614f9449..ee675ec6c 100644 --- a/business/partner/purchase/jx/localjx/order.go +++ b/business/partner/purchase/jx/localjx/order.go @@ -1423,7 +1423,7 @@ func GetMatterOrderStatus(ctx *jxcontext.Context, vendorOrderID string) (result var ( db = dao.GetDB() ) - order, err := partner.CurOrderManager.LoadOrder(vendorOrderID, model.VendorIDJX) + order, err := dao.GetSimpleOrder(db, vendorOrderID) if err != nil { return nil, err } diff --git a/business/partner/purchase/mtwm/store_sku2.go b/business/partner/purchase/mtwm/store_sku2.go index d33a2e9dc..432f3611f 100644 --- a/business/partner/purchase/mtwm/store_sku2.go +++ b/business/partner/purchase/mtwm/store_sku2.go @@ -5,6 +5,8 @@ import ( "regexp" "strings" + "github.com/astaxie/beego" + "git.rosy.net.cn/baseapi/platformapi/mtwmapi" "git.rosy.net.cn/baseapi/utils" "git.rosy.net.cn/jx-callback/business/jxutils" @@ -246,7 +248,7 @@ func (p *PurchaseHandler) createOrUpdateStoreSkus(ctx *jxcontext.Context, storeI syncType = "更新商品" } for i, storeSku := range storeSkuList { - isNeedUpdatePrice := isCreate //storeSku.SkuSyncStatus&( model.SyncFlagPriceMask| model.SyncFlagNewMask) != 0 + isNeedUpdatePrice := storeSku.SkuSyncStatus&(model.SyncFlagPriceMask|model.SyncFlagNewMask) != 0 foodData := make(map[string]interface{}) foodDataList[i] = foodData foodData[mtwmapi.KeyAppFoodCode] = utils.Int2Str(storeSku.SkuID) @@ -265,6 +267,9 @@ func (p *PurchaseHandler) createOrUpdateStoreSkus(ctx *jxcontext.Context, storeI foodData["unit"] = storeSku.Unit foodData["box_num"] = 1 foodData["box_price"] = jxutils.IntPrice2Standard(storeSku.BoxFee) + if beego.BConfig.RunMode == "jxgy" { + foodData["common_attr_value"] = switchAttr(storeSku.VendorVendorCatID) + } catCode := tryCatName2Code(storeSku.VendorCatID) if catCode != "" { foodData["category_code"] = catCode @@ -277,7 +282,11 @@ func (p *PurchaseHandler) createOrUpdateStoreSkus(ctx *jxcontext.Context, storeI if img2 == "" { img2 = storeSku.Img } - foodData["picture"] = strings.Join(jxutils.BatchString2Slice(storeSku.Img, img2, storeSku.Img, storeSku.Img, storeSku.Img), ",") + if storeSku.ImgMix != "" { + foodData["picture"] = strings.Join(jxutils.BatchString2Slice(storeSku.ImgMix, img2, storeSku.ImgMix, storeSku.ImgMix, storeSku.ImgMix), ",") + } else { + foodData["picture"] = strings.Join(jxutils.BatchString2Slice(storeSku.Img, img2, storeSku.Img, storeSku.Img, storeSku.Img), ",") + } } else { foodData["picture"] = strings.Join(jxutils.BatchString2Slice(storeSku.Img, storeSku.Img2), ",") } @@ -360,6 +369,28 @@ func (p *PurchaseHandler) DeleteStoreSkus(ctx *jxcontext.Context, storeID int, v return failedList, err } +func switchAttr(vendorCatID int64) (attrs string) { + switch vendorCatID { + case 200002727: + return mtwmapi.MtwmSkuAttr200002727 + case 200001555: + return mtwmapi.MtwmSkuAttr200001555 + case 200002728: + return mtwmapi.MtwmSkuAttr200002728 + case 200001519, 200000592: + return mtwmapi.MtwmSkuAttr200000592 + case 200002704, 200002731: + return mtwmapi.MtwmSkuAttr200002731 + case 200002716: + return mtwmapi.MtwmSkuAttr200002716 + case 200002667, 200002713, 200002670: + return mtwmapi.MtwmSkuAttr200002670 + case 200002680: + return mtwmapi.MtwmSkuAttr200002680 + } + return attrs +} + func stockCount2Mtwm(stock int) (mtwmStock string) { return utils.Int2Str(stock) } diff --git a/conf/app.conf b/conf/app.conf index f9ab2bab5..ef6f86ce8 100644 --- a/conf/app.conf +++ b/conf/app.conf @@ -395,7 +395,7 @@ enableElmStoreWrite = false enableMtwmStoreWrite = false enableWscStoreWrite = false enableYbStoreWrite = false -enableJdShopWrite = false +enableJdShopWrite = true jdOrgCode = "320406" jdLoginName = "jd_jxcs1223" diff --git a/controllers/cms_sku.go b/controllers/cms_sku.go index 1f5c9fe13..bd04f8fb0 100644 --- a/controllers/cms_sku.go +++ b/controllers/cms_sku.go @@ -199,6 +199,8 @@ func (c *SkuController) UpdateSkuName() { delete(payload, "exPrefix") delete(payload, "exPrefixBegin") delete(payload, "exPrefixEnd") + delete(payload, "imgWaterMark") + delete(payload, "exVendorID") retVal, err = cms.UpdateSkuName(params.Ctx, params.NameID, payload, params.IsExd) } return retVal, "", err @@ -403,9 +405,11 @@ func (c *SkuController) GetJdUpcCodeByName() { // @Description 批量设置商品额外前缀 // @Param token header string true "认证token" // @Param nameIDs formData string true "商品nameIDs" -// @Param exPrefix formData string true "商品额外前缀" +// @Param exPrefix formData string false "商品额外前缀" // @Param fromDate formData string true "生效开始时间,格式 2006-01-01 " // @Param toDate formData string true "生效结束时间,格式 2006-01-01 " +// @Param imgWaterMark formData string false "商品水印图" +// @Param vendorID formData int true "平台ID" // @Param isAsync formData bool false "是否异步" // @Param isContinueWhenError formData bool false "单个同步失败是否继续,缺省false" // @Success 200 {object} controllers.CallResult @@ -415,7 +419,7 @@ func (c *SkuController) UpdateSkuNamesExPrefix() { c.callUpdateSkuNamesExPrefix(func(params *tSkuUpdateSkuNamesExPrefixParams) (retVal interface{}, errCode string, err error) { var skuIDList []int if err = jxutils.Strings2Objs(params.NameIDs, &skuIDList); err == nil { - retVal, err = cms.UpdateSkuNamesExPrefix(params.Ctx, skuIDList, params.ExPrefix, params.FromDate, params.ToDate, params.IsAsync, params.IsContinueWhenError) + retVal, err = cms.UpdateSkuNamesExPrefix(params.Ctx, skuIDList, params.ImgWaterMark, params.VendorID, params.ExPrefix, params.FromDate, params.ToDate, params.IsAsync, params.IsContinueWhenError) } return retVal, "", err }) @@ -479,3 +483,27 @@ func (c *SkuController) RefreshJdDepot() { return retVal, "", err }) } + +// @Title 批量设置商品额外信息 +// @Description 批量设置商品额外信息 +// @Param token header string true "认证token" +// @Param nameIDs formData string true "商品nameIDs" +// @Param exPrefix formData string false "商品额外前缀" +// @Param fromDate formData string true "生效开始时间,格式 2006-01-01 " +// @Param toDate formData string true "生效结束时间,格式 2006-01-01 " +// @Param imgWaterMark formData string false "商品水印图" +// @Param vendorID formData int true "平台ID" +// @Param isAsync formData bool false "是否异步" +// @Param isContinueWhenError formData bool false "单个同步失败是否继续,缺省false" +// @Success 200 {object} controllers.CallResult +// @Failure 200 {object} controllers.CallResult +// @router /UpdateSkuExinfoMap [put] +func (c *SkuController) UpdateSkuExinfoMap() { + c.callUpdateSkuExinfoMap(func(params *tSkuUpdateSkuExinfoMapParams) (retVal interface{}, errCode string, err error) { + var skuIDList []int + if err = jxutils.Strings2Objs(params.NameIDs, &skuIDList); err == nil { + retVal, err = cms.UpdateSkuExinfoMap(params.Ctx, skuIDList, params.ImgWaterMark, params.VendorID, params.ExPrefix, params.FromDate, params.ToDate, params.IsAsync, params.IsContinueWhenError) + } + return retVal, "", err + }) +} diff --git a/controllers/cms_store.go b/controllers/cms_store.go index d24330b3c..01c32e164 100644 --- a/controllers/cms_store.go +++ b/controllers/cms_store.go @@ -42,6 +42,7 @@ type StoreController struct { // @Param orderCountTo query int false "订单量结束" // @Param marketManPhone query string false "市场负责人电话" // @Param briefLevel query int false "返回信息精简模式" +// @Param storeLevels query string false "门店等级" // @Param offset query int false "门店列表起始序号(以0开始,缺省为0)" // @Param pageSize query int false "门店列表页大小(缺省为50,-1表示全部)" // @Success 200 {object} controllers.CallResult diff --git a/controllers/jx_order.go b/controllers/jx_order.go index 640f07f68..a4d044b51 100644 --- a/controllers/jx_order.go +++ b/controllers/jx_order.go @@ -1088,3 +1088,18 @@ func (c *OrderController) SendJdwlForJdsOrder() { return retVal, "", err }) } + +// @Title 手动拉取京东商城订单 +// @Description 手动拉取京东商城订单 +// @Param token header string true "认证token" +// @Param fromTime formData string true "订单起始时间" +// @Param toTime formData string true "订单结束时间" +// @Success 200 {object} controllers.CallResult +// @Failure 200 {object} controllers.CallResult +// @router /SaveJdsOrders [post] +func (c *OrderController) SaveJdsOrders() { + c.callSaveJdsOrders(func(params *tOrderSaveJdsOrdersParams) (retVal interface{}, errCode string, err error) { + err = orderman.SaveJdsOrders(params.Ctx, utils.Str2Time(params.FromTime), utils.Str2Time(params.ToTime)) + return retVal, "", err + }) +} diff --git a/globals/beegodb/beegodb.go b/globals/beegodb/beegodb.go index fe01980d6..17217e5d3 100644 --- a/globals/beegodb/beegodb.go +++ b/globals/beegodb/beegodb.go @@ -35,6 +35,7 @@ func Init() { orm.RegisterModel(&model.StoreSkuAudit{}) orm.RegisterModel(&model.SkuCategory{}) orm.RegisterModel(&model.ThingMap{}) + orm.RegisterModel(&model.SkuExinfoMap{}) orm.RegisterModel(&model.AuthBind{}, &model.User{}) diff --git a/main.go b/main.go index 59532647a..6d77b0f82 100644 --- a/main.go +++ b/main.go @@ -143,8 +143,11 @@ func main() { if err := tasks.RefreshYilianyunToken(); err != nil { globals.SugarLogger.Errorf("RefreshYilianyunToken failed with error:%s", err) return - } + } + // if globals.IsProductEnv() { + // orderman.SaveJdsOrders(nil, time.Now().Add(-2*time.Hour), time.Now()) + // } orderman.LoadPendingOrders() // 延时的原因是等回调准备好 diff --git a/routers/commentsRouter_controllers.go b/routers/commentsRouter_controllers.go index 14ea8c384..79bf8f9aa 100644 --- a/routers/commentsRouter_controllers.go +++ b/routers/commentsRouter_controllers.go @@ -2816,5 +2816,4 @@ func init() { MethodParams: param.Make(), Filters: nil, Params: nil}) - }