diff --git a/business/jxcallback/orderman/order.go b/business/jxcallback/orderman/order.go index 810e68296..93a9c6705 100644 --- a/business/jxcallback/orderman/order.go +++ b/business/jxcallback/orderman/order.go @@ -377,27 +377,33 @@ func (c *OrderManager) updateOrderSkuOtherInfo(order *model.GoodsOrder, db *dao. //TODO 重复购买有活动且结算价大于0的商品需要拆分,第一个商品按结算价,后面的商品按shopprice 或者 saleprice, 2020-05-06 //TODO 京东美团的订单,做活动的商品之前就会拆分出来,所以只做更新,饿百暂时不管, 2020-05-07 //TODO 不根据商品是否拆分,直接根据该商品做了活动,并且他的vendorPrice 和 salePrice 相等,就按新规则结算, 2020-05-11 + //TODO 现在不判断商品做没做活动,只要vendorPrice和salePrice不等,就默认为做了活动,不做活动的商品就按新规则结算,2020-05-18 if order.VendorID == model.VendorIDJD || order.VendorID == model.VendorIDMTWM { for _, v := range orderSkus { if v.EarningPrice > 0 { - var storeID int - if order.StoreID == 0 { - storeID = order.JxStoreID - } else { - storeID = order.StoreID - } - result, err := dao.GetEffectiveActStoreSkuInfo2(db, 0, []int{order.VendorID}, []int{model.ActSkuSecKill, model.ActSkuDirectDown}, []int{storeID}, []int{v.SkuID}, order.OrderCreatedAt, order.OrderCreatedAt) - if (len(result) > 0 && err == nil) || v.IsVendorAct == model.YES { - if v.VendorPrice == v.SalePrice { - var earningPrice = 0 - if v.ShopPrice < v.SalePrice { - earningPrice = int(utils.Float64TwoInt64(math.Round(utils.Int2Float64(int(v.ShopPrice)) * utils.Int2Float64(storePayPercentage) / 100))) - } else { + // var storeID int + // if order.StoreID == 0 { + // storeID = order.JxStoreID + // } else { + // storeID = order.StoreID + // } + // result, err := dao.GetEffectiveActStoreSkuInfo2(db, 0, []int{order.VendorID}, []int{model.ActSkuSecKill, model.ActSkuDirectDown}, []int{storeID}, []int{v.SkuID}, order.OrderCreatedAt, order.OrderCreatedAt) + // if (len(result) > 0 && err == nil) || v.IsVendorAct == model.YES { + if v.VendorPrice == v.SalePrice { + var earningPrice = 0 + if v.ShopPrice < v.SalePrice { + if v.ShopPrice == 0 { earningPrice = int(utils.Float64TwoInt64(math.Round(utils.Int2Float64(int(v.SalePrice)) * utils.Int2Float64(storePayPercentage) / 100))) + } else { + earningPrice = int(utils.Float64TwoInt64(math.Round(utils.Int2Float64(int(v.ShopPrice)) * utils.Int2Float64(storePayPercentage) / 100))) } - v.EarningPrice = int64(earningPrice) + } else { + earningPrice = int(utils.Float64TwoInt64(math.Round(utils.Int2Float64(int(v.SalePrice)) * utils.Int2Float64(storePayPercentage) / 100))) } + v.EarningPrice = int64(earningPrice) + // v.StoreSubID = 0 } + // } } } } @@ -422,6 +428,9 @@ 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) @@ -738,7 +747,6 @@ func (c *OrderManager) RefreshHistoryOrdersEarningPrice(ctx *jxcontext.Context, task := tasksch.NewParallelTask("刷新历史订单结算价", tasksch.NewParallelConfig().SetIsContinueWhenError(isContinueWhenError), ctx, func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { order := batchItemList[0].(*model.GoodsOrder) - fmt.Println("test333333333333333333333333333333", order.VendorOrderID) db := dao.GetDB() updateSingleOrderEarningPrice(order, db) dao.Begin(db) @@ -785,7 +793,20 @@ func (c *OrderManager) RefreshHistoryOrdersEarningPrice(ctx *jxcontext.Context, } } jxutils.RefreshOrderSkuRelated(order) - num, err := dao.UpdateEntity(db, order, "EarningPrice") + storeID := 0 + if order.StoreID == 0 { + storeID = order.JxStoreID + } else { + storeID = order.StoreID + } + store, _ := dao.GetStoreDetail(db, storeID, order.VendorID) + payPercentage := store.PayPercentage + if payPercentage <= 50 { + order.NewEarningPrice = order.TotalShopMoney * int64((100 - payPercentage/2)) / 100 + } else { + order.NewEarningPrice = order.EarningPrice + } + num, err := dao.UpdateEntity(db, order, "EarningPrice", "NewEarningPrice") if err != nil { return nil, err } @@ -946,3 +967,31 @@ func RefreshOrdersPriceInfo(ctx *jxcontext.Context, fromTime, toTime time.Time, } return hint, err } + +type GetOrderSimpleInfoResult struct { + VendorOrderID string `orm:"column(vendor_order_id)" json:"vendorOrderID"` + Status int `json:"status"` + WaybillVendorID int `orm:"column(waybill_vendor_id)" json:"waybillVendorID"` + CourierName string `json:"courierName"` + CourierMobile string `json:"courierMobile"` + Tel1 string `json:"tel1"` + MarketManPhone string `json:"marketManPhone"` +} + +func GetOrderSimpleInfo(ctx *jxcontext.Context, vendorOrderID string) (getOrderSimpleInfoResult *GetOrderSimpleInfoResult, err error) { + db := dao.GetDB() + sql := ` + SELECT a.vendor_order_id, a.status, a.waybill_vendor_id, c.courier_name, c.courier_mobile, b.tel1, b.market_man_phone + FROM goods_order a + JOIN store b ON IF(a.store_id <> '', a.store_id, a.jx_store_id) = b.id + LEFT JOIN waybill c ON c.vendor_order_id = a.vendor_order_id + WHERE a.vendor_order_id = ? + ` + sqlParams := []interface{}{vendorOrderID} + err = dao.GetRow(db, &getOrderSimpleInfoResult, sql, sqlParams) + if getOrderSimpleInfoResult == nil { + return getOrderSimpleInfoResult, fmt.Errorf("未查询到该订单的信息!") + } + + return getOrderSimpleInfoResult, err +} diff --git a/business/jxcallback/orderman/orderman_ext.go b/business/jxcallback/orderman/orderman_ext.go index e86b5649c..8eb0e4846 100644 --- a/business/jxcallback/orderman/orderman_ext.go +++ b/business/jxcallback/orderman/orderman_ext.go @@ -1367,3 +1367,27 @@ func RefreshJdShopOrdersEarningPrice(ctx *jxcontext.Context, orderStartTime, ord } return err } + +func GetOrderUserBuyFirst(ctx *jxcontext.Context, vendorOrderID string) (isFirst bool, err error) { + var orderPays []*model.OrderPay + sql := ` + SELECT b.* + FROM goods_order a, order_pay b + WHERE a.vendor_order_id = b.vendor_order_id + AND a.vendor_id = b.vendor_id + AND b.pay_finished_at <> 0 + AND a.vendor_id = ? + AND a.user_id = ( + SELECT user_id + FROM goods_order WHERE vendor_order_id = ?) + AND a.vendor_order_id <> ? + ` + sqlParams := []interface{}{model.VendorIDJX, vendorOrderID, vendorOrderID} + err = dao.GetRows(dao.GetDB(), &orderPays, sql, sqlParams) + if len(orderPays) > 0 { + return false, err + } else { + return true, err + } + return isFirst, err +} diff --git a/business/jxcallback/scheduler/basesch/basesch_ext.go b/business/jxcallback/scheduler/basesch/basesch_ext.go index 73531d641..556879844 100644 --- a/business/jxcallback/scheduler/basesch/basesch_ext.go +++ b/business/jxcallback/scheduler/basesch/basesch_ext.go @@ -44,7 +44,7 @@ func (c *BaseScheduler) CreateWaybillOnProviders(ctx *jxcontext.Context, order * stores, _ := dao.GetStoreList(dao.GetDB(), []int{order.StoreID}, nil, nil, nil, "") if len(stores) > 0 { if stores[0].PayPercentage <= 50 { - order.NewEarningPrice = (order.TotalShopMoney - bill.DesiredFee) * int64((100 - stores[0].PayPercentage/2)) / 10000 + order.NewEarningPrice = (order.TotalShopMoney - bill.DesiredFee) * int64((100 - stores[0].PayPercentage/2)) / 100 dao.UpdateEntity(dao.GetDB(), order, "NewEarningPrice") } } diff --git a/business/jxcallback/scheduler/defsch/defsch.go b/business/jxcallback/scheduler/defsch/defsch.go index fdb6c32d6..1a3df3005 100644 --- a/business/jxcallback/scheduler/defsch/defsch.go +++ b/business/jxcallback/scheduler/defsch/defsch.go @@ -516,6 +516,7 @@ func (s *DefScheduler) OnWaybillStatusChanged(bill *model.Waybill, isPending boo s.resetTimer(savedOrderInfo, bill, isPending) s.saveDeliveryFeeFromAndStartWatch(savedOrderInfo, bill.StatusTime) } + s.sendCourierOrderSMS(bill) } else { isBillExist := s.updateBillsInfo(savedOrderInfo, bill) if !isBillExist { @@ -654,6 +655,11 @@ func (s *DefScheduler) OnWaybillStatusChanged(bill *model.Waybill, isPending boo return err } +func (s *DefScheduler) sendCourierOrderSMS(bill *model.Waybill) (err error) { + err = smsmsg.NotifyNewCourierOrder(bill) + return err +} + func (s *DefScheduler) isWaybillCourierSame(savedOrderInfo *WatchOrderInfo, bill *model.Waybill) bool { return savedOrderInfo.waybills[bill.WaybillVendorID] != nil && savedOrderInfo.waybills[bill.WaybillVendorID].CourierMobile == bill.CourierMobile } @@ -1352,9 +1358,15 @@ func (s *DefScheduler) notifyNewOrder(order *model.GoodsOrder) { utils.CallFuncAsync(func() { order = setFakeActualPayPrice(order) netprinter.PrintOrderByOrder(jxcontext.AdminCtx, order) - weixinmsg.NotifyNewOrder(order) + //目前暂且认为AdjustCount > 0 就是调整单 + if order.AdjustCount > 0 { + weixinmsg.NotifyAdjustOrder(order) + } else { + weixinmsg.NotifyNewOrder(order) + } smsmsg.NotifyNewOrder(order) OrderProfitWarning(order) + smsmsg.NotifyNewUserOrder(order) }) } } diff --git a/business/jxstore/cms/cms.go b/business/jxstore/cms/cms.go index e6df5aa6c..3a420aa95 100644 --- a/business/jxstore/cms/cms.go +++ b/business/jxstore/cms/cms.go @@ -3,6 +3,7 @@ package cms import ( "fmt" "reflect" + "regexp" "strconv" "strings" "time" @@ -47,6 +48,8 @@ var ( "mtpsPrice": true, } + regexpMsgContentOpID = regexp.MustCompile(`"openid":"(.*?)"`) + receiveMsgUsersMap = map[string][]string{ SendMsgTypeOpenStoreRequest: []string{ "石锋", @@ -57,6 +60,7 @@ var ( "石锋", // "x", // "周扬", + // "苏尹岚", }, } needConfirmRequestMap = map[string]int{ @@ -224,6 +228,84 @@ func SendMsg2Somebody(ctx *jxcontext.Context, mobileNum, verifyCode, msgType, ms } } db := dao.GetDB() + //获取门店信息 + var ( + stores []*model.Store + authBinds []*model.AuthBind + order *model.GoodsOrder + storeName string + storeID int + vendorOrderID string + ) + if mobileNum != "" { + sql := ` + SELECT * FROM store WHERE (tel1 = ? OR tel2 = ?) AND deleted_at = ? + ` + sqlParams := []interface{}{mobileNum, mobileNum, utils.DefaultTimeValue} + err = dao.GetRows(db, &stores, sql, sqlParams) + if len(stores) > 0 { + storeName = stores[0].Name + storeID = stores[0].ID + } + if storeID == 0 { + results := regexpMsgContentOpID.FindStringSubmatch(msgContent) + if len(results) > 0 { + sql3 := ` + SELECT * FROM auth_bind WHERE auth_id = ? OR auth_id2 = ? + ` + sqlParams3 := []interface{}{results[1], results[1]} + err = dao.GetRows(db, &authBinds, sql3, sqlParams3) + if len(authBinds) > 0 { + user, _ := dao.GetUserByID(db, "user_id", authBinds[0].UserID) + mobileNum = *user.Mobile + sqlParams4 := []interface{}{mobileNum, mobileNum, utils.DefaultTimeValue} + err = dao.GetRows(db, &stores, sql, sqlParams4) + if len(stores) > 0 { + storeName = stores[0].Name + storeID = stores[0].ID + } + } + } + } + } else { + results := regexpMsgContentOpID.FindStringSubmatch(msgContent) + if len(results) > 0 { + sql3 := ` + SELECT * FROM auth_bind WHERE auth_id = ? OR auth_id2 = ? + ` + sqlParams3 := []interface{}{results[1], results[1]} + err = dao.GetRows(db, &authBinds, sql3, sqlParams3) + if len(authBinds) > 0 { + user, _ := dao.GetUserByID(db, "user_id", authBinds[0].UserID) + mobileNum = *user.Mobile + sql4 := ` + SELECT * FROM store WHERE (tel1 = ? OR tel2 = ?) AND deleted_at = ? + ` + sqlParams4 := []interface{}{mobileNum, mobileNum, utils.DefaultTimeValue} + err = dao.GetRows(db, &stores, sql4, sqlParams4) + if len(stores) > 0 { + storeName = stores[0].Name + storeID = stores[0].ID + } + } + } + } + sql2 := ` + SELECT * + FROM goods_order + WHERE IF(store_id <> '', store_id, jx_store_id) = ? + ORDER BY order_created_at DESC + LIMIT 1 + ` + sqlParams2 := []interface{}{storeID} + err = dao.GetRow(db, &order, sql2, sqlParams2) + if order != nil { + vendorOrderID = order.VendorOrderID + } + if storeID == 0 { + vendorOrderID = "" + } + msgContent = msgContent + " 门店名称:" + storeName + " 门店ID:" + utils.Int2Str(storeID) + " 最新订单号:" + vendorOrderID for _, v := range receiveMsgUsersMap[msgType] { user, err2 := dao.GetUserByID(db, "name", v) if err2 == nil { diff --git a/business/jxstore/cms/sku.go b/business/jxstore/cms/sku.go index 2a5f6aaf5..788bcd094 100644 --- a/business/jxstore/cms/sku.go +++ b/business/jxstore/cms/sku.go @@ -1120,6 +1120,34 @@ func AddSku(ctx *jxcontext.Context, nameID int, sku *model.Sku, userName string) err = ErrEntityNotExist } } + //增加规格则同步到门店,目前只做了京东商城的。 + storeSkus, err := dao.GetStoreSkusByNameIDs(db, []int{model.JdShopMainStoreID}, nameID) + if len(storeSkus) > 0 { + storeIDs := make(map[int]int) + storeMaps, err2 := dao.GetStoresMapList(db, []int{model.VendorIDJDShop}, nil, nil, model.StoreStatusAll, model.StoreIsSyncAll, "") + err = err2 + for _, v := range storeMaps { + storeSkus2, err2 := dao.GetStoreSkusByNameIDs(db, []int{v.StoreID}, nameID) + err = err2 + if len(storeSkus2) > 0 { + storeIDs[v.StoreID] = v.StoreID + } + } + skuBindInfos := []*StoreSkuBindInfo{} + for _, v := range storeIDs { + skus2 := []*StoreSkuBindSkuInfo{} + skuBindInfo := &StoreSkuBindInfo{ + StoreID: v, + } + sku2 := &StoreSkuBindSkuInfo{ + SkuID: sku.ID, + } + skus2 = append(skus2, sku2) + skuBindInfo.Skus = skus2 + skuBindInfos = append(skuBindInfos, skuBindInfo) + } + FocusStoreSkusBySku(ctx, skuBindInfos, true, true) + } return outSkuNameExt, err } @@ -1258,10 +1286,10 @@ func DeleteSku(ctx *jxcontext.Context, skuID int, userName string) (num int64, e return 0, err } dao.Commit(db) - if num == 1 { _, err = CurVendorSync.SyncSku(ctx, db, -1, sku.ID, false, false, userName) } + err = deleteJdsSku(db, skuID) return num, err } @@ -1293,6 +1321,7 @@ func DeleteStoreSku(ctx *jxcontext.Context, db *dao.DaoDB, nameID, skuID int) (n model.FieldJdSyncStatus: model.SyncFlagDeletedMask, model.FieldMtwmSyncStatus: model.SyncFlagDeletedMask, model.FieldEbaiSyncStatus: model.SyncFlagDeletedMask, + model.FieldJdsSyncStatus: model.SyncFlagDeletedMask, }, ctx.GetUserName(), map[string]interface{}{ model.FieldSkuID: v.ID, model.FieldDeletedAt: utils.DefaultTimeValue, @@ -2475,3 +2504,11 @@ func getImgFromNet(db *dao.DaoDB, upc string) (img string) { img = result.Img return img } + +func deleteJdsSku(db *dao.DaoDB, skuID int) (err error) { + storeBinds, err := dao.GetStoresSkusInfo(db, []int{model.JdShopMainStoreID}, []int{skuID}) + if err == nil { + err = api.JdShopAPI.DeleteSku(storeBinds[0].JdsID) + } + return err +} diff --git a/business/jxstore/cms/store.go b/business/jxstore/cms/store.go index 9a7504f51..b32cdd699 100644 --- a/business/jxstore/cms/store.go +++ b/business/jxstore/cms/store.go @@ -645,6 +645,9 @@ func getMapCenter(storeList []*StoreExt) (lng, lat float64) { } func GetVendorStore(ctx *jxcontext.Context, vendorID int, vendorOrgCode, vendorStoreID string) (retVal *StoreExt, err error) { + if vendorID == model.VendorIDJDShop && vendorStoreID == model.JdShopMainVendorStoreID { + return nil, err + } if handler := CurVendorSync.GetStoreHandler(vendorID); handler != nil { result, err2 := handler.ReadStore(ctx, vendorOrgCode, vendorStoreID) if err = err2; err == nil { @@ -1147,7 +1150,7 @@ func AddStoreVendorMap(ctx *jxcontext.Context, db *dao.DaoDB, vendorID int, vend storeMap.Status = model.StoreStatusOpened storeMap.DeliveryType = model.StoreDeliveryTypeByStore storeMap.SyncStatus = 0 - if vendorID != model.VendorIDJX && vendorID != model.VendorIDYB { + if vendorID != model.VendorIDJX && vendorID != model.VendorIDYB && vendorID != model.VendorIDJDShop { if storeMap.VendorOrgCode == "" { return nil, fmt.Errorf("必须指定平台分账号信息") } @@ -1171,30 +1174,64 @@ func AddStoreVendorMap(ctx *jxcontext.Context, db *dao.DaoDB, vendorID int, vend if err != nil { return nil, err } - } - if err == nil { - dao.WrapAddIDCULDEntity(storeMap, userName) - if db == nil { - db = dao.GetDB() - } - dao.Begin(db) - defer func() { - if r := recover(); r != nil { - dao.Rollback(db) - panic(r) - } - }() - if err = dao.CreateEntity(db, storeMap); err == nil { - if globals.IsAddEvent { - err = AddEventDetail(db, ctx, model.OperateAdd, vendorID, model.ThingTypeStore, storeID, "", `{"VendorID":`+utils.Int2Str(vendorID)+`}`) - } - dao.Commit(db) - outStoreMap = storeMap - _, err = CurVendorSync.SyncStore(ctx, db, storeMap.VendorID, storeID, false, userName) + } else if vendorID == model.VendorIDJDShop { + if storeMap.VendorStoreID == "" { + storeMap.SyncStatus = model.SyncFlagNewMask //京东商城要去建店 } else { - dao.Rollback(db) + if handler := CurVendorSync.GetStoreHandler(vendorID); handler != nil { + store, err2 := handler.ReadStore(ctx, vendorOrgCode, storeMap.VendorStoreID) + if err = err2; err == nil || storeMap.IsSync == 0 { + if store != nil { + storeMap.Status = store.Status + } + err = nil + storeMap.SyncStatus = model.SyncFlagModifiedMask | model.SyncFlagStoreName | model.SyncFlagStoreAddress + } else { + return nil, err + } + } else { + err = ErrCanNotFindVendor + } } } + storeMapList, err := dao.GetStoresMapList2(db, []int{vendorID}, []int{storeID}, nil, model.StoreStatusAll, model.StoreIsSyncAll, "", true) + if len(storeMapList) > 0 { + _, err = CurVendorSync.SyncStore(ctx, db, storeMap.VendorID, storeID, false, userName) + } else { + if err == nil { + dao.WrapAddIDCULDEntity(storeMap, userName) + if db == nil { + db = dao.GetDB() + } + dao.Begin(db) + defer func() { + if r := recover(); r != nil { + dao.Rollback(db) + panic(r) + } + }() + if err = dao.CreateEntity(db, storeMap); err == nil { + dao.Commit(db) + outStoreMap = storeMap + _, err = CurVendorSync.SyncStore(ctx, db, storeMap.VendorID, storeID, false, userName) + } else { + dao.Rollback(db) + } + } + } + if err != nil { + return outStoreMap, err + } + if vendorID == model.VendorIDJDShop { + //绑定京东商城后,需要对绑定的门店现有的和模板店相同且可售的商品设置京东商城的门店库存 + //TODO SyncFlagSaleMask对京东商城来说,修改门店商品状态就是修改库存 + if _, err = SetStoreSkuSyncStatus2(db, []int{storeID}, []int{model.VendorIDJDShop}, findSkusBetweenJdsMainStore(db, storeID), model.SyncFlagSaleMask); err == nil { + // CurVendorSync.SyncStoresSkus(ctx, nil, 0, db, nil, []int{storeID}, nil, false, true, true) + } + } + if globals.IsAddEvent { + err = AddEventDetail(db, ctx, model.OperateAdd, vendorID, model.ThingTypeStore, storeID, "", `{"VendorID":`+utils.Int2Str(vendorID)+`}`) + } return outStoreMap, err } @@ -2447,7 +2484,7 @@ func SyncStoresQualify(ctx *jxcontext.Context, storeIDs []int, isAsync, isContin func GetStoreListByLocation(ctx *jxcontext.Context, lng, lat float64, needWalkDistance bool) (storeList []*Store4User, err error) { const ( - maxRadius = 5000 + maxRadius = 8000 maxStoreCount4User = 5 ) @@ -2471,7 +2508,6 @@ func GetStoreListByLocation(ctx *jxcontext.Context, lng, lat float64, needWalkDi utils.DefaultTimeValue, model.StoreStatusDisabled, jxutils.StandardCoordinate2Int(lng1), jxutils.StandardCoordinate2Int(lng2), jxutils.StandardCoordinate2Int(lat1), jxutils.StandardCoordinate2Int(lat2), model.YES, } - var storeList1 []*Store4User if err = dao.GetRows(dao.GetDB(), &storeList1, sql, sqlParams...); err == nil { var storeList2 []*Store4User @@ -3123,3 +3159,20 @@ func DeleteStoreCategroies(ctx *jxcontext.Context, db *dao.DaoDB, storeID int) ( err = dao.DeleteStoreCategroies(db, ctx.GetUserName(), storeID) return err } + +func findSkusBetweenJdsMainStore(db *dao.DaoDB, storeID int) (skus []int) { + var skuMap = make(map[int]int) + storeSkus1, _ := dao.GetStoresSkusInfo(db, []int{model.JdShopMainStoreID}, nil) + storeSkus2, _ := dao.GetStoresSkusInfo(db, []int{storeID}, nil) + for _, v := range storeSkus1 { + if v.Status == model.SkuStatusNormal { + skuMap[v.SkuID] = 1 + } + } + for _, v := range storeSkus2 { + if v.Status == model.SkuStatusNormal && skuMap[v.SkuID] != 0 { + skus = append(skus, v.SkuID) + } + } + return skus +} diff --git a/business/jxstore/cms/store_sku.go b/business/jxstore/cms/store_sku.go index 19c55f3c0..93c513e16 100644 --- a/business/jxstore/cms/store_sku.go +++ b/business/jxstore/cms/store_sku.go @@ -13,6 +13,8 @@ import ( "time" "unicode" + "git.rosy.net.cn/baseapi/platformapi/jdshopapi" + "git.rosy.net.cn/jx-callback/globals/api" "git.rosy.net.cn/jx-callback/globals/refutil" @@ -537,10 +539,10 @@ func GetStoresSkusNew(ctx *jxcontext.Context, storeIDs, skuIDs []int, isFocus, i t2.comment, t2.category_id sku_category_id, t2.status sku_status, t2.eclp_id, t4.created_at bind_created_at, t4.updated_at bind_updated_at, t4.last_operator bind_last_operator, t4.deleted_at bind_deleted_at, t4.sub_store_id, t4.price bind_price, IF(t4.unit_price IS NOT NULL, t4.unit_price, t1.price) unit_price, t4.status store_sku_status, t4.auto_sale_at, - t4.ebai_id, t4.mtwm_id, t4.yb_id, CONCAT(smm.yb_store_prefix,t1.yb_name_suffix) yb_sku_name, - t4.jd_sync_status, t4.ebai_sync_status, t4.mtwm_sync_status, t4.yb_sync_status, - t4.jd_price, t4.ebai_price, t4.mtwm_price, t4.jx_price, t4.yb_price, - t4.jd_lock_time, t4.ebai_lock_time, t4.mtwm_lock_time, t4.jx_lock_time, t4.yb_lock_time, + t4.ebai_id, t4.mtwm_id, t4.yb_id, CONCAT(smm.yb_store_prefix,t1.yb_name_suffix) yb_sku_name, t4.jds_id, t4.jds_ware_id, + t4.jd_sync_status, t4.ebai_sync_status, t4.mtwm_sync_status, t4.yb_sync_status, t4.jds_sync_status, + t4.jd_price, t4.ebai_price, t4.mtwm_price, t4.jx_price, t4.yb_price, t4.jds_price, + t4.jd_lock_time, t4.ebai_lock_time, t4.mtwm_lock_time, t4.jx_lock_time, t4.yb_lock_time, t4.jds_lock_time, t4.status_sale_begin, t4.status_sale_end, t6.mid_unit_price real_mid_unit_price ` + sql @@ -853,7 +855,7 @@ func UpdateStoresSkus(ctx *jxcontext.Context, causeFlag int, storeIDs []int, sku return hint, err } -func UpdateStoresSkusByBind(ctx *jxcontext.Context, parentTask tasksch.ITask, skuBindInfos []*StoreSkuBindInfo, isAsync, isContinueWhenError bool) (hint string, err error) { +func UpdateStoresSkusByBind(ctx *jxcontext.Context, parentTask tasksch.ITask, skuBindInfos []*StoreSkuBindInfo, isAsync, isContinueWhenError, isFos bool) (hint string, err error) { // if len(skuBindInfos) > maxStoreNameBind { // return "", fmt.Errorf("门店商品信息大于%d", maxStoreNameBind) // } @@ -892,7 +894,7 @@ func UpdateStoresSkusByBind(ctx *jxcontext.Context, parentTask tasksch.ITask, sk isAsync = asyncStoreSkuOpFilter(ctx, isAsync) if num > 0 { skuIDs := jxutils.IntMap2List(skuIDMap) - hint, err = CurVendorSync.SyncStoresSkus(ctx, parentTask, 0, db, nil, storeIDs, skuIDs, false, isAsync, isContinueWhenError) + hint, err = CurVendorSync.SyncStoresSkus(ctx, parentTask, 0, db, nil, storeIDs, skuIDs, isFos, isAsync, isContinueWhenError) } if num == 0 || !isAsync || hint == "" { hint = utils.Int64ToStr(num) @@ -1132,6 +1134,7 @@ func updateStoresSkusWithoutSync(ctx *jxcontext.Context, db *dao.DaoDB, storeIDs model.FieldEbaiSyncStatus: model.SyncFlagDeletedMask, model.FieldMtwmSyncStatus: model.SyncFlagDeletedMask, model.FieldYbSyncStatus: model.SyncFlagDeletedMask, + model.FieldJdsSyncStatus: model.SyncFlagDeletedMask, }, userName, nil); err != nil { dao.Rollback(db) return nil, err @@ -2044,6 +2047,7 @@ func setStoreSkuBindStatus(skuBind *model.StoreSkuBind, status int8) { skuBind.EbaiSyncStatus |= status skuBind.MtwmSyncStatus |= status skuBind.YbSyncStatus |= status + skuBind.JdsSyncStatus |= status } func checkStoreExisting(db *dao.DaoDB, storeID int) (store *model.Store, err error) { @@ -3110,7 +3114,7 @@ func FocusStoreSkusByExcelBin(ctx *jxcontext.Context, reader io.Reader, isAsync, for _, v := range result1 { skuBindInfos = append(skuBindInfos, v.(*StoreSkuBindInfo)) } - UpdateStoresSkusByBind(ctx, task, skuBindInfos, true, true) + UpdateStoresSkusByBind(ctx, task, skuBindInfos, true, true, false) } return result, err } @@ -3205,7 +3209,7 @@ func FocusStoreSkusBySku(ctx *jxcontext.Context, skuBindInfos []*StoreSkuBindInf for _, v := range result1 { skuBindInfos = append(skuBindInfos, v.(*StoreSkuBindInfo)) } - hint, err = UpdateStoresSkusByBind(ctx, task, skuBindInfos, isAsync, isContinueWhenError) + hint, err = UpdateStoresSkusByBind(ctx, task, skuBindInfos, isAsync, isContinueWhenError, true) } return result, err } @@ -3301,7 +3305,7 @@ func AutoFocusStoreSkusForTopSkus(ctx *jxcontext.Context, isAsync, isContinueWhe for _, v := range result1 { skuBindInfos = append(skuBindInfos, v.(*StoreSkuBindInfo)) } - hint, err = UpdateStoresSkusByBind(ctx, nil, skuBindInfos, isAsync, isContinueWhenError) + hint, err = UpdateStoresSkusByBind(ctx, nil, skuBindInfos, isAsync, isContinueWhenError, false) } return result, err } @@ -3796,7 +3800,7 @@ func RefreshJxPriceByVendor(ctx *jxcontext.Context, jdStoreSkus []*JdStoreSkus, } } case 1: - _, err = UpdateStoresSkusByBind(ctx, nil, param, isAsync, isContinueWhenError) + _, err = UpdateStoresSkusByBind(ctx, nil, param, isAsync, isContinueWhenError, false) } return result, err } @@ -3879,7 +3883,7 @@ func RefreshJxPriceByVendor2(ctx *jxcontext.Context, storeIDs []int, vendorID in } } case 1: - _, err = UpdateStoresSkusByBind(ctx, nil, param, isAsync, isContinueWhenError) + _, err = UpdateStoresSkusByBind(ctx, nil, param, isAsync, isContinueWhenError, false) } return result, err } @@ -4131,7 +4135,7 @@ func CreateSkusAndFocusFromWx(ctx *jxcontext.Context, productInfo *jdapi.Product IsSale: 1, } skuBindInfos = append(skuBindInfos, skuBindInfo) - _, err := UpdateStoresSkusByBind(ctx, nil, skuBindInfos, true, true) + _, err := UpdateStoresSkusByBind(ctx, nil, skuBindInfos, true, true, false) if err != nil { err = nil } @@ -4424,3 +4428,17 @@ func focusC4Matters(ctx *jxcontext.Context, db *dao.DaoDB, v *model.Sku) (err er } return err } + +func RefreshJdsSkusStatus(ctx *jxcontext.Context) (err error) { + handler := partner.GetPurchasePlatformFromVendorID(model.VendorIDJDShop).(partner.ISingleStoreStoreSkuHandler) + remoteSkuList, err := handler.GetStoreSkusFullInfo(ctx, nil, 0, "", nil) + for _, v := range remoteSkuList { + if v.Status == jdshopapi.JdsSkuStatus2 { + reason, err := api.JdShopAPI.FindOpReason(utils.Str2Int64(v.VendorNameID)) + if err == nil && reason == jdshopapi.PassReason { + err = api.JdShopAPI.UpOrDown(utils.Str2Int64(v.VendorNameID), jdshopapi.JdsSkuStatus1) + } + } + } + return err +} diff --git a/business/jxstore/cms/sync.go b/business/jxstore/cms/sync.go index a39fd5322..aba24309c 100644 --- a/business/jxstore/cms/sync.go +++ b/business/jxstore/cms/sync.go @@ -233,32 +233,79 @@ func (v *VendorSync) SyncStore2(ctx *jxcontext.Context, db *dao.DaoDB, vendorIDs loopStoreTask := tasksch.NewParallelTask(fmt.Sprintf("处理平台%s", model.VendorChineseNames[loopMapInfo.VendorID]), tasksch.NewParallelConfig().SetIsContinueWhenError(true), ctx, func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { var resultList []interface{} + var vendorStoreID string storeMap := batchItemList[0].(*model.StoreMap) db2 := db if len(loopMapInfo.StoreMapList) > 1 { db2 = dao.GetDB() } - if err = handler.UpdateStore(db2, storeMap.StoreID, userName); err == nil { - storeMap.SyncStatus = 0 - _, err = dao.UpdateEntity(db2, storeMap, model.FieldSyncStatus) - resultList = append(resultList, 1) + if model.IsSyncStatusNew(storeMap.SyncStatus) { + if vendorStoreID, err = handler.CreateStore2(db2, storeMap.StoreID, userName); err == nil { + resultList = append(resultList, 1) + } else { + failedList = putils.GetErrMsg2FailedSingleList(nil, err, storeMap.StoreID, model.VendorChineseNames[storeMap.VendorID], "创建门店") + } + } else if model.IsSyncStatusDelete(storeMap.SyncStatus) { + if err = handler.DeleteStore(db2, storeMap.StoreID, userName); err == nil { + resultList = append(resultList, 1) + } else { + failedList = putils.GetErrMsg2FailedSingleList(nil, err, storeMap.StoreID, model.VendorChineseNames[storeMap.VendorID], "删除门店") + } } else { - failedList = putils.GetErrMsg2FailedSingleList(nil, err, storeMap.StoreID, model.VendorChineseNames[storeMap.VendorID], "同步门店") + if err = handler.UpdateStore(db2, storeMap.StoreID, userName); err == nil { + resultList = append(resultList, 1) + } else { + failedList = putils.GetErrMsg2FailedSingleList(nil, err, storeMap.StoreID, model.VendorChineseNames[storeMap.VendorID], "更新门店") + } + } + if err == nil { + if model.IsSyncStatusNew(storeMap.SyncStatus) { + storeMap.VendorStoreID = vendorStoreID + storeMap.SyncStatus = 0 + _, err = dao.UpdateEntity(db, storeMap, "VendorStoreID", model.FieldSyncStatus) + } else { + storeMap.SyncStatus = 0 + _, err = dao.UpdateEntity(db, storeMap, model.FieldSyncStatus) + } } return resultList, err }, loopMapInfo.StoreMapList) t.AddChild(loopStoreTask).Run() resultList, err = loopStoreTask.GetResult(0) } else { + var resultList []interface{} + db2 := db + var vendorStoreID string storeMap := loopMapInfo.StoreMapList[0] - if err = handler.UpdateStore(db, storeMap.StoreID, userName); err == nil { - storeMap.SyncStatus = 0 - _, err = dao.UpdateEntity(db, storeMap, model.FieldSyncStatus) + if model.IsSyncStatusNew(storeMap.SyncStatus) { + if vendorStoreID, err = handler.CreateStore2(db2, storeMap.StoreID, userName); err == nil { + resultList = append(resultList, 1) + } else { + failedList = putils.GetErrMsg2FailedSingleList(nil, err, storeMap.StoreID, model.VendorChineseNames[storeMap.VendorID], "创建门店") + } + } else if model.IsSyncStatusDelete(storeMap.SyncStatus) { + if err = handler.DeleteStore(db2, storeMap.StoreID, userName); err == nil { + resultList = append(resultList, 1) + } else { + failedList = putils.GetErrMsg2FailedSingleList(nil, err, storeMap.StoreID, model.VendorChineseNames[storeMap.VendorID], "删除门店") + } } else { - failedList = putils.GetErrMsg2FailedSingleList(nil, err, storeMap.StoreID, model.VendorChineseNames[storeMap.VendorID], "同步门店") + if err = handler.UpdateStore(db, storeMap.StoreID, userName); err == nil { + resultList = append(resultList, 1) + } else { + failedList = putils.GetErrMsg2FailedSingleList(nil, err, storeMap.StoreID, model.VendorChineseNames[storeMap.VendorID], "更新门店") + } } if err == nil { resultList = []interface{}{1} + if model.IsSyncStatusNew(storeMap.SyncStatus) { + storeMap.VendorStoreID = vendorStoreID + storeMap.SyncStatus = 0 + _, err = dao.UpdateEntity(db, storeMap, "VendorStoreID", model.FieldSyncStatus) + } else { + storeMap.SyncStatus = 0 + _, err = dao.UpdateEntity(db, storeMap, model.FieldSyncStatus) + } } } err = partner.AddVendorInfo2Err(err, loopMapInfo.VendorID) @@ -1036,3 +1083,136 @@ func syncStoreSkusFromYb(ctx *jxcontext.Context, storeID, vendorID int, vendorSt hint = taskSeq.GetID() return hint, err } + +func (v *VendorSync) SyncJdsStoresSkus(ctx *jxcontext.Context, storeIDs []int, isAsync, isContinueWhenError bool) (hint string, err error) { + var ( + db = dao.GetDB() + ) + _, 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 + } + 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 syncJdsStoresSkus(ctx *jxcontext.Context, db *dao.DaoDB, parentTask tasksch.ITask, storeMap *model.StoreMap, isAsync, isContinueWhenError bool) (hint string, err error) { + var ( + mainSkusMap = make(map[int]*model.StoreSkuBind) + skusMap = make(map[int]*model.StoreSkuBind) + updateList []*model.StoreSkuBind + addList []*model.StoreSkuBind + skuBindInfos1 []*StoreSkuBindInfo + skuBindInfos2 []*StoreSkuBindInfo + resultInterface1 []interface{} + resultInterface2 []interface{} + ) + storeSkusMain, err := dao.GetStoresSkusInfo(db, []int{model.JdShopMainStoreID}, nil) + for _, v := range storeSkusMain { + mainSkusMap[v.SkuID] = v + } + storeSkus, err := dao.GetStoresSkusInfo(db, []int{storeMap.StoreID}, nil) + 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]) + } + } + for k, v := range mainSkusMap { + if skusMap[k] == nil { + if storeMap.SyncRule == 2 { + addList = append(addList, v) + } + } + } + // fmt.Println("updateList", utils.Format4Output(updateList, false)) + // fmt.Println("addList", utils.Format4Output(addList, false)) + task := tasksch.NewParallelTask("正在同步京东商城的库存商品", tasksch.NewParallelConfig().SetParallelCount(1).SetIsContinueWhenError(isContinueWhenError), ctx, + func(ptTask *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { + step := batchItemList[0].(int) + switch step { + case 0: + if len(updateList) > 0 { + task := tasksch.NewParallelTask("同步门店库存", tasksch.NewParallelConfig().SetParallelCount(1).SetIsContinueWhenError(isContinueWhenError), ctx, + func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { + storeBind := batchItemList[0].(*model.StoreSkuBind) + retVal = []*StoreSkuBindInfo{buildStoreSkuBindInfo(db, storeMap.StoreID, storeBind, false)} + return retVal, err + }, updateList) + tasksch.HandleTask(task, ptTask, false).Run() + resultInterface1, err = task.GetResult(0) + for _, v := range resultInterface1 { + skuBindInfos1 = append(skuBindInfos1, v.(*StoreSkuBindInfo)) + } + hint, err = UpdateStoresSkusByBind(ctx, ptTask, skuBindInfos1, isAsync, isContinueWhenError, false) + } + case 1: + if len(addList) > 0 { + task := tasksch.NewParallelTask("同步门店商品", tasksch.NewParallelConfig().SetParallelCount(1).SetIsContinueWhenError(isContinueWhenError), ctx, + func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { + storeBind := batchItemList[0].(*model.StoreSkuBind) + retVal = []*StoreSkuBindInfo{buildStoreSkuBindInfo(db, storeMap.StoreID, storeBind, true)} + return retVal, err + }, addList) + tasksch.HandleTask(task, ptTask, false).Run() + resultInterface2, err = task.GetResult(0) + for _, v := range resultInterface2 { + skuBindInfos2 = append(skuBindInfos2, v.(*StoreSkuBindInfo)) + } + hint, err = UpdateStoresSkusByBind(ctx, ptTask, skuBindInfos2, isAsync, isContinueWhenError, false) + } + } + return retVal, err + }, []int{0, 1}) + tasksch.HandleTask(task, nil, true).Run() + if isAsync { + hint = task.GetID() + } else { + _, err = task.GetResult(0) + hint = "1" + } + return hint, 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 + } + skus := []*StoreSkuBindSkuInfo{ + &StoreSkuBindSkuInfo{ + SkuID: storeBind.SkuID, + }, + } + skuBindInfo = &StoreSkuBindInfo{ + StoreID: storeID, + NameID: result[0].NameID, + } + if isFocus { + skuBindInfo.IsFocus = 1 + } + if storeBind.Status == model.SkuStatusNormal { + skus[0].IsSale = 1 + } else { + skus[0].IsSale = -1 + } + skuBindInfo.Skus = skus + return skuBindInfo +} diff --git a/business/jxstore/cms/sync_store_sku.go b/business/jxstore/cms/sync_store_sku.go index eb462118b..3c0d35393 100644 --- a/business/jxstore/cms/sync_store_sku.go +++ b/business/jxstore/cms/sync_store_sku.go @@ -87,7 +87,7 @@ func SyncStoreCategories(ctx *jxcontext.Context, parentTask tasksch.ITask, vendo storeCatMap.ID = catInfo.MapID var failedList []*partner.StoreSkuInfoWithErr if catInfo.IsExdSpec == model.YES { - if vendorID == model.VendorIDJD || vendorID == model.VendorIDMTWM || vendorID == model.VendorIDYB { + if vendorID != model.VendorIDEBAI { return nil, err } } @@ -231,11 +231,12 @@ func storeSkuSyncInfo2Bare(inSku *dao.StoreSkuSyncInfo) (outSku *partner.StoreSk NameID: inSku.NameID, VendorNameID: inSku.VendorNameID, - Status: inSku.MergedStatus, - VendorPrice: inSku.VendorPrice, - Seq: inSku.Seq, - JxPrice: inSku.Price, - JxUnitPrice: inSku.UnitPrice, + Status: inSku.MergedStatus, + VendorPrice: inSku.VendorPrice, + Seq: inSku.Seq, + JxPrice: inSku.Price, + JxUnitPrice: inSku.UnitPrice, + VendorSkuID2: utils.Int64ToStr(inSku.JdsWareID), } if !isStoreSkuSyncNeedDelete(inSku) { outSku.Stock = model.MaxStoreSkuStockQty @@ -260,6 +261,15 @@ func getSkuBoxFee(vendorID int) (boxFee int64) { return boxFee } +func formalizeStoreSkuListForJds(inSkuList []*dao.StoreSkuSyncInfo) []*dao.StoreSkuSyncInfo { + if len(inSkuList) > 0 { + for _, skuItem := range inSkuList { + skuItem.SkuName = jxutils.ComposeSkuNameSync2(skuItem.Prefix, skuItem.Name, skuItem.Comment, skuItem.Unit, skuItem.SpecQuality, skuItem.SpecUnit, 0, skuItem.ExPrefix, skuItem.ExPrefixBegin, skuItem.ExPrefixEnd) + } + } + return inSkuList +} + func formalizeStoreSkuList(inSkuList []*dao.StoreSkuSyncInfo) []*dao.StoreSkuSyncInfo { if len(inSkuList) > 0 { boxFee := getSkuBoxFee(inSkuList[0].VendorID) @@ -324,18 +334,41 @@ func updateStoreSku(db *dao.DaoDB, vendorID int, storeSkuList []*dao.StoreSkuSyn // panic(r) // } // }() - updateItemList := make([]*dao.KVUpdateItem, len(storeSkuList)) - for k, v := range storeSkuList { - updateItemList[k] = sku2Update(vendorID, v, syncStatus) - } - num, err = dao.BatchUpdateEntityByKV(db, updateItemList) - if vendorID == model.VendorIDYB { - err = updateYbOhterSku(db, storeSkuList) + if vendorID == model.VendorIDJDShop { + if syncStatus != model.SyncFlagPriceMask && syncStatus != model.SyncFlagSaleMask { + for _, v := range storeSkuList { + updateItemList := make([]*dao.KVUpdateItem, len(v.StoreSkuSyncInfoJds)) + for k, vv := range v.StoreSkuSyncInfoJds { + updateItemList[k] = sku2Update(vendorID, vv, syncStatus) + err = updateJdsWareID(db, vv) + } + num, err = dao.BatchUpdateEntityByKV(db, updateItemList) + } + } else { + updateItemList := make([]*dao.KVUpdateItem, len(storeSkuList)) + for k, v := range storeSkuList { + updateItemList[k] = sku2Update(vendorID, v, syncStatus) + } + num, err = dao.BatchUpdateEntityByKV(db, updateItemList) + } + } else { + updateItemList := make([]*dao.KVUpdateItem, len(storeSkuList)) + for k, v := range storeSkuList { + updateItemList[k] = sku2Update(vendorID, v, syncStatus) + } + num, err = dao.BatchUpdateEntityByKV(db, updateItemList) + if vendorID == model.VendorIDYB { + err = updateYbOhterSku(db, storeSkuList) + } } } return num, err } +func updateJdsWareID(db *dao.DaoDB, storeSku *dao.StoreSkuSyncInfo) (err error) { + return dao.UpdateJdsWareID(db, storeSku) +} + func updateYbOhterSku(db *dao.DaoDB, storeSkuList []*dao.StoreSkuSyncInfo) (err error) { for _, v := range storeSkuList { err = dao.UpdateYbOtherSku(db, v) @@ -361,7 +394,6 @@ func syncStoreSkuNew(ctx *jxcontext.Context, parentTask tasksch.ITask, causeFlag } else { skus, err = dao.GetStoreSkus(db, vendorID, storeID, skuIDs) } - if err != nil || len(skus) == 0 { return err } @@ -376,6 +408,11 @@ func syncStoreSkuNew(ctx *jxcontext.Context, parentTask tasksch.ITask, causeFlag skus = skus2 } formalizeStoreSkuList(skus) + //京东商城的商品名规则不同 + // name,空格,comment,约xxg + // if vendorID == model.VendorIDJDShop { + // formalizeStoreSkuListForJds(skus) + // } singleStoreHandler, _ := partner.GetPurchasePlatformFromVendorID(vendorID).(partner.ISingleStoreStoreSkuHandler) storeSkuHandler := partner.GetPurchasePlatformFromVendorID(vendorID).(partner.IPurchasePlatformStoreSkuHandler) @@ -394,6 +431,11 @@ func syncStoreSkuNew(ctx *jxcontext.Context, parentTask tasksch.ITask, causeFlag now := jxutils.OperationTime2HourMinuteFormat(time.Now()) var failedList []*partner.StoreSkuInfoWithErr for _, sku := range skus { + if vendorID == model.VendorIDJDShop && storeID != model.JdShopMainStoreID { + if sku.SkuSyncStatus != 0 { + sku.SkuSyncStatus = model.SyncFlagSaleMask + } + } if !useVendorPriceDirectly && !isSkuLockTimeValid(sku) { sku.VendorPrice = 0 @@ -433,8 +475,10 @@ func syncStoreSkuNew(ctx *jxcontext.Context, parentTask tasksch.ITask, causeFlag } } else { if sku.MergedStatus == model.SkuStatusNormal { - if dao.IsVendorThingIDEmpty(sku.VendorCatID) && !strings.Contains(sku.StoreName, model.ExdStoreName) && vendorID != model.VendorIDYB { + if dao.IsVendorThingIDEmpty(sku.VendorCatID) && !strings.Contains(sku.StoreName, model.ExdStoreName) && vendorID != model.VendorIDYB && vendorID != model.VendorIDJDShop { globals.SugarLogger.Warnf("syncStoreSkuNew 创建门店:%d商品:%d,但没有平台分类ID", storeID, sku.SkuID) + } else if dao.IsVendorThingIDEmpty(utils.Int64ToStr(sku.VendorVendorCatID)) && vendorID == model.VendorIDJDShop { + globals.SugarLogger.Warnf("syncStoreSkuNew 创建门店:%d商品:%d,但没有映射的平台ID", storeID, sku.SkuID) } else { createList = append(createList, sku) } @@ -442,20 +486,22 @@ func syncStoreSkuNew(ctx *jxcontext.Context, parentTask tasksch.ITask, causeFlag } isNeedReorder = true } else { - if dao.IsVendorThingIDEmpty(sku.VendorSkuID) { + if dao.IsVendorThingIDEmpty(sku.VendorSkuID) && vendorID != model.VendorIDJDShop { // err = fmt.Errorf("门店:%d,修改没有创建的商品:%d", storeID, sku.SkuID) - err = utils.NewErrorCode(fmt.Sprintf("门店:%d,修改没有创建的商品:%d", storeID, sku.SkuID), "-1", 0) - failedList = putils.GetErrMsg2FailedSingleList(nil, err, storeID, model.VendorChineseNames[vendorID], "异常同步错误") - if parentTask == nil { - return err + if vendorID != model.VendorIDJDShop || (vendorID == model.VendorIDJDShop && storeID == model.JdShopMainStoreID && sku.StoreSkuStatus != model.SkuStatusDontSale) { + err = utils.NewErrorCode(fmt.Sprintf("门店:%d,修改没有创建的商品:%d", storeID, sku.SkuID), "-1", 0) + failedList = putils.GetErrMsg2FailedSingleList(nil, err, storeID, model.VendorChineseNames[vendorID], "异常同步错误") + if parentTask == nil { + return err + } + parentTask.AddBatchErr(err) + parentTask.AddFailedList(failedList) } - parentTask.AddBatchErr(err) - parentTask.AddFailedList(failedList) } else { isAdded2Update := false // 修改商品信息时不改价(以免活动引起的失败),而用单独的改价来改 if (model.IsSyncStatusUpdate(sku.SkuSyncStatus) || (model.IsSyncStatusSeq(sku.SkuSyncStatus) && reorderHandler == nil)) && singleStoreHandler != nil { - if dao.IsVendorThingIDEmpty(sku.VendorCatID) && !strings.Contains(sku.StoreName, model.ExdStoreName) && vendorID != model.VendorIDYB { + if dao.IsVendorThingIDEmpty(sku.VendorCatID) && !strings.Contains(sku.StoreName, model.ExdStoreName) && vendorID != model.VendorIDYB && vendorID != model.VendorIDJDShop { globals.SugarLogger.Warnf("syncStoreSkuNew 修改门店:%d商品:%d,但没有平台分类ID", storeID, sku.SkuID) } else { isAdded2Update = true @@ -549,6 +595,19 @@ func syncStoreSkuNew(ctx *jxcontext.Context, parentTask tasksch.ITask, causeFlag api.YinBaoAPI.SetCookie(".POSPALAUTH30220", yinbaoCookie) } } + //如果平台是京东商城,则按商品skuname创建 + if vendorID == model.VendorIDJDShop { + if len(createList) > 0 { + rList := changeList2Jds(createList) + createList = createList[:] + createList = rList + } + if len(updateList) > 0 { + rList2 := changeList2Jds(updateList) + updateList = updateList[:] + updateList = rList2 + } + } task := tasksch.NewParallelTask("syncStoreSkuNew", tasksch.NewParallelConfig().SetParallelCount(1).SetIsContinueWhenError(isContinueWhenError2), ctx, func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { step := batchItemList[0].(int) @@ -1319,3 +1378,29 @@ func changeList2Yb(list1 []*dao.StoreSkuSyncInfo, list2 []*partner.StoreSkuInfo) } return rList1, rList2 } + +func changeList2Jds(list []*dao.StoreSkuSyncInfo) (rList []*dao.StoreSkuSyncInfo) { + var ( + skuNameMap = make(map[int][]*dao.StoreSkuSyncInfo) + ) + for _, v := range list { + skuNameMap[v.NameID] = append(skuNameMap[v.NameID], v) + } + for k, v := range skuNameMap { + storeSku := &dao.StoreSkuSyncInfo{ + StoreSkuSyncInfoJds: v, + } + storeSku.NameID = k + storeSku.Name = v[0].Name + storeSku.VendorCatID = v[0].VendorCatID + storeSku.VendorVendorCatID = v[0].VendorVendorCatID + storeSku.UnitPrice = v[0].UnitPrice + storeSku.Img = v[0].Img + storeSku.Img2 = v[0].Img2 + storeSku.DescImg = v[0].DescImg + storeSku.JdsWareID = v[0].JdsWareID + storeSku.CategoryName = v[0].CategoryName + rList = append(rList, storeSku) + } + return rList +} diff --git a/business/jxstore/cms/user2.go b/business/jxstore/cms/user2.go index 7601e08dd..6fdc80348 100644 --- a/business/jxstore/cms/user2.go +++ b/business/jxstore/cms/user2.go @@ -1109,3 +1109,18 @@ func GetUserAgreement(ctx *jxcontext.Context, name, idNumber, bankNumber, mobile userAgrs, err = dao.GetUserAgreement(db, name, idNumber, bankNumber, mobile) return userAgrs, err } + +func CleanUserOrderSMSMark(ctx *jxcontext.Context) (err error) { + var ( + db = dao.GetDB() + ) + if time.Now().Day() == 1 { + sql := ` + UPDATE user_order_sms + SET sms_mark = ? + ` + sqlParams := []interface{}{model.NO} + _, err = dao.ExecuteSQL(db, sql, sqlParams) + } + return err +} diff --git a/business/jxstore/misc/misc.go b/business/jxstore/misc/misc.go index d7412594e..226797d12 100644 --- a/business/jxstore/misc/misc.go +++ b/business/jxstore/misc/misc.go @@ -130,6 +130,7 @@ var ( yinbaoCookie string feiePageCookie string jdStorePageEarning string + jdsCookie string ) func GetImportantTaskID(taskName string) string { @@ -218,6 +219,9 @@ func Init() { ScheduleTimerFunc("CleanStoreIsBoughtMatter", func() { cms.CleanStoreIsBoughtMatter(jxcontext.AdminCtx) }, priceReferTimeList) + ScheduleTimerFunc("CleanUserOrderSMSMark", func() { + cms.CleanUserOrderSMSMark(jxcontext.AdminCtx) + }, priceReferTimeList) ScheduleTimerFunc("exSync", func() { var ( db = dao.GetDB() @@ -291,6 +295,10 @@ func Init() { if configs, err := dao.QueryConfigs(dao.GetDB(), "feiePageCookie", model.ConfigTypeCookie, ""); err == nil { feiePageCookie = configs[0].Value } + if configs, err := dao.QueryConfigs(dao.GetDB(), "jdsCookie", model.ConfigTypeCookie, ""); err == nil { + jdsCookie = configs[0].Value + api.JdShopAPI.SetCookieWithStr(jdsCookie) + } if configs, err := dao.QueryConfigs(dao.GetDB(), "yinbaoCookie", model.ConfigTypeCookie, ""); err == nil { yinbaoCookie := configs[0].Value api.YinBaoAPI.SetCookie(".POSPALAUTH30220", yinbaoCookie) @@ -393,6 +401,10 @@ func doDailyWork() { cms.CurVendorSync.SyncStoreSkusFromYb(jxcontext.AdminCtx, nil, true, true) //刷新京东商城订单结算价 orderman.RefreshJdShopOrdersEarningPrice(jxcontext.AdminCtx, time.Now().AddDate(0, 0, -3).Format("20060102"), time.Now().Format("20060102")) + //同步京东商城门店库存和商品 + cms.CurVendorSync.SyncJdsStoresSkus(jxcontext.AdminCtx, nil, true, true) + //同步上架京东商城待售商品 + cms.RefreshJdsSkusStatus(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 48623eb26..9257cd023 100644 --- a/business/jxstore/tempop/tempop.go +++ b/business/jxstore/tempop/tempop.go @@ -8,6 +8,8 @@ import ( "strings" "time" + "git.rosy.net.cn/baseapi/platformapi/jdshopapi" + "git.rosy.net.cn/jx-callback/business/auth2/authprovider/weixin" "git.rosy.net.cn/jx-callback/business/partner/delivery" "github.com/360EntSecGroup-Skylar/excelize" @@ -1496,3 +1498,122 @@ func addSku(outSkuId string, cagtegoryId int, shopCategories []int64, brandId in // return "456", err return api.JdAPI.AddSku(outSkuId, cagtegoryId, shopCategories, brandId, skuName, skuPrice, weight, images, fixedStatus, isSale, addParams) } + +func UploadJdsImage(ctx *jxcontext.Context) (err error) { + // db := dao.GetDB() + // result1, _ := api.JdShopAPI.GetProvince() + // for _, v := range result1 { + // place1, _ := dao.GetPlaceByName(db, v.AreaName, 1, 0) + // place1.JdsCode = v.AreaID + // dao.UpdateEntity(db, place1, "JdsCode") + // result2, _ := api.JdShopAPI.GetCity(v.AreaID) + // for _, vv := range result2 { + // place2, _ := dao.GetPlaceByName(db, vv.AreaName, 2, 0) + // place2.JdsCode = vv.AreaID + // dao.UpdateEntity(db, place2, "JdsCode") + // place22, _ := dao.GetPlaceByName(db, vv.AreaName, 3, 0) + // if place22 != nil { + // place22.JdsCode = vv.AreaID + // dao.UpdateEntity(db, place22, "JdsCode") + // } + // result3, _ := api.JdShopAPI.GetCounty(vv.AreaID) + // for _, vvv := range result3 { + // place3, _ := dao.GetPlaceByName(db, vvv.AreaName, 3, 0) + // place3.JdsCode = vvv.AreaID + // dao.UpdateEntity(db, place3, "JdsCode") + // } + // } + // } + + ///建店 + // beginTime := utils.Str2Time("2020-05-18") + // endTime := utils.Str2Time("2020-05-24") + // result, _ := misc.GetStoreTotalScoreList(nil, 0, "", beginTime, endTime, true, 50, 100, 1, 700) + // for _, v := range result.StoreTotalScoreList { + // storeMaps, _ := dao.GetStoresMapList(db, []int{model.VendorIDJX}, []int{v.StoreID}, nil, model.StoreStatusAll, model.StoreIsSyncAll, "") + // if len(storeMaps) == 0 { + // stores, _ := dao.GetStoreList(db, []int{v.StoreID}, nil, nil, nil, "") + // store := stores[0] + // if store.Status != model.StoreStatusDisabled && !strings.Contains(store.Name, "不做") { + // pricePercentagePack := "" + // if store.PayPercentage >= 90 { + // pricePercentagePack = "京西100" + // } else if store.PayPercentage >= 80 { + // pricePercentagePack = "京西80" + // } else { + // pricePercentagePack = "京西70" + // } + // storeMap := &model.StoreMap{ + // Status: 1, + // VendorID: model.VendorIDJX, + // AutoPickup: 1, + // DeliveryCompetition: 1, + // PricePercentage: 100, + // IsSync: 1, + // VendorStoreID: utils.Int2Str(v.StoreID), + // PricePercentagePack: pricePercentagePack, + // } + // _, err = cms.AddStoreVendorMap(ctx, db, model.VendorIDJX, "", v.StoreID, storeMap) + // if err != nil { + // continue + // } + // } + // } + // } + + //京东商城街道name + // var stores []*model.Store + // sql := ` + // SELECT b.* + // FROM store_map a, store b + // WHERE a.store_id = b.id + // AND a.vendor_store_id = '' AND a.vendor_id = 5 AND a.deleted_at = ? + // AND b.deleted_at = ? + // ` + // sqlParams := []interface{}{utils.DefaultTimeValue, utils.DefaultTimeValue} + // err = dao.GetRows(db, &stores, sql, sqlParams) + // for _, v := range stores { + // result, _ := api.AutonaviAPI.GetCoordinateAreaInfo(jxutils.IntCoordinate2Standard(v.Lng), jxutils.IntCoordinate2Standard(v.Lat)) + // if result["regeocode"] != nil { + // street := result["regeocode"].(map[string]interface{})["addressComponent"].(map[string]interface{})["township"].(string) + // if street != "" { + // storeMaps, _ := dao.GetStoresMapList(db, []int{model.VendorIDJDShop}, []int{v.ID}, nil, model.StoreStatusAll, model.StoreIsSyncAll, "") + // storeMap := storeMaps[0] + // storeMap.JdsStreetName = street + // dao.UpdateEntity(db, storeMap, "JdsStreetName") + // } + // } + // } + + // var stores []*model.Store + // sql := ` + // SELECT a.* + // FROM store a + // LEFT JOIN store_map b ON a.id = b.store_id AND b.vendor_id = 5 AND b.deleted_at = '1970-01-01 00:00:00' + // WHERE 1=1 + // AND (a.status = 1 OR a.status = 0) + // AND b.id IS NULL + // AND a.deleted_at = '1970-01-01 00:00:00' + // ` + // err = dao.GetRows(db, &stores, sql, nil) + // for _, v := range stores { + // storeMap := &model.StoreMap{ + // Status: 1, + // VendorID: model.VendorIDJDShop, + // AutoPickup: 1, + // DeliveryCompetition: 1, + // PricePercentage: 100, + // IsSync: 1, + // SyncRule: 1, + // } + // _, err = cms.AddStoreVendorMap(ctx, db, model.VendorIDJDShop, "", v.ID, storeMap) + // if err != nil { + // continue + // } + // } + _, err = api.JdShopAPI.AllOrders(&jdshopapi.AllOrdersParam{ + Current: 1, + PageSize: 10, + }) + return err +} diff --git a/business/jxstore/tempop/tempop_test.go b/business/jxstore/tempop/tempop_test.go index 4ad4b6e38..06875b096 100644 --- a/business/jxstore/tempop/tempop_test.go +++ b/business/jxstore/tempop/tempop_test.go @@ -1,6 +1,9 @@ package tempop import ( + "fmt" + "io/ioutil" + "net/http" "testing" "git.rosy.net.cn/jx-callback/globals/api2" @@ -24,3 +27,18 @@ func TestJdStoreInfo1125(t *testing.T) { t.Fatal(err) } } + +func Testaa(t *testing.T) { + request, _ := http.NewRequest(http.MethodGet, "https://stores.shop.jd.com/stores/updateStoreStatus?storeId=24332466&storeStatus=1", nil) + c := &http.Cookie{ + Name: "thor", + Value: "80FAF09E9A09B6E618A68057BDFCFCB8C86E8252DC9F7D3B34572625904FBA0AB6BF053A5325612EC0407791BB05F5301356E71E8B282C40C06D0B5DF3439DEECB102A78FAFF7AC0FC4E2D1FA8DD8BBAE1A011E50B5C74F1870AD982D7BF453F470F31F2241B73AC4C25485025C2ABEBC8A538AF7257824D2FAEE300A1435175B0B451FB5C19B78D729FC83152CA3BAF", + } + request.AddCookie(c) + client := &http.Client{} + fmt.Println("test1", request.URL) + response, _ := client.Do(request) + defer response.Body.Close() + bodyData, _ := ioutil.ReadAll(response.Body) + fmt.Println("test1", string(bodyData)) +} diff --git a/business/jxutils/datares/datares.go b/business/jxutils/datares/datares.go index 267ad6da7..1d6630372 100644 --- a/business/jxutils/datares/datares.go +++ b/business/jxutils/datares/datares.go @@ -159,6 +159,9 @@ func UploadImage2Vendors(ctx *jxcontext.Context, parentTask tasksch.ITask, dataR if dataRes.MtwmURL == "" { vendorIDs = append(vendorIDs, model.VendorIDMTWM) } + // if dataRes.JdsURL == "" { + // vendorIDs = append(vendorIDs, model.VendorIDJDShop) + // } if len(vendorIDs) > 0 { imgName := jxutils.GetShortNameFromURL(dataRes.MainURL) task := tasksch.NewSeqTask(fmt.Sprintf("上传图片至平台1:%s,%s", dataRes.Name, dataRes.MainURL), ctx, @@ -206,6 +209,10 @@ func UploadImage2Vendors(ctx *jxcontext.Context, parentTask tasksch.ITask, dataR dataRes.MtwmURL = imgHint updateField = "MtwmURL" } + // else if vendorID == model.VendorIDJDShop { + // dataRes.JdsURL = imgHint + // updateField = "JdsURL" + // } dao.UpdateEntity(db, dataRes, updateField) } } diff --git a/business/jxutils/jxutils.go b/business/jxutils/jxutils.go index c28ce415e..723130186 100644 --- a/business/jxutils/jxutils.go +++ b/business/jxutils/jxutils.go @@ -359,6 +359,32 @@ func ComposeSkuNameOriginal(prefix, name, comment, unit string, spec_quality flo return skuName } +func ComposeSkuNameForJds(prefix, name, comment, unit string, spec_quality float32, spec_unit string, maxLen int) (skuName string) { + strBuilder := &strings.Builder{} + if prefix != "" { + strBuilder.WriteString("[") + strBuilder.WriteString(prefix) + strBuilder.WriteString("]") + } + skuName += name + strBuilder.WriteString(name) + if comment != "" { + strBuilder.WriteString(" ") + strBuilder.WriteString(comment) + } + if unit == "份" { + strBuilder.WriteString("约") + } + if unit != "" { + strBuilder.WriteString(ComposeSkuSpec(spec_quality, spec_unit)) + } + skuName = strBuilder.String() + if maxLen > 0 { + skuName = utils.LimitUTF8StringLen(skuName, maxLen) + } + return skuName +} + func ComposeSkuName(prefix, name, comment, unit string, spec_quality float32, spec_unit string, maxLen int, exPrefix string, exPrefixBegin, exPrefixEnd *time.Time) (skuName string) { if exPrefix != "" && exPrefixBegin != nil && exPrefixEnd != nil { if utils.Time2Date(time.Now().Add(6*time.Hour)).Sub(*exPrefixBegin) >= 0 && utils.Time2Date(time.Now()).Sub(*exPrefixEnd) <= 0 { @@ -382,6 +408,19 @@ func ComposeSkuNameSync(prefix, name, comment, unit string, spec_quality float32 return skuName } +func ComposeSkuNameSync2(prefix, name, comment, unit string, spec_quality float32, spec_unit string, maxLen int, exPrefix string, exPrefixBegin, exPrefixEnd *time.Time) (skuName string) { + if exPrefix != "" && exPrefixBegin != nil && exPrefixEnd != nil { + if utils.Time2Date(time.Now().Add(6*time.Hour)).Sub(*exPrefixBegin) >= 0 && utils.Time2Date(time.Now()).Sub(*exPrefixEnd) <= 0 { + skuName = exPrefix + } + if utils.Time2Date(time.Now().Add(6*time.Hour)).Sub(*exPrefixEnd) > 0 { + skuName = "" + } + } + skuName += ComposeSkuNameForJds(prefix, name, comment, unit, spec_quality, spec_unit, maxLen) + return skuName +} + func ComposeSpuName(prefix, name string, maxLen int) (spuName string) { if prefix != "" { spuName = "[" + prefix + "]" diff --git a/business/jxutils/smsmsg/smsmsg.go b/business/jxutils/smsmsg/smsmsg.go index 819fbe44a..56d014418 100644 --- a/business/jxutils/smsmsg/smsmsg.go +++ b/business/jxutils/smsmsg/smsmsg.go @@ -43,7 +43,9 @@ func SendSMSMsg(mobileList []string, signName, templateCode string, templatePara globals.SugarLogger.Infof(errMsg) } } else { - err = updateStoreSMSNotifyMark(order) + if order != nil { + err = updateStoreSMSNotifyMark(order) + } } } } @@ -78,10 +80,20 @@ func NotifyOrderCanceled(order *model.GoodsOrder) (err error) { } func isPushSMS(order *model.GoodsOrder) bool { - stores, _ := dao.GetStoreList(dao.GetDB(), []int{order.StoreID}, nil, nil, nil, "") + storeID := 0 + if order.StoreID == 0 { + storeID = order.JxStoreID + } else { + storeID = order.StoreID + } + stores, _ := dao.GetStoresMapList(dao.GetDB(), []int{order.VendorID}, []int{storeID}, nil, model.StoreStatusAll, model.StoreIsSyncAll, "") if len(stores) > 0 { - if stores[0].SMSNotifyMark == model.NO { - return true + if stores[0].IsOrder == model.NO { + if storeID == model.MatterStoreID { + return false + } else { + return true + } } else { return false } @@ -99,3 +111,90 @@ func updateStoreSMSNotifyMark(order *model.GoodsOrder) (err error) { } return err } + +//每月向用户发送 +func NotifyNewUserOrder(order *model.GoodsOrder) (err error) { + var ( + db = dao.GetDB() + storeTel string + storeID int + mobile string + ) + if order.StoreID == 0 { + storeID = order.JxStoreID + } else { + storeID = order.StoreID + } + if order.ConsigneeMobile2 != "" { + mobile = order.ConsigneeMobile2 + uoSMS, err := dao.GetUserOrderSMS(db, mobile, "") + stores, _ := dao.GetStoreList(db, []int{storeID}, nil, nil, nil, "") + if len(stores) > 0 { + if stores[0].Tel1 == "" { + storeTel = stores[0].Tel2 + } else { + storeTel = stores[0].Tel1 + } + } + if uoSMS == nil { + uoSMSc := &model.UserOrderSms{ + Mobile: mobile, + Name: order.ConsigneeName, + VendorUserID: order.VendorUserID, + TotalCount: 0, + SMSMark: model.NO, + } + err = dao.CreateEntity(db, uoSMSc) + err = SendSMSMsg([]string{uoSMSc.Mobile}, globals.SMSSignName, globals.SMSNewUserOrderTemplate, map[string]interface{}{ + "tel": storeTel, + }, nil) + if err == nil { + uoSMS2, _ := dao.GetUserOrderSMS(db, mobile, "") + uoSMS2.SMSMark = model.YES + uoSMS2.TotalCount++ + _, err = dao.UpdateEntity(db, uoSMS2, "SMSMark", "TotalCount") + } + } else { + if uoSMS.SMSMark != model.YES { + err = SendSMSMsg([]string{uoSMS.Mobile}, globals.SMSSignName, globals.SMSNewUserOrderTemplate, map[string]interface{}{ + "tel": storeTel, + }, nil) + if err == nil { + uoSMS.SMSMark = model.YES + uoSMS.TotalCount++ + _, err = dao.UpdateEntity(db, uoSMS, "SMSMark", "TotalCount") + } + } + } + } + return err +} + +//给配送员发短信 +func NotifyNewCourierOrder(bill *model.Waybill) (err error) { + var ( + db = dao.GetDB() + storeTel string + storeID int + ) + order := &model.GoodsOrder{} + order.VendorOrderID = bill.VendorOrderID + err = dao.GetEntity(db, order, "VendorOrderID") + if order.StoreID == 0 { + storeID = order.JxStoreID + } else { + storeID = order.StoreID + } + stores, _ := dao.GetStoreList(db, []int{storeID}, nil, nil, nil, "") + if len(stores) > 0 { + if stores[0].Tel1 == "" { + storeTel = stores[0].Tel2 + } else { + storeTel = stores[0].Tel1 + } + } + err = SendSMSMsg([]string{bill.CourierMobile}, globals.SMSSignName, globals.SMSNewOrderTemplate, map[string]interface{}{ + "tel": storeTel, + }, nil) + return err +} diff --git a/business/jxutils/weixinmsg/weixinmsg.go b/business/jxutils/weixinmsg/weixinmsg.go index 306dd8fb0..87795f53d 100644 --- a/business/jxutils/weixinmsg/weixinmsg.go +++ b/business/jxutils/weixinmsg/weixinmsg.go @@ -44,6 +44,7 @@ const ( WX_TEMPLATE_VENDERCOLOR_BAD_COMMENTS = "#4F4DA0" WX_NEWORDER_TEMPLATE_ID = "_DtNGwmOeR6TkkTVUblxLIlkV2MAPOX57TkvfdqG6nY" //微信新订单推送 + WX_ADJUSTORDER_TEMPLATE_ID = "N5rmV2-PDf3opjkv23IdLc76VnFThr_uOKSh5FzT13M" //微信调整订单推送 WX_MTPS_DELIVERY_GRABDONE_TEMPLATE_ID = "h4dkON6AgnHz1XmaksEUB_8Bcir4V8MSexUhC149pPE" //微信美团配送员接单推送 WX_MTPS_DELIVERY_DONE_TEMPLATE_ID = "YXdCrQAHZlcZX1htYUiarrLmtkmKAjp7rynjwObgODo" //微信美团配送员配送完成推送 WX_MTPS_UNABLE_DELIVER_TEMPLATE_ID = "ZFph5Hp7oLlrzVRXbsKIC_StmaBeB9Dlp4tlHeAmUQ8" //微信美团配送配送能力不足推送 @@ -718,3 +719,40 @@ func SendStoreMessage(ctx *jxcontext.Context, title, content string, storeIDs [] } return "", err } + +func NotifyAdjustOrder(order *model.GoodsOrder) (err error) { + globals.SugarLogger.Debugf("NotifyAdjustOrder orderID:%s", order.VendorOrderID) + if order.VendorID == model.VendorIDELM { + return nil + } + + if !model.IsOrderSolid(order) { + globals.SugarLogger.Infof("NotifyAdjustOrder orderID:%s is not solid", order.VendorOrderID) + return nil + } + sb := new(strings.Builder) + sb.WriteString("老板,") + sb.WriteString(order.ConsigneeName) + sb.WriteString("调整了订单商品,请及时查看!") + sb.WriteString(getOrderDetailBrief(order)) + data := map[string]interface{}{ + "first": map[string]interface{}{ + "value": sb.String(), + "color": WX_NEW_ORDER_TEMPLATE_COLOR, + }, + "keyword1": map[string]interface{}{ + "value": jxutils.IntPrice2Standard(order.NewEarningPrice), + "color": WX_NEW_ORDER_TEMPLATE_COLOR, + }, + "keyword2": map[string]interface{}{ + "value": utils.Time2Str(order.CreatedAt), + "color": WX_NEW_ORDER_TEMPLATE_COLOR, + }, + "keyword3": map[string]interface{}{ + "value": model.OrderStatusName[order.Status], + "color": WX_NEW_ORDER_TEMPLATE_COLOR, + }, + } + storeID := jxutils.GetSaleStoreIDFromOrder(order) + return SendMsgToStore(storeID, WX_ADJUSTORDER_TEMPLATE_ID, globals.WxBackstageHost+fmt.Sprintf("%s%d", WX_TO_ORDER_PAGE_URL, storeID), WX_MINI_TO_ORDER_PAGE_URL, data) +} diff --git a/business/model/api_config.go b/business/model/api_config.go index d51bffb6d..fb5b25ad0 100644 --- a/business/model/api_config.go +++ b/business/model/api_config.go @@ -15,6 +15,7 @@ const ( VendorIDELM = 2 VendorIDEBAI = 3 VendorIDYB = 4 //银豹 + VendorIDJDShop = 5 //京东商城 VendorIDWSC = 11 // 微盟微商城 VendorIDPurchaseEnd = 11 VendorIDJX = 9 // 这是一个假的京西VendorID @@ -63,13 +64,14 @@ type VendorInfo struct { var ( VendorNames = map[int]string{ - VendorIDJD: "Jd", - VendorIDMTWM: "Mtwm", - VendorIDELM: "Elm", - VendorIDEBAI: "Ebai", - VendorIDWSC: "Wsc", - VendorIDYB: "Yb", - VendorIDJX: "Jx", + VendorIDJD: "Jd", + VendorIDMTWM: "Mtwm", + VendorIDELM: "Elm", + VendorIDEBAI: "Ebai", + VendorIDWSC: "Wsc", + VendorIDYB: "Yb", + VendorIDJX: "Jx", + VendorIDJDShop: "Jds", VendorIDDada: "Dada", VendorIDMTPS: "Mtps", @@ -90,13 +92,14 @@ var ( } VendorChineseNames = map[int]string{ - VendorIDJD: "京东到家", - VendorIDMTWM: "美团外卖", - VendorIDELM: "饿了么", - VendorIDEBAI: "饿百新零售", - VendorIDYB: "银豹", - VendorIDWSC: "微盟微商城", - VendorIDJX: "京西商城", + VendorIDJD: "京东到家", + VendorIDMTWM: "美团外卖", + VendorIDELM: "饿了么", + VendorIDEBAI: "饿百新零售", + VendorIDYB: "银豹", + VendorIDJDShop: "京东商城", + VendorIDWSC: "微盟微商城", + VendorIDJX: "京西商城", VendorIDDada: "达达众包", VendorIDMTPS: "美团配送", diff --git a/business/model/common.go b/business/model/common.go index e5c3a1d10..01a450373 100644 --- a/business/model/common.go +++ b/business/model/common.go @@ -33,6 +33,7 @@ type DataResource struct { QiniuURL string `orm:"size(512);column(qiniu_url);index" json:"qiniuURL"` EbaiURL string `orm:"size(512);column(ebai_url);index" json:"ebaiURL"` MtwmURL string `orm:"size(512);column(mtwm_url);index" json:"mtwmURL"` + JdsURL string `orm:"size(512);column(jds_url);index" json:"jdsURL"` Remark string `orm:"size(1024)" json:"remark"` } diff --git a/business/model/dao/act.go b/business/model/dao/act.go index ff5049cf4..3ed92ef4c 100644 --- a/business/model/dao/act.go +++ b/business/model/dao/act.go @@ -413,8 +413,6 @@ func GetEffectiveActStoreSkuInfo(db *DaoDB, actID int, vendorIDs []int, actType if globals.IsStoreSkuAct { sql += " AND t1.is_special = 0" } - // globals.SugarLogger.Debug(sql) - // globals.SugarLogger.Debug(utils.Format4Output(sqlParams, false)) err = GetRows(db, &actStoreSkuList, sql, sqlParams...) return actStoreSkuList, err } diff --git a/business/model/dao/dao_order.go b/business/model/dao/dao_order.go index 0f94c9f07..fc8994645 100644 --- a/business/model/dao/dao_order.go +++ b/business/model/dao/dao_order.go @@ -1270,3 +1270,14 @@ func GetMatterChildOrders(db *DaoDB, vendorOrderID string) (goods []*model.Goods err = GetRows(db, &goods, sql, sqlParams) return goods, err } + +func GetSimpleOrder(db *DaoDB, vendorOrderID string) (goods *model.GoodsOrder, err error) { + sql := ` + SELECT * + FROM goods_order + WHERE vendor_order_id = ? + ` + sqlParams := []interface{}{vendorOrderID} + err = GetRow(db, &goods, sql, sqlParams) + return goods, err +} diff --git a/business/model/dao/dao_user.go b/business/model/dao/dao_user.go index 4e73d14ca..4206a2979 100644 --- a/business/model/dao/dao_user.go +++ b/business/model/dao/dao_user.go @@ -239,3 +239,22 @@ func GetUserAgreement(db *DaoDB, name, idNumber, bankNumber, mobile string) (use err = GetRows(db, &userAgrs, sql, sqlParams) return userAgrs, err } + +func GetUserOrderSMS(db *DaoDB, mobile, name string) (userOrderSms *model.UserOrderSms, err error) { + sql := ` + SELECT * + FROM user_order_sms + WHERE 1=1 + ` + sqlParams := []interface{}{} + if mobile != "" { + sql += " AND mobile = ?" + sqlParams = append(sqlParams, mobile) + } + if name != "" { + sql += " AND name like ?" + sqlParams = append(sqlParams, "%"+name+"%") + } + err = GetRow(db, &userOrderSms, sql, sqlParams) + return userOrderSms, err +} diff --git a/business/model/dao/sku.go b/business/model/dao/sku.go index a3a364889..be89fa4a9 100644 --- a/business/model/dao/sku.go +++ b/business/model/dao/sku.go @@ -210,8 +210,9 @@ func GetSkuCategoryWithVendor(db *DaoDB, vendorIDs []int, appOrgCodes []string, LEFT JOIN thing_map t1pm ON t1pm.thing_id = t1p.id AND t1pm.thing_type = ? AND t1m.deleted_at = ? AND t1pm.vendor_id = t1m.vendor_id AND t1pm.vendor_org_code = t1m.vendor_org_code WHERE 1 = 1 + AND t1.is_sync <> ? ` - sqlParams = append(sqlParams, model.ThingTypeCategory, utils.DefaultTimeValue) + sqlParams = append(sqlParams, model.ThingTypeCategory, utils.DefaultTimeValue, model.YES) if mustDirty { sql += " AND t1m.sync_status IS NOT NULL AND t1m.sync_status <> 0" } else { diff --git a/business/model/dao/store.go b/business/model/dao/store.go index ad2b11225..cea3c67b6 100644 --- a/business/model/dao/store.go +++ b/business/model/dao/store.go @@ -35,8 +35,13 @@ type StoreDetail struct { DeliveryCompetition int8 `orm:"default(1)" json:"deliveryCompetition"` // 是否支持配送竞争 IsSync int8 `orm:"default(1)" json:"isSync"` // 是否同步 - DistrictName string `json:"districtName"` - CityName string `json:"cityName"` + DistrictName string `json:"districtName"` + CityName string `json:"cityName"` + ProvinceName string `json:"provinceName"` //省名 + JdCode int `json:"jdCode"` + JdsCode int `json:"jdsCode"` //京东商城地址代码 + JdsStreetCode int `json:"jdsStreetCode"` //京东商城直辖市街道code + JdsStreetName string `json:"jdsStreetName"` //京东商城直辖市街道 IsAutoOrder int8 `json:"isAutoOrder"` // 平台是否自动接单,-1:否,0:未知,1:是 MarketManName string `json:"marketManName"` //市场负责人 @@ -94,9 +99,13 @@ func getStoreDetail(db *DaoDB, storeID, vendorID int, vendorStoreID string) (sto SELECT t1.*, t2.vendor_store_id, t2.status vendor_status, t2.delivery_fee_deduction_sill, t2.delivery_fee_deduction_fee, t2.sync_status, t2.vendor_org_code, t2.price_percentage, t2.auto_pickup, t2.delivery_type, t2.delivery_competition, t2.is_sync, t2.vendor_store_name, t2.is_order, t2.yb_app_id, t2.yb_app_key, t2.yb_store_prefix, + t2.jds_street_code, t2.jds_street_name, t3.value price_percentage_pack_str, t4.value freight_deduction_pack_str, + province.name province_name, district.name district_name, + district.jds_code jds_code, + district.jd_code jd_code, city.name city_name, IF(mm.name <> '', mm.name, mm.user_id2) market_man_name, IF(om.name <> '', om.name, om.user_id2) operator_name, @@ -106,6 +115,7 @@ func getStoreDetail(db *DaoDB, storeID, vendorID int, vendorStoreID string) (sto LEFT JOIN store_map t2 ON t1.id = t2.store_id AND t2.vendor_id = ? AND t2.deleted_at = ? LEFT JOIN place city ON city.code = t1.city_code LEFT JOIN place district ON district.code = t1.district_code + LEFT JOIN place province ON city.parent_code = province.code LEFT JOIN new_config t3 ON t3.key = t2.price_percentage_pack AND t3.type = ? AND t3.deleted_at = ? LEFT JOIN new_config t4 ON t4.key = t2.freight_deduction_pack AND t4.type = ? AND t4.deleted_at = ? LEFT JOIN user mm ON mm.mobile <> '' AND mm.mobile = t1.market_man_phone @@ -439,6 +449,9 @@ func AddStoreCategoryMap(db *DaoDB, storeID, categoryID int, vendorID int, vendo } else if vendorID == model.VendorIDYB { storeCat.YbID = utils.Str2Int64WithDefault(vendorCategoryID, 0) storeCat.YbSyncStatus = status + } else if vendorID == model.VendorIDJDShop { + storeCat.JdsID = utils.Str2Int64WithDefault(vendorCategoryID, 0) + storeCat.JdsSyncStatus = status } else { panic("unsupported vendor") } diff --git a/business/model/dao/store_sku.go b/business/model/dao/store_sku.go index 8d83e5075..0820bcc70 100644 --- a/business/model/dao/store_sku.go +++ b/business/model/dao/store_sku.go @@ -21,8 +21,9 @@ type StoreSkuAndAct struct { var ( dataResFieldMap = map[int]string{ - model.VendorIDMTWM: "mtwm_url", - model.VendorIDEBAI: "ebai_url", + model.VendorIDMTWM: "mtwm_url", + model.VendorIDEBAI: "ebai_url", + model.VendorIDJDShop: "jds_url", } salePriceLimit = 100 ) @@ -43,8 +44,9 @@ type SkuStoreCatInfo struct { } type StoreSkuSyncInfo struct { - VendorID int `orm:"column(vendor_id)" json:"vendorID"` - VendorOrgCode string `orm:"size(32)" json:"vendorOrgCode"` // 同一平台下不同的商户代码,如果只有一个,可以为空 + StoreSkuSyncInfoJds []*StoreSkuSyncInfo + VendorID int `orm:"column(vendor_id)" json:"vendorID"` + VendorOrgCode string `orm:"size(32)" json:"vendorOrgCode"` // 同一平台下不同的商户代码,如果只有一个,可以为空 // 平台无关的store sku信息 BindID int `orm:"column(bind_id)"` // 换名的原因是与Sku.ID同名区别 @@ -60,6 +62,7 @@ type StoreSkuSyncInfo struct { StoreSkuStatus int SkuSyncStatus int8 VendorSkuID string `orm:"column(vendor_sku_id)"` + JdsWareID int64 `orm:"column(jds_ware_id)" json:"jdsWareID"` BindDeletedAt time.Time `orm:"type(datetime)" json:"bindDeletedAt"` model.Sku @@ -89,8 +92,8 @@ type StoreSkuSyncInfo struct { Img2 string DescImg string - VendorVendorCatID int64 `orm:"column(vendor_vendor_cat_id)"` // 平台商品分类(叶子结点) - + VendorVendorCatID int64 `orm:"column(vendor_vendor_cat_id)"` // 平台商品分类(叶子结点) + CategoryName string `json:"categoryName"` //分类名 // sku的商家分类信息 SkuCatSyncStatus int8 SkuVendorCatID string `orm:"column(sku_vendor_cat_id)"` @@ -216,19 +219,23 @@ type StoreSkuExt struct { EbaiID string `orm:"column(ebai_id);index" json:"ebaiID"` MtwmID string `orm:"column(mtwm_id)" json:"mtwmID"` // 这个也不是必须的,只是为了DAO取数据语句一致 YbID string `orm:"column(yb_id);index" json:"ybID"` + JdsID string `orm:"column(jds_id);index" json:"jdsID"` JdSyncStatus int8 `orm:"default(2)" json:"jdSyncStatus"` EbaiSyncStatus int8 `orm:"default(2)" json:"ebaiSyncStatus"` MtwmSyncStatus int8 `orm:"default(2)" json:"mtwmSyncStatus"` YbSyncStatus int8 `orm:"default(2)" json:"ybSyncStatus"` + JdsSyncStatus int8 `orm:"default(2)" json:"jdsSyncStatus"` //京东商城 JdPrice int `json:"jdPrice"` EbaiPrice int `json:"ebaiPrice"` MtwmPrice int `json:"mtwmPrice"` JxPrice int `json:"jxPrice"` YbPrice int `json:"ybPrice"` + JdsPrice int `json:"jdsPrice"` JdLockTime *time.Time `orm:"null" json:"jdLockTime,omitempty"` + JdsLockTime *time.Time `orm:"null" json:"jdsLockTime,omitempty"` EbaiLockTime *time.Time `orm:"null" json:"ebaiLockTime,omitempty"` MtwmLockTime *time.Time `orm:"null" json:"mtwmLockTime,omitempty"` JxLockTime *time.Time `orm:"null" json:"jxLockTime,omitempty"` @@ -355,8 +362,8 @@ func GetStoreCategories(db *DaoDB, vendorID, storeID int, skuIDs []int, level in sql += ` LEFT JOIN sku_category t4p ON t4.parent_id = t4p.id LEFT JOIN store_sku_category_map t5p ON t4p.id = t5p.category_id AND t5.store_id = t5p.store_id AND t5p.deleted_at = ? - WHERE t5.store_id = ? AND t5.deleted_at = ?` - sqlParams = append(sqlParams, utils.DefaultTimeValue, storeID, utils.DefaultTimeValue) + WHERE t5.store_id = ? AND t5.deleted_at = ? AND t4.is_sync <> ?` + sqlParams = append(sqlParams, utils.DefaultTimeValue, storeID, utils.DefaultTimeValue, model.YES) if mustDirty { sql += " AND t5.%s_sync_status <> 0" fieldPrefixParams = append(fieldPrefixParams, fieldPrefix) @@ -392,19 +399,20 @@ func GetStoreSkus2(db *DaoDB, vendorID, storeID int, skuIDs []int, mustDirty boo t14.vendor_id, t14.vendor_org_code, t1.id bind_id, t1.sku_id, t1.price, t1.unit_price, t1.status store_sku_status, %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.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, IF(t11.%s <> '', t11.%s, t3.img) img, IF(t12.%s <> '', t12.%s, t3.img2) img2, - t13.%s desc_img, + 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` fmtParams := []interface{}{ skuVendorIDField, fieldPrefix, fieldPrefix, fieldPrefix, GetDataResFieldName(vendorID), GetDataResFieldName(vendorID), GetDataResFieldName(vendorID), GetDataResFieldName(vendorID), - GetDataResFieldName(vendorID), + GetDataResFieldName(vendorID), GetDataResFieldName(vendorID), fieldPrefix, } if isSingleStorePF { @@ -520,7 +528,7 @@ func GetFullStoreSkus(db *DaoDB, vendorID, storeID int) (skus []*StoreSkuSyncInf 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, IF(t11.%s <> '', t11.%s, t3.img) img, IF(t12.%s <> '', t12.%s, t3.img2) img2, - t13.%s desc_img, + IF(t13.%s <> '', t13.%s, t3.desc_img) desc_img, t4.%s_category_id vendor_vendor_cat_id, t4m.sync_status cat_sync_status, t4m.vendor_thing_id vendor_cat_id, t5skum.sync_status sku_cat_sync_status, t5skum.vendor_thing_id sku_vendor_cat_id @@ -553,7 +561,7 @@ func GetFullStoreSkus(db *DaoDB, vendorID, storeID int) (skus []*StoreSkuSyncInf fieldPrefix, fieldPrefix, fieldPrefix, GetDataResFieldName(vendorID), GetDataResFieldName(vendorID), GetDataResFieldName(vendorID), GetDataResFieldName(vendorID), - GetDataResFieldName(vendorID), + GetDataResFieldName(vendorID), GetDataResFieldName(vendorID), fieldPrefix) // globals.SugarLogger.Debug(sql) // globals.SugarLogger.Debug(utils.Format4Output(sqlParams, false)) @@ -1507,3 +1515,21 @@ func UpdateYbOtherSku(db *DaoDB, storeSkuSyncInfo *StoreSkuSyncInfo) (err error) _, err = ExecuteSQL(db, sql, sqlParams) return err } + +func UpdateJdsWareID(db *DaoDB, storeSkuSyncInfo *StoreSkuSyncInfo) (err error) { + sql := ` + UPDATE store_sku_bind + SET jds_ware_id = ? + WHERE store_id = ? + AND sku_id = ? + AND deleted_at = ? + ` + sqlParams := []interface{}{ + storeSkuSyncInfo.JdsWareID, + storeSkuSyncInfo.StoreID, + storeSkuSyncInfo.SkuID, + utils.DefaultTimeValue, + } + _, err = ExecuteSQL(db, sql, sqlParams) + return err +} diff --git a/business/model/model.go b/business/model/model.go index 569b7fe41..303eb9fab 100644 --- a/business/model/model.go +++ b/business/model/model.go @@ -18,7 +18,8 @@ const ( FieldEbaiSyncStatus = "EbaiSyncStatus" FieldMtwmSyncStatus = "MtwmSyncStatus" // FieldWscSyncStatus = "WscSyncStatus" - FieldYbSyncStatus = "YbSyncStatus" + FieldYbSyncStatus = "YbSyncStatus" + FieldJdsSyncStatus = "JdsSyncStatus" FieldVendorID = "VendorID" FieldStoreID = "StoreID" diff --git a/business/model/place.go b/business/model/place.go index 7a67310d6..77be6a1fb 100644 --- a/business/model/place.go +++ b/business/model/place.go @@ -20,4 +20,5 @@ type Place struct { EbaiCode int `orm:"index" json:"ebaiCode"` Enabled int8 `json:"enabled"` // 是否启用 MtpsPrice int `json:"mtpsPrice"` // 分为单位 + JdsCode int `json:"jdsCode"` //京东商城代码 } diff --git a/business/model/sku.go b/business/model/sku.go index cc374bc30..25c31e894 100644 --- a/business/model/sku.go +++ b/business/model/sku.go @@ -18,6 +18,7 @@ const ( NoCatCatgoryID = 291 NOSkuNameImg = "https://image.jxc4.com/noGoodsImg.jpg" SkuNameImgStandard = "?imageMogr2/thumbnail/!800x800r/gravity/Center/crop/800x800" + SkuNameImgToPng = "?imageView2/0/format/png/q/75" ) const ( @@ -69,39 +70,11 @@ var ( SkuNamePrefixNames = []string{ "新鲜", "组合菜", - "冰鲜", - "优", - "精", "熟食", - "鲜", - "净菜", - "净", - "冻", - "半熟", - "果切", - "熟", - "优质", - "生", - "干货", - "快捷菜", - "手工厨房", - "带壳", - "长条", - "鲜活宰杀", - "惠", + "鲜活现杀", "冰冻", - "思念", - "散装", - "优质精品", - "干", - "湿", - "生品", - "虾仁", - "鲜活现宰", - "鲜切", - "进口", - "冰镇", - "预售", + "净菜", + "非熟食", } SpecialUnit = "份" @@ -154,6 +127,7 @@ type SkuCategory struct { EbaiCategoryID int64 `orm:"column(ebai_category_id)" json:"ebaiCategoryID"` // 这个是指对应的饿百商品类别 MtwmCategoryID int64 `orm:"column(mtwm_category_id)" json:"mtwmCategoryID"` // 这个是指对应的美团外卖商品类别 YbCategoryID int64 `orm:"column(yb_category_id)" json:"ybCategoryID"` // 这个是指对应的银豹商品类别 + JdsCategoryID int64 `orm:"column(jds_category_id)" json:"jdsCategoryID"` // 这个是指对应的京东商城类别 // ElmCategoryID int64 `orm:"column(elm_category_id)" json:"elmCategoryID"` // 这个是指对应的饿了么商品类别 // WscCategoryID int64 `orm:"column(wsc_category_id)" json:"wscCategoryID"` // 这个是指对应的美团外卖商品类别 @@ -165,6 +139,7 @@ type SkuCategory struct { IsExdSpec int `json:"isExdSpec"` //是否是饿鲜达特有新建的分类 // JdID int64 `orm:"column(jd_id);index" json:"jdID"` // 这个是指商家自己的商品类别在京东平台上的ID // JdSyncStatus int8 `orm:"default(2)" json:"jdSyncStatus"` + IsSync int `json:"isSync"` //是否同步到平台 } func (*SkuCategory) TableUnique() [][]string { diff --git a/business/model/store.go b/business/model/store.go index 06e1f4250..647cc86d4 100644 --- a/business/model/store.go +++ b/business/model/store.go @@ -56,8 +56,12 @@ const ( ) const ( - ExdStoreName = "饿鲜达" - MatterStoreID = 666666 + ExdStoreName = "饿鲜达" + MatterStoreID = 666666 + JdShopMainVendorStoreID = "999999" + JdShopMainStoreID = 102919 + + VendorStoreTel = "18011597879" ) var ( @@ -419,9 +423,12 @@ type StoreMap struct { SyncStatus int8 `orm:"default(2)" json:"syncStatus"` IsSync int8 `orm:"default(1)" json:"isSync"` // 是否同步 + SyncRule int8 `orm:"default(0)" json:"syncRule"` //目前用于京东商城晚上的同步规则,0表示关闭,1表示小同步,2表示大同步 FakeOpenStart int16 `orm:"default(0)" json:"fakeOpenStart"` // 假开店开始 FakeOpenStop int16 `orm:"default(0)" json:"fakeOpenStop"` // 假开店结束 JdStoreLevel string `orm:"size(32)" json:"jdStoreLevel"` //京东门店等级 + JdsStreetCode int `orm:"default(0)" json:"jdsStreetCode"` //京东商城直辖市街道code + JdsStreetName string `orm:"size(32)" json:"jdsStreetName"` //京东商城直辖市街道 IsOrder int `orm:"default(0)" json:"isOrder"` //是否是下预订单门店 diff --git a/business/model/store_sku.go b/business/model/store_sku.go index 0519894d0..89e0fb996 100644 --- a/business/model/store_sku.go +++ b/business/model/store_sku.go @@ -52,8 +52,10 @@ type StoreSkuCategoryMap struct { EbaiSyncStatus int8 `orm:"default(2)"` MtwmSyncStatus int8 `orm:"default(2)"` // WscSyncStatus int8 `orm:"default(2)"` - YbID int64 `orm:"column(yb_id);index"` - YbSyncStatus int8 `orm:"default(2)"` + YbID int64 `orm:"column(yb_id);index"` + YbSyncStatus int8 `orm:"default(2)"` + JdsID int64 `orm:"column(jds_id);index"` + JdsSyncStatus int8 `orm:"default(2)"` } func (*StoreSkuCategoryMap) TableUnique() [][]string { @@ -96,9 +98,11 @@ type StoreSkuBind struct { Status int // ElmID int64 `orm:"column(elm_id);index"` - MtwmID int64 `orm:"column(mtwm_id);index"` - EbaiID int64 `orm:"column(ebai_id);index"` - YbID int64 `orm:"column(yb_id);index"` + MtwmID int64 `orm:"column(mtwm_id);index"` + EbaiID int64 `orm:"column(ebai_id);index"` + YbID int64 `orm:"column(yb_id);index"` + JdsID int64 `orm:"column(jds_id);index"` + JdsWareID int64 `orm:"column(jds_ware_id)"` // WscID int64 `orm:"column(wsc_id);index"` // 表示微盟skuId // WscID2 int64 `orm:"column(wsc_id2);index"` // 表示微盟goodsId @@ -107,6 +111,7 @@ type StoreSkuBind struct { MtwmSyncStatus int8 `orm:"default(2)"` EbaiSyncStatus int8 `orm:"default(2)"` YbSyncStatus int8 `orm:"default(2)"` + JdsSyncStatus int8 `orm:"default(2)"` //京东商城 // WscSyncStatus int8 `orm:"default(2)"` JdPrice int `json:"jdPrice"` @@ -114,8 +119,10 @@ type StoreSkuBind struct { EbaiPrice int `json:"ebaiPrice"` JxPrice int `json:"jxPrice"` YbPrice int `json:"ybPrice"` + JdsPrice int `json:"jdsPrice"` JdLockTime *time.Time `orm:"null" json:"jdLockTime"` + JdsLockTime *time.Time `orm:"null" json:"jdsLockTime"` MtwmLockTime *time.Time `orm:"null" json:"mtwmLockTime"` EbaiLockTime *time.Time `orm:"null" json:"ebaiLockTime"` JxLockTime *time.Time `orm:"null" json:"jxLockTime"` diff --git a/business/model/user.go b/business/model/user.go index d7718c2a8..91011fbbf 100644 --- a/business/model/user.go +++ b/business/model/user.go @@ -175,3 +175,22 @@ type UserAgreement struct { IDNumber string `orm:"column(id_number);size(20)" json:"idNumber"` BankNumber string `orm:"size(32)" json:"bankNumber"` } + +type UserOrderSms struct { + ID int64 `orm:"column(id)" json:"-"` + CreatedAt time.Time `orm:"auto_now_add;type(datetime)" json:"createdAt"` + UpdatedAt time.Time `orm:"auto_now;type(datetime)" json:"-"` + LastOperator string `orm:"size(32)" json:"-"` // 最后操作员 + + Mobile string `orm:"size(32)" json:"mobile"` + Name string `orm:"size(32)" json:"name"` + VendorUserID string `orm:"column(vendor_user_id)" json:"vendorUserID"` + SMSMark int `orm:"column(sms_mark)" json:"smsMark"` + TotalCount int `json:"totalCount"` +} + +func (*UserOrderSms) TableUnique() [][]string { + return [][]string{ + []string{"Mobile"}, + } +} diff --git a/business/partner/partner.go b/business/partner/partner.go index 97928dc65..a24968fb8 100644 --- a/business/partner/partner.go +++ b/business/partner/partner.go @@ -147,6 +147,8 @@ type IPurchasePlatformHandler interface { // Store ReadStore(ctx *jxcontext.Context, vendorOrgCode, vendorStoreID string) (store *dao.StoreDetail, err error) UpdateStore(db *dao.DaoDB, storeID int, userName string) (err error) + CreateStore2(db *dao.DaoDB, storeID int, userName string) (vendorStoreID string, err error) + DeleteStore(db *dao.DaoDB, storeID int, userName string) (err error) GetStoreStatus(ctx *jxcontext.Context, vendorOrgCode string, storeID int, vendorStoreID string) (storeStatus int, err error) UpdateStoreCustomID(ctx *jxcontext.Context, vendorOrgCode, vendorStoreID string, storeID int64) (err error) diff --git a/business/partner/partner_store_sku.go b/business/partner/partner_store_sku.go index 2d3f6111b..89867ba3c 100644 --- a/business/partner/partner_store_sku.go +++ b/business/partner/partner_store_sku.go @@ -46,11 +46,12 @@ type StoreSkuInfo struct { Seq int `json:"seq,omitempty"` - ActPrice int64 `json:"actPrice,omitempty"` - VendorActID string `json:"vendorActID,omitempty"` - IsSpecialty int `json:"isSpecialty,omitempty"` - JxPrice int64 `json:"jxPrice,omitempty"` - JxUnitPrice int64 `json:"jxUnitPrice,omitempty"` + ActPrice int64 `json:"actPrice,omitempty"` + VendorActID string `json:"vendorActID,omitempty"` + IsSpecialty int `json:"isSpecialty,omitempty"` + JxPrice int64 `json:"jxPrice,omitempty"` + JxUnitPrice int64 `json:"jxUnitPrice,omitempty"` + VendorSkuID2 string `json:"vendorSkuID2,omitempty"` } type StoreSkuInfoWithErr struct { diff --git a/business/partner/purchase/ebai/order.go b/business/partner/purchase/ebai/order.go index 9f9b4271a..067fbeb2d 100644 --- a/business/partner/purchase/ebai/order.go +++ b/business/partner/purchase/ebai/order.go @@ -61,10 +61,14 @@ var ( } ) -func mapDeliveryType(ebaiDeliveryParty int) (deliveryType string) { - deliveryType = deliveryTypeMap[ebaiDeliveryParty] - if deliveryType == "" { - deliveryType = model.OrderDeliveryTypePlatform +func mapDeliveryType(ebaiDeliveryParty int, businessType int) (deliveryType string) { + if businessType == ebaiapi.DeliveryBusinessTypeZT { + return model.OrderDeliveryTypeSelfTake + } else { + deliveryType = deliveryTypeMap[ebaiDeliveryParty] + if deliveryType == "" { + deliveryType = model.OrderDeliveryTypePlatform + } } return deliveryType } @@ -226,7 +230,7 @@ func (p *PurchaseHandler) Map2Order(orderData map[string]interface{}) (order *mo ActualPayPrice: utils.ForceInterface2Int64(orderMap["user_fee"]), BaseFreightMoney: utils.ForceInterface2Int64(orderMap["send_fee"]), TotalShopMoney: utils.ForceInterface2Int64(orderMap["shop_fee"]), - DeliveryType: mapDeliveryType(int(utils.ForceInterface2Int64(orderMap["delivery_party"]))), + DeliveryType: mapDeliveryType(int(utils.ForceInterface2Int64(orderMap["delivery_party"])), int(utils.ForceInterface2Int64(orderMap["business_type"]))), InvoiceTitle: utils.Interface2String(orderMap["invoice_title"]), InvoiceTaxerID: utils.Interface2String(orderMap["taxer_id"]), diff --git a/business/partner/purchase/ebai/store.go b/business/partner/purchase/ebai/store.go index 8361b7182..4ae71f077 100644 --- a/business/partner/purchase/ebai/store.go +++ b/business/partner/purchase/ebai/store.go @@ -375,14 +375,21 @@ func ebaiOpTime2Jx(businessTime interface{}) (opTimeList []int16) { func genStoreMapFromStore(store *tEbaiStoreInfo) map[string]interface{} { params := fillOpTimeParams(nil, store.GetOpTimeList()) - tel := store.Tel1 - if tel == "" { - tel = store.Tel2 - } - if tel != "" { - // params["phone"] = tel // 外卖客服联系电话,这个有时能修改,有时不能修改,暂时统一不改 - params["ivr_phone"] = tel // 订单提醒电话 + // tel := store.Tel1 + // if tel == "" { + // tel = store.Tel2 + // } + // if tel != "" { + // // params["phone"] = tel // 外卖客服联系电话,这个有时能修改,有时不能修改,暂时统一不改 + // params["ivr_phone"] = tel // 订单提醒电话 + // } + phone := "" + if store.MarketManPhone != "" { + phone = store.MarketManPhone + } else { + phone = model.VendorStoreTel } + params["ivr_phone"] = phone //统一改为这个电话 if store.VendorStoreID != "" { params["baidu_shop_id"] = store.VendorStoreID } @@ -534,3 +541,11 @@ func (c *PurchaseHandler) GetShopIDsByPage() (vendorStoreIDs []string, err error } return vendorStoreIDs, err } + +func (p *PurchaseHandler) CreateStore2(db *dao.DaoDB, storeID int, userName string) (vendorStoreID string, err error) { + return vendorStoreID, err +} + +func (p *PurchaseHandler) DeleteStore(db *dao.DaoDB, storeID int, userName string) (err error) { + return err +} diff --git a/business/partner/purchase/jd/order.go b/business/partner/purchase/jd/order.go index 78328428e..055ca98d8 100644 --- a/business/partner/purchase/jd/order.go +++ b/business/partner/purchase/jd/order.go @@ -6,6 +6,8 @@ import ( "strings" "time" + "git.rosy.net.cn/jx-callback/business/model/dao" + "git.rosy.net.cn/jx-callback/business/jxutils/tasksch" "git.rosy.net.cn/baseapi/platformapi/autonavi" @@ -71,7 +73,7 @@ func (c *PurchaseHandler) updateOrderFinancialInfo(a *jdapi.API, orderID string) if err == nil { if orderSettlement != nil { updateOrderBySettleMent(order, orderSettlement) - err = partner.CurOrderManager.UpdateOrderFields(order, []string{ /*"WaybillTipMoney", */ "TotalShopMoney", "PmSubsidyMoney"}) + err = partner.CurOrderManager.UpdateOrderFields(order, []string{ /*"WaybillTipMoney", */ "TotalShopMoney", "PmSubsidyMoney", "NewEarningPrice"}) } } return err @@ -135,6 +137,16 @@ func updateOrderBySettleMent(order *model.GoodsOrder, orderSettlement *jdapi.Ord // order.WaybillTipMoney = orderSettlement.VenderPaidTips order.TotalShopMoney = orderSettlement.SettlementAmount order.PmSubsidyMoney = orderSettlement.PlatOrderGoodsDiscountMoney + orderSettlement.PlatSkuGoodsDiscountMoney + if order.TotalShopMoney > 0 { + stores, _ := dao.GetStoreList(dao.GetDB(), []int{order.StoreID}, nil, nil, nil, "") + if len(stores) > 0 { + if stores[0].PayPercentage <= 50 { + order.NewEarningPrice = order.TotalShopMoney * int64((100 - stores[0].PayPercentage/2)) / 100 + } else { + order.NewEarningPrice = order.EarningPrice + } + } + } } } diff --git a/business/partner/purchase/jd/store.go b/business/partner/purchase/jd/store.go index a4fffb315..aca822b80 100644 --- a/business/partner/purchase/jd/store.go +++ b/business/partner/purchase/jd/store.go @@ -138,10 +138,16 @@ func (p *PurchaseHandler) UpdateStore(db *dao.DaoDB, storeID int, userName strin if err = dao.GetRows(db, &stores, sql, model.VendorIDJD, utils.DefaultTimeValue, storeID); err == nil { for _, store := range stores { a := getAPI(store.VendorOrgCode) + phone := "" + if store.MarketManPhone != "" { + phone = store.MarketManPhone + } else { + phone = model.VendorStoreTel + } storeParams := &jdapi.OpStoreParams{ StationNo: store.VendorStoreID, Operator: userName, - Phone: store.Tel1, + Phone: phone, Mobile: store.Tel2, } if store.SyncStatus&model.SyncFlagDeletedMask == 0 { @@ -167,7 +173,13 @@ func (p *PurchaseHandler) UpdateStore(db *dao.DaoDB, storeID int, userName strin } if store.JdDistrictCode != 0 { storeParams.County = store.JdDistrictCode + //TODO 彭州市做特殊处理 2020-05-25 + if store.JdDistrictCode == 49318 { + storeParams.City = 49318 + storeParams.County = 310045 + } } + // storeParams.DeliveryRangeType = store.DeliveryRangeType // if store.DeliveryRangeType == model.DeliveryRangeTypePolygon { // storeParams.CoordinatePoints = store.DeliveryRange @@ -498,3 +510,11 @@ func (c *PurchaseHandler) UpdateStoreCustomID(ctx *jxcontext.Context, vendorOrgC } return err } + +func (p *PurchaseHandler) CreateStore2(db *dao.DaoDB, storeID int, userName string) (vendorStoreID string, err error) { + return vendorStoreID, err +} + +func (p *PurchaseHandler) DeleteStore(db *dao.DaoDB, storeID int, userName string) (err error) { + return err +} diff --git a/business/partner/purchase/jdshop/act.go b/business/partner/purchase/jdshop/act.go new file mode 100644 index 000000000..d155fefd8 --- /dev/null +++ b/business/partner/purchase/jdshop/act.go @@ -0,0 +1,11 @@ +package jdshop + +import ( + "git.rosy.net.cn/jx-callback/business/jxutils/jxcontext" + "git.rosy.net.cn/jx-callback/business/jxutils/tasksch" + "git.rosy.net.cn/jx-callback/business/model" +) + +func (c *PurchaseHandler) SyncAct(ctx *jxcontext.Context, parentTask tasksch.ITask, act *model.Act2, actOrderRules []*model.ActOrderRule, actStoreSkuList []*model.ActStoreSku2) (err error) { + return err +} diff --git a/business/partner/purchase/jdshop/callback.go b/business/partner/purchase/jdshop/callback.go new file mode 100644 index 000000000..77c54ac2c --- /dev/null +++ b/business/partner/purchase/jdshop/callback.go @@ -0,0 +1,35 @@ +package jdshop + +import ( + "fmt" + + "git.rosy.net.cn/baseapi/platformapi/jdshopapi" +) + +func OnCallbackMsg(msg *jdshopapi.CallBackResult) { + fmt.Println("testcallback") + // if CurPurchaseHandler != nil { + // if msg.Cmd == mtwmapi.MsgTypeStoreStatusChanged { + // response = CurPurchaseHandler.onStoreStatusChanged(msg) + // } else if msg.Cmd == mtwmapi.MsgTypePrivateNumberDowngrade { + // response = CurPurchaseHandler.onNumberDowngrade(msg) + // } else { + // if orderID := GetOrderIDFromMsg(msg); orderID != "" { + // jxutils.CallMsgHandler(func() { + // switch msg.Cmd { + // case mtwmapi.MsgTypeWaybillStatus: + // response = CurPurchaseHandler.onWaybillMsg(msg) + // default: + // response = CurPurchaseHandler.onOrderMsg(msg) + // } + // }, jxutils.ComposeUniversalOrderID(orderID, model.VendorIDMTWM)) + // } + // /*if msg.Cmd == mtwmapi.MsgTypeOrderRefund || msg.Cmd == mtwmapi.MsgTypeOrderPartialRefund { + // utils.CallFuncAsync(func() { + // OnFinancialMsg(msg) + // }) + // } */ + // } + // } + // return response +} diff --git a/business/partner/purchase/jdshop/jds.go b/business/partner/purchase/jdshop/jds.go new file mode 100644 index 000000000..8f73f40d4 --- /dev/null +++ b/business/partner/purchase/jdshop/jds.go @@ -0,0 +1,69 @@ +package jdshop + +import ( + "git.rosy.net.cn/baseapi/utils" + "git.rosy.net.cn/jx-callback/business/jxutils/jxcontext" + "git.rosy.net.cn/jx-callback/business/model" + "git.rosy.net.cn/jx-callback/business/partner" + "git.rosy.net.cn/jx-callback/business/partner/putils" + "git.rosy.net.cn/jx-callback/globals" + "git.rosy.net.cn/jx-callback/globals/api" +) + +var ( + CurPurchaseHandler *PurchaseHandler +) + +type PurchaseHandler struct { + partner.BasePurchasePlatform + putils.DefSingleStorePlatform +} + +func init() { + if api.JdShopAPI != nil { + CurPurchaseHandler = New() + partner.RegisterPurchasePlatform(CurPurchaseHandler) + } +} + +func New() (obj *PurchaseHandler) { + obj = new(PurchaseHandler) + obj.ISingleStoreStoreSkuHandler = obj + return obj +} + +func (p *PurchaseHandler) GetVendorID() int { + return model.VendorIDJDShop +} + +func (p *PurchaseHandler) UploadImg(ctx *jxcontext.Context, vendorOrgCode, imgURL string, imgData []byte, imgName string, imgType int) (imgHint string, err error) { + if globals.EnableJdShopWrite { + if imgType > model.ImgTypeLocal { + result, err := api.JdShopAPI.UploadPicture(imgData, 0, imgName) + if err == nil { + imgHint = result.PictureURL + } + } + } else { + imgHint = utils.GetUpperUUID() + } + return imgHint, err +} + +func (p *PurchaseHandler) GetVendorCategories(ctx *jxcontext.Context) (vendorCats []*model.SkuVendorCategory, err error) { + result, err := api.JdShopAPI.FindVendorCategories() + for _, v := range result { + cat := &model.SkuVendorCategory{ + VendorID: model.VendorIDJDShop, + Name: v.Name, + Level: v.Lev, + VendorCategoryID: utils.Int2Str(v.ID), + } + if v.Lev > 1 { + cat.ParentID = utils.Int2Str(v.Fid) + cat.IsLeaf = 1 + } + vendorCats = append(vendorCats, cat) + } + return vendorCats, err +} diff --git a/business/partner/purchase/jdshop/order.go b/business/partner/purchase/jdshop/order.go new file mode 100644 index 000000000..075526bc6 --- /dev/null +++ b/business/partner/purchase/jdshop/order.go @@ -0,0 +1,76 @@ +package jdshop + +import ( + "git.rosy.net.cn/jx-callback/business/jxutils/jxcontext" + "git.rosy.net.cn/jx-callback/business/model" +) + +func (p *PurchaseHandler) AcceptOrRefuseFailedGetOrder(ctx *jxcontext.Context, order *model.GoodsOrder, isAcceptIt bool) (err error) { + return err +} + +func (p *PurchaseHandler) Map2Order(orderData map[string]interface{}) (order *model.GoodsOrder) { + return order +} +func (p *PurchaseHandler) GetOrder(vendorOrgCode, vendorOrderID string) (order *model.GoodsOrder, err error) { + return order, err +} +func (p *PurchaseHandler) GetOrderStatus(vendorOrgCode, vendorOrderID string) (status int, err error) { + return status, err +} + +func (p *PurchaseHandler) AcceptOrRefuseOrder(order *model.GoodsOrder, isAcceptIt bool, userName string) (err error) { + return err +} +func (p *PurchaseHandler) PickupGoods(order *model.GoodsOrder, isSelfDelivery bool, userName string) (err error) { + return err +} + +func (p *PurchaseHandler) CallCourier(ctx *jxcontext.Context, order *model.GoodsOrder) (err error) { + return err +} // 取货失败后再次招唤平台配送 +func (p *PurchaseHandler) ConfirmReceiveGoods(ctx *jxcontext.Context, order *model.GoodsOrder) (err error) { + return err +} // 投递失败后确认收到退货 +func (p *PurchaseHandler) CanSwitch2SelfDeliver(order *model.GoodsOrder) (isCan bool, err error) { + return isCan, err +} +func (p *PurchaseHandler) Swtich2SelfDeliver(order *model.GoodsOrder, userName string) (err error) { + return err +} +func (p *PurchaseHandler) Swtich2SelfDelivered(order *model.GoodsOrder, userName string) (err error) { + return err +} +func (p *PurchaseHandler) SelfDeliverDelivering(order *model.GoodsOrder, userName string) (err error) { + return err +} +func (p *PurchaseHandler) SelfDeliverDelivered(order *model.GoodsOrder, userName string) (err error) { + return err +} +func (p *PurchaseHandler) GetOrderRealMobile(ctx *jxcontext.Context, order *model.GoodsOrder) (mobile string, err error) { + return mobile, err +} +func (p *PurchaseHandler) ReplyOrderComment(ctx *jxcontext.Context, vendorOrgCode string, orderComment *model.OrderComment, replyComment string) (err error) { + return err +} +func (p *PurchaseHandler) AgreeOrRefuseCancel(ctx *jxcontext.Context, order *model.GoodsOrder, isAgree bool, reason string) (err error) { + return err +} +func (p *PurchaseHandler) CancelOrder(ctx *jxcontext.Context, order *model.GoodsOrder, reason string) (err error) { + return err +} +func (p *PurchaseHandler) AdjustOrder(ctx *jxcontext.Context, order *model.GoodsOrder, removedSkuList []*model.OrderSku, reason string) (err error) { + return err +} +func (p *PurchaseHandler) RefundOrder(ctx *jxcontext.Context, order *model.GoodsOrder, reason string) (err error) { + return err +} +func (p *PurchaseHandler) PartRefundOrder(ctx *jxcontext.Context, order *model.GoodsOrder, refundSkuList []*model.OrderSku, reason string) (err error) { + return err +} +func (p *PurchaseHandler) AgreeOrRefuseRefund(ctx *jxcontext.Context, order *model.AfsOrder, approveType int, reason string) (err error) { + return err +} +func (p *PurchaseHandler) ConfirmReceivedReturnGoods(ctx *jxcontext.Context, order *model.AfsOrder) (err error) { + return err +} diff --git a/business/partner/purchase/jdshop/order_comment.go b/business/partner/purchase/jdshop/order_comment.go new file mode 100644 index 000000000..6505fdb3c --- /dev/null +++ b/business/partner/purchase/jdshop/order_comment.go @@ -0,0 +1,5 @@ +package jdshop + +func (c *PurchaseHandler) StartRefreshComment() { + +} diff --git a/business/partner/purchase/jdshop/store.go b/business/partner/purchase/jdshop/store.go new file mode 100644 index 000000000..0a308695b --- /dev/null +++ b/business/partner/purchase/jdshop/store.go @@ -0,0 +1,178 @@ +package jdshop + +import ( + "encoding/base64" + "encoding/json" + "fmt" + "strings" + + "git.rosy.net.cn/baseapi/platformapi/jdshopapi" + "git.rosy.net.cn/baseapi/utils" + "git.rosy.net.cn/jx-callback/business/jxutils" + "git.rosy.net.cn/jx-callback/business/jxutils/jxcontext" + "git.rosy.net.cn/jx-callback/business/jxutils/tasksch" + "git.rosy.net.cn/jx-callback/business/model" + "git.rosy.net.cn/jx-callback/business/model/dao" + "git.rosy.net.cn/jx-callback/globals/api" +) + +func (p *PurchaseHandler) ReadStore(ctx *jxcontext.Context, vendorOrgCode, vendorStoreID string) (storeDetail *dao.StoreDetail, err error) { + // result, err := api.JdShopAPI.NewInfoList(utils.Str2Int64(vendorStoreID)) + // storeDetail.VendorStoreID = vendorStoreID + // storeDetail.Status = JdsStatus2jxStatus(result.StoreStatus) + result2, err := api.JdShopAPI.QueryEntityStore(utils.Str2Int64(vendorStoreID)) + if result2 == nil { + return storeDetail, fmt.Errorf("未查询到该平台门店,平台门店ID:[%v]", vendorStoreID) + } + storeDetail = &dao.StoreDetail{} + storeDetail.ID = utils.Str2Int(result2.ExStoreID) + storeDetail.Name = result2.StoreName + storeDetail.Address = result2.Address + storeDetail.Tel1 = result2.Phone + storeDetail.DistrictCode = result2.AddrCode + zbs := strings.Split(result2.Coordinate, ",") + storeDetail.Lat = jxutils.StandardCoordinate2Int(utils.Str2Float64(zbs[0])) + storeDetail.Lng = jxutils.StandardCoordinate2Int(utils.Str2Float64(zbs[1])) + return storeDetail, err +} + +// stoerIDs为nil表示所有 +func (p *PurchaseHandler) UpdateStore(db *dao.DaoDB, storeID int, userName string) (err error) { + store, err := dao.GetStoreDetail(db, storeID, model.VendorIDJDShop) + if err != nil { + return err + } + data, _, err := jxutils.DownloadFileByURL(jdshopapi.JdsStoreImg) + timeMap := map[string]string{ + "businessBeginTime": int2TimeStr(int(store.OpenTime1)), + "businessEndTime": int2TimeStr(int(store.CloseTime1)), + } + timeJSON, _ := json.Marshal(timeMap) + updateEntityStoreParam := &jdshopapi.UpdateEntityStoreParam{ + StoreID: utils.Str2Int(store.VendorStoreID), + Name: store.Name, + AddCode: store.JdsCode, + AddCodeName: store.DistrictName, + AddName: store.ProvinceName + store.CityName + store.DistrictName + "@!" + store.Address, + Coordinate: utils.Float64ToStr(jxutils.IntCoordinate2Standard(store.Lat)) + "," + utils.Float64ToStr(jxutils.IntCoordinate2Standard(store.Lng)), + Phone: store.Tel1, + ExtendJSON: string(timeJSON), + ImageFile: base64.StdEncoding.EncodeToString(data), + CustomerID: utils.Int2Str(store.ID), + } + if store.JdsStreetCode != 0 { + updateEntityStoreParam.AddCode = store.JdsStreetCode + } + if updateEntityStoreParam.AddCode == 0 { + updateEntityStoreParam.AddCode = store.JdCode + } + err = api.JdShopAPI.UpdateEntityStore(updateEntityStoreParam) + if err == nil { + // if store.SyncStatus&(model.SyncFlagNewMask|model.SyncFlagStoreStatus) != 0 { + // mergeStatus := jxutils.MergeStoreStatus(store.Status, store.VendorStatus) + // err = api.JdShopAPI.UpdateStoreStatus(utils.Str2Int(store.VendorStoreID), jxStatus2JdsStatus(mergeStatus)) + // } + } + return err +} + +func (p *PurchaseHandler) CreateStore2(db *dao.DaoDB, storeID int, userName string) (vendorStoreID string, err error) { + store, err := dao.GetStoreDetail(db, storeID, model.VendorIDJDShop) + if err != nil { + return vendorStoreID, err + } + data, _, err := jxutils.DownloadFileByURL(jdshopapi.JdsStoreImg) + timeMap := map[string]string{ + "businessBeginTime": int2TimeStr(int(store.OpenTime1)), + "businessEndTime": int2TimeStr(int(store.CloseTime1)), + } + timeJSON, _ := json.Marshal(timeMap) + createEntityStoreParam := &jdshopapi.CreateEntityStoreParam{ + Name: store.Name, + AddCode: store.JdsCode, + AddCodeName: store.DistrictName, + AddName: store.ProvinceName + store.CityName + store.DistrictName + "@!" + store.Address, + Coordinate: utils.Float64ToStr(jxutils.IntCoordinate2Standard(store.Lat)) + "," + utils.Float64ToStr(jxutils.IntCoordinate2Standard(store.Lng)), + Phone: store.Tel1, + ExtendJSON: string(timeJSON), + ImageFile: base64.StdEncoding.EncodeToString(data), + CategoryName: jdshopapi.JdsStoreCategoryName, + CustomerID: utils.Int2Str(store.ID), + } + if store.JdsStreetCode != 0 { + createEntityStoreParam.AddCode = store.JdsStreetCode + } + if createEntityStoreParam.AddCode == 0 { + createEntityStoreParam.AddCode = store.JdCode + } + vendorStoreID, err = api.JdShopAPI.CreateEntityStore(createEntityStoreParam) + return vendorStoreID, err +} + +func (p *PurchaseHandler) DeleteStore(db *dao.DaoDB, storeID int, userName string) (err error) { + // store, err := dao.GetStoreDetail(db, storeID, model.VendorIDJDShop) + // if err != nil { + // return err + // } + // err = api.JdShopAPI.DeleteStoresByID(utils.Str2Int64(store.VendorStoreID)) + return err +} + +func (p *PurchaseHandler) RefreshAllStoresID(ctx *jxcontext.Context, parentTask tasksch.ITask, isAsync bool) (hint string, err error) { + return hint, err +} + +func (p *PurchaseHandler) GetStoreStatus(ctx *jxcontext.Context, vendorOrgCode string, storeID int, vendorStoreID string) (storeStatus int, err error) { + return storeStatus, err +} + +func (p *PurchaseHandler) EnableAutoAcceptOrder(ctx *jxcontext.Context, vendorOrgCode string, storeID int, vendorStoreID string, isSetEnable bool) (err error) { + return err +} + +func (c *PurchaseHandler) UpdateStoreStatus(ctx *jxcontext.Context, vendorOrgCode string, storeID int, vendorStoreID string, status int) (err error) { + return err +} + +func (c *PurchaseHandler) UpdateStoreOpTime(ctx *jxcontext.Context, vendorOrgCode string, storeID int, vendorStoreID string, opTimeList []int16) (err error) { + return err +} + +func (c *PurchaseHandler) GetAllStoresVendorID(ctx *jxcontext.Context, vendorOrgCode string) (vendorStoreIDs []string, err error) { + return vendorStoreIDs, err +} + +func (c *PurchaseHandler) UpdateStoreCustomID(ctx *jxcontext.Context, vendorOrgCode, vendorStoreID string, storeID int64) (err error) { + return err +} + +func int2TimeStr(time int) (str string) { + str += utils.Int2Str(time / 1000) + str += utils.Int2Str(time % 1000 / 100) + str += ":" + str += utils.Int2Str(time % 100 / 10) + str += utils.Int2Str(time % 10) + return str +} + +func jxStatus2JdsStatus(status int) (result int) { + if status == model.StoreStatusOpened { + result = jdshopapi.JdsStoreStatusOnline + } else if status == model.StoreStatusHaveRest || status == model.StoreStatusClosed { + result = jdshopapi.JdsStoreStatusRest + } else { + result = jdshopapi.JdsStoreStatusDisable + } + return result +} + +func JdsStatus2jxStatus(status int) (result int) { + if status == jdshopapi.JdsStoreStatusOnline { + result = model.StoreStatusOpened + } else if status == jdshopapi.JdsStoreStatusRest { + result = model.StoreStatusClosed + } else { + result = model.StoreStatusDisabled + } + return result +} diff --git a/business/partner/purchase/jdshop/store_sku.go b/business/partner/purchase/jdshop/store_sku.go new file mode 100644 index 000000000..8a6f64e8c --- /dev/null +++ b/business/partner/purchase/jdshop/store_sku.go @@ -0,0 +1,758 @@ +package jdshop + +import ( + "fmt" + "regexp" + "strings" + "time" + + "git.rosy.net.cn/baseapi/platformapi/jdshopapi" + + "git.rosy.net.cn/jx-callback/globals/api" + + "git.rosy.net.cn/baseapi/platformapi/yinbaoapi" + "git.rosy.net.cn/baseapi/utils" + "git.rosy.net.cn/jx-callback/business/jxutils" + "git.rosy.net.cn/jx-callback/business/jxutils/jxcontext" + "git.rosy.net.cn/jx-callback/business/jxutils/tasksch" + "git.rosy.net.cn/jx-callback/business/model" + "git.rosy.net.cn/jx-callback/business/model/dao" + "git.rosy.net.cn/jx-callback/business/partner" + "git.rosy.net.cn/jx-callback/business/partner/putils" + "git.rosy.net.cn/jx-callback/globals" +) + +var ( + sensitiveWordRegexp = regexp.MustCompile(`商品名称中含有敏感词(\[.*\])`) +) + +func (p *PurchaseHandler) CreateStoreSkus(ctx *jxcontext.Context, storeID int, vendorStoreID string, storeSkuList []*dao.StoreSkuSyncInfo) (failedList []*partner.StoreSkuInfoWithErr, err error) { + if globals.EnableJdShopWrite && vendorStoreID == model.JdShopMainVendorStoreID { + for _, v := range storeSkuList { + //判断京东商城上是否有这个商品了,如果有就是添加规格而不是创建商品 + name := filterSensitiveWord(v.Name) + flag := false + result, err := api.JdShopAPI.SearchWare4Valid(name, 1, 100) + if err != nil { + failedList = putils.GetErrMsg2FailedSingleList(storeSkuList, err, storeID, model.VendorChineseNames[model.VendorIDJDShop], "创建商品") + return failedList, err + } + for _, v := range result.Data { + if v.Title == name { + flag = true + break + } + } + if result.TotalItem > 0 && len(result.Data) > 0 && flag { + for _, vv := range v.StoreSkuSyncInfoJds { + v.JdsWareID = result.Data[0].WareID + vv.JdsWareID = result.Data[0].WareID + updateSkusParam, err := buildUpdateSkusParam(v, vv, true) + if err != nil { + failedList = putils.GetErrMsg2FailedSingleList(storeSkuList, err, storeID, model.VendorChineseNames[model.VendorIDJDShop], "创建商品") + return failedList, err + } + vendorSkuID, err := api.JdShopAPI.UpdateSkus(updateSkusParam) + if err != nil { + failedList = putils.GetErrMsg2FailedSingleList(storeSkuList, err, storeID, model.VendorChineseNames[model.VendorIDJDShop], "创建商品") + return failedList, err + } + vv.VendorSkuID = vendorSkuID + } + } else { + createSkuParamWare, createSkuParamSkus, err := buildCreateWareParam(v) + if err != nil { + failedList = putils.GetErrMsg2FailedSingleList(storeSkuList, err, storeID, model.VendorChineseNames[model.VendorIDJDShop], "创建商品") + return failedList, err + } + createSkuResult, err := api.JdShopAPI.CreateWare(createSkuParamWare, createSkuParamSkus) + if err != nil { + failedList = putils.GetErrMsg2FailedSingleList(storeSkuList, err, storeID, model.VendorChineseNames[model.VendorIDJDShop], "创建商品") + return failedList, err + } else { + //追加商品透图 + imageURL := "" + img := v.Img + if img != "" { + suffix := img[strings.LastIndex(img, "."):] + if suffix != ".png" { + if resBinary, _, err := jxutils.DownloadFileByURL(img + model.SkuNameImgToPng); err == nil { + downloadURL, err2 := jxutils.UploadExportContent(resBinary, utils.Int64ToStr(time.Now().Unix())) + err = err2 + imageURL, err = uploadImg(downloadURL, name, "tou") + } + } else { + imageURL, err = uploadImg(img, name, "tou") + } + } + err2 := api.JdShopAPI.TransparentImageAdd(createSkuResult.WareID, imageURL) + if err2 != nil { + failedList = putils.GetErrMsg2FailedSingleList(storeSkuList, err, storeID, model.VendorChineseNames[model.VendorIDJDShop], "创建商品") + return failedList, err + } + } + var paramAttrs = make(map[string]*jdshopapi.CreateSkuParamSkus) + var resultAttrs = make(map[string]int64) + for _, vv := range createSkuParamSkus { + for _, vvv := range vv.SaleAttrs { + paramAttrs[vvv.AttrValues[0]] = vv + } + } + for _, vv1 := range createSkuResult.Skus { + for _, vvv1 := range vv1.SaleAttrs { + if paramAttrs[vvv1.AttrValues[0]] != nil { + resultAttrs[paramAttrs[vvv1.AttrValues[0]].OuterID] = vv1.SkuID + } + } + } + for _, vv2 := range v.StoreSkuSyncInfoJds { + vv2.JdsWareID = createSkuResult.WareID + if resultAttrs[utils.Int2Str(vv2.SkuID)] != 0 { + vv2.VendorSkuID = utils.Int64ToStr(resultAttrs[utils.Int2Str(vv2.SkuID)]) + } + } + } + } + } + return failedList, err +} + +func (p *PurchaseHandler) UpdateStoreSkus(ctx *jxcontext.Context, storeID int, vendorStoreID string, storeSkuList []*dao.StoreSkuSyncInfo) (failedList []*partner.StoreSkuInfoWithErr, err error) { + if globals.EnableJdShopWrite && vendorStoreID == model.JdShopMainVendorStoreID { + for _, v := range storeSkuList { + name := filterSensitiveWord(v.Name) + updateWareParam := &jdshopapi.UpdateWareParam{ + WareID: v.JdsWareID, + Title: name, + VenderID: jdshopapi.VenderID, + PromiseID: jdshopapi.JdsPromiseID, + } + var desc string + if v.DescImg != "" { + pic3, err2 := uploadImg2(v.DescImg, name, "desc") + err = err2 + desc = `



` + } else { + desc = `



` + } + updateWareParam.Introduction = desc + updateWareParam.MobileDesc = desc + if v.Img != "" { + pic1, err2 := uploadImg2(v.Img, name, "1") + err = err2 + err = api.JdShopAPI.ImageUpdate(v.JdsWareID, 1, pic1) + if v.Img2 != "" { + pic2, err2 := uploadImg2(v.Img2, name, "2") + err = err2 + err = api.JdShopAPI.ImageUpdate(v.JdsWareID, 2, pic2) + } else { + err = api.JdShopAPI.ImageUpdate(v.JdsWareID, 2, pic1) + } + + } + var features = []*jdshopapi.CreateSkuParamFeatures{ + &jdshopapi.CreateSkuParamFeatures{ + Key: "is7ToReturn", //不支持7天无理由退货 + Value: "0", + }, + &jdshopapi.CreateSkuParamFeatures{ + Key: "tssp", //支持自提 + Value: "4", + }, + // &jdshopapi.CreateSkuParamFeatures{ + // Key: "fdms", //分单? + // Value: "1", + // }, + } + updateWareParam.Features = features + err = api.JdShopAPI.UpdateWare(updateWareParam) + if err == nil { + //追加商品透图 + imageURL := "" + img := v.Img + if img != "" { + suffix := img[strings.LastIndex(img, "."):] + if suffix != ".png" { + if resBinary, _, err := jxutils.DownloadFileByURL(img + model.SkuNameImgToPng); err == nil { + downloadURL, err2 := jxutils.UploadExportContent(resBinary, utils.Int64ToStr(time.Now().Unix())) + err = err2 + imageURL, err = uploadImg(downloadURL, name, "tou") + } + } else { + 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 + } + } + for _, vv := range v.StoreSkuSyncInfoJds { + updateSkusParam, err := buildUpdateSkusParam(v, vv, false) + if err != nil { + failedList = putils.GetErrMsg2FailedSingleList(storeSkuList, err, storeID, model.VendorChineseNames[model.VendorIDJDShop], "更新商品基础信息") + return failedList, err + } + vendorSkuID, err := api.JdShopAPI.UpdateSkus(updateSkusParam) + vv.VendorSkuID = vendorSkuID + } + } + if err != nil { + failedList = putils.GetErrMsg2FailedSingleList(storeSkuList, err, storeID, model.VendorChineseNames[model.VendorIDJDShop], "更新商品基础信息") + } + } + return failedList, err +} + +func (p *PurchaseHandler) DeleteStoreSkus(ctx *jxcontext.Context, storeID int, vendorStoreID string, storeSkuList []*partner.StoreSkuInfo) (failedList []*partner.StoreSkuInfoWithErr, err error) { + if globals.EnableJdShopWrite && vendorStoreID == model.JdShopMainVendorStoreID { + for _, v := range storeSkuList { + // err = api.JdShopAPI.DeleteSku(utils.Str2Int64(v.VendorSkuID)) + err = api.JdShopAPI.UpOrDown(utils.Str2Int64(v.VendorSkuID2), 2) + if err == nil { + err = api.JdShopAPI.DeleteWare(utils.Str2Int(v.VendorSkuID2)) + } + } + if err != nil { + failedList = putils.GetErrMsg2FailedSingleList(storeSkuList, err, storeID, model.VendorChineseNames[model.VendorIDJDShop], "删除商品") + } + } + return failedList, err +} + +func (p *PurchaseHandler) GetStoreSkusFullInfo(ctx *jxcontext.Context, parentTask tasksch.ITask, storeID int, vendorStoreID string, storeSkuList []*partner.StoreSkuInfo) (skuNameList []*partner.SkuNameInfo, err error) { + var ( + pageNo = 1 + pageSize = 100 + ) + pageResult, err := api.JdShopAPI.SearchWare4Valid("", pageNo, pageSize) + for ; pageNo <= pageResult.TotalItem/pageSize+1; pageNo++ { + result, err := api.JdShopAPI.SearchWare4Valid("", pageNo, pageSize) + if err == nil { + for _, v := range result.Data { + if skuName := vendorSku2Jx(v); skuName != nil { + skuNameList = append(skuNameList, skuName) + } + } + } + } + return skuNameList, err +} + +func (p *PurchaseHandler) UpdateStoreSkusStatus(ctx *jxcontext.Context, vendorOrgCode string, storeID int, vendorStoreID string, storeSkuList []*partner.StoreSkuInfo, status int) (failedList []*partner.StoreSkuInfoWithErr, err error) { + if globals.EnableJdShopWrite { + var stock = 0 + for _, v := range storeSkuList { + if status == model.SkuStatusNormal { + stock = 9999 + } + if storeID == model.JdShopMainStoreID { + err = api.JdShopAPI.UpdateSkuStock(utils.Str2Int(v.VendorSkuID), stock) + } else { + storeSkus, err2 := dao.GetStoresSkusInfo(dao.GetDB(), []int{model.JdShopMainStoreID}, []int{v.SkuID}) + err = err2 + if len(storeSkus) > 0 { + if storeSkus[0].JdsID != 0 { + err = api.JdShopAPI.UpdateSkuSiteStock(storeSkus[0].JdsID, stock, utils.Str2Int(vendorStoreID)) + } + } + } + } + if err != nil { + failedList = putils.GetErrMsg2FailedSingleList(storeSkuList, err, storeID, model.VendorChineseNames[model.VendorIDJDShop], "修改商品库存") + } + } + return failedList, err +} + +func (p *PurchaseHandler) UpdateStoreSkusPrice(ctx *jxcontext.Context, vendorOrgCode string, storeID int, vendorStoreID string, storeSkuList []*partner.StoreSkuInfo) (failedList []*partner.StoreSkuInfoWithErr, err error) { + 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], "修改商品价格") + } + } + return failedList, err +} + +func (p *PurchaseHandler) UpdateStoreSkusStock(ctx *jxcontext.Context, vendorOrgCode string, storeID int, vendorStoreID string, storeSkuList []*partner.StoreSkuInfo) (failedList []*partner.StoreSkuInfoWithErr, err error) { + if globals.EnableJdShopWrite { + + } + return failedList, err +} + +func (p *PurchaseHandler) GetStoreAllCategories(ctx *jxcontext.Context, storeID int, vendorStoreID string) (cats []*partner.BareCategoryInfo, err error) { + result, err := api.JdShopAPI.FindShopCategories() + for _, v := range result { + var cat = &partner.BareCategoryInfo{ + VendorCatID: utils.Int64ToStr(v.CID), + Name: v.Name, + } + if v.ParentCID == 0 { + cat.Level = 1 + } else { + cat.Level = 2 + } + cats = append(cats, cat) + } + return cats, err +} + +func (p *PurchaseHandler) CreateStoreCategory(ctx *jxcontext.Context, storeID int, vendorStoreID string, storeCat *dao.SkuStoreCatInfo) (err error) { + if globals.EnableJdShopWrite && vendorStoreID == model.JdShopMainVendorStoreID { + status, err2 := updateOrCreateCategories(storeCat, true) + err = err2 + if status == -1 { + return fmt.Errorf("京东商城店内分类创建失败!") + } + flag := false + for { + result, err := api.JdShopAPI.FindShopCategories() + if err != nil { + return err + } + for _, v := range result { + if v.Name == storeCat.Name { + storeCat.VendorCatID = utils.Int64ToStr(v.CID) + flag = true + break + } + } + time.Sleep(time.Second * 2) + if flag { + break + } + } + } + return err +} + +func (p *PurchaseHandler) UpdateStoreCategory(ctx *jxcontext.Context, storeID int, vendorStoreID string, storeCat *dao.SkuStoreCatInfo) (err error) { + if globals.EnableJdShopWrite && vendorStoreID == model.JdShopMainVendorStoreID { + status, err2 := updateOrCreateCategories(storeCat, false) + err = err2 + if status == -1 { + return fmt.Errorf("京东商城店内分类更新失败!") + } + } + return err +} + +func (p *PurchaseHandler) DeleteStoreCategory(ctx *jxcontext.Context, storeID int, vendorStoreID, vendorCatID string, level int) (err error) { + if globals.EnableJdShopWrite && vendorStoreID == model.JdShopMainVendorStoreID { + _, err = api.JdShopAPI.DeleteShopCategory(utils.Str2Int64(vendorCatID)) + } + return err +} + +func (p *PurchaseHandler) IsErrSkuExist(err error) (isExist bool) { + return false +} + +func (p *PurchaseHandler) IsErrCategoryExist(err error) (isExist bool) { + return false +} + +func (p *PurchaseHandler) IsErrCategoryNotExist(err error) (isNotExist bool) { + return false +} + +func (p *PurchaseHandler) GetStoreSkusBatchSize(funcID int) (batchSize int) { + return 1 +} + +func (p *PurchaseHandler) GetSensitiveWordRegexp() *regexp.Regexp { + return sensitiveWordRegexp +} + +func (p *PurchaseHandler) IsErrSkuNotExist(err error) (isNotExist bool) { + return false +} + +func ybSkuStatus2Jx(ybStatus int) (jxSkuStatus int) { + if ybStatus == yinbaoapi.SkuStatusEnable { + jxSkuStatus = model.SkuStatusNormal + } else if ybStatus == yinbaoapi.SkuStatusDisabled { + jxSkuStatus = model.SkuStatusDontSale + } else if ybStatus == yinbaoapi.SkuStatusDeleted { + jxSkuStatus = model.SkuStatusDeleted + } + return jxSkuStatus +} + +func vendorSku2Jx(result *jdshopapi.SearchWare4ValidResultData) (skuName *partner.SkuNameInfo) { + if result == nil { + globals.SugarLogger.Warnf("vendorSku2Jx, strange result:%s", utils.Format4Output(result, true)) + return nil + } + // prefix, name, comment, specUnit, unit, specQuality := jxutils.SplitSkuName(result.Title) + skuName = &partner.SkuNameInfo{ + Name: result.Title, + VendorNameID: utils.Int64ToStr(result.WareID), + Status: result.WareStatus, + VendorCatIDList: []string{utils.Int2Str(result.CategoryID)}, + NameID: utils.Str2Int(result.OuterID), + } + return skuName +} + +func updateOrCreateCategories(storeCat *dao.SkuStoreCatInfo, isCreate bool) (status int64, err error) { + var createShopCategoryParams []*jdshopapi.CreateShopCategoryParam + result, err := api.JdShopAPI.FindShopCategories() + if err != nil { + return -1, err + } + for _, v := range result { + createShopCategoryParam := &jdshopapi.CreateShopCategoryParam{ + HomeShow: "0", + ID: utils.Int64ToStr(v.CID), + Open: "", + OrderNo: utils.Int2Str(v.OrderNo), + ParentID: utils.Int64ToStr(v.ParentCID), + Title: v.Name, + Type: jdshopapi.UpdateCatType, + } + createShopCategoryParams = append(createShopCategoryParams, createShopCategoryParam) + } + createShopCategoryParam2 := &jdshopapi.CreateShopCategoryParam{ + HomeShow: "0", + Open: "", + OrderNo: utils.Int2Str(storeCat.Seq), + ParentID: storeCat.ParentVendorCatID, + Title: storeCat.Name, + } + if isCreate { + createShopCategoryParam2.Type = jdshopapi.CreateCatType + createShopCategoryParam2.ID = "1" + createShopCategoryParams = append(createShopCategoryParams, createShopCategoryParam2) + } else { + for _, v := range createShopCategoryParams { + if v.ID == storeCat.VendorCatID { + v.Title = createShopCategoryParam2.Title + v.OrderNo = createShopCategoryParam2.OrderNo + } + } + } + status, err = api.JdShopAPI.CreateShopCategory(createShopCategoryParams) + return status, err +} + +func buildCreateWareParam(storeSku *dao.StoreSkuSyncInfo) (createSkuParamWare *jdshopapi.CreateSkuParamWare, createSkuParamSkus []*jdshopapi.CreateSkuParamSkus, err error) { + var ( + images []*jdshopapi.CreateSkuParamImages + vendorCatID int + ) + if storeSku.VendorCatID == "0" { + resultCat, _ := api.JdShopAPI.FindShopCategories() + for _, v := range resultCat { + if v.Name == storeSku.CategoryName { + vendorCatID = int(v.CID) + break + } + } + } else { + vendorCatID = utils.Str2Int(storeSku.VendorCatID) + } + name := filterSensitiveWord(storeSku.Name) + createSkuParamWare = &jdshopapi.CreateSkuParamWare{ + Title: name, + ShopCategorys: []int{vendorCatID}, + CategoryID: int(storeSku.VendorVendorCatID), + BrandID: jdshopapi.JxBrandId, + // TransportID: jdshopapi.TransportID, + WareStatus: 8, //上架待审核 + OuterID: utils.Int2Str(storeSku.NameID), + VenderID: jdshopapi.VenderID, + Length: 100, + Width: 100, + Height: 100, + Weight: 0.5, + JdPrice: jxutils.IntPrice2Standard(storeSku.UnitPrice), + // MarketPrice: jxutils.IntPrice2Standard(storeSku.UnitPrice), + PromiseID: jdshopapi.JdsPromiseID, + } + + //上传京东图片 + //规则,有两张就传两张,没有就重复传一张 + pic1, err := uploadImg(storeSku.Img, name, "1") + img1 := &jdshopapi.CreateSkuParamImages{ + ColorID: "0000000000", + ImgIndex: 1, + ImgURL: pic1, + } + img2 := &jdshopapi.CreateSkuParamImages{ + ColorID: "0000000000", + ImgIndex: 2, + } + if storeSku.Img2 == "" { + img2.ImgURL = pic1 + } else { + pic2, err2 := uploadImg(storeSku.Img, name, "2") + err = err2 + img2.ImgURL = pic2 + } + images = append(images, img1) + images = append(images, img2) + createSkuParamWare.Images = images + + //商品详情拼接 + var desc string + if storeSku.DescImg != "" { + pic3, err2 := uploadImg(storeSku.DescImg, name, "desc") + err = err2 + desc = `



` + } else { + desc = `



` + } + createSkuParamWare.MobileDesc = desc + createSkuParamWare.Introduction = desc + + //设置商品属性值 + var ( + attrIDs = make(map[string]int) //贮存方式,净含量,保质期IDs + zctjValueID int64 //贮存条件冷藏0-4的id + gcjkValueID int64 //国产,进口的id + lbValueID int64 //类别的ID + attrsProp []*jdshopapi.CreateSkuParamAttrs + ) + 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 + } else if v.Name == "净含量" { + attrIDs[v.Name] = v.ID + } else if v.Name == "规格" { + attrIDs[v.Name] = v.ID + } else if v.Name == "国产/进口" { + attrIDs[v.Name] = v.ID + } else if v.Name == "类别" { + attrIDs[v.Name] = v.ID + } + } + values, _, err := api.JdShopAPI.FindValuesByAttrId(attrIDs["贮存条件"]) + for _, v := range values { + if v.Name == "冷藏 0-4℃" { + zctjValueID = v.ID + } + } + if attrIDs["国产/进口"] != 0 { + values2, _, err2 := api.JdShopAPI.FindValuesByAttrId(attrIDs["国产/进口"]) + err = err2 + for _, v := range values2 { + if v.Name == "国产" { + gcjkValueID = v.ID + } + } + attrgcjk := &jdshopapi.CreateSkuParamAttrs{ + AttrID: utils.Int2Str(attrIDs["国产/进口"]), + AttrValues: []string{utils.Int64ToStr(gcjkValueID)}, + } + attrsProp = append(attrsProp, attrgcjk) + } + attrZctj := &jdshopapi.CreateSkuParamAttrs{ + AttrID: utils.Int2Str(attrIDs["贮存条件"]), + AttrValues: []string{utils.Int64ToStr(zctjValueID)}, + } + attrJhl := &jdshopapi.CreateSkuParamAttrs{ + AttrID: utils.Int2Str(attrIDs["净含量"]), + AttrValues: []string{"0.5"}, + } + attrBzq := &jdshopapi.CreateSkuParamAttrs{ + AttrID: utils.Int2Str(attrIDs["保质期"]), + AttrValues: []string{"5"}, + } + attrsProp = append(attrsProp, attrZctj) + attrsProp = append(attrsProp, attrJhl) + attrsProp = append(attrsProp, attrBzq) + createSkuParamWare.MultiCateProps = attrsProp + var features = []*jdshopapi.CreateSkuParamFeatures{ + &jdshopapi.CreateSkuParamFeatures{ + Key: "is7ToReturn", //不支持7天无理由退货 + Value: "0", + }, + &jdshopapi.CreateSkuParamFeatures{ + Key: "tssp", //支持自提 + Value: "4", + }, + // &jdshopapi.CreateSkuParamFeatures{ + // Key: "fdms", //分单? + // Value: "1", + // }, + } + createSkuParamWare.Features = features + //组合sku + var vendorPrice int64 = 0 + for _, v := range storeSku.StoreSkuSyncInfoJds { + var ( + ggValueID int64 //规格的属性id + attrsPropSku []*jdshopapi.CreateSkuParamAttrs + multiPropSku []*jdshopapi.CreateSkuParamAttrs + ) + 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 + } + } + 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.CreateSkuParamSkus{ + JdPrice: jxutils.IntPrice2Standard(v.VendorPrice), + // StockNum: 9999, + Type: "com.jd.pop.ware.ic.api.domain.sku", + Type2: "com.jd.pop.ware.ic.api.domain.Sku", + OuterID: utils.Int2Str(v.SkuID), + } + sku.SaleAttrs = attrsPropSku + if attrIDs["类别"] != 0 { + values2, _, err2 := api.JdShopAPI.FindValuesByAttrId(attrIDs["类别"]) + err = err2 + lbValueID = values2[len(values2)-1].ID + attrlb := &jdshopapi.CreateSkuParamAttrs{ + AttrID: utils.Int2Str(attrIDs["类别"]), + AttrValues: []string{utils.Int64ToStr(lbValueID)}, + } + multiPropSku = append(multiPropSku, attrlb) + } + sku.MultiCateProps = multiPropSku + createSkuParamSkus = append(createSkuParamSkus, sku) + + if v.VendorPrice > vendorPrice { + vendorPrice = v.VendorPrice + } + if v.Status == model.SkuStatusNormal { + sku.StockNum = 9999 + } else { + sku.StockNum = 0 + } + } + //市场价固定500 + createSkuParamWare.MarketPrice = 500 + return createSkuParamWare, createSkuParamSkus, err +} + +//京东商城上传图片,若平台上已经有了这个图就直接拿来用了 +func uploadImg(img, name, index string) (imgURL string, err error) { + result, err := api.JdShopAPI.QueryPicture(name + index) + if len(result) > 0 { + imgURL = result[0].PictureURL + } else { + data, _, err := jxutils.DownloadFileByURL(img) + if err != nil { + return imgURL, err + } + uploadResult, err := api.JdShopAPI.UploadPicture(data, 0, name+index) + if err != nil { + return imgURL, err + } + imgURL = uploadResult.PictureURL + } + return imgURL, err +} + +func uploadImg2(img, name, index string) (imgURL string, err error) { + data, _, err := jxutils.DownloadFileByURL(img) + if err != nil { + return imgURL, err + } + uploadResult, err := api.JdShopAPI.UploadPicture(data, 0, name+index) + if err != nil { + return imgURL, err + } + imgURL = uploadResult.PictureURL + return imgURL, err +} + +func filterSensitiveWord(name string) (result string) { + for _, v := range jdshopapi.SensitiveWordMap { + if strings.Contains(name, v) { + return strings.ReplaceAll(name, v, "") + } + } + return name +} + +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 + ) + 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 + } + } + 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), + Type: "com.jd.pop.ware.ic.api.domain.sku", + Type2: "com.jd.pop.ware.ic.api.domain.Sku", + OuterID: utils.Int2Str(v.SkuID), + } + sku.SaleAttrs = attrsPropSku + if v.Status == 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)) + } + } + if attrIDs["类别"] != 0 { + values2, _, err2 := api.JdShopAPI.FindValuesByAttrId(attrIDs["类别"]) + err = err2 + lbValueID := values2[len(values2)-1].ID + attrlb := &jdshopapi.CreateSkuParamAttrs{ + AttrID: utils.Int2Str(attrIDs["类别"]), + AttrValues: []string{utils.Int64ToStr(lbValueID)}, + } + multiPropSku = append(multiPropSku, attrlb) + } + sku.MultiCateProps = multiPropSku + 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 aaf0d6761..4613a34fd 100644 --- a/business/partner/purchase/jx/localjx/order.go +++ b/business/partner/purchase/jx/localjx/order.go @@ -151,8 +151,10 @@ var ( 6039390: 200, } - regexpCnameAndCmobile = regexp.MustCompile(`配送员,(.*),手机号,(.*)`) - bagSkuMap = map[int]int{ //京西物料袋子skuid + regexpCnameAndCmobile = regexp.MustCompile(`配送员,(.*),手机号,(.*)`) + regexpCnameAndCmobile2 = regexp.MustCompile(`(快递员:(.*),联系电话:(.*))`) + + bagSkuMap = map[int]int{ //京西物料袋子skuid 6039382: 6039382, 6039383: 6039383, 6039384: 6039384, @@ -336,6 +338,11 @@ func GetAvailableDeliverTime(ctx *jxcontext.Context, storeID int) (deliverTimerL } beginDate = beginDate.Add(24 * time.Hour) } + if len(deliverTimerList) > 0 { + if deliverTimerList[0].TimeList[0].UnixTime != 0 { + deliverTimerList[0].TimeList[0].ViewTime = "营业即送" + } + } return deliverTimerList, err } @@ -1477,8 +1484,16 @@ func updateJdWayBillInfo(db *dao.DaoDB, order *model.GoodsOrder, getTrackMessage for _, vv := range getTrackMessagePlusByOrderResult.ResultData { if vv.OpeTitle == "配送员收货" { result := regexpCnameAndCmobile.FindAllStringSubmatch(vv.OpeRemark, -1) - cName = result[0][1] - cMobile = result[0][2] + if len(result) > 0 { + cName = result[0][1] + cMobile = result[0][2] + } else { + result2 := regexpCnameAndCmobile2.FindAllStringSubmatch(vv.OpeRemark, -1) + if len(result2) > 0 { + cName = result2[0][1] + cMobile = result2[0][2] + } + } break } } diff --git a/business/partner/purchase/mtwm/order.go b/business/partner/purchase/mtwm/order.go index 06e8fff29..71f6e81c9 100644 --- a/business/partner/purchase/mtwm/order.go +++ b/business/partner/purchase/mtwm/order.go @@ -396,8 +396,14 @@ func (c *PurchaseHandler) callbackMsg2Status(msg *mtwmapi.CallbackMsg) (orderSta if msg.Cmd == mtwmapi.MsgTypeOrderPartialRefund { if notifyType == mtwmapi.NotifyTypePartyApply { if globals.EnableMtwmStoreWrite { - // api.MtwmAPI.OrderRefundReject(utils.Str2Int64(orderID), "请联系商户,让商户发起订单调整") // todo 京东与饿百都没有售前用户提出订单调整的,自动拒绝调整单 - api.MtwmAPI.OrderRefundAgree(utils.Str2Int64(orderID), "自动确认退款") + goods, err := dao.GetSimpleOrder(dao.GetDB(), orderID) + if err == nil { + if goods.Status < model.OrderStatusDelivering { + api.MtwmAPI.OrderRefundAgree(utils.Str2Int64(orderID), "自动确认退款") + } else { + api.MtwmAPI.OrderRefundReject(utils.Str2Int64(orderID), "商品配送中,请联系门店。") // todo 京东与饿百都没有售前用户提出订单调整的,自动拒绝调整单 + } + } } } else if notifyType == mtwmapi.NotifyTypeSuccess { vendorStatus = fakeOrderAdjustFinished diff --git a/business/partner/purchase/mtwm/store.go b/business/partner/purchase/mtwm/store.go index 3e5a7409b..c834465d2 100644 --- a/business/partner/purchase/mtwm/store.go +++ b/business/partner/purchase/mtwm/store.go @@ -96,6 +96,14 @@ func (p *PurchaseHandler) CreateStore(db *dao.DaoDB, storeID int, userName strin return p.UpdateStore(db, storeID, userName) } +func (p *PurchaseHandler) CreateStore2(db *dao.DaoDB, storeID int, userName string) (vendorStoreID string, err error) { + return vendorStoreID, err +} + +func (p *PurchaseHandler) DeleteStore(db *dao.DaoDB, storeID int, userName string) (err error) { + return err +} + func (p *PurchaseHandler) UpdateStore(db *dao.DaoDB, storeID int, userName string) (err error) { var name string if db == nil { @@ -122,12 +130,19 @@ func (p *PurchaseHandler) UpdateStore(db *dao.DaoDB, storeID int, userName strin // } } // openLevel, isOnline := bizStatusJX2Mtwm(mergedStoreStatus) + //TODO 美团暂时不用那个电话 + phone := storeDetail.Tel1 + // if storeDetail.MarketManPhone != "" { + // phone = storeDetail.MarketManPhone + // } else { + // phone = model.VendorStoreTel + // } params := map[string]interface{}{ "name": name, //jxutils.ComposeStoreName(storeDetail.Store.Name, model.VendorIDMTWM), "address": storeDetail.Address, // 美团好像地址也不能改的? "longitude": jxutils.IntCoordinate2Standard(int(remoteStoreInfo.Longitude)), "latitude": jxutils.IntCoordinate2Standard(int(remoteStoreInfo.Latitude)), - "phone": storeDetail.Tel1, + "phone": phone, "shipping_fee": remoteStoreInfo.ShippingFee, "shipping_time": remoteStoreInfo.ShippingTime, "open_level": remoteStoreInfo.OpenLevel, diff --git a/business/partner/purchase/mtwm/store_sku2.go b/business/partner/purchase/mtwm/store_sku2.go index 4cc9ea279..a1e95fee9 100644 --- a/business/partner/purchase/mtwm/store_sku2.go +++ b/business/partner/purchase/mtwm/store_sku2.go @@ -246,7 +246,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 := isCreate //storeSku.SkuSyncStatus&( model.SyncFlagPriceMask| model.SyncFlagNewMask) != 0 foodData := make(map[string]interface{}) foodDataList[i] = foodData foodData[mtwmapi.KeyAppFoodCode] = utils.Int2Str(storeSku.SkuID) @@ -258,9 +258,9 @@ func (p *PurchaseHandler) createOrUpdateStoreSkus(ctx *jxcontext.Context, storeI foodData["skus"] = skus foodData["name"] = utils.LimitUTF8StringLen(utils.FilterEmoji(storeSku.SkuName), mtwmapi.MaxSkuNameCharCount) foodData["description"] = storeSku.Comment - if isNeedUpdatePrice { - foodData["price"] = jxutils.IntPrice2Standard(storeSku.VendorPrice) - } + // if isNeedUpdatePrice { + foodData["price"] = jxutils.IntPrice2Standard(storeSku.VendorPrice) + // } foodData["min_order_count"] = 1 foodData["unit"] = storeSku.Unit foodData["box_num"] = 1 @@ -291,9 +291,9 @@ func (p *PurchaseHandler) createOrUpdateStoreSkus(ctx *jxcontext.Context, storeI // foodData["tag_id"] = utils.Int64ToStr(defVendorCatID) } skus[0]["spec"] = jxutils.ComposeSkuSpec(storeSku.SpecQuality, storeSku.SpecUnit) - if isNeedUpdatePrice { - skus[0]["price"] = foodData["price"] - } + // if isNeedUpdatePrice { + skus[0]["price"] = foodData["price"] + // } skus[0]["stock"] = stockCount2Mtwm(model.MaxStoreSkuStockQty) if storeSku.Upc != "" { skus[0]["upc"] = storeSku.Upc diff --git a/business/partner/purchase/yb/store.go b/business/partner/purchase/yb/store.go index fea030fb1..af4aa04a2 100644 --- a/business/partner/purchase/yb/store.go +++ b/business/partner/purchase/yb/store.go @@ -15,6 +15,14 @@ func (p *PurchaseHandler) UpdateStore(db *dao.DaoDB, storeID int, userName strin return err } +func (p *PurchaseHandler) CreateStore2(db *dao.DaoDB, storeID int, userName string) (vendorStoreID string, err error) { + return vendorStoreID, err +} + +func (p *PurchaseHandler) DeleteStore(db *dao.DaoDB, storeID int, userName string) (err error) { + return err +} + func (p *PurchaseHandler) RefreshAllStoresID(ctx *jxcontext.Context, parentTask tasksch.ITask, isAsync bool) (hint string, err error) { return hint, err } diff --git a/conf/app.conf b/conf/app.conf index b57561713..ef6f86ce8 100644 --- a/conf/app.conf +++ b/conf/app.conf @@ -31,7 +31,10 @@ enableEbaiStoreWrite = false enableElmStoreWrite = false enableMtwmStoreWrite = false enableWscStoreWrite = false -enableYbStoreWrite = true +enableYbStoreWrite = false +enableJdShopWrite = false + +jdsCookie = "shshshfpa=13b38d4a-8ba0-df12-0012-82d9a37fb835-1573795914; shshshfpb=abYp8Dq5JobRtp2pkZa7MbA%3D%3D; __jdu=1142616513; pinId=WMIzMhF5BfL6nJp9AcA2-A; pin=shop_jxcs; unick=shop_jxcs; _tp=7FBEvLyPe%2FKcgxsfY5lRgA%3D%3D; _pst=shop_jxcs; areaId=22; ipLoc-djd=22-1930-50948-57092; user-key=3ec204b4-f204-4320-98e3-b2569c757800; cn=0; shshshfp=5d23828ee6ea3a33e1a58588db1713f8; 3AB9D23F7A4B3C9B=AK36FFYF5J6WMPRH7YTXMEX4CATHR6NAA3IQEESU2I33FEJRQ3DRLU4SZJYD2XGFLCFW43DHYP5HQKOMR4EFQSLKLA; navigation=[%22shop_jxcs%22]; __jdv=122270672|baidu|-|organic|not set|1589514011252; language=zh_CN; ceshi3.com=000; csrf_token=b84d0a5c-6288-4db4-84e1-cadf66be3bf7; mba_muid=1142616513; TrackID=1qvZk-6QSAOp1NmaouJGEx58_cFglCFv57HEfoHOezMrOnV3_FSK-5ExeYhHx97IltBADG3dvJqLIt3P57wyUW4Z2Q3Y8ITo8Cfdmlz3kykM; RT="z=1&dm=jd.com&si=mcot45862q&ss=kaf1rcqz&sl=2&tt=38t&ld=22qx&nu=b99e5a7f32b36f184614d34a1d926a39&cl=3clu&ul=3crs&hd=3cz3"; b-sec=S2JWP6CAFP7K4I6PXVBUVCO6YVXUX2JAPDHLX5RZUDE4YKCGOEXJIINB3Q4THCFCMVWZPFAYGLWLG; thor=80FAF09E9A09B6E618A68057BDFCFCB8C86E8252DC9F7D3B34572625904FBA0AB6BF053A5325612EC0407791BB05F5301356E71E8B282C40C06D0B5DF3439DEECB102A78FAFF7AC0FC4E2D1FA8DD8BBAE1A011E50B5C74F1870AD982D7BF453F470F31F2241B73AC4C25485025C2ABEBC8A538AF7257824D2FAEE300A1435175B0B451FB5C19B78D729FC83152CA3BAF; _vender_=TNK3O6PALVQGGA33SGBIUTOKL4OOE6DP6OMNVIPMAMULGTRFWUMTVWGFRUTYP4L4EPN3KP73P33BOBN5SNJFBNQB5OMQYSJ5MORGQLJS7QAPOMIN7AZD6B3ZLP2DV4JCXDI5P3KOXJ3PHLIIRZ2YVS4JSSA3JRSBACNLJSC24ELO46GIMRW53XGW36EBPLZMZP2MQCAMJNO44FKT46B7VDVT7KQTELESOOF6E377AYC3NWKQF6ICIYBW4BA4JL5QG2NHGNOHOUJDNUW3N22UF32DLFLEIQGVO2W55J6AKPPBT227XA5NO4S3NFVIUUUADGOYH56T72MTNXCILWVMN4RMUNVFMGL4ISGXJS7YILE7A2ESPAU43MISAOZM2BR53MGRB5OZSQZPV5DBDCN2OVVT3XT5N2VMFELARQNTMAJCDBGXFURSN2Q7SYULLKZEZHTYWWOI65LS5OIHLUZQKWFGMNSQF2UBSYV7FG46CWJGMVHOGV3FY4RUEVJK6BQ223QK3H3VMTHXCZOZV4GKR5EWGIZZDVUAK4B36BPA5HPBO7PXKBOEXEBX77IYBNQLCGMK72J4VKNOUPYKNB5JE5D5UN3R2MMFGLJARTL2QTC5ZRZ4PJCJZWWOV37VWLWFVAN5IGHPAYME73KTNFABM5W73XLOXJFQWTFRZEK3FCL3BLRV4UOXLBQGA34R4WUBYSZURMKTXXB7U; __jda=65775340.1142616513.1573036516.1589946171.1589952725.54; __jdb=65775340.147.1142616513|54.1589952725; __jdc=65775340; _base_=YKH2KDFHMOZBLCUV7NSRBWQUJPBI7JIMU5R3EFJ5UDHJ5LCU7R2NILKK5UJ6GLA2RGYT464UKXAI4Z6HPCTN4UQM3WHVQ4ENFP57OC2DC7JQLRXRUO5PW6B77O6UXAZ4TCNE6YVKRXISVLBYGYO44RCDDPWDA4AEL7ZLXI2SG4SOQWCP5WPWO6EFS7HEHMRWVKBRVHB33TFD4SMNBHRJCTDFHU6SZXCZD6RFXX2OORYGL5H2GYF2IIH2KKD4T72IR4F577G2E5II2OMMXYF2GDYNTS7WGAUXFEWRJ3CTKDBDWMHUKJQF4ZFOTNBBYBIZRXZYERXXIG6ATJFKID7XOR3NQ2CL6K7A2IEZV5HCBNYDPXFCM2ZMCS474KZ44S5F; _vender_new_=GI63BGTJFDBQ46CD7JXUX3HEPM4P5LEA3TJTFGW4ZGGIVOLTPK5T25EXTBLCENPUTR7E2I23YDFQ4ARO6JW3NHSWBDE73RTUKJTADIPFPLYFE3ARGJUBPHWUIONS72KRQOZC5P7PB4VPPLRHGEP7L3Z5K62L2E2MGTWHFJRQ3CAVBDYVW2Z4J6U73HW4BKKOCDAH5T6OJJKWKLBZFOTI7342QSL7YQ2E3I4T777RNZF23XGOTCP3D4INHNO5MNKT3XJZQBVHWUVZYQUXCK5QQTKWADKQUCYV3JRY6YAYOD7Z5IIKGNLREQTCPO7SYGSIS655JUGOUILFLXVZE6KCFG7ZTPRUD6VPE4KCIE4OUZSED6FTSEZHTM363E7XXCHB4NA7VLZHCQSBHDVGMRA7RM4RGJC3MOI4TJNGCLW6QKUCCZAY7XTGOTMC53TFUYERGNIH2RBULZ7UTZH5GU3TC6RWFI2QL4QTAIARA6GNVXENEOYIPZEHN222YDAJX5OBBEECAMAPNKZ3XNF5CNGDJ3DSU2ZLOCAKLFPCYTIIWPPJMCQ636F5464HS4OVFPFNIDW4OCE23JRPYP5FAL6TKHPAC3H3ZRU7WA5GKJJKBZUGIX7NEO4LZB7FJ3RZZZH3UHPQMNILD5DT2V7HVCUOVNOFBEOW5ID2ZMQ3XV264IU4MYHN64RA; _BELONG_CLIENT_=WPSC4XJXWK5USS4JNZY2X7VRLR5MCBKRSVHEXABGTHDGISIQK5YOLZUXYE7IOIM7MOKO74H6CRN6WHAAR4TMDV3XZWMXZRCRT5XRNE3V356BTOB2Y7LPK66VWQK6HPTGWVXIDXDCPVE3W5WMHAIO6AT2LX2XXVNUCXR34ZWFK6HY45CORGIKOSYDYZBF27WOKTUX6BS4FZMIJWNUX6CB4JAA25ZLF7ZEKYOO4QV5HTSBXGNRM3E242MBI6V5D4C5VJDQ3EOYCOW5BMTUJZACIBHXQFAVLRF76VQY5PNJGGJNBEZHSFYYJA3YORRT7FB5AHCOIFQKF3W5RWNUX6CB4JAA26JNMO7AYWNUPZF5HTSBXGNRM3E242MBI6V5D4C5VJDQ3EOYCOW5BWZDKMOJ5BS6II53ERY6ALV3ZWPF42L4CPUHEGPYIII35KDC4FCNVCORCXFD6IVNLBEDPB2GGP4UHWNRUDOQBDIW7RZJXBA2WV5ANZOTEGUCDWYRVQS2YUTIZNZ276PRYG4N56V6YTII7MBKBC7LYHO7C555HTSBXGNRM3E466AYN67DHWVM5HQFJ4NFDO5BTOKMOS5L2CXFVYDR2FCOILVYPEI; _lvtc_=5ZH3OJ7CWYNVGEKDRC32XTFXGY" aliKey = "LTAI4FwZN7pp4dACQHoapkZQ" aliSecret = "NTegceUFX0FdfMovqCDzqcIKmhcoOu" @@ -125,6 +128,7 @@ smsSignName = "京西菜市" smsMobileVerifyTemplate = "SMS_175583158" smsNewOrderTemplate = "SMS_175583150" smsOrderCanceledTemplate = "SMS_175573134" +smsNewUserOrderTemplate = "SMS_190284055" addEvent = true @@ -181,6 +185,11 @@ jdEclpAccessToken = "bcb6201b5b3c45a0976dcda5e2dea8aejiwm" jdEclpAppKey = "0D397F05CF11C51BCDCC81744680EBC3" jdEclpAppSecret = "f16a5e57ff4f4f428b702c40d2d4b933" +jdShopAccessToken = "de8157b447584885910f429011e49cb93yjq" +jdShopAppKey = "E1D746D42474D5F1F1A10CECE75D99F6" +jdShopAppSecret = "efa7e1d1a22640fa990e6cf164b28608" +jdsCookie = "shshshfpa=13b38d4a-8ba0-df12-0012-82d9a37fb835-1573795914; shshshfpb=abYp8Dq5JobRtp2pkZa7MbA%3D%3D; __jdu=1142616513; pinId=WMIzMhF5BfL6nJp9AcA2-A; pin=shop_jxcs; unick=shop_jxcs; _tp=7FBEvLyPe%2FKcgxsfY5lRgA%3D%3D; _pst=shop_jxcs; areaId=22; ipLoc-djd=22-1930-50948-57092; user-key=3ec204b4-f204-4320-98e3-b2569c757800; cn=0; shshshfp=5d23828ee6ea3a33e1a58588db1713f8; 3AB9D23F7A4B3C9B=AK36FFYF5J6WMPRH7YTXMEX4CATHR6NAA3IQEESU2I33FEJRQ3DRLU4SZJYD2XGFLCFW43DHYP5HQKOMR4EFQSLKLA; navigation=[%22shop_jxcs%22]; __jdv=122270672|baidu|-|organic|not set|1589514011252; language=zh_CN; ceshi3.com=000; csrf_token=b84d0a5c-6288-4db4-84e1-cadf66be3bf7; mba_muid=1142616513; TrackID=1qvZk-6QSAOp1NmaouJGEx58_cFglCFv57HEfoHOezMrOnV3_FSK-5ExeYhHx97IltBADG3dvJqLIt3P57wyUW4Z2Q3Y8ITo8Cfdmlz3kykM; RT="z=1&dm=jd.com&si=mcot45862q&ss=kaf1rcqz&sl=2&tt=38t&ld=22qx&nu=b99e5a7f32b36f184614d34a1d926a39&cl=3clu&ul=3crs&hd=3cz3"; b-sec=S2JWP6CAFP7K4I6PXVBUVCO6YVXUX2JAPDHLX5RZUDE4YKCGOEXJIINB3Q4THCFCMVWZPFAYGLWLG; thor=80FAF09E9A09B6E618A68057BDFCFCB8C86E8252DC9F7D3B34572625904FBA0AB6BF053A5325612EC0407791BB05F5301356E71E8B282C40C06D0B5DF3439DEECB102A78FAFF7AC0FC4E2D1FA8DD8BBAE1A011E50B5C74F1870AD982D7BF453F470F31F2241B73AC4C25485025C2ABEBC8A538AF7257824D2FAEE300A1435175B0B451FB5C19B78D729FC83152CA3BAF; _vender_=TNK3O6PALVQGGA33SGBIUTOKL4OOE6DP6OMNVIPMAMULGTRFWUMTVWGFRUTYP4L4EPN3KP73P33BOBN5SNJFBNQB5OMQYSJ5MORGQLJS7QAPOMIN7AZD6B3ZLP2DV4JCXDI5P3KOXJ3PHLIIRZ2YVS4JSSA3JRSBACNLJSC24ELO46GIMRW53XGW36EBPLZMZP2MQCAMJNO44FKT46B7VDVT7KQTELESOOF6E377AYC3NWKQF6ICIYBW4BA4JL5QG2NHGNOHOUJDNUW3N22UF32DLFLEIQGVO2W55J6AKPPBT227XA5NO4S3NFVIUUUADGOYH56T72MTNXCILWVMN4RMUNVFMGL4ISGXJS7YILE7A2ESPAU43MISAOZM2BR53MGRB5OZSQZPV5DBDCN2OVVT3XT5N2VMFELARQNTMAJCDBGXFURSN2Q7SYULLKZEZHTYWWOI65LS5OIHLUZQKWFGMNSQF2UBSYV7FG46CWJGMVHOGV3FY4RUEVJK6BQ223QK3H3VMTHXCZOZV4GKR5EWGIZZDVUAK4B36BPA5HPBO7PXKBOEXEBX77IYBNQLCGMK72J4VKNOUPYKNB5JE5D5UN3R2MMFGLJARTL2QTC5ZRZ4PJCJZWWOV37VWLWFVAN5IGHPAYME73KTNFABM5W73XLOXJFQWTFRZEK3FCL3BLRV4UOXLBQGA34R4WUBYSZURMKTXXB7U; __jda=65775340.1142616513.1573036516.1589946171.1589952725.54; __jdb=65775340.147.1142616513|54.1589952725; __jdc=65775340; _base_=YKH2KDFHMOZBLCUV7NSRBWQUJPBI7JIMU5R3EFJ5UDHJ5LCU7R2NILKK5UJ6GLA2RGYT464UKXAI4Z6HPCTN4UQM3WHVQ4ENFP57OC2DC7JQLRXRUO5PW6B77O6UXAZ4TCNE6YVKRXISVLBYGYO44RCDDPWDA4AEL7ZLXI2SG4SOQWCP5WPWO6EFS7HEHMRWVKBRVHB33TFD4SMNBHRJCTDFHU6SZXCZD6RFXX2OORYGL5H2GYF2IIH2KKD4T72IR4F577G2E5II2OMMXYF2GDYNTS7WGAUXFEWRJ3CTKDBDWMHUKJQF4ZFOTNBBYBIZRXZYERXXIG6ATJFKID7XOR3NQ2CL6K7A2IEZV5HCBNYDPXFCM2ZMCS474KZ44S5F; _vender_new_=GI63BGTJFDBQ46CD7JXUX3HEPM4P5LEA3TJTFGW4ZGGIVOLTPK5T25EXTBLCENPUTR7E2I23YDFQ4ARO6JW3NHSWBDE73RTUKJTADIPFPLYFE3ARGJUBPHWUIONS72KRQOZC5P7PB4VPPLRHGEP7L3Z5K62L2E2MGTWHFJRQ3CAVBDYVW2Z4J6U73HW4BKKOCDAH5T6OJJKWKLBZFOTI7342QSL7YQ2E3I4T777RNZF23XGOTCP3D4INHNO5MNKT3XJZQBVHWUVZYQUXCK5QQTKWADKQUCYV3JRY6YAYOD7Z5IIKGNLREQTCPO7SYGSIS655JUGOUILFLXVZE6KCFG7ZTPRUD6VPE4KCIE4OUZSED6FTSEZHTM363E7XXCHB4NA7VLZHCQSBHDVGMRA7RM4RGJC3MOI4TJNGCLW6QKUCCZAY7XTGOTMC53TFUYERGNIH2RBULZ7UTZH5GU3TC6RWFI2QL4QTAIARA6GNVXENEOYIPZEHN222YDAJX5OBBEECAMAPNKZ3XNF5CNGDJ3DSU2ZLOCAKLFPCYTIIWPPJMCQ636F5464HS4OVFPFNIDW4OCE23JRPYP5FAL6TKHPAC3H3ZRU7WA5GKJJKBZUGIX7NEO4LZB7FJ3RZZZH3UHPQMNILD5DT2V7HVCUOVNOFBEOW5ID2ZMQ3XV264IU4MYHN64RA; _BELONG_CLIENT_=WPSC4XJXWK5USS4JNZY2X7VRLR5MCBKRSVHEXABGTHDGISIQK5YOLZUXYE7IOIM7MOKO74H6CRN6WHAAR4TMDV3XZWMXZRCRT5XRNE3V356BTOB2Y7LPK66VWQK6HPTGWVXIDXDCPVE3W5WMHAIO6AT2LX2XXVNUCXR34ZWFK6HY45CORGIKOSYDYZBF27WOKTUX6BS4FZMIJWNUX6CB4JAA25ZLF7ZEKYOO4QV5HTSBXGNRM3E242MBI6V5D4C5VJDQ3EOYCOW5BMTUJZACIBHXQFAVLRF76VQY5PNJGGJNBEZHSFYYJA3YORRT7FB5AHCOIFQKF3W5RWNUX6CB4JAA26JNMO7AYWNUPZF5HTSBXGNRM3E242MBI6V5D4C5VJDQ3EOYCOW5BWZDKMOJ5BS6II53ERY6ALV3ZWPF42L4CPUHEGPYIII35KDC4FCNVCORCXFD6IVNLBEDPB2GGP4UHWNRUDOQBDIW7RZJXBA2WV5ANZOTEGUCDWYRVQS2YUTIZNZ276PRYG4N56V6YTII7MBKBC7LYHO7C555HTSBXGNRM3E466AYN67DHWVM5HQFJ4NFDO5BTOKMOS5L2CXFVYDR2FCOILVYPEI; _lvtc_=5ZH3OJ7CWYNVGEKDRC32XTFXGY" + elmIsProd = true elmToken = "" elmAppKey = "KLRDcOZGrk" @@ -221,6 +230,7 @@ enableEbaiStoreWrite = true enableMtwmStoreWrite = true enableWscStoreWrite = true enableYbStoreWrite = true +enableJdShopWrite = true disableWeimob = false weimobCallbackURL = "http://callback.jxc4.com/weimob" @@ -259,6 +269,7 @@ enableJdStoreWrite = true enableEbaiStoreWrite = true enableMtwmStoreWrite = true enableYbStoreWrite = true +enableJdShopWrite = true mtpsAppKey = "3c0a05d464c247c19d7ec13accc78605" mtpsSecret = "b1M}9?:sTbsB[OF2gNORnN(|(iy9rB8(`7]|[wGLnbmt`evfM>E:A90DjHAW:UPE" @@ -302,6 +313,10 @@ jdEclpAccessToken = "bcb6201b5b3c45a0976dcda5e2dea8aejiwm" jdEclpAppKey = "0D397F05CF11C51BCDCC81744680EBC3" jdEclpAppSecret = "f16a5e57ff4f4f428b702c40d2d4b933" +jdShopAccessToken = "de8157b447584885910f429011e49cb93yjq" +jdShopAppKey = "E1D746D42474D5F1F1A10CECE75D99F6" +jdShopAppSecret = "efa7e1d1a22640fa990e6cf164b28608" + storeName = "京西果园" [test] @@ -397,9 +412,10 @@ jdEclpAccessToken = "bcb6201b5b3c45a0976dcda5e2dea8aejiwm" jdEclpAppKey = "0D397F05CF11C51BCDCC81744680EBC3" jdEclpAppSecret = "f16a5e57ff4f4f428b702c40d2d4b933" -jdShopAccessToken = "da8db492e20149e494afaf5607e1d6654zgi" +jdShopAccessToken = "de8157b447584885910f429011e49cb93yjq" jdShopAppKey = "E1D746D42474D5F1F1A10CECE75D99F6" jdShopAppSecret = "efa7e1d1a22640fa990e6cf164b28608" +jdsCookie = "shshshfpa=13b38d4a-8ba0-df12-0012-82d9a37fb835-1573795914; shshshfpb=abYp8Dq5JobRtp2pkZa7MbA%3D%3D; __jdu=1142616513; pinId=WMIzMhF5BfL6nJp9AcA2-A; pin=shop_jxcs; unick=shop_jxcs; _tp=7FBEvLyPe%2FKcgxsfY5lRgA%3D%3D; _pst=shop_jxcs; areaId=22; ipLoc-djd=22-1930-50948-57092; user-key=3ec204b4-f204-4320-98e3-b2569c757800; cn=0; shshshfp=5d23828ee6ea3a33e1a58588db1713f8; 3AB9D23F7A4B3C9B=AK36FFYF5J6WMPRH7YTXMEX4CATHR6NAA3IQEESU2I33FEJRQ3DRLU4SZJYD2XGFLCFW43DHYP5HQKOMR4EFQSLKLA; navigation=[%22shop_jxcs%22]; __jdv=122270672|baidu|-|organic|not set|1589514011252; language=zh_CN; ceshi3.com=000; csrf_token=b84d0a5c-6288-4db4-84e1-cadf66be3bf7; mba_muid=1142616513; TrackID=1qvZk-6QSAOp1NmaouJGEx58_cFglCFv57HEfoHOezMrOnV3_FSK-5ExeYhHx97IltBADG3dvJqLIt3P57wyUW4Z2Q3Y8ITo8Cfdmlz3kykM; RT="z=1&dm=jd.com&si=mcot45862q&ss=kaf1rcqz&sl=2&tt=38t&ld=22qx&nu=b99e5a7f32b36f184614d34a1d926a39&cl=3clu&ul=3crs&hd=3cz3"; b-sec=S2JWP6CAFP7K4I6PXVBUVCO6YVXUX2JAPDHLX5RZUDE4YKCGOEXJIINB3Q4THCFCMVWZPFAYGLWLG; thor=80FAF09E9A09B6E618A68057BDFCFCB8C86E8252DC9F7D3B34572625904FBA0AB6BF053A5325612EC0407791BB05F5301356E71E8B282C40C06D0B5DF3439DEECB102A78FAFF7AC0FC4E2D1FA8DD8BBAE1A011E50B5C74F1870AD982D7BF453F470F31F2241B73AC4C25485025C2ABEBC8A538AF7257824D2FAEE300A1435175B0B451FB5C19B78D729FC83152CA3BAF; _vender_=TNK3O6PALVQGGA33SGBIUTOKL4OOE6DP6OMNVIPMAMULGTRFWUMTVWGFRUTYP4L4EPN3KP73P33BOBN5SNJFBNQB5OMQYSJ5MORGQLJS7QAPOMIN7AZD6B3ZLP2DV4JCXDI5P3KOXJ3PHLIIRZ2YVS4JSSA3JRSBACNLJSC24ELO46GIMRW53XGW36EBPLZMZP2MQCAMJNO44FKT46B7VDVT7KQTELESOOF6E377AYC3NWKQF6ICIYBW4BA4JL5QG2NHGNOHOUJDNUW3N22UF32DLFLEIQGVO2W55J6AKPPBT227XA5NO4S3NFVIUUUADGOYH56T72MTNXCILWVMN4RMUNVFMGL4ISGXJS7YILE7A2ESPAU43MISAOZM2BR53MGRB5OZSQZPV5DBDCN2OVVT3XT5N2VMFELARQNTMAJCDBGXFURSN2Q7SYULLKZEZHTYWWOI65LS5OIHLUZQKWFGMNSQF2UBSYV7FG46CWJGMVHOGV3FY4RUEVJK6BQ223QK3H3VMTHXCZOZV4GKR5EWGIZZDVUAK4B36BPA5HPBO7PXKBOEXEBX77IYBNQLCGMK72J4VKNOUPYKNB5JE5D5UN3R2MMFGLJARTL2QTC5ZRZ4PJCJZWWOV37VWLWFVAN5IGHPAYME73KTNFABM5W73XLOXJFQWTFRZEK3FCL3BLRV4UOXLBQGA34R4WUBYSZURMKTXXB7U; __jda=65775340.1142616513.1573036516.1589946171.1589952725.54; __jdb=65775340.147.1142616513|54.1589952725; __jdc=65775340; _base_=YKH2KDFHMOZBLCUV7NSRBWQUJPBI7JIMU5R3EFJ5UDHJ5LCU7R2NILKK5UJ6GLA2RGYT464UKXAI4Z6HPCTN4UQM3WHVQ4ENFP57OC2DC7JQLRXRUO5PW6B77O6UXAZ4TCNE6YVKRXISVLBYGYO44RCDDPWDA4AEL7ZLXI2SG4SOQWCP5WPWO6EFS7HEHMRWVKBRVHB33TFD4SMNBHRJCTDFHU6SZXCZD6RFXX2OORYGL5H2GYF2IIH2KKD4T72IR4F577G2E5II2OMMXYF2GDYNTS7WGAUXFEWRJ3CTKDBDWMHUKJQF4ZFOTNBBYBIZRXZYERXXIG6ATJFKID7XOR3NQ2CL6K7A2IEZV5HCBNYDPXFCM2ZMCS474KZ44S5F; _vender_new_=GI63BGTJFDBQ46CD7JXUX3HEPM4P5LEA3TJTFGW4ZGGIVOLTPK5T25EXTBLCENPUTR7E2I23YDFQ4ARO6JW3NHSWBDE73RTUKJTADIPFPLYFE3ARGJUBPHWUIONS72KRQOZC5P7PB4VPPLRHGEP7L3Z5K62L2E2MGTWHFJRQ3CAVBDYVW2Z4J6U73HW4BKKOCDAH5T6OJJKWKLBZFOTI7342QSL7YQ2E3I4T777RNZF23XGOTCP3D4INHNO5MNKT3XJZQBVHWUVZYQUXCK5QQTKWADKQUCYV3JRY6YAYOD7Z5IIKGNLREQTCPO7SYGSIS655JUGOUILFLXVZE6KCFG7ZTPRUD6VPE4KCIE4OUZSED6FTSEZHTM363E7XXCHB4NA7VLZHCQSBHDVGMRA7RM4RGJC3MOI4TJNGCLW6QKUCCZAY7XTGOTMC53TFUYERGNIH2RBULZ7UTZH5GU3TC6RWFI2QL4QTAIARA6GNVXENEOYIPZEHN222YDAJX5OBBEECAMAPNKZ3XNF5CNGDJ3DSU2ZLOCAKLFPCYTIIWPPJMCQ636F5464HS4OVFPFNIDW4OCE23JRPYP5FAL6TKHPAC3H3ZRU7WA5GKJJKBZUGIX7NEO4LZB7FJ3RZZZH3UHPQMNILD5DT2V7HVCUOVNOFBEOW5ID2ZMQ3XV264IU4MYHN64RA; _BELONG_CLIENT_=WPSC4XJXWK5USS4JNZY2X7VRLR5MCBKRSVHEXABGTHDGISIQK5YOLZUXYE7IOIM7MOKO74H6CRN6WHAAR4TMDV3XZWMXZRCRT5XRNE3V356BTOB2Y7LPK66VWQK6HPTGWVXIDXDCPVE3W5WMHAIO6AT2LX2XXVNUCXR34ZWFK6HY45CORGIKOSYDYZBF27WOKTUX6BS4FZMIJWNUX6CB4JAA25ZLF7ZEKYOO4QV5HTSBXGNRM3E242MBI6V5D4C5VJDQ3EOYCOW5BMTUJZACIBHXQFAVLRF76VQY5PNJGGJNBEZHSFYYJA3YORRT7FB5AHCOIFQKF3W5RWNUX6CB4JAA26JNMO7AYWNUPZF5HTSBXGNRM3E242MBI6V5D4C5VJDQ3EOYCOW5BWZDKMOJ5BS6II53ERY6ALV3ZWPF42L4CPUHEGPYIII35KDC4FCNVCORCXFD6IVNLBEDPB2GGP4UHWNRUDOQBDIW7RZJXBA2WV5ANZOTEGUCDWYRVQS2YUTIZNZ276PRYG4N56V6YTII7MBKBC7LYHO7C555HTSBXGNRM3E466AYN67DHWVM5HQFJ4NFDO5BTOKMOS5L2CXFVYDR2FCOILVYPEI; _lvtc_=5ZH3OJ7CWYNVGEKDRC32XTFXGY" elmIsProd = true elmToken = "" @@ -432,73 +448,3 @@ yinbaoAppKey = "682628966212343269" yinbaoAppID = "18C0E0867E467DBC26EFF5E957B02EC4" aliUpcAppCode = "00a6eefba0204d3fa310ac0ee7a6fc54" - -[prod3] -EnableDocs = false - -jdOrgCode = "320406" -jdToken = "77e703b7-7997-441b-a12a-2e522efb117a" -jdAppKey = "1dba76d40cac446ca500c0391a0b6c9d" -jdSecret = "a88d031a1e7b462cb1579f12e97fe7f4" - -jd2OrgCode = "349454" -jd2Token = "29e0e567-c475-433a-aff0-37176ee8d8a7" -jd2AppKey = "7fb947624ff847ae94ff2f068cc99652" -jd2Secret = "1097abd7ef09427099b4922784af123a" - -jdEclpAccessToken = "bcb6201b5b3c45a0976dcda5e2dea8aejiwm" -jdEclpAppKey = "0D397F05CF11C51BCDCC81744680EBC3" -jdEclpAppSecret = "f16a5e57ff4f4f428b702c40d2d4b933" - -elmIsProd = true -elmToken = "" -elmAppKey = "KLRDcOZGrk" -elmSecret = "1fc221f8265506531da36fb613d5f5ad673f2e9a" - -ebaiSource = "34665" -ebaiSecret = "c3db75b754ea2d89" - -mtpsAppKey = "3c0a05d464c247c19d7ec13accc78605" -mtpsSecret = "b1M}9?:sTbsB[OF2gNORnN(|(iy9rB8(`7]|[wGLnbmt`evfM>E:A90DjHAW:UPE" - -dadaIsProd = true -dadaCallbackURL = "http://callback.jxc4.com/dadadelivery/msg" -dadaSourceID = "6660" - -weixinAppID = "wx2bb99eb5d2c9b82c" -weixinSecret = "6bbbed1443cc062c20a015a64c07a531" -weixinMiniAppID2 = "wx4b5930c13f8b1170" -weixinMiniSecret2 = "2a57228a716ce991a52739f0ff41111d" - -yinbaoAppKey = "682628966212343269" -yinbaoAppID = "18C0E0867E467DBC26EFF5E957B02EC4" - -aliUpcAppCode = "00a6eefba0204d3fa310ac0ee7a6fc54" - -wxpayNotifyURL = "http://callback.jxc4.com/wxpay/msg/" - -tonglianPayAppID = "00183083" -tonglianPayKey = "18048531223" -tonglianPayCusID = "56065105499TVAH" -tonglianPayNotifyURL = "http://callback.jxc4.com/tonglian/msg/" - -dbConnectStr = "root:WebServer@1@tcp(127.0.0.1:3306)/jxd_dev_0?charset=utf8mb4&loc=Local&parseTime=true" - -enableStoreWrite = false -enableJdStoreWrite = false -enableEbaiStoreWrite = false -enableMtwmStoreWrite = false -enableWscStoreWrite = false -enableYbStoreWrite = false - -disableWeimob = false -weimobCallbackURL = "http://callback.jxc4.com/weimob" - -dingdingAgentID = 733555444 -dingdingAppKey = "dingrn2ujlpa4ler2x4d" -dingdingSecret = "I4ZC1BH1_xwpE_NaXeYZkWgCIfbp39rne9JYObmdN3NINetA6ghf-a4jQ9YXa2n7" - -dingdingQRCodeAppKey = "dingoacnwcbkbwhktccmmg" -dingdingQRCodeSecret = "qizpI-k5a_5O9q7XVGRiqB4RDvbZ5qBTCzlxDVZwYxRQoyJoeg6LLrORDFLoLChc" - -dingdingCallbackURL = "http://callback.jxc4.com/dingding/msg" \ No newline at end of file diff --git a/controllers/cms_store_sku.go b/controllers/cms_store_sku.go index 0a03ae6a8..1adad8330 100644 --- a/controllers/cms_store_sku.go +++ b/controllers/cms_store_sku.go @@ -246,7 +246,7 @@ func (c *StoreSkuController) UpdateStoresSkusByBind() { if err = jxutils.Strings2Objs(params.Payload, &skuBindInfos); err != nil { return retVal, "", err } - retVal, err = cms.UpdateStoresSkusByBind(params.Ctx, nil, skuBindInfos, params.IsAsync, params.IsContinueWhenError) + retVal, err = cms.UpdateStoresSkusByBind(params.Ctx, nil, skuBindInfos, params.IsAsync, params.IsContinueWhenError, false) return retVal, "", err }) } diff --git a/controllers/cms_sync.go b/controllers/cms_sync.go index 4cdba082e..3b15447e4 100644 --- a/controllers/cms_sync.go +++ b/controllers/cms_sync.go @@ -366,3 +366,22 @@ func (c *SyncController) SyncStoreSkusFromYb() { return retVal, "", err }) } + +// @Title 同步京东商城门店商品和库存 +// @Description 同步京东商城门店商品和库存 +// @Param token header string true "认证token" +// @Param storeIDs formData string false "门店ID列表" +// @Param isAsync formData bool false "是否异步操作" +// @Param isContinueWhenError formData bool false "单个同步失败是否继续,缺省false" +// @Success 200 {object} controllers.CallResult +// @Failure 200 {object} controllers.CallResult +// @router /SyncJdsStoresSkus [put] +func (c *SyncController) SyncJdsStoresSkus() { + c.callSyncJdsStoresSkus(func(params *tSyncSyncJdsStoresSkusParams) (retVal interface{}, errCode string, err error) { + var storeIDs []int + if err = jxutils.Strings2Objs(params.StoreIDs, &storeIDs); err == nil { + retVal, err = cms.CurVendorSync.SyncJdsStoresSkus(params.Ctx, storeIDs, params.IsAsync, params.IsContinueWhenError) + } + return retVal, "", err + }) +} diff --git a/controllers/jds_callback.go b/controllers/jds_callback.go new file mode 100644 index 000000000..af05c996d --- /dev/null +++ b/controllers/jds_callback.go @@ -0,0 +1,36 @@ +package controllers + +import ( + "bytes" + "fmt" + "io/ioutil" + "net/http" + + "git.rosy.net.cn/jx-callback/business/partner/purchase/jdshop" + + "git.rosy.net.cn/baseapi/utils" + "git.rosy.net.cn/jx-callback/globals" + "git.rosy.net.cn/jx-callback/globals/api" + "github.com/astaxie/beego" +) + +type JdsController struct { + beego.Controller +} + +func (c *JdsController) Msg() { + fmt.Println("testjdscll") + if c.Ctx.Input.Method() == http.MethodPost { + ctx := c.Ctx + ctx.Request.Body = ioutil.NopCloser(bytes.NewReader(ctx.Input.RequestBody)) + call, err := api.JdShopAPI.GetCallbackMsg(ctx.Request) + if err == nil { + jdshop.OnCallbackMsg(call) + } + globals.SugarLogger.Debugf("jds callback callbackResponse:%s", utils.Format4Output(call, true)) + c.Data["json"] = call + c.ServeJSON() + } else { + c.Abort("404") + } +} diff --git a/controllers/jx_order.go b/controllers/jx_order.go index bb01fc5cd..271794378 100644 --- a/controllers/jx_order.go +++ b/controllers/jx_order.go @@ -1031,3 +1031,31 @@ func (c *OrderController) RefreshJdShopOrdersEarningPrice() { return retVal, "", err }) } + +// @Title 根据订单号查询一些信息 +// @Description 根据订单号查询一些信息 +// @Param token header string false "认证token" +// @Param vendorOrderID query string true "订单号" +// @Success 200 {object} controllers.CallResult +// @Failure 200 {object} controllers.CallResult +// @router /GetOrderSimpleInfo [get] +func (c *OrderController) GetOrderSimpleInfo() { + c.callGetOrderSimpleInfo(func(params *tOrderGetOrderSimpleInfoParams) (retVal interface{}, errCode string, err error) { + retVal, err = orderman.GetOrderSimpleInfo(params.Ctx, params.VendorOrderID) + return retVal, "", err + }) +} + +// @Title 根据订单号查询用户是否是第一次购买 +// @Description 根据订单号查询用户是否是第一次购买 +// @Param token header string true "认证token" +// @Param vendorOrderID query string true "订单号" +// @Success 200 {object} controllers.CallResult +// @Failure 200 {object} controllers.CallResult +// @router /GetOrderUserBuyFirst [get] +func (c *OrderController) GetOrderUserBuyFirst() { + c.callGetOrderUserBuyFirst(func(params *tOrderGetOrderUserBuyFirstParams) (retVal interface{}, errCode string, err error) { + retVal, err = orderman.GetOrderUserBuyFirst(params.Ctx, params.VendorOrderID) + return retVal, "", err + }) +} diff --git a/controllers/temp_op.go b/controllers/temp_op.go index b2ab93b95..82c9ba8ef 100644 --- a/controllers/temp_op.go +++ b/controllers/temp_op.go @@ -368,3 +368,16 @@ func (c *TempOpController) BuildSkuFromEbaiStore() { return retVal, "", err }) } + +// @Title 上传京东商城图片 +// @Description 上传京东商城图片 +// @Param token header string true "认证token" +// @Success 200 {object} controllers.CallResult +// @Failure 200 {object} controllers.CallResult +// @router /UploadJdsImage [post] +func (c *TempOpController) UploadJdsImage() { + c.callUploadJdsImage(func(params *tTempopUploadJdsImageParams) (retVal interface{}, errCode string, err error) { + err = tempop.UploadJdsImage(params.Ctx) + return retVal, "", err + }) +} diff --git a/globals/api/api.go b/globals/api/api.go index 9fd4b40ec..1cc86b19f 100644 --- a/globals/api/api.go +++ b/globals/api/api.go @@ -123,6 +123,9 @@ func Init() { } if !beego.AppConfig.DefaultBool("disableJdShop", false) { JdShopAPI = jdshopapi.New(beego.AppConfig.String("jdShopAccessToken"), beego.AppConfig.String("jdShopAppKey"), beego.AppConfig.String("jdShopAppSecret")) + // if jdsCookie := beego.AppConfig.DefaultString("jdsCookie", ""); jdsCookie != "" { + // JdShopAPI.SetCookieWithStr(jdsCookie) + // } } else { JdShopAPI = nil } diff --git a/globals/beegodb/beegodb.go b/globals/beegodb/beegodb.go index 284fe4195..a7b8caf44 100644 --- a/globals/beegodb/beegodb.go +++ b/globals/beegodb/beegodb.go @@ -74,6 +74,7 @@ func Init() { orm.RegisterModel(&model.UserCartItem{}) orm.RegisterModel(&model.UserAgreement{}) orm.RegisterModel(&model.OrderPay{}, &model.OrderPayRefund{}) + orm.RegisterModel(&model.UserOrderSms{}) orm.RegisterModel(&model.FakeJdThingMap{}) diff --git a/globals/globals.go b/globals/globals.go index 6447c9fad..022333e7b 100644 --- a/globals/globals.go +++ b/globals/globals.go @@ -48,6 +48,7 @@ var ( SMSMobileVerifyTemplate string SMSNewOrderTemplate string SMSOrderCanceledTemplate string + SMSNewUserOrderTemplate string EnableWXAuth2 bool DisableWXAuth1 bool @@ -119,6 +120,7 @@ func Init() { SMSMobileVerifyTemplate = beego.AppConfig.String("smsMobileVerifyTemplate") SMSNewOrderTemplate = beego.AppConfig.String("smsNewOrderTemplate") SMSOrderCanceledTemplate = beego.AppConfig.String("smsOrderCanceledTemplate") + SMSNewUserOrderTemplate = beego.AppConfig.String("smsNewUserOrderTemplate") EnableWXAuth2 = true // beego.BConfig.RunMode == "beta" DisableWXAuth1 = true diff --git a/main.go b/main.go index c3b567b5b..59532647a 100644 --- a/main.go +++ b/main.go @@ -8,6 +8,8 @@ import ( "os" "time" + "git.rosy.net.cn/jx-callback/business/partner/purchase/jdshop" + "git.rosy.net.cn/jx-callback/business/partner/purchase/yb" "github.com/astaxie/beego" @@ -77,6 +79,7 @@ func Init() { ebai.CurPurchaseHandler.StartRefreshComment() mtwm.CurPurchaseHandler.StartRefreshComment() yb.CurPurchaseHandler.StartRefreshComment() + jdshop.CurPurchaseHandler.StartRefreshComment() } misc.Init() } diff --git a/routers/commentsRouter_controllers.go b/routers/commentsRouter_controllers.go index b7349c580..86c0ff4f1 100644 --- a/routers/commentsRouter_controllers.go +++ b/routers/commentsRouter_controllers.go @@ -1017,6 +1017,15 @@ func init() { Filters: nil, Params: nil}) + beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:OrderController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:OrderController"], + beego.ControllerComments{ + Method: "GetOrderSimpleInfo", + Router: `/GetOrderSimpleInfo`, + AllowHTTPMethods: []string{"get"}, + MethodParams: param.Make(), + Filters: nil, + Params: nil}) + beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:OrderController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:OrderController"], beego.ControllerComments{ Method: "GetOrderSkuInfo", @@ -1035,6 +1044,15 @@ func init() { Filters: nil, Params: nil}) + beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:OrderController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:OrderController"], + beego.ControllerComments{ + Method: "GetOrderUserBuyFirst", + Router: `/GetOrderUserBuyFirst`, + AllowHTTPMethods: []string{"get"}, + MethodParams: param.Make(), + Filters: nil, + Params: nil}) + beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:OrderController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:OrderController"], beego.ControllerComments{ Method: "GetOrderWaybillInfo", @@ -2223,6 +2241,15 @@ func init() { Filters: nil, Params: nil}) + beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:SyncController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:SyncController"], + beego.ControllerComments{ + Method: "SyncJdsStoresSkus", + Router: `/SyncJdsStoresSkus`, + AllowHTTPMethods: []string{"put"}, + MethodParams: param.Make(), + Filters: nil, + Params: nil}) + beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:SyncController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:SyncController"], beego.ControllerComments{ Method: "SyncSkuNames", @@ -2448,6 +2475,15 @@ func init() { Filters: nil, Params: nil}) + beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:TempOpController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:TempOpController"], + beego.ControllerComments{ + Method: "UploadJdsImage", + Router: `/UploadJdsImage`, + AllowHTTPMethods: []string{"post"}, + MethodParams: param.Make(), + Filters: nil, + Params: nil}) + beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:User2Controller"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:User2Controller"], beego.ControllerComments{ Method: "AddMyDeliveryAddress", diff --git a/routers/router.go b/routers/router.go index 5a12568a9..162e2ce63 100644 --- a/routers/router.go +++ b/routers/router.go @@ -157,6 +157,7 @@ func init() { beego.AutoRouter(&controllers.Djsw2Controller{}) beego.AutoRouter(&controllers.TongLianController{}) beego.AutoRouter(&controllers.EclpController{}) + beego.AutoRouter(&controllers.JdsController{}) // 如下都是用于检测存活的空接口 beego.Any("/", func(ctx *beecontext.Context) {