Merge remote-tracking branch 'origin/mark'

This commit is contained in:
苏尹岚
2020-05-28 09:40:00 +08:00
62 changed files with 2557 additions and 268 deletions

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -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")
}
}

View File

@@ -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)
})
}
}

View File

@@ -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 {

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -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) {

View File

@@ -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
}

View File

@@ -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))
}

View File

@@ -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)
}
}

View File

@@ -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 + "]"

View File

@@ -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
}

View File

@@ -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)
}

View File

@@ -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: "美团配送",

View File

@@ -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"`
}

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -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 {

View File

@@ -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"` // 平台是否自动接单,-10未知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")
}

View File

@@ -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
}

View File

@@ -18,7 +18,8 @@ const (
FieldEbaiSyncStatus = "EbaiSyncStatus"
FieldMtwmSyncStatus = "MtwmSyncStatus"
// FieldWscSyncStatus = "WscSyncStatus"
FieldYbSyncStatus = "YbSyncStatus"
FieldYbSyncStatus = "YbSyncStatus"
FieldJdsSyncStatus = "JdsSyncStatus"
FieldVendorID = "VendorID"
FieldStoreID = "StoreID"

View File

@@ -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"` //京东商城代码
}

View File

@@ -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 {

View File

@@ -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"` //是否是下预订单门店

View File

@@ -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"`

View File

@@ -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"},
}
}

View File

@@ -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)

View File

@@ -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 {

View File

@@ -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"]),

View File

@@ -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
}

View File

@@ -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
}
}
}
}
}

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -0,0 +1,5 @@
package jdshop
func (c *PurchaseHandler) StartRefreshComment() {
}

View File

@@ -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
}

View File

@@ -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 = `<p><img src="` + jdshopapi.JdsImgURL + pic3 + `" style="width: auto; height: auto; max-width: 100%;"><br></p><p><br></p>`
} else {
desc = `<p><br></p><p><br></p>`
}
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 = `<p><img src="` + jdshopapi.JdsImgURL + pic3 + `" style="width: auto; height: auto; max-width: 100%;"><br></p><p><br></p>`
} else {
desc = `<p><br></p><p><br></p>`
}
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
}

View File

@@ -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
}
}

View File

@@ -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

View File

@@ -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,

View File

@@ -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

View File

@@ -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
}

View File

@@ -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"

View File

@@ -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
})
}

View File

@@ -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
})
}

View File

@@ -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")
}
}

View File

@@ -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
})
}

View File

@@ -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
})
}

View File

@@ -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
}

View File

@@ -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{})

View File

@@ -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

View File

@@ -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()
}

View File

@@ -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",

View File

@@ -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) {