解决冲突
This commit is contained in:
@@ -7,6 +7,8 @@ import (
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"git.rosy.net.cn/baseapi/platformapi/jdeclpapi"
|
||||
|
||||
"git.rosy.net.cn/jx-callback/business/jxstore/common"
|
||||
"git.rosy.net.cn/jx-callback/business/jxutils/ddmsg"
|
||||
"git.rosy.net.cn/jx-callback/business/jxutils/tasksch"
|
||||
@@ -341,7 +343,13 @@ func (c *OrderManager) updateOrderSkuOtherInfo(order *model.GoodsOrder, db *dao.
|
||||
}
|
||||
}
|
||||
if len(vendorSkuIDs) > 0 {
|
||||
l, err := dao.GetStoreSkuPriceAndWeight(db, order.VendorStoreID, order.VendorID, vendorSkuIDs)
|
||||
var vendorStoreID string
|
||||
if order.VendorID == model.VendorIDJDShop {
|
||||
vendorStoreID = model.JdShopMainVendorStoreID
|
||||
} else {
|
||||
vendorStoreID = order.VendorStoreID
|
||||
}
|
||||
l, err := dao.GetStoreSkuPriceAndWeight(db, vendorStoreID, order.VendorID, vendorSkuIDs)
|
||||
if err != nil {
|
||||
globals.SugarLogger.Warnf("updateOrderSkuOtherInfo orderID:%s failed with err:%v", order.VendorOrderID, err)
|
||||
return err
|
||||
@@ -357,13 +365,30 @@ func (c *OrderManager) updateOrderSkuOtherInfo(order *model.GoodsOrder, db *dao.
|
||||
if skuBindInfo == nil {
|
||||
globals.SugarLogger.Infof("updateOrderSkuOtherInfo [运营%s]%s订单sku找不到门店价格(或商品映射),orderID:%s, StoreID:%d, VendorSkuID:%s, sku:%v", opNumStr, model.VendorChineseNames[order.VendorID], order.VendorOrderID, jxStoreID, v.VendorSkuID, v)
|
||||
} else {
|
||||
v.JxSkuID = skuBindInfo.SkuID
|
||||
// TODO 客户端当前逻辑认为SkuID为0为赠品
|
||||
if v.SkuID == 0 {
|
||||
v.SkuID = v.JxSkuID
|
||||
}
|
||||
v.ShopPrice = int64(skuBindInfo.Price)
|
||||
v.JxSkuID = skuBindInfo.SkuID
|
||||
//京东商城的话,门店里可能取不到对应商品
|
||||
if order.VendorID == model.VendorIDJDShop {
|
||||
v.JxSkuID = v.SkuID
|
||||
storeSkus, _ := dao.GetStoresSkusInfo(db, []int{order.StoreID}, []int{v.SkuID})
|
||||
if len(storeSkus) > 0 {
|
||||
v.ShopPrice = int64(storeSkus[0].Price)
|
||||
} else {
|
||||
v.ShopPrice = v.SalePrice * 70 / 100
|
||||
}
|
||||
} else {
|
||||
v.ShopPrice = int64(skuBindInfo.Price)
|
||||
}
|
||||
v.Weight = skuBindInfo.Weight // 以本地信息中的WEIGHT为准
|
||||
//饿鲜达的订单做一下处理
|
||||
if strings.Contains(order.StoreName, model.ExdStoreName) {
|
||||
if v.SkuID == 0 && !strings.Contains(v.SkuName, "免费") {
|
||||
v.SkuID = v.JxSkuID
|
||||
}
|
||||
}
|
||||
if skuBindInfo.Price == 0 {
|
||||
globals.SugarLogger.Infof("updateOrderSkuOtherInfo [运营%s]%s订单sku门店价格为零(一般原因为没有门店价格信息),orderID:%s, StoreID:%d, SkuID:%d, sku:%v", opNumStr, model.VendorChineseNames[order.VendorID], order.VendorOrderID, jxStoreID, v.JxSkuID, v)
|
||||
}
|
||||
@@ -434,9 +459,6 @@ func updateSingleOrderEarningPrice(order *model.GoodsOrder, db *dao.DaoDB) {
|
||||
}
|
||||
}
|
||||
if len(skuIDMap) > 0 {
|
||||
if order.VendorOrderID == "5000356075877900459" {
|
||||
fmt.Println("testupdateSingleOrderEarningPrice", order.VendorOrderID)
|
||||
}
|
||||
actStoreSkuList, err := dao.GetEffectiveActStoreSkuInfo(db, 0, []int{order.VendorID}, model.ActTypeAll, []int{jxStoreID}, jxutils.IntMap2List(skuIDMap), order.OrderCreatedAt, order.OrderCreatedAt)
|
||||
if err != nil {
|
||||
globals.SugarLogger.Errorf("updateOrderSkuOtherInfo can not get sku promotion info for error:%v", err)
|
||||
@@ -1004,19 +1026,29 @@ func GetOrderSimpleInfo(ctx *jxcontext.Context, vendorOrderID string) (getOrderS
|
||||
|
||||
func SaveJdsOrders(ctx *jxcontext.Context, orderCreatedStart, orderCreatedEnd time.Time) (err error) {
|
||||
var (
|
||||
pageNo = 1
|
||||
pageSize = 10
|
||||
pageSize = 20
|
||||
)
|
||||
orderResult, err := jdshop.CurPurchaseHandler.GetJdsOrders(ctx, utils.Time2Str(orderCreatedStart), utils.Time2Str(orderCreatedEnd), pageNo, pageSize)
|
||||
orderResult, err := jdshop.CurPurchaseHandler.GetJdsOrders(ctx, utils.Time2Str(orderCreatedStart), utils.Time2Str(orderCreatedEnd), 1, pageSize)
|
||||
if err != nil {
|
||||
noticeMsg := fmt.Sprintf("京东商城保存订单出错!(多半是cookie过期了),err :[%v]", err)
|
||||
ddmsg.SendUserMessage(dingdingapi.MsgTyeText, "DDC5657B43EE11E9A9FF525400E86DC0", "cookie", noticeMsg)
|
||||
ddmsg.SendUserMessage(dingdingapi.MsgTyeText, "1439B3E07D3911EA881A525400E86DC0", "cookie", noticeMsg)
|
||||
globals.SugarLogger.Errorf("SaveJdsOrders : %v", err)
|
||||
return err
|
||||
}
|
||||
orders, err := result2Orders(ctx, orderResult)
|
||||
if orderResult.TotalCount > pageSize {
|
||||
for pageNO := 2; pageNO < orderResult.TotalCount/pageSize+1; pageNO++ {
|
||||
orderResult, _ := jdshop.CurPurchaseHandler.GetJdsOrders(ctx, utils.Time2Str(orderCreatedStart), utils.Time2Str(orderCreatedEnd), pageNO, pageSize)
|
||||
orders2, _ := result2Orders(ctx, orderResult)
|
||||
orders = append(orders, orders2...)
|
||||
}
|
||||
}
|
||||
for _, order := range orders {
|
||||
// partner.CurOrderManager.OnOrderNew(order, model.Order2Status(order))
|
||||
order.StoreID = 102919
|
||||
order.JxStoreID = 102919
|
||||
order.StoreName = "商城模板(成都发货)"
|
||||
order.VendorStoreID = model.JdShopMainVendorStoreID
|
||||
partner.CurOrderManager.OnOrderNew(order, model.Order2Status(order))
|
||||
globals.SugarLogger.Debugf("SaveJdsOrders, order: [%v]", utils.Format4Output(order, false))
|
||||
noticeMsg := fmt.Sprintf("京东商城新订单,订单号:[%v] ,将要发到的门店id:[%v] , 门店名:[%v]", order.VendorOrderID, order.StoreID, order.StoreName)
|
||||
ddmsg.SendUserMessage(dingdingapi.MsgTyeText, "DDC5657B43EE11E9A9FF525400E86DC0", "京东商城来新订单了!", noticeMsg)
|
||||
@@ -1043,7 +1075,7 @@ func result2Orders(ctx *jxcontext.Context, result *jdshopapi.AllOrdersResult) (o
|
||||
}
|
||||
order := &model.GoodsOrder{
|
||||
VendorOrderID2: utils.Int64ToStr(jdsOrder.OrderID),
|
||||
VendorOrderID: utils.Int64ToStr(jdsOrder.OrderID) + "01",
|
||||
VendorOrderID: utils.Int64ToStr(jdsOrder.OrderID) + "001",
|
||||
VendorID: model.VendorIDJDShop,
|
||||
BaseFreightMoney: jxutils.StandardPrice2Int(jdsOrder.Freight),
|
||||
VendorStatus: utils.Int2Str(jdsOrder.OrderStatus),
|
||||
@@ -1058,6 +1090,10 @@ func result2Orders(ctx *jxcontext.Context, result *jdshopapi.AllOrdersResult) (o
|
||||
ActualPayPrice: orderDetail.ActualPayPrice,
|
||||
Status: model.OrderStatusNew,
|
||||
TotalShopMoney: utils.Float64TwoInt64(math.Round(utils.Int64ToFloat64(orderDetail.ActualPayPrice) * jdshopapi.JdsPayPercentage)),
|
||||
DeliveryFlag: model.OrderDeliveryFlagMaskScheduleDisabled,
|
||||
DeliveryType: model.OrderDeliveryTypeStoreSelf,
|
||||
StatusTime: utils.Str2Time(jdsOrder.OrderCreateTime + ":00"),
|
||||
OrderSeq: 0,
|
||||
}
|
||||
//获取真实手机号
|
||||
fakeMobile, err := api.JdShopAPI.PhoneSensltiveInfo(order.VendorOrderID2, orderDetail.MobileKey)
|
||||
@@ -1075,31 +1111,28 @@ func result2Orders(ctx *jxcontext.Context, result *jdshopapi.AllOrdersResult) (o
|
||||
order.ConsigneeLng = jxutils.StandardCoordinate2Int(lng)
|
||||
order.ConsigneeLat = jxutils.StandardCoordinate2Int(lat)
|
||||
}
|
||||
if order.StoreName != "" {
|
||||
storeMaps, _ := dao.GetStoresMapList(dao.GetDB(), []int{model.VendorIDJDShop}, nil, nil, model.StoreStatusAll, model.StoreIsSyncAll, "", order.StoreName)
|
||||
if len(storeMaps) > 0 {
|
||||
order.StoreID = storeMaps[0].StoreID
|
||||
order.VendorStoreID = storeMaps[0].VendorStoreID
|
||||
}
|
||||
} else {
|
||||
storeList, err := common.GetStoreListByLocation(ctx, jxutils.IntCoordinate2Standard(order.ConsigneeLng), jxutils.IntCoordinate2Standard(order.ConsigneeLat), 5000, false, true)
|
||||
if err != nil {
|
||||
globals.SugarLogger.Debugf("jds GetStoreListByLocation error: %v", err.Error())
|
||||
continue
|
||||
}
|
||||
order.StoreID = storeList[0].ID
|
||||
order.StoreName = storeList[0].Name
|
||||
storeList, err := common.GetStoreListByLocation(ctx, jxutils.IntCoordinate2Standard(order.ConsigneeLng), jxutils.IntCoordinate2Standard(order.ConsigneeLat), 5000, false, true)
|
||||
if err != nil {
|
||||
globals.SugarLogger.Debugf("jds GetStoreListByLocation error: %v", err.Error())
|
||||
continue
|
||||
}
|
||||
order.StoreID = storeList[0].ID
|
||||
order.StoreName = storeList[0].Name
|
||||
storeMaps, _ := dao.GetStoresMapList(dao.GetDB(), []int{model.VendorIDJDShop}, []int{order.StoreID}, nil, model.StoreStatusAll, model.StoreIsSyncAll, "", "")
|
||||
if len(storeMaps) > 0 {
|
||||
order.VendorStoreID = storeMaps[0].VendorStoreID
|
||||
}
|
||||
//如果是暂停,表示是预订单
|
||||
if jdsOrder.OrderStatus == jdshopapi.JdsOrderStatusPause {
|
||||
order.BusinessType = model.BusinessTypeDingshida
|
||||
order.ExpectedDeliveredTime = utils.Str2Time(orderDetail.ExpectedDeliveredTime)
|
||||
} else if jdsOrder.OrderStatus == jdshopapi.JdsOrderStatusWaittingExport {
|
||||
order.ExpectedDeliveredTime = order.CreatedAt.Add(time.Hour)
|
||||
order.ExpectedDeliveredTime = order.OrderCreatedAt.Add(time.Hour)
|
||||
order.BusinessType = model.BusinessTypeImmediate
|
||||
} else {
|
||||
globals.SugarLogger.Errorf("未知的京东商城订单状态!status : %v", jdsOrder.OrderStatus)
|
||||
}
|
||||
setJdsOrderSeq(order)
|
||||
for _, v := range jdsOrder.OrderItems {
|
||||
sku := &model.OrderSku{
|
||||
VendorID: model.VendorIDJDShop,
|
||||
@@ -1128,6 +1161,19 @@ func result2Orders(ctx *jxcontext.Context, result *jdshopapi.AllOrdersResult) (o
|
||||
return orders, err
|
||||
}
|
||||
|
||||
func setJdsOrderSeq(order *model.GoodsOrder) (err error) {
|
||||
var count int
|
||||
sql := `
|
||||
SELECT count(*) FROM goods_order WHERE store_id = ? AND order_create_at >= ? AND order_create_at <= ? AND vendor_id = ?
|
||||
`
|
||||
sqlParams := []interface{}{
|
||||
order.StoreID, utils.Time2Date(time.Now()), utils.Time2Date(time.Now().AddDate(0, 0, 1)), order.VendorID,
|
||||
}
|
||||
err = dao.GetRow(dao.GetDB(), &count, sql, sqlParams)
|
||||
order.OrderSeq = count + 1
|
||||
return err
|
||||
}
|
||||
|
||||
func TransferJdsOrder(ctx *jxcontext.Context, vendorOrderID string, storeID int) (vendorOrderIDJds string, err error) {
|
||||
globals.SugarLogger.Debugf("jds TransferJdsOrder vendorOrderID: %v, storeID : %v", vendorOrderID, storeID)
|
||||
var (
|
||||
@@ -1138,7 +1184,7 @@ func TransferJdsOrder(ctx *jxcontext.Context, vendorOrderID string, storeID int)
|
||||
if err != nil || order == nil {
|
||||
return "", fmt.Errorf("未查询到该订单!订单号:[%v]", vendorOrderID)
|
||||
}
|
||||
if order.Status >= model.OrderStatusDelivering {
|
||||
if order.Status >= model.OrderStatusDelivering && order.Status != model.OrderStatusCanceled {
|
||||
return "", fmt.Errorf("暂不支持此状态的订单进行转移!")
|
||||
}
|
||||
if order.VendorID != model.VendorIDJDShop {
|
||||
@@ -1159,10 +1205,12 @@ func TransferJdsOrder(ctx *jxcontext.Context, vendorOrderID string, storeID int)
|
||||
waybill = v
|
||||
}
|
||||
}
|
||||
handler := partner.DeliveryPlatformHandlers[waybill.WaybillVendorID]
|
||||
err = handler.Handler.CancelWaybill(waybill, 0, "订单转移被取消")
|
||||
if err != nil {
|
||||
return "", err
|
||||
if waybill.WaybillVendorID != model.VendorIDJDWL {
|
||||
handler := partner.DeliveryPlatformHandlers[waybill.WaybillVendorID]
|
||||
err = handler.Handler.CancelWaybill(waybill, 0, "订单转移被取消")
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
}
|
||||
}
|
||||
err = jdshop.ChangeOrderStatus(vendorOrderID, model.OrderStatusCanceled, "订单转移被取消")
|
||||
@@ -1170,23 +1218,30 @@ func TransferJdsOrder(ctx *jxcontext.Context, vendorOrderID string, storeID int)
|
||||
return "", err
|
||||
}
|
||||
//重新构建order的数据
|
||||
storeMaps, err := dao.GetStoresMapList(db, []int{order.VendorID}, []int{order.StoreID}, nil, model.StoreStatusAll, model.StoreIsSyncAll, "", "")
|
||||
if len(storeMaps) > 0 {
|
||||
storeMaps, err := dao.GetStoresMapList(db, []int{order.VendorID}, []int{storeID}, nil, model.StoreStatusAll, model.StoreIsSyncAll, "", "")
|
||||
stores, err := dao.GetStoreList(db, []int{storeID}, nil, nil, nil, "")
|
||||
if len(storeMaps) > 0 && len(stores) > 0 {
|
||||
order.StoreID = storeID
|
||||
order.StoreName = storeMaps[0].StoreName
|
||||
order.StoreName = stores[0].Name
|
||||
order.VendorStoreID = storeMaps[0].VendorStoreID
|
||||
} else {
|
||||
return "", fmt.Errorf("未查询到该门店对应的平台信息!门店:[%v]", order.StoreID)
|
||||
}
|
||||
if len(order.VendorOrderID) > 12 {
|
||||
suffix := utils.Str2Int(order.VendorOrderID[12:len(order.VendorOrderID)])
|
||||
suffix++
|
||||
order.VendorOrderID = order.VendorOrderID2 + utils.Int2Str(suffix)
|
||||
order.VendorOrderID = utils.Int64ToStr(utils.Str2Int64(order.VendorOrderID2)*100) + utils.Int2Str(suffix)
|
||||
}
|
||||
for _, sku := range skus {
|
||||
sku.VendorOrderID = order.VendorOrderID
|
||||
sku.ID = 0
|
||||
order.Skus = append(order.Skus, sku)
|
||||
}
|
||||
if storeID != model.JdShopMainStoreID {
|
||||
order.DeliveryFlag = model.NO
|
||||
}
|
||||
order.Status = model.OrderStatusNew
|
||||
setJdsOrderSeq(order)
|
||||
err = partner.CurOrderManager.OnOrderNew(order, model.Order2Status(order))
|
||||
vendorOrderIDJds = order.VendorOrderID
|
||||
return vendorOrderIDJds, err
|
||||
@@ -1218,8 +1273,64 @@ func SendJdwlForJdsOrder(ctx *jxcontext.Context, vendorOrderID string) (err erro
|
||||
return err
|
||||
}
|
||||
}
|
||||
handler := partner.DeliveryPlatformHandlers[model.VendorIDJDWL]
|
||||
waybill2, err := handler.Handler.CreateWaybill(order, 0)
|
||||
jdshop.CurPurchaseHandler.OrderExport(ctx, vendorOrderID, waybill2.VendorWaybillID, false)
|
||||
var vendorWaybillID string
|
||||
if order.StoreID == model.JdShopMainStoreID {
|
||||
var (
|
||||
goodsNos []string
|
||||
prices []string
|
||||
quantities []string
|
||||
)
|
||||
for _, v := range order.Skus {
|
||||
skus, err := dao.GetSkus(db, []int{v.SkuID}, nil, nil, nil, nil)
|
||||
if err != nil || len(skus) == 0 {
|
||||
continue
|
||||
}
|
||||
goodsNos = append(goodsNos, skus[0].EclpID)
|
||||
prices = append(prices, "0")
|
||||
quantities = append(quantities, utils.Int2Str(v.Count))
|
||||
}
|
||||
eclpSoNo, err := api.JdEclpAPI.AddOrder(&jdeclpapi.AddOrderParam{
|
||||
IsvUUID: order.VendorOrderID,
|
||||
IsvSource: jdeclpapi.IsvSource,
|
||||
ShopNo: jdeclpapi.ShopNo,
|
||||
DepartmentNo: jdeclpapi.DepartmentNo,
|
||||
WarehouseNo: jdeclpapi.WarehouseNo,
|
||||
SalesPlatformOrderNo: order.VendorOrderID,
|
||||
SalePlatformSource: jdeclpapi.SalePlatformSource,
|
||||
ConsigneeName: order.ConsigneeName,
|
||||
ConsigneeMobile: order.ConsigneeMobile,
|
||||
ConsigneeAddress: order.ConsigneeAddress,
|
||||
OrderMark: jdeclpapi.OrderMark,
|
||||
GoodsNo: strings.Join(goodsNos, ","),
|
||||
Price: strings.Join(prices, ","),
|
||||
Quantity: strings.Join(quantities, ","),
|
||||
})
|
||||
waybill := &model.Waybill{
|
||||
VendorOrderID: order.VendorOrderID,
|
||||
OrderVendorID: model.VendorIDJX,
|
||||
VendorWaybillID: eclpSoNo,
|
||||
WaybillVendorID: model.VendorIDJDWL,
|
||||
Status: model.WaybillStatusDelivering,
|
||||
WaybillCreatedAt: time.Now(),
|
||||
StatusTime: time.Now(),
|
||||
WaybillFinishedAt: utils.DefaultTimeValue,
|
||||
DeliveryFlag: model.OrderDeliveryFlagMaskScheduleDisabled,
|
||||
}
|
||||
dao.CreateEntity(db, waybill)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
order.EclpOutID = eclpSoNo
|
||||
dao.UpdateEntity(db, order, "EclpOutID")
|
||||
vendorWaybillID = eclpSoNo
|
||||
} else {
|
||||
handler := partner.DeliveryPlatformHandlers[model.VendorIDJDWL]
|
||||
waybill2, err := handler.Handler.CreateWaybill(order, 0)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
vendorWaybillID = waybill2.VendorWaybillID
|
||||
}
|
||||
jdshop.CurPurchaseHandler.OrderExport(ctx, vendorOrderID, vendorWaybillID, false)
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -295,6 +295,7 @@ func (c *OrderManager) updateAfsOrderSkuOtherInfo(db *dao.DaoDB, order *model.Af
|
||||
globals.SugarLogger.Infof("updateAfsOrderSkuOtherInfo [运营%s]%s订单sku找不到门店价格(或商品映射),orderID:%s, StoreID:%d, VendorSkuID:%s, sku:%v", opNumStr, model.VendorChineseNames[order.VendorID], order.VendorOrderID, jxStoreID, v.VendorSkuID, v)
|
||||
} else {
|
||||
v.JxSkuID = skuBindInfo.SkuID
|
||||
v.ShopPrice = int64(skuBindInfo.Price)
|
||||
}
|
||||
}
|
||||
if actStoreSkuMap != nil {
|
||||
|
||||
@@ -6,6 +6,12 @@ import (
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
"github.com/astaxie/beego"
|
||||
|
||||
"git.rosy.net.cn/jx-callback/business/jxstore/cms"
|
||||
|
||||
"git.rosy.net.cn/jx-callback/business/authz"
|
||||
"git.rosy.net.cn/jx-callback/business/authz/autils"
|
||||
"git.rosy.net.cn/jx-callback/business/jxutils/ddmsg"
|
||||
"git.rosy.net.cn/jx-callback/business/partner/purchase/jdshop"
|
||||
|
||||
@@ -1384,9 +1390,11 @@ func (s *DefScheduler) notifyNewOrder(order *model.GoodsOrder) {
|
||||
} else {
|
||||
weixinmsg.NotifyNewOrder(order)
|
||||
}
|
||||
smsmsg.NotifyNewOrder(order)
|
||||
OrderProfitWarning(order)
|
||||
smsmsg.NotifyNewUserOrder(order)
|
||||
if order.VendorID != model.VendorIDJDShop {
|
||||
smsmsg.NotifyNewOrder(order)
|
||||
smsmsg.NotifyNewUserOrder(order)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
@@ -1440,18 +1448,49 @@ func OrderProfitWarning(order *model.GoodsOrder) {
|
||||
storeDetail, err := dao.GetStoreDetail(db, storeID, order.VendorID)
|
||||
if storeDetail != nil && err == nil {
|
||||
payPercentage := storeDetail.PayPercentage
|
||||
if payPercentage >= 50 {
|
||||
profit = utils.Str2Float64(utils.Int64ToStr(order.TotalShopMoney-order.EarningPrice)) / 100
|
||||
if beego.BConfig.RunMode == "jxgy" {
|
||||
if payPercentage >= 50 {
|
||||
profit = utils.Str2Float64(utils.Int64ToStr(order.TotalShopMoney-order.EarningPrice)) / 100
|
||||
} else {
|
||||
profit = utils.Str2Float64(utils.Int64ToStr(order.TotalShopMoney*int64(payPercentage)/200)) / 100
|
||||
}
|
||||
} else {
|
||||
profit = utils.Str2Float64(utils.Int64ToStr(order.TotalShopMoney*int64(payPercentage)/200)) / 100
|
||||
if payPercentage >= 50 {
|
||||
profit = utils.Str2Float64(utils.Int64ToStr(order.TotalShopMoney-order.ShopPrice)) / 100
|
||||
} else {
|
||||
profit = utils.Str2Float64(utils.Int64ToStr(order.TotalShopMoney*int64(payPercentage)/200)) / 100
|
||||
}
|
||||
}
|
||||
if profit < 0 {
|
||||
operatorPhone, operatorName := getOrderOperatorInfo(order, storeDetail)
|
||||
operatorRole := getOrderOperatorRoleInfo(order, storeDetail)
|
||||
if operatorPhone != "" {
|
||||
var (
|
||||
roleList []*authz.RoleInfo
|
||||
userIDs []string
|
||||
flag = false
|
||||
)
|
||||
roleList = append(roleList, autils.NewRole(operatorRole, 0))
|
||||
userIDMap, err := cms.GetRolesUserList(jxcontext.AdminCtx, roleList)
|
||||
noticeMsg := fmt.Sprintf("利润 :[%v],运营负责人:[%v],门店ID:[%v],平台门店ID[%v],门店名:[%v],订单序号:[%v],订单号(点击进入详情):%v", profit, operatorName, order.StoreID, order.VendorStoreID, order.StoreName, order.OrderSeq, globals.BackstageHost+"/#/ordermanager/"+order.VendorOrderID)
|
||||
user, err := dao.GetUserByID(db, "mobile", operatorPhone)
|
||||
if user != nil && err == nil {
|
||||
ddmsg.SendUserMessage(dingdingapi.MsgTyeText, user.UserID, "警告!此订单利润低于0", noticeMsg)
|
||||
for _, v := range userIDMap {
|
||||
for _, vv := range v {
|
||||
userIDs = append(userIDs, vv)
|
||||
}
|
||||
}
|
||||
for _, v := range userIDs {
|
||||
if v == user.UserID {
|
||||
flag = true
|
||||
}
|
||||
}
|
||||
if !flag {
|
||||
userIDs = append(userIDs, user.UserID)
|
||||
}
|
||||
for _, v := range userIDs {
|
||||
ddmsg.SendUserMessage(dingdingapi.MsgTyeText, v, "警告!此订单利润低于0", noticeMsg)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1500,3 +1539,15 @@ func getOrderOperatorInfo(order *model.GoodsOrder, storeDetail *dao.StoreDetail)
|
||||
}
|
||||
return operatorPhone, operatorName
|
||||
}
|
||||
|
||||
func getOrderOperatorRoleInfo(order *model.GoodsOrder, storeDetail *dao.StoreDetail) (roleName string) {
|
||||
switch order.VendorID {
|
||||
case model.VendorIDJD:
|
||||
roleName = storeDetail.OperatorRole
|
||||
case model.VendorIDMTWM:
|
||||
roleName = storeDetail.OperatorRole2
|
||||
case model.VendorIDEBAI:
|
||||
roleName = storeDetail.OperatorRole3
|
||||
}
|
||||
return roleName
|
||||
}
|
||||
|
||||
@@ -588,6 +588,9 @@ func GetSkuNames(ctx *jxcontext.Context, keyword string, isBySku, isQueryMidPric
|
||||
t1.price,
|
||||
t1.img,
|
||||
t1.img2,
|
||||
t1.img3,
|
||||
t1.img_watermark,
|
||||
t1.img_mix,
|
||||
t1.status,
|
||||
t1.is_spu,
|
||||
t1.desc_img,
|
||||
@@ -596,7 +599,8 @@ func GetSkuNames(ctx *jxcontext.Context, keyword string, isBySku, isQueryMidPric
|
||||
t1.ex_prefix_begin,
|
||||
t1.ex_prefix_end,
|
||||
t1.yb_name_suffix,
|
||||
t1.jds_stock_switch
|
||||
t1.jds_stock_switch,
|
||||
t1.preparation_time
|
||||
`
|
||||
if isQueryMidPrice {
|
||||
sql += `,
|
||||
@@ -624,6 +628,9 @@ func GetSkuNames(ctx *jxcontext.Context, keyword string, isBySku, isQueryMidPric
|
||||
t1.price,
|
||||
t1.img,
|
||||
t1.img2,
|
||||
t1.img3,
|
||||
t1.img_watermark,
|
||||
t1.img_mix,
|
||||
t1.status,
|
||||
t1.is_spu,
|
||||
t1.desc_img,
|
||||
@@ -637,6 +644,7 @@ func GetSkuNames(ctx *jxcontext.Context, keyword string, isBySku, isQueryMidPric
|
||||
t1.ex_prefix_end,
|
||||
t1.yb_name_suffix,
|
||||
t1.jds_stock_switch,
|
||||
t1.preparation_time,
|
||||
`
|
||||
if isQueryMidPrice {
|
||||
sqlData += " t4.mid_unit_price,"
|
||||
@@ -903,7 +911,7 @@ func UpdateSkuName(ctx *jxcontext.Context, nameID int, payload map[string]interf
|
||||
}
|
||||
}
|
||||
globals.SugarLogger.Debugf("UpdateSkuName valid:%s", utils.Format4Output(valid, false))
|
||||
for _, imgName := range []string{"img", "img2"} {
|
||||
for _, imgName := range []string{"img", "img2", "img3"} {
|
||||
if valid[imgName] != nil {
|
||||
if imgStr := utils.Interface2String(valid[imgName]); imgStr != "" {
|
||||
_, err2 := datares.TryRegisterDataResource(ctx, skuName.Name, valid[imgName].(string), model.ImgTypeMain, true)
|
||||
@@ -1517,7 +1525,7 @@ func GetJdUpcCodeByName(ctx *jxcontext.Context, name, upcCode string) (productIn
|
||||
return productInfos, err
|
||||
}
|
||||
|
||||
func UpdateSkuNamesExPrefix(ctx *jxcontext.Context, nameIDs []int, exPrefix, fromTime, toTime string, isAsync, isContinueWhenError bool) (hint string, err error) {
|
||||
func UpdateSkuNamesExPrefix(ctx *jxcontext.Context, nameIDs []int, imgWaterMark string, vendorID int, exPrefix, fromTime, toTime string, isAsync, isContinueWhenError bool) (hint string, err error) {
|
||||
var (
|
||||
fromTimeP time.Time
|
||||
toTimeP time.Time
|
||||
@@ -1545,24 +1553,30 @@ func UpdateSkuNamesExPrefix(ctx *jxcontext.Context, nameIDs []int, exPrefix, fro
|
||||
"exPrefix": exPrefix,
|
||||
"exPrefixBegin": fromTimeP,
|
||||
"exPrefixEnd": toTimeP,
|
||||
"imgWaterMark": imgWaterMark,
|
||||
"exVendorID": vendorID,
|
||||
}
|
||||
if now.Sub(toTimeP) <= 0 && now.Sub(fromTimeP) >= 0 {
|
||||
if now.Sub(toTimeP) <= 0 && now.Sub(fromTimeP) <= 0 {
|
||||
_, err = UpdateSkuName(ctx, nameID, payload, false)
|
||||
} else if now.Sub(fromTimeP) > 0 && now.Sub(toTimeP) > 0 {
|
||||
payload["exPrefixBegin"] = nil
|
||||
payload["exPrefixEnd"] = nil
|
||||
payload["imgWaterMark"] = nil
|
||||
payload["exVendorID"] = nil
|
||||
_, err = UpdateSkuName(ctx, nameID, payload, false)
|
||||
} else {
|
||||
skuList, err := dao.GetSkus(db, nil, []int{nameID}, nil, nil, nil)
|
||||
if err == nil && len(skuList) > 0 {
|
||||
if skuList[0].ExPrefixBegin != nil {
|
||||
_, err = UpdateSkuName(ctx, nameID, payload, false)
|
||||
CurVendorSync.SyncStoresSkus2(ctx, nil, 0, db, partner.GetSingleStoreVendorIDs(), nil, false, []int{skuList[0].ID}, nil, model.SyncFlagModifiedMask, true, true)
|
||||
CurVendorSync.SyncStoresSkus2(ctx, nil, 0, db, []int{vendorID}, nil, false, []int{skuList[0].ID}, nil, model.SyncFlagModifiedMask, true, true)
|
||||
} else {
|
||||
skuName := &model.SkuName{
|
||||
ExPrefix: exPrefix,
|
||||
ExPrefixBegin: &fromTimeP,
|
||||
ExPrefixEnd: &toTimeP,
|
||||
ImgWatermark: imgWaterMark,
|
||||
ExVendorID: vendorID,
|
||||
}
|
||||
skuName.ID = nameID
|
||||
skuName.LastOperator = ctx.GetLoginID()
|
||||
@@ -1574,7 +1588,7 @@ func UpdateSkuNamesExPrefix(ctx *jxcontext.Context, nameIDs []int, exPrefix, fro
|
||||
panic(r)
|
||||
}
|
||||
}()
|
||||
_, err = dao.UpdateEntity(db, skuName, "ExPrefix", "ExPrefixBegin", "ExPrefixEnd", "LastOperator", "UpdatedAt")
|
||||
_, err = dao.UpdateEntity(db, skuName, "ImgWatermark", "ExVendorID", "ExPrefix", "ExPrefixBegin", "ExPrefixEnd", "LastOperator", "UpdatedAt")
|
||||
dao.Commit(db)
|
||||
}
|
||||
}
|
||||
@@ -1592,7 +1606,7 @@ func UpdateSkuNamesExPrefix(ctx *jxcontext.Context, nameIDs []int, exPrefix, fro
|
||||
for _, v := range skuList {
|
||||
skuIDs = append(skuIDs, v.ID)
|
||||
}
|
||||
CurVendorSync.SyncStoresSkus2(ctx, nil, 0, db, partner.GetSingleStoreVendorIDs(), nil, false, skuIDs, nil, model.SyncFlagModifiedMask, true, true)
|
||||
CurVendorSync.SyncStoresSkus2(ctx, nil, 0, db, []int{vendorID}, nil, false, skuIDs, nil, model.SyncFlagModifiedMask, true, true)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -2520,3 +2534,72 @@ func deleteJdsSku(db *dao.DaoDB, skuID int) (err error) {
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
func UpdateSkuExinfoMap(ctx *jxcontext.Context, nameIDs []int, imgWaterMark string, vendorID int, exPrefix, fromTime, toTime string, isAsync, isContinueWhenError bool) (hint string, err error) {
|
||||
var (
|
||||
fromTimeP time.Time
|
||||
toTimeP time.Time
|
||||
db = dao.GetDB()
|
||||
)
|
||||
if fromTime != "" {
|
||||
fromTimeP = utils.Time2Date(utils.Str2Time(fromTime))
|
||||
}
|
||||
if toTime != "" {
|
||||
toTimeP = utils.Time2Date(utils.Str2Time(toTime))
|
||||
}
|
||||
if toTimeP.Before(fromTimeP) {
|
||||
return "", fmt.Errorf("结束时间不可以小于开始时间!开始时间:[%v],结束时间:[%v]", fromTimeP, toTimeP)
|
||||
}
|
||||
task := tasksch.NewParallelTask("UpdateSkuExinfoMap", tasksch.NewParallelConfig().SetIsContinueWhenError(isContinueWhenError), ctx,
|
||||
func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
|
||||
nameID := batchItemList[0].(int)
|
||||
skuEx := &model.SkuExinfoMap{
|
||||
NameID: nameID,
|
||||
ImgWatermark: imgWaterMark,
|
||||
ExPrefix: exPrefix,
|
||||
VendorID: vendorID,
|
||||
BeginAt: fromTimeP,
|
||||
EndAt: toTimeP,
|
||||
}
|
||||
dao.WrapAddIDCULDEntity(skuEx, ctx.GetUserName())
|
||||
skuExs, _ := dao.GetSkuExinfos(db, []int{nameID}, []int{vendorID}, "", utils.ZeroTimeValue, utils.ZeroTimeValue)
|
||||
if len(skuExs) > 0 {
|
||||
skuEx2 := skuExs[0]
|
||||
skuEx2.DeletedAt = time.Now()
|
||||
skuEx2.LastOperator = ctx.GetUserName()
|
||||
dao.UpdateEntity(db, skuEx2, "DeletedAt", "LastOperator")
|
||||
dao.CreateEntity(db, skuEx)
|
||||
} else {
|
||||
dao.CreateEntity(db, skuEx)
|
||||
}
|
||||
now := utils.Time2Date(time.Now())
|
||||
if now.Sub(fromTimeP) >= 0 && now.Sub(toTimeP) <= 0 {
|
||||
var skuIDs []int
|
||||
skuList, err2 := dao.GetSkus(db, nil, []int{nameID}, nil, nil, nil)
|
||||
if err = err2; err == nil {
|
||||
if len(skuList) > 0 {
|
||||
for _, v := range skuList {
|
||||
skuIDs = append(skuIDs, v.ID)
|
||||
}
|
||||
if partner.IsMultiStore(vendorID) {
|
||||
for _, v := range skuIDs {
|
||||
OnUpdateThing(ctx, db, nil, int64(v), model.ThingTypeSku)
|
||||
}
|
||||
CurVendorSync.SyncSkus(ctx, db, nil, skuIDs, isAsync, isContinueWhenError, ctx.GetUserName())
|
||||
} else {
|
||||
CurVendorSync.SyncStoresSkus2(ctx, nil, 0, db, []int{vendorID}, nil, false, skuIDs, nil, model.SyncFlagModifiedMask, isAsync, isContinueWhenError)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return retVal, err
|
||||
}, nameIDs)
|
||||
tasksch.HandleTask(task, nil, true).Run()
|
||||
if isAsync {
|
||||
hint = task.GetID()
|
||||
} else {
|
||||
_, err = task.GetResult(0)
|
||||
hint = "1"
|
||||
}
|
||||
return hint, err
|
||||
}
|
||||
|
||||
@@ -370,6 +370,17 @@ func getStoresSql(ctx *jxcontext.Context, keyword string, params map[string]inte
|
||||
}
|
||||
}
|
||||
|
||||
if params["storeLevels"] != nil {
|
||||
var storeLevels []string
|
||||
if err = jxutils.Strings2Objs(utils.Interface2String(params["storeLevels"]), &storeLevels); err != nil {
|
||||
return "", nil, "", nil, err
|
||||
}
|
||||
if len(storeLevels) > 0 {
|
||||
sqlWhere += " AND t1.store_level IN (" + dao.GenQuestionMarks(len(storeLevels)) + ")"
|
||||
sqlWhereParams = append(sqlWhereParams, storeLevels)
|
||||
}
|
||||
}
|
||||
|
||||
sql = sqlFrom + sqlWhere
|
||||
sqlParams = append(sqlParams, sqlFromParams...)
|
||||
sqlParams = append(sqlParams, sqlWhereParams...)
|
||||
|
||||
@@ -13,6 +13,8 @@ import (
|
||||
"time"
|
||||
"unicode"
|
||||
|
||||
"github.com/astaxie/beego"
|
||||
|
||||
"git.rosy.net.cn/baseapi/platformapi/jdshopapi"
|
||||
|
||||
"git.rosy.net.cn/jx-callback/globals/api"
|
||||
@@ -843,8 +845,7 @@ func UpdateStoreSkus(ctx *jxcontext.Context, causeFlag, storeID int, skuBindInfo
|
||||
|
||||
func UpdateStoresSkus(ctx *jxcontext.Context, causeFlag int, storeIDs []int, skuBindInfos []*StoreSkuBindInfo, isScale, isRefreshHigh, isAsync, isContinueWhenError bool) (hint string, err error) {
|
||||
globals.SugarLogger.Debugf("UpdateStoresSkus:%s, storeIDs:%v, skuBindInfos:%s", ctx.GetTrackInfo(), storeIDs, utils.Format4Output(skuBindInfos, true))
|
||||
flag, err := doStoreSkuAudit(ctx, storeIDs, skuBindInfos)
|
||||
if !flag {
|
||||
if beego.BConfig.RunMode == "jxgy" {
|
||||
var num int64
|
||||
db := dao.GetDB()
|
||||
skuIDs, err := updateStoresSkusWithoutSync(ctx, db, storeIDs, skuBindInfos, isScale, isRefreshHigh)
|
||||
@@ -859,6 +860,24 @@ func UpdateStoresSkus(ctx *jxcontext.Context, causeFlag int, storeIDs []int, sku
|
||||
if num == 0 || !isAsync || hint == "" {
|
||||
hint = utils.Int64ToStr(num)
|
||||
}
|
||||
} else {
|
||||
flag, _ := doStoreSkuAudit(ctx, storeIDs, skuBindInfos)
|
||||
if !flag {
|
||||
var num int64
|
||||
db := dao.GetDB()
|
||||
skuIDs, err := updateStoresSkusWithoutSync(ctx, db, storeIDs, skuBindInfos, isScale, isRefreshHigh)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
isAsync = asyncStoreSkuOpFilter(ctx, isAsync)
|
||||
num = int64(len(skuIDs))
|
||||
if num > 0 {
|
||||
hint, err = CurVendorSync.SyncStoresSkus(ctx, nil, causeFlag, db, nil, storeIDs, skuIDs, false, isAsync, isContinueWhenError)
|
||||
}
|
||||
if num == 0 || !isAsync || hint == "" {
|
||||
hint = utils.Int64ToStr(num)
|
||||
}
|
||||
}
|
||||
}
|
||||
return hint, err
|
||||
}
|
||||
@@ -1107,7 +1126,7 @@ func updateStoresSkusWithoutSync(ctx *jxcontext.Context, db *dao.DaoDB, storeIDs
|
||||
skuBind.Status = tmpStatus
|
||||
}
|
||||
if globals.IsAddEvent {
|
||||
err = AddEventDetail(db, ctx, model.OperateAdd, v.RealSkuID, model.ThingTypeSku, storeID, "", "")
|
||||
err = AddEventDetail(db, ctx, model.OperateAdd, v.RealSkuID, model.ThingTypeSku, storeID, "", utils.Int2Str(skuBind.UnitPrice))
|
||||
}
|
||||
setStoreSkuBindStatus(skuBind, model.SyncFlagNewMask)
|
||||
dao.WrapAddIDCULDEntity(skuBind, userName)
|
||||
@@ -2351,7 +2370,7 @@ func ReCalculateJxPrice(db *dao.DaoDB, ctx *jxcontext.Context, storeIDs []int) (
|
||||
if storeSkuList, err := dao.GetStoresSkusInfo(db, []int{storeID}, nil); err == nil {
|
||||
for _, skuBind := range storeSkuList {
|
||||
skuBind.JxPrice = jxutils.CaculatePriceByPricePack(storeDetail.PricePercentagePackObj, int(storeDetail.PricePercentage), skuBind.Price)
|
||||
dao.UpdateEntity(db, skuBind)
|
||||
dao.UpdateEntity(db, skuBind, "JxPrice")
|
||||
}
|
||||
} else {
|
||||
return nil, err
|
||||
@@ -4504,6 +4523,14 @@ func doStoreSkuAudit(ctx *jxcontext.Context, storeIDs []int, skuBindInfos []*Sto
|
||||
time.Sleep(time.Second / 5)
|
||||
db := dao.GetDB()
|
||||
for _, storeID := range storeIDs {
|
||||
stores, _ := dao.GetStoreList(db, []int{storeID}, nil, nil, nil, "")
|
||||
//扣点的门店改价不进审核
|
||||
if len(stores) > 0 {
|
||||
if stores[0].PayPercentage <= 50 || stores[0].StoreLevel == "E" {
|
||||
globals.SugarLogger.Debugf("doStoreSkuAudit return0 storeID : %v", storeID)
|
||||
return false, err
|
||||
}
|
||||
}
|
||||
for _, skuBindInfo := range skuBindInfos {
|
||||
globals.SugarLogger.Debugf("doStoreSkuAudit storeID: %v , nameID: %v", storeID, skuBindInfo.NameID)
|
||||
storeAudits, err := dao.GetStoreSkuAuditLight(db, []int{storeID}, []int{skuBindInfo.NameID}, model.StoreAuditStatusOnline)
|
||||
@@ -4584,7 +4611,7 @@ func StoreSkuPriceAudit(ctx *jxcontext.Context, storeSkuAudits []*model.StoreSku
|
||||
if status == model.StoreAuditStatusOnline {
|
||||
return "", fmt.Errorf("审核标志不正确!")
|
||||
}
|
||||
task := tasksch.NewParallelTask("StoreSkuPriceAudit", tasksch.NewParallelConfig().SetParallelCount(1).SetIsContinueWhenError(isContinueWhenError), ctx,
|
||||
task := tasksch.NewParallelTask("StoreSkuPriceAudit", tasksch.NewParallelConfig().SetParallelCount(5).SetIsContinueWhenError(isContinueWhenError), ctx,
|
||||
func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
|
||||
storeAudit := batchItemList[0].(*model.StoreSkuAudit)
|
||||
storeAudits, err := dao.GetStoreSkuAuditLight(db, []int{storeAudit.StoreID}, []int{storeAudit.NameID}, model.StoreAuditStatusOnline)
|
||||
@@ -4594,10 +4621,10 @@ func StoreSkuPriceAudit(ctx *jxcontext.Context, storeSkuAudits []*model.StoreSku
|
||||
if len(storeAudits) > 1 {
|
||||
return retVal, fmt.Errorf("查询到该门店该商品的待审核信息大于1条!storeID: %v, nameID: %v", storeAudit.StoreID, storeAudit.NameID)
|
||||
}
|
||||
flag := false
|
||||
// flag := false
|
||||
//审核通过
|
||||
if status == model.StoreAuditStatusCreated {
|
||||
flag = true
|
||||
// flag = true
|
||||
storeAudits[0].UserID = ctx.GetUserID()
|
||||
storeAudits[0].Status = model.StoreAuditStatusCreated
|
||||
storeAudits[0].Remark = storeAudit.Remark
|
||||
@@ -4640,19 +4667,20 @@ func StoreSkuPriceAudit(ctx *jxcontext.Context, storeSkuAudits []*model.StoreSku
|
||||
} else {
|
||||
return retVal, fmt.Errorf("审核标志不正确!")
|
||||
}
|
||||
//TODO 暂时先不推消息了
|
||||
if err == nil {
|
||||
if globals.IsProductEnv() {
|
||||
skuAndNames, err := dao.GetSkus(db, nil, []int{storeAudit.NameID}, nil, nil, nil)
|
||||
if len(skuAndNames) > 0 && err == nil {
|
||||
price := 0
|
||||
if storeAudit.AuditPrice != 0 {
|
||||
price = storeAudit.AuditPrice
|
||||
} else {
|
||||
price = storeAudits[0].UnitPrice
|
||||
}
|
||||
weixinmsg.NotifyStoreOpRequestStatus(flag, storeAudit.StoreID, storeAudit.NameID, jxutils.ComposeSpuName(skuAndNames[0].Prefix, skuAndNames[0].Name, 0), storeAudits[0].OriginUnitPrice, price, storeAudit.Remark)
|
||||
}
|
||||
}
|
||||
// if globals.IsProductEnv() {
|
||||
// skuAndNames, err := dao.GetSkus(db, nil, []int{storeAudit.NameID}, nil, nil, nil)
|
||||
// if len(skuAndNames) > 0 && err == nil {
|
||||
// price := 0
|
||||
// if storeAudit.AuditPrice != 0 {
|
||||
// price = storeAudit.AuditPrice
|
||||
// } else {
|
||||
// price = storeAudits[0].UnitPrice
|
||||
// }
|
||||
// weixinmsg.NotifyStoreOpRequestStatus(flag, storeAudit.StoreID, storeAudit.NameID, jxutils.ComposeSpuName(skuAndNames[0].Prefix, skuAndNames[0].Name, 0), storeAudits[0].OriginUnitPrice, price, storeAudit.Remark)
|
||||
// }
|
||||
// }
|
||||
}
|
||||
return retVal, err
|
||||
}, storeSkuAudits)
|
||||
|
||||
@@ -7,6 +7,7 @@ import (
|
||||
"time"
|
||||
|
||||
"git.rosy.net.cn/jx-callback/business/partner/putils"
|
||||
"git.rosy.net.cn/jx-callback/globals/api"
|
||||
|
||||
"git.rosy.net.cn/baseapi"
|
||||
"git.rosy.net.cn/baseapi/platformapi/dingdingapi"
|
||||
@@ -677,6 +678,7 @@ func (v *VendorSync) LoopStoresMap2(ctx *jxcontext.Context, parentTask tasksch.I
|
||||
resultList, err2 := task.GetResult(0)
|
||||
if len(task.GetFailedList()) > 0 {
|
||||
err2 = buildErrMsg(task)
|
||||
err = err2
|
||||
}
|
||||
if err = err2; err == nil {
|
||||
if len(resultList) == 0 {
|
||||
@@ -1088,58 +1090,96 @@ func (v *VendorSync) SyncJdsStoresSkus(ctx *jxcontext.Context, storeIDs []int, i
|
||||
var (
|
||||
db = dao.GetDB()
|
||||
)
|
||||
storeSkus, _ := dao.GetStoresSkusInfo(db, []int{model.JdShopMainStoreID}, nil)
|
||||
_, hint, err = v.LoopStoresMap2(ctx, nil, db, fmt.Sprintf("同步京东商城库存商品信息:%v", storeIDs), isAsync, true, []int{model.VendorIDJDShop}, storeIDs, false,
|
||||
func(t *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (interface{}, error) {
|
||||
loopMapInfo := batchItemList[0].(*LoopStoreMapInfo)
|
||||
if handler := v.GetStoreHandler(loopMapInfo.VendorID); handler != nil {
|
||||
parallelCount := 5
|
||||
if model.MultiStoresVendorMap[loopMapInfo.VendorID] == 1 {
|
||||
parallelCount = 2
|
||||
for _, storeMap := range loopMapInfo.StoreMapList {
|
||||
if storeMap.Status > model.StoreStatusDisabled && storeMap.StoreID != model.JdShopMainStoreID && storeMap.SyncRule != 0 {
|
||||
err = syncJdsStoresSkus(ctx, db, nil, storeMap, isAsync, isContinueWhenError)
|
||||
}
|
||||
err = syncJdsStoreStock(ctx, db, storeSkus, storeMap)
|
||||
}
|
||||
loopStoreTask := tasksch.NewParallelTask(fmt.Sprintf("处理平台%s", model.VendorChineseNames[loopMapInfo.VendorID]),
|
||||
tasksch.NewParallelConfig().SetParallelCount(parallelCount).SetIsContinueWhenError(isContinueWhenError), ctx,
|
||||
func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
|
||||
storeMap := batchItemList[0].(*model.StoreMap)
|
||||
if storeMap.Status > model.StoreStatusDisabled && storeMap.StoreID != model.JdShopMainStoreID && storeMap.SyncRule != 0 {
|
||||
err = syncJdsStoresSkus(ctx, db, task, storeMap, isAsync, isContinueWhenError)
|
||||
}
|
||||
return nil, err
|
||||
}, loopMapInfo.StoreMapList)
|
||||
t.AddChild(loopStoreTask).Run()
|
||||
_, err = loopStoreTask.GetResult(0)
|
||||
}
|
||||
return nil, partner.AddVendorInfo2Err(err, loopMapInfo.VendorID)
|
||||
}, isContinueWhenError)
|
||||
return hint, err
|
||||
}
|
||||
|
||||
func syncJdsStoreStock(ctx *jxcontext.Context, db *dao.DaoDB, storeSkus []*model.StoreSkuBind, storeMap *model.StoreMap) (err error) {
|
||||
for _, storeSku := range storeSkus {
|
||||
stock := 0
|
||||
if storeSku.Status == model.StoreSkuBindStatusNormal {
|
||||
stock = 9999
|
||||
}
|
||||
storeSku2, _ := dao.GetStoresSkusInfo(db, []int{storeMap.StoreID}, []int{storeSku.SkuID})
|
||||
if storeSku.JdsID != 0 && len(storeSku2) > 0 {
|
||||
if storeSku.Status != storeSku2[0].Status {
|
||||
err = api.JdShopAPI.UpdateSkuSiteStock(storeSku.JdsID, stock, utils.Str2Int(storeMap.VendorStoreID))
|
||||
}
|
||||
}
|
||||
}
|
||||
// task := tasksch.NewParallelTask("syncJdsStoreStock", tasksch.NewParallelConfig().SetIsContinueWhenError(true), ctx,
|
||||
// func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
|
||||
// storeSku := batchItemList[0].(*model.StoreSkuBind)
|
||||
|
||||
// return retVal, err
|
||||
// }, storeSkus)
|
||||
// tasksch.HandleTask(task, nil, true).Run()
|
||||
// _, err = task.GetResult(0)
|
||||
return err
|
||||
}
|
||||
|
||||
func syncJdsStoresSkus(ctx *jxcontext.Context, db *dao.DaoDB, parentTask tasksch.ITask, storeMap *model.StoreMap, isAsync, isContinueWhenError bool) (err error) {
|
||||
var (
|
||||
mainSkusMap = make(map[int]*model.StoreSkuBind)
|
||||
skusMap = make(map[int]*model.StoreSkuBind)
|
||||
updateList []*model.StoreSkuBind
|
||||
addList []*model.StoreSkuBind
|
||||
mainSkusMap = make(map[int][]*dao.StoreSkuSyncInfo)
|
||||
skusMap = make(map[int][]*dao.StoreSkuSyncInfo)
|
||||
updateList []*dao.StoreSkuSyncInfo
|
||||
addList []*dao.StoreSkuSyncInfo
|
||||
skuBindInfos1 []*StoreSkuBindInfo
|
||||
skuBindInfos2 []*StoreSkuBindInfo
|
||||
)
|
||||
storeSkusMain, err := dao.GetStoresSkusInfo(db, []int{model.JdShopMainStoreID}, nil)
|
||||
storeSkusMain, err := dao.GetStoreSkusByNameIDs(db, []int{model.JdShopMainStoreID}, 0)
|
||||
for _, v := range storeSkusMain {
|
||||
mainSkusMap[v.SkuID] = v
|
||||
mainSkusMap[v.NameID] = append(mainSkusMap[v.NameID], v)
|
||||
}
|
||||
storeSkus, err := dao.GetStoresSkusInfo(db, []int{storeMap.StoreID}, nil)
|
||||
storeSkus, err := dao.GetStoreSkusByNameIDs(db, []int{storeMap.StoreID}, 0)
|
||||
for _, v := range storeSkus {
|
||||
skusMap[v.SkuID] = v
|
||||
if mainSkusMap[v.SkuID] != nil && mainSkusMap[v.SkuID].Status != v.Status {
|
||||
updateList = append(updateList, mainSkusMap[v.SkuID])
|
||||
skusMap[v.NameID] = append(skusMap[v.NameID], v)
|
||||
}
|
||||
for k, v := range skusMap {
|
||||
if mainSkusMap[k] != nil {
|
||||
flag := false
|
||||
for _, storeSku := range v {
|
||||
if storeSku.StoreSkuStatus == model.StoreSkuBindStatusNormal {
|
||||
flag = true
|
||||
}
|
||||
}
|
||||
if !flag {
|
||||
continue
|
||||
}
|
||||
for _, storeSku := range v {
|
||||
for _, storeSkuMain := range mainSkusMap[k] {
|
||||
if storeSkuMain.StoreSkuStatus == model.StoreSkuBindStatusNormal && storeSku.StoreSkuStatus == model.StoreSkuBindStatusDontSale &&
|
||||
storeSkuMain.SkuID == storeSku.SkuID {
|
||||
updateList = append(updateList, storeSkuMain)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
for k, v := range mainSkusMap {
|
||||
if skusMap[k] == nil {
|
||||
if storeMap.SyncRule == 2 {
|
||||
addList = append(addList, v)
|
||||
for _, storeSkuMain := range v {
|
||||
addList = append(addList, storeSkuMain)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// fmt.Println("updateList", utils.Format4Output(updateList, false))
|
||||
// fmt.Println("addList", utils.Format4Output(addList, false))
|
||||
if len(updateList) > 0 {
|
||||
for _, v := range updateList {
|
||||
skuBindInfos1 = append(skuBindInfos1, buildStoreSkuBindInfo(db, storeMap.StoreID, v, false))
|
||||
@@ -1149,18 +1189,14 @@ func syncJdsStoresSkus(ctx *jxcontext.Context, db *dao.DaoDB, parentTask tasksch
|
||||
|
||||
if len(addList) > 0 {
|
||||
for _, v := range addList {
|
||||
skuBindInfos2 = append(skuBindInfos2, buildStoreSkuBindInfo(db, storeMap.StoreID, v, false))
|
||||
skuBindInfos2 = append(skuBindInfos2, buildStoreSkuBindInfo(db, storeMap.StoreID, v, true))
|
||||
}
|
||||
_, err = UpdateStoresSkusByBind(ctx, parentTask, skuBindInfos2, isAsync, isContinueWhenError, false)
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
func buildStoreSkuBindInfo(db *dao.DaoDB, storeID int, storeBind *model.StoreSkuBind, isFocus bool) (skuBindInfo *StoreSkuBindInfo) {
|
||||
result, err := dao.GetSkus(db, []int{storeBind.SkuID}, nil, nil, nil, nil)
|
||||
if err != nil || len(result) == 0 {
|
||||
return nil
|
||||
}
|
||||
func buildStoreSkuBindInfo(db *dao.DaoDB, storeID int, storeBind *dao.StoreSkuSyncInfo, isFocus bool) (skuBindInfo *StoreSkuBindInfo) {
|
||||
skus := []*StoreSkuBindSkuInfo{
|
||||
&StoreSkuBindSkuInfo{
|
||||
SkuID: storeBind.SkuID,
|
||||
@@ -1168,12 +1204,12 @@ func buildStoreSkuBindInfo(db *dao.DaoDB, storeID int, storeBind *model.StoreSku
|
||||
}
|
||||
skuBindInfo = &StoreSkuBindInfo{
|
||||
StoreID: storeID,
|
||||
NameID: result[0].NameID,
|
||||
NameID: storeBind.NameID,
|
||||
}
|
||||
if isFocus {
|
||||
skuBindInfo.IsFocus = 1
|
||||
}
|
||||
if storeBind.Status == model.SkuStatusNormal {
|
||||
if storeBind.StoreSkuStatus == model.SkuStatusNormal {
|
||||
skus[0].IsSale = 1
|
||||
} else {
|
||||
skus[0].IsSale = -1
|
||||
@@ -1181,3 +1217,31 @@ func buildStoreSkuBindInfo(db *dao.DaoDB, storeID int, storeBind *model.StoreSku
|
||||
skuBindInfo.Skus = skus
|
||||
return skuBindInfo
|
||||
}
|
||||
|
||||
func SyncSkuExperfixAndWatermark(ctx *jxcontext.Context) (err error) {
|
||||
var (
|
||||
db = dao.GetDB()
|
||||
)
|
||||
skuExinfos, err := dao.GetSkuExinfos(db, nil, []int{model.VendorIDMTWM, model.VendorIDEBAI, model.VendorIDJD}, "", utils.ZeroTimeValue, utils.ZeroTimeValue)
|
||||
task := tasksch.NewParallelTask("SyncSkuExperfixAndWatermark", tasksch.NewParallelConfig().SetIsContinueWhenError(true), ctx,
|
||||
func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
|
||||
skuExinfo := batchItemList[0].(*model.SkuExinfoMap)
|
||||
skus, err := dao.GetSkus(db, nil, []int{skuExinfo.NameID}, nil, nil, nil)
|
||||
var skuIDs []int
|
||||
for _, v := range skus {
|
||||
skuIDs = append(skuIDs, v.ID)
|
||||
}
|
||||
if partner.IsMultiStore(skuExinfo.VendorID) {
|
||||
for _, v := range skuIDs {
|
||||
OnUpdateThing(ctx, db, nil, int64(v), model.ThingTypeSku)
|
||||
}
|
||||
CurVendorSync.SyncSkus(ctx, db, nil, skuIDs, true, true, ctx.GetUserName())
|
||||
} else {
|
||||
CurVendorSync.SyncStoresSkus2(ctx, nil, 0, db, []int{skuExinfo.VendorID}, nil, false, skuIDs, nil, model.SyncFlagModifiedMask, true, true)
|
||||
}
|
||||
return retVal, err
|
||||
}, skuExinfos)
|
||||
tasksch.HandleTask(task, nil, true).Run()
|
||||
_, err = task.GetResult(0)
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -147,7 +147,12 @@ func SyncSkus(ctx *jxcontext.Context, parentTask tasksch.ITask, vendorIDs []int,
|
||||
if skuVendorInfo.ExdSkuID != "" {
|
||||
return nil, err
|
||||
}
|
||||
skuVendorInfo.SkuName = jxutils.ComposeSkuName(skuVendorInfo.Prefix, skuVendorInfo.Name, skuVendorInfo.Comment, skuVendorInfo.Unit, skuVendorInfo.SpecQuality, skuVendorInfo.SpecUnit, 0, skuVendorInfo.ExPrefix, skuVendorInfo.ExPrefixBegin, skuVendorInfo.ExPrefixEnd)
|
||||
skuVendorInfo.SkuName = jxutils.ComposeSkuNameSync(skuVendorInfo.Prefix, skuVendorInfo.Name, skuVendorInfo.Comment, skuVendorInfo.Unit, skuVendorInfo.SpecQuality, skuVendorInfo.SpecUnit, 0, skuVendorInfo.ExPrefix, skuVendorInfo.ExPrefixBegin, skuVendorInfo.ExPrefixEnd)
|
||||
skuVendorInfo.SkuNameOrigin = jxutils.ComposeSkuNameOriginal(skuVendorInfo.Prefix, skuVendorInfo.Name, skuVendorInfo.Comment, skuVendorInfo.Unit, skuVendorInfo.SpecQuality, skuVendorInfo.SpecUnit, 0)
|
||||
if skuVendorInfo.ImgWatermark != "" {
|
||||
downLoad, _ := uploadImgStandard(skuVendorInfo.ImgWatermark)
|
||||
skuVendorInfo.ImgMix = jxutils.MixWatermarkImg(downLoad, skuVendorInfo.Img, skuVendorInfo.ExPrefixBegin, skuVendorInfo.ExPrefixEnd)
|
||||
}
|
||||
skuVendorInfo.MergedStatus = jxutils.MergeSkuStatus(skuVendorInfo.Status, skuVendorInfo.NameStatus)
|
||||
if multiStoresHandler, ok := partner.GetPurchasePlatformFromVendorID(skuVendorInfo.VendorID).(partner.IMultipleStoresHandler); ok {
|
||||
if model.IsSyncStatusDelete(skuVendorInfo.SkuSyncStatus) { //删除
|
||||
|
||||
@@ -280,6 +280,12 @@ func formalizeStoreSkuList(inSkuList []*dao.StoreSkuSyncInfo) []*dao.StoreSkuSyn
|
||||
}
|
||||
skuItem.MergedStatus = jxutils.MergeSkuStatus(jxutils.MergeSkuStatus(skuItem.NameStatus, skuItem.Status), skuItem.StoreSkuStatus)
|
||||
skuItem.SkuName = jxutils.ComposeSkuNameSync(skuItem.Prefix, skuItem.Name, skuItem.Comment, skuItem.Unit, skuItem.SpecQuality, skuItem.SpecUnit, 0, skuItem.ExPrefix, skuItem.ExPrefixBegin, skuItem.ExPrefixEnd)
|
||||
skuItem.SkuNameOrigin = jxutils.ComposeSkuNameOriginal(skuItem.Prefix, skuItem.Name, skuItem.Comment, skuItem.Unit, skuItem.SpecQuality, skuItem.SpecUnit, 0)
|
||||
if skuItem.ImgWatermark != "" {
|
||||
downLoad, _ := uploadImgStandard(skuItem.ImgWatermark)
|
||||
fmt.Println("testdo", downLoad)
|
||||
skuItem.ImgMix = jxutils.MixWatermarkImg(downLoad, skuItem.ImgOrigin, skuItem.ExPrefixBegin, skuItem.ExPrefixEnd)
|
||||
}
|
||||
}
|
||||
}
|
||||
return inSkuList
|
||||
|
||||
@@ -11,10 +11,8 @@ import (
|
||||
"git.rosy.net.cn/jx-callback/business/jxutils/jxcontext"
|
||||
"git.rosy.net.cn/jx-callback/business/model"
|
||||
"git.rosy.net.cn/jx-callback/business/model/dao"
|
||||
"git.rosy.net.cn/jx-callback/business/partner/purchase/jd"
|
||||
"git.rosy.net.cn/jx-callback/globals"
|
||||
"git.rosy.net.cn/jx-callback/globals/api"
|
||||
"git.rosy.net.cn/jx-callback/globals/api/apimanager"
|
||||
)
|
||||
|
||||
var (
|
||||
@@ -149,78 +147,52 @@ func GetCheckVendorCookie(ctx *jxcontext.Context, vendorIDs []int, isAuto bool)
|
||||
errMsg = ""
|
||||
)
|
||||
for _, v := range vendorIDs {
|
||||
appOrgCodeList := apimanager.CurAPIManager.GetAppOrgCodeList(v)
|
||||
if len(appOrgCodeList) > 0 {
|
||||
for _, vv := range appOrgCodeList {
|
||||
cc := &CheckCookie{}
|
||||
var flag = false
|
||||
switch v {
|
||||
case model.VendorIDEBAI:
|
||||
resultMap, err := api.EbaiAPI.GetStoreOrderInfo(ebaiOrderID)
|
||||
if len(resultMap) < 1 && err != nil {
|
||||
if strings.Contains(err.Error(), ebaiErr) || strings.Contains(err.Error(), ebaiErr2) {
|
||||
errMsg += fmt.Sprintf(" 饿百账号:[%v]的Cookie无效了!", vv)
|
||||
flag = true
|
||||
}
|
||||
}
|
||||
// result, err := api.Ebai2API.GetEbaiDepotSku(ebaiapi.EbaiWholeCountryStore, "190700570")
|
||||
// if err != nil || len(result) < 1 {
|
||||
// cc := &CheckCookie{}
|
||||
// cc.VendorID = v
|
||||
// cc.VendorOrgCode = "饿百后台饿鲜达全国账号"
|
||||
// cc.Status = "无效"
|
||||
// ccList = append(ccList, cc)
|
||||
// errMsg += fmt.Sprintf(" 饿百账号:[饿百后台饿鲜达全国账号]的Cookie无效了!", vv)
|
||||
// flag = true
|
||||
// }
|
||||
// result2, err2 := api.EbaiAPI.GetExianDaSkuDepot("190600741")
|
||||
// if err2 != nil || result2 == nil {
|
||||
// cc := &CheckCookie{}
|
||||
// cc.VendorID = v
|
||||
// cc.VendorOrgCode = "饿鲜达供应链系统"
|
||||
// cc.Status = "无效"
|
||||
// ccList = append(ccList, cc)
|
||||
// errMsg += fmt.Sprintf(" 饿百账号:[饿鲜达供应链系统]的Cookie无效了!", vv)
|
||||
// flag = true
|
||||
// }
|
||||
case model.VendorIDMTWM:
|
||||
_, err := api.MtwmAPI.PackagePriceGet(mtStoreID)
|
||||
if err != nil {
|
||||
if strings.Contains(err.Error(), mtErr) {
|
||||
errMsg += fmt.Sprintf(" 美团账号:[%v]的Cookie无效了!", vv)
|
||||
flag = true
|
||||
}
|
||||
globals.SugarLogger.Debugf("cookieCheck", err)
|
||||
}
|
||||
case model.VendorIDJD:
|
||||
result, err := jd.GetAPI(vv).GetJdUpcCodeByName("", jdUpcCode, 1, 5)
|
||||
if len(result) < 1 && err != nil {
|
||||
if strings.Contains(err.Error(), jdErr) {
|
||||
errMsg += fmt.Sprintf(" 京东账号:[%v]的Cookie无效了!", vv)
|
||||
flag = true
|
||||
}
|
||||
}
|
||||
result2, err2 := api.JdPageAPI.GetCorporationInfo("11926674", "92510108MA68KK3M8P")
|
||||
if err2 != nil || result2 == nil {
|
||||
cc := &CheckCookie{}
|
||||
cc.VendorID = v
|
||||
cc.VendorOrgCode = "京东page账号"
|
||||
cc.Status = "无效"
|
||||
ccList = append(ccList, cc)
|
||||
errMsg += fmt.Sprintf(" 京东page账号:的Cookie无效了!", vv)
|
||||
flag = true
|
||||
}
|
||||
cc := &CheckCookie{}
|
||||
var flag = false
|
||||
switch v {
|
||||
case model.VendorIDEBAI:
|
||||
resultMap, err := api.EbaiAPI.GetStoreOrderInfo(ebaiOrderID)
|
||||
if len(resultMap) < 1 && err != nil {
|
||||
if strings.Contains(err.Error(), ebaiErr) || strings.Contains(err.Error(), ebaiErr2) {
|
||||
errMsg += fmt.Sprintf(" 饿百账号:[%v]的Cookie无效了!")
|
||||
flag = true
|
||||
}
|
||||
cc.VendorID = v
|
||||
cc.VendorOrgCode = vv
|
||||
if flag {
|
||||
cc.Status = "无效"
|
||||
} else {
|
||||
cc.Status = "有效"
|
||||
}
|
||||
case model.VendorIDMTWM:
|
||||
_, err := api.MtwmAPI.PackagePriceGet(mtStoreID)
|
||||
if err != nil {
|
||||
if strings.Contains(err.Error(), mtErr) {
|
||||
errMsg += fmt.Sprintf(" 美团账号:[%v]的Cookie无效了!")
|
||||
flag = true
|
||||
}
|
||||
ccList = append(ccList, cc)
|
||||
globals.SugarLogger.Debugf("cookieCheck", err)
|
||||
}
|
||||
case model.VendorIDJD:
|
||||
result, err := api.JdAPI.GetJdUpcCodeByName("", jdUpcCode, 1, 5)
|
||||
if len(result) < 1 && err != nil {
|
||||
if strings.Contains(err.Error(), jdErr) {
|
||||
errMsg += fmt.Sprintf(" 京东账号:[%v]的Cookie无效了!")
|
||||
flag = true
|
||||
}
|
||||
}
|
||||
case model.VendorIDJDShop:
|
||||
_, err := api.JdShopAPI.OrderDetail("124350112427")
|
||||
if err != nil {
|
||||
if strings.Contains(err.Error(), "登录") {
|
||||
errMsg += fmt.Sprintf("京东商城:[%v]的Cookie无效了!")
|
||||
flag = true
|
||||
}
|
||||
globals.SugarLogger.Debugf("cookieCheck", err)
|
||||
}
|
||||
}
|
||||
cc.VendorID = v
|
||||
cc.VendorOrgCode = ""
|
||||
if flag {
|
||||
cc.Status = "无效"
|
||||
} else {
|
||||
cc.Status = "有效"
|
||||
}
|
||||
ccList = append(ccList, cc)
|
||||
}
|
||||
if isAuto && errMsg != "" {
|
||||
globals.SugarLogger.Warnf("GetCheckVendorCookie:[%v]", errMsg)
|
||||
|
||||
@@ -164,7 +164,7 @@ func Init() {
|
||||
ScheduleTimerFunc("doDailyWork2", doDailyWork2, dailyWorkTimeList2)
|
||||
|
||||
ScheduleTimerFuncByInterval(func() {
|
||||
orderman.SaveJdsOrders(jxcontext.AdminCtx, time.Now().Add(-15*time.Minute), time.Now())
|
||||
orderman.SaveJdsOrders(jxcontext.AdminCtx, time.Now().Add(-20*time.Minute), time.Now())
|
||||
}, 10*time.Second, 10*time.Minute)
|
||||
|
||||
ScheduleTimerFuncByInterval(func() {
|
||||
@@ -205,7 +205,7 @@ func Init() {
|
||||
cms.AutoFocusStoreSkusForTopSkus(jxcontext.AdminCtx, true, true)
|
||||
}, createStorePriceTimeList)
|
||||
ScheduleTimerFunc("GetCheckVendorCookie", func() {
|
||||
event.GetCheckVendorCookie(jxcontext.AdminCtx, []int{model.VendorIDEBAI, model.VendorIDJD, model.VendorIDMTWM, model.VendorIDMTPS}, true)
|
||||
event.GetCheckVendorCookie(jxcontext.AdminCtx, []int{model.VendorIDEBAI, model.VendorIDJD, model.VendorIDMTWM, model.VendorIDMTPS, model.VendorIDJDShop}, true)
|
||||
}, checkCookieList)
|
||||
ScheduleTimerFunc("SendSeckillSkusCountMsg", func() {
|
||||
cms.SendSeckillSkusCountMsg(jxcontext.AdminCtx, []int{model.VendorIDEBAI, model.VendorIDJD, model.VendorIDMTWM}, false, true)
|
||||
@@ -419,6 +419,8 @@ func doDailyWork() {
|
||||
orderman.RefreshJdShopOrdersEarningPrice(jxcontext.AdminCtx, time.Now().AddDate(0, 0, -3).Format("20060102"), time.Now().Format("20060102"))
|
||||
//同步上架京东商城待售商品
|
||||
cms.RefreshJdsSkusStatus(jxcontext.AdminCtx)
|
||||
//同步商品额外前缀和水印图
|
||||
cms.SyncSkuExperfixAndWatermark(jxcontext.AdminCtx)
|
||||
}
|
||||
|
||||
func RefreshRealMobile(ctx *jxcontext.Context, vendorID int, fromTime, toTime time.Time, isAsync, isContinueWhenError bool) (hint string, err error) {
|
||||
|
||||
@@ -1611,10 +1611,295 @@ func UploadJdsImage(ctx *jxcontext.Context) (err error) {
|
||||
// continue
|
||||
// }
|
||||
// }
|
||||
_, err = api.JdShopAPI.AllOrders(&jdshopapi.AllOrdersParam{
|
||||
Current: 1,
|
||||
PageSize: 10,
|
||||
})
|
||||
var jdsIds = []int64{69355523686,
|
||||
69353698875,
|
||||
69353633443,
|
||||
69353579080,
|
||||
69353592976,
|
||||
69353575450,
|
||||
69353669915,
|
||||
69353617240,
|
||||
69353711276,
|
||||
69355552630,
|
||||
69353579078,
|
||||
69633169613,
|
||||
69353608855,
|
||||
69634881612,
|
||||
69353634806,
|
||||
69353675911,
|
||||
69353698186,
|
||||
69353698877,
|
||||
69607962771,
|
||||
69608002604,
|
||||
69666543870,
|
||||
69353541693,
|
||||
69411607058,
|
||||
69353594629,
|
||||
69353602818,
|
||||
69353698187,
|
||||
69355538267,
|
||||
69353633269,
|
||||
69355549016,
|
||||
69411607059,
|
||||
69593365617,
|
||||
69353589341,
|
||||
69353618034,
|
||||
69353633445,
|
||||
69353644658,
|
||||
69353644659,
|
||||
69353664332,
|
||||
69355505481,
|
||||
69355531215,
|
||||
69355552632,
|
||||
69353618035,
|
||||
69353619589,
|
||||
69353684423,
|
||||
69353687174,
|
||||
69353722053,
|
||||
69355493882,
|
||||
69627859883,
|
||||
69680935348,
|
||||
69353555847,
|
||||
69353570677,
|
||||
69353589397,
|
||||
69353592975,
|
||||
69353594611,
|
||||
69353602819,
|
||||
69353616402,
|
||||
69353624528,
|
||||
69353654004,
|
||||
69353668114,
|
||||
69353687173,
|
||||
69353701089,
|
||||
69353722052,
|
||||
69353723922,
|
||||
69355527850,
|
||||
69355552631,
|
||||
69628257042,
|
||||
69636525703,
|
||||
69680935349,
|
||||
69353579081,
|
||||
69353589342,
|
||||
69353632136,
|
||||
69353654006,
|
||||
69353726354,
|
||||
69355496067,
|
||||
69355515747,
|
||||
69355516049,
|
||||
69355527036,
|
||||
69355532703,
|
||||
69355558164,
|
||||
69355560640,
|
||||
69608002434,
|
||||
69608089252,
|
||||
69626869676,
|
||||
69628142211,
|
||||
69651275202,
|
||||
69665458721,
|
||||
69980157422,
|
||||
69353511255,
|
||||
69353550931,
|
||||
69353555846,
|
||||
69353579079,
|
||||
69353593375,
|
||||
69353595563,
|
||||
69353603501,
|
||||
69353608856,
|
||||
69353618036,
|
||||
69353628469,
|
||||
69353628470,
|
||||
69353632137,
|
||||
69353633267,
|
||||
69353633444,
|
||||
69353651935,
|
||||
69353668115,
|
||||
69353683331,
|
||||
69353684157,
|
||||
69353701088,
|
||||
69353723844,
|
||||
69353723845,
|
||||
69353726353,
|
||||
69355490631,
|
||||
69355493881,
|
||||
69355493884,
|
||||
69355520278,
|
||||
69355523687,
|
||||
69355532705,
|
||||
69355533814,
|
||||
69355536851,
|
||||
69355538268,
|
||||
69355538269,
|
||||
69593321185,
|
||||
69593321186,
|
||||
69607997022,
|
||||
69626638026,
|
||||
69626638027,
|
||||
69626872037,
|
||||
69627693305,
|
||||
69627954144,
|
||||
69628180933,
|
||||
69633580083,
|
||||
69633580085,
|
||||
69634881613,
|
||||
69635037810,
|
||||
69635204944,
|
||||
69636212985,
|
||||
69636446354,
|
||||
69659137913,
|
||||
69659219611,
|
||||
69665406179,
|
||||
69666460731,
|
||||
69673523007,
|
||||
69680905913,
|
||||
69681869918,
|
||||
69821176674,
|
||||
69913341309,
|
||||
69916445013,
|
||||
69353511254,
|
||||
69353570678,
|
||||
69353581400,
|
||||
69353589343,
|
||||
69353589398,
|
||||
69353593376,
|
||||
69353594630,
|
||||
69353609816,
|
||||
69353616406,
|
||||
69353617241,
|
||||
69353619591,
|
||||
69353633268,
|
||||
69353634833,
|
||||
69353642793,
|
||||
69353647695,
|
||||
69353651934,
|
||||
69353654005,
|
||||
69353664333,
|
||||
69353669914,
|
||||
69353673334,
|
||||
69353684159,
|
||||
69353684603,
|
||||
69353684604,
|
||||
69353684605,
|
||||
69353684607,
|
||||
69353698876,
|
||||
69353701090,
|
||||
69353711277,
|
||||
69353711278,
|
||||
69353726357,
|
||||
69355496066,
|
||||
69355520277,
|
||||
69355523688,
|
||||
69355527851,
|
||||
69355533813,
|
||||
69355533815,
|
||||
69355538270,
|
||||
69355559874,
|
||||
69355559875,
|
||||
69355559876,
|
||||
69355560641,
|
||||
69607988687,
|
||||
69608089253,
|
||||
69625036409,
|
||||
69625436705,
|
||||
69626674146,
|
||||
69626756838,
|
||||
69626849783,
|
||||
69626872040,
|
||||
69627211928,
|
||||
69627823696,
|
||||
69627823697,
|
||||
69627824429,
|
||||
69627859882,
|
||||
69627954146,
|
||||
69628055157,
|
||||
69628209840,
|
||||
69628220046,
|
||||
69628244518,
|
||||
69628620179,
|
||||
69628645373,
|
||||
69633038980,
|
||||
69633169614,
|
||||
69633311068,
|
||||
69633433209,
|
||||
69634285577,
|
||||
69634285578,
|
||||
69634566319,
|
||||
69634566320,
|
||||
69634620948,
|
||||
69635037811,
|
||||
69635075404,
|
||||
69635108188,
|
||||
69636525704,
|
||||
69636563250,
|
||||
69636658901,
|
||||
69636658902,
|
||||
69651265114,
|
||||
69659219612,
|
||||
69659883978,
|
||||
69662122661,
|
||||
69666543871,
|
||||
69666543872,
|
||||
69666660395,
|
||||
69666907986,
|
||||
69666931214,
|
||||
69673508504,
|
||||
69680887348,
|
||||
69818078270,
|
||||
69881553035,
|
||||
69901783885,
|
||||
69913362221,
|
||||
69916396643,
|
||||
69925717199,
|
||||
69933144351,
|
||||
69933974117,
|
||||
69935756246,
|
||||
69935768981,
|
||||
69935855227,
|
||||
69935915640,
|
||||
69937601360,
|
||||
69937642148,
|
||||
69939562884,
|
||||
69939571687,
|
||||
69948026907,
|
||||
}
|
||||
db := dao.GetDB()
|
||||
for _, v := range jdsIds {
|
||||
vendorSku, _ := api.JdShopAPI.FindSkuById(v)
|
||||
var sku *model.Sku
|
||||
sql := `
|
||||
SELECT b.* FROM store_sku_bind a,sku b WHERE a.sku_id = b.id AND a.store_id = 102919 AND a.jds_id = ?
|
||||
`
|
||||
sqlParams := []interface{}{v}
|
||||
err = dao.GetRow(db, &sku, sql, sqlParams)
|
||||
skus, _ := dao.GetStoreSkus(db, model.VendorIDJDShop, model.JdShopMainStoreID, []int{sku.ID})
|
||||
storeSku := skus[0]
|
||||
if sku.Comment != "" {
|
||||
var specQuality = utils.Float64ToStr(float64(storeSku.SpecQuality)) + storeSku.SpecUnit
|
||||
vendorSkuAttr := vendorSku.SaleAttrs[0].AttrValueAlias[0]
|
||||
if vendorSkuAttr == specQuality {
|
||||
err = api.JdShopAPI.UpdateWareSaleAttrvalueAlias(&jdshopapi.UpdateWareSaleAttrvalueAliasParam{
|
||||
WareID: vendorSku.WareID,
|
||||
Props: []*jdshopapi.CreateSkuParamAttrs2{
|
||||
&jdshopapi.CreateSkuParamAttrs2{
|
||||
AttrID: vendorSku.SaleAttrs[0].AttrID,
|
||||
AttrValues: []string{vendorSku.SaleAttrs[0].AttrValues[0]},
|
||||
AttrValueAlias: []string{sku.Comment},
|
||||
Type: "com.jd.pop.ware.ic.api.domain.prop",
|
||||
Type2: "com.jd.pop.ware.ic.api.domain.Prop",
|
||||
},
|
||||
},
|
||||
})
|
||||
} else {
|
||||
if vendorSkuAttr != sku.Comment {
|
||||
_, maxNo, _ := api.JdShopAPI.FindValuesByAttrId(utils.Str2Int(vendorSku.SaleAttrs[0].AttrID))
|
||||
api.JdShopAPI.SaveVenderAttrValue(sku.Comment, utils.Str2Int(vendorSku.SaleAttrs[0].AttrID), int(storeSku.VendorVendorCatID), maxNo+1)
|
||||
}
|
||||
}
|
||||
}
|
||||
// attrValue := vendorSku.SaleAttrs[0].AttrValueAlias[0]
|
||||
// if storeSkus != nil {
|
||||
// cms.CurVendorSync.SyncStoresSkus(ctx, nil, 0, db, []int{model.VendorIDJDShop}, []int{model.JdShopMainStoreID}, []int{storeSkus.SkuID}, false, true, true)
|
||||
// }
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
|
||||
@@ -161,6 +161,8 @@ func GetPossibleVendorIDFromVendorOrderID(vendorOrderID string) (vendorID int) {
|
||||
vendorID = model.VendorIDWSC
|
||||
} else if orderIDLen == len("1000004390") {
|
||||
vendorID = model.VendorIDJX
|
||||
} else if orderIDLen == len("124557362562002") {
|
||||
vendorID = model.VendorIDJDShop
|
||||
}
|
||||
}
|
||||
return vendorID
|
||||
@@ -916,3 +918,24 @@ func PKCS5UnPadding(origData []byte) []byte {
|
||||
unpadding := int(origData[length-1])
|
||||
return origData[:(length - unpadding)]
|
||||
}
|
||||
|
||||
//合成水印图
|
||||
func MixWatermarkImg(imgWatermark, img string, exPrefixBegin, exPrefixEnd *time.Time) (imgMix string) {
|
||||
if exPrefixBegin != nil && exPrefixEnd != nil {
|
||||
if utils.Time2Date(time.Now().Add(6*time.Hour)).Sub(*exPrefixBegin) >= 0 && utils.Time2Date(time.Now()).Sub(*exPrefixEnd) <= 0 {
|
||||
baseURL := base64.URLEncoding.EncodeToString([]byte(imgWatermark))
|
||||
imgUrl := img + "?imageView2/0/q/75|watermark/1/image/" + baseURL + "/dissolve/100/gravity/Center/dx/0/dy/0"
|
||||
if resBinary, _, err := DownloadFileByURL(imgUrl); err == nil {
|
||||
if downloadURL, err := UploadExportContent(resBinary, utils.Int64ToStr(time.Now().Unix())+img[strings.LastIndex(img, "/")+1:len(img)]); err == nil {
|
||||
if err == nil {
|
||||
return downloadURL
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if utils.Time2Date(time.Now().Add(6*time.Hour)).Sub(*exPrefixEnd) > 0 {
|
||||
return imgMix
|
||||
}
|
||||
}
|
||||
return imgMix
|
||||
}
|
||||
|
||||
@@ -35,9 +35,10 @@ type GoodsOrderExt struct {
|
||||
WaybillCreatedAt time.Time `orm:"type(datetime);index" json:"waybillCreatedAt"`
|
||||
WaybillFinishedAt time.Time `orm:"type(datetime)" json:"waybillFinishedAt"`
|
||||
|
||||
DistrictName string `json:"districtName"`
|
||||
CityName string `json:"cityName"`
|
||||
PayPercentage int `json:"payPercentage"`
|
||||
DistrictName string `json:"districtName"`
|
||||
CityName string `json:"cityName"`
|
||||
PayPercentage int `json:"payPercentage"`
|
||||
OldPayPercentage int `json:"oldPayPercentage"`
|
||||
|
||||
SkuInfo string `json:"skuInfo,omitempty"`
|
||||
SkuInfo2 string `json:"skuInfo2,omitempty"`
|
||||
|
||||
@@ -26,7 +26,8 @@ const (
|
||||
VendorIDDada = 101
|
||||
VendorIDMTPS = 102
|
||||
VendorIDFengNiao = 103
|
||||
VendorIDDeliveryEnd = 200
|
||||
VendorIDJDWL = 401 //京东物流
|
||||
VendorIDDeliveryEnd = 500
|
||||
|
||||
VendorIDPrinterBegin = 201
|
||||
VendorIDFeiE = 201 // 飞鹅打印机
|
||||
@@ -48,7 +49,6 @@ const (
|
||||
VendorIDQiNiuCloud = 323 // 七牛云
|
||||
VendorIDShowAPI = 325 // 万维易源
|
||||
|
||||
VendorIDJDWL = 401 //京东物流
|
||||
)
|
||||
|
||||
type VendorInfo struct {
|
||||
@@ -82,6 +82,7 @@ var (
|
||||
VendorIDZhongWu: "ZhongWu",
|
||||
|
||||
VendorIDQiNiuCloud: "Qiniu",
|
||||
VendorIDJDWL: "Jdwl",
|
||||
}
|
||||
|
||||
VendorTypeName = map[int]string{
|
||||
|
||||
@@ -767,7 +767,7 @@ func GetOrders(db *DaoDB, ids []int64, isIncludeSku, isIncludeFake bool, fromDat
|
||||
CAST(IF(t1.earning_price <> 0, t1.earning_price, IF(t1.shop_price <> 0 && t1.shop_price < t1.sale_price, t1.shop_price, t1.sale_price) * IF(t5.pay_percentage > 0, t5.pay_percentage, %d) / 100) AS SIGNED) earning_price,
|
||||
t2.status waybill_status, t2.courier_name, t2.courier_mobile,
|
||||
t2.actual_fee, t2.desired_fee, t2.waybill_created_at, t2.waybill_finished_at,
|
||||
t5.pay_percentage,
|
||||
t5.pay_percentage, t5.old_pay_percentage,
|
||||
city.name city_name, district.name district_name`, model.DefaultEarningPricePercentage)
|
||||
if isIncludeSku {
|
||||
sql += `,
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
package dao
|
||||
|
||||
import (
|
||||
"time"
|
||||
|
||||
"git.rosy.net.cn/baseapi/platformapi/aliupcapi"
|
||||
"git.rosy.net.cn/baseapi/utils"
|
||||
"git.rosy.net.cn/jx-callback/business/model"
|
||||
@@ -255,11 +257,8 @@ func GetSkusWithVendor(db *DaoDB, vendorIDs []int, appOrgCodes []string, nameIDs
|
||||
IF(t11.resource_type IS NULL OR t11.resource_type <> ?, t2.img, '') img,
|
||||
IF(t12.resource_type IS NULL OR t12.resource_type <> ?, t2.img2, '') img2,
|
||||
t2.desc_img,
|
||||
t2.ex_prefix,
|
||||
t2.ex_prefix_begin,
|
||||
t2.ex_prefix_end,
|
||||
t3.jd_category_id vendor_vendor_cat_id,
|
||||
|
||||
tsu.ex_prefix, tsu.begin_at ex_prefix_begin, tsu.end_at ex_prefix_end, tsu.img_watermark,
|
||||
t3m.sync_status cat_sync_status,
|
||||
t3m.vendor_thing_id vendor_cat_id
|
||||
|
||||
@@ -286,9 +285,10 @@ func GetSkusWithVendor(db *DaoDB, vendorIDs []int, appOrgCodes []string, nameIDs
|
||||
AND t3m.vendor_id = t1m.vendor_id AND t3m.vendor_org_code = t1m.vendor_org_code
|
||||
LEFT JOIN data_resource t11 ON t11.main_url = t2.img
|
||||
LEFT JOIN data_resource t12 ON t12.main_url = t2.img2
|
||||
LEFT JOIN sku_exinfo_map tsu ON tsu.name_id = t2.id AND tsu.deleted_at = ? AND tsu.vendor_id = t1m.vendor_id
|
||||
WHERE 1 = 1
|
||||
`
|
||||
sqlParams = append(sqlParams, model.ThingTypeCategory, utils.DefaultTimeValue)
|
||||
sqlParams = append(sqlParams, model.ThingTypeCategory, utils.DefaultTimeValue, utils.DefaultTimeValue)
|
||||
if mustDirty {
|
||||
sql += " AND t1m.sync_status IS NOT NULL AND t1m.sync_status <> 0"
|
||||
} else {
|
||||
@@ -379,3 +379,34 @@ func InsertUpcDepot(db *DaoDB, result *aliupcapi.GetAliUpcInfoResult) (err error
|
||||
_, err = ExecuteSQL(db, sql, sqlParams)
|
||||
return err
|
||||
}
|
||||
|
||||
func GetSkuExinfos(db *DaoDB, nameIDs []int, vendorIDs []int, exPrefix string, fromTime, toTime time.Time) (skuExinfoMaps []*model.SkuExinfoMap, err error) {
|
||||
sql := `
|
||||
SELECT *
|
||||
FROM sku_exinfo_map
|
||||
WHERE deleted_at = ?
|
||||
`
|
||||
sqlParams := []interface{}{
|
||||
utils.DefaultTimeValue,
|
||||
}
|
||||
if len(nameIDs) > 0 {
|
||||
sql += " AND name_id IN (" + GenQuestionMarks(len(nameIDs)) + ")"
|
||||
sqlParams = append(sqlParams, nameIDs)
|
||||
}
|
||||
if len(vendorIDs) > 0 {
|
||||
sql += " AND vendor_id IN (" + GenQuestionMarks(len(vendorIDs)) + ")"
|
||||
sqlParams = append(sqlParams, vendorIDs)
|
||||
}
|
||||
if exPrefix != "" {
|
||||
sql += " AND ex_prefix LIKE ?"
|
||||
sqlParams = append(sqlParams, "%"+exPrefix+"%")
|
||||
}
|
||||
if fromTime != utils.ZeroTimeValue && toTime != utils.ZeroTimeValue {
|
||||
sql += " AND NOT (begin_at > ? OR end_at < ?)"
|
||||
sqlParams = append(sqlParams, toTime, fromTime)
|
||||
}
|
||||
if err = GetRows(db, &skuExinfoMaps, sql, sqlParams...); err == nil {
|
||||
return skuExinfoMaps, nil
|
||||
}
|
||||
return nil, err
|
||||
}
|
||||
|
||||
@@ -75,23 +75,29 @@ type StoreSkuSyncInfo struct {
|
||||
ExPrefix string
|
||||
ExPrefixBegin *time.Time
|
||||
ExPrefixEnd *time.Time
|
||||
|
||||
// NameID int `orm:"column(name_id)"`
|
||||
VendorNameID string `orm:"column(vendor_name_id)"` // 暂时无用
|
||||
Name string
|
||||
Unit string
|
||||
Upc string
|
||||
IsGlobal int8 `orm:"default(1)" json:"isGlobal"` // 是否是全部(全国)可见,如果否的话,可见性由SkuPlace决定
|
||||
NameStatus int
|
||||
SellCities []string
|
||||
NameCategoryID int `orm:"column(name_category_id)"`
|
||||
YbNameSuffix string //银豹的商品条码后缀
|
||||
YbBarCode string //银豹的商品条码
|
||||
JdsStockSwitch int
|
||||
VendorNameID string `orm:"column(vendor_name_id)"` // 暂时无用
|
||||
Name string
|
||||
Unit string
|
||||
Upc string
|
||||
IsGlobal int8 `orm:"default(1)" json:"isGlobal"` // 是否是全部(全国)可见,如果否的话,可见性由SkuPlace决定
|
||||
NameStatus int
|
||||
SellCities []string
|
||||
NameCategoryID int `orm:"column(name_category_id)"`
|
||||
YbNameSuffix string //银豹的商品条码后缀
|
||||
YbBarCode string //银豹的商品条码
|
||||
JdsStockSwitch int
|
||||
PreparationTime int
|
||||
|
||||
// 平台相关的图片信息
|
||||
Img string
|
||||
Img2 string
|
||||
DescImg string
|
||||
Img string
|
||||
Img2 string
|
||||
Img3 string
|
||||
DescImg string
|
||||
ImgWatermark string `json:"imgWatermark"` //图片水印
|
||||
ImgMix string //合成水印后的图片
|
||||
ImgOrigin string //skuname里的img
|
||||
|
||||
VendorVendorCatID int64 `orm:"column(vendor_vendor_cat_id)"` // 平台商品分类(叶子结点)
|
||||
CategoryName string `json:"categoryName"` //分类名
|
||||
@@ -108,6 +114,7 @@ type StoreSkuSyncInfo struct {
|
||||
|
||||
MergedStatus int
|
||||
SkuName string
|
||||
SkuNameOrigin string
|
||||
StatusSaleBegin int16 `json:"statusSaleBegin"` //商品可售时间范围
|
||||
StatusSaleEnd int16 `json:"statusSaleEnd"`
|
||||
|
||||
@@ -403,19 +410,22 @@ func GetStoreSkus2(db *DaoDB, vendorID, storeID int, skuIDs []int, mustDirty boo
|
||||
%s vendor_sku_id, t1.%s_sync_status sku_sync_status, t1.%s_price vendor_price, t1.%s_lock_time lock_time,
|
||||
t1.store_id, t1.deleted_at bind_deleted_at,t1.status_sale_begin,t1.status_sale_end, t1.jds_ware_id,
|
||||
t2.*,
|
||||
t3.id name_id, t3.prefix, t3.name, t3.unit, t3.upc, t3.status name_status, t3.ex_prefix, t3.ex_prefix_begin, t3.ex_prefix_end, t3.category_id name_category_id, t3.yb_name_suffix,
|
||||
t3.jds_stock_switch,
|
||||
t3.id name_id, t3.prefix, t3.name, t3.unit, t3.upc, t3.status name_status, t3.category_id name_category_id, t3.yb_name_suffix,
|
||||
t3.jds_stock_switch, t3.preparation_time, t3.img_watermark, t3.ex_vendor_id, t3.img img_origin,
|
||||
IF(t11.%s <> '', t11.%s, t3.img) img,
|
||||
IF(t12.%s <> '', t12.%s, t3.img2) img2,
|
||||
IF(t15.%s <> '', t15.%s, t3.img3) img3,
|
||||
IF(t13.%s <> '', t13.%s, t3.desc_img) desc_img,
|
||||
t4.%s_category_id vendor_vendor_cat_id,
|
||||
t4.name category_name,
|
||||
ts.name store_name`
|
||||
ts.name store_name,
|
||||
tsu.ex_prefix, tsu.begin_at ex_prefix_begin, tsu.end_at ex_prefix_end, tsu.img_watermark`
|
||||
fmtParams := []interface{}{
|
||||
skuVendorIDField, fieldPrefix, fieldPrefix, fieldPrefix,
|
||||
GetDataResFieldName(vendorID), GetDataResFieldName(vendorID),
|
||||
GetDataResFieldName(vendorID), GetDataResFieldName(vendorID),
|
||||
GetDataResFieldName(vendorID), GetDataResFieldName(vendorID),
|
||||
GetDataResFieldName(vendorID), GetDataResFieldName(vendorID),
|
||||
fieldPrefix,
|
||||
}
|
||||
if isSingleStorePF {
|
||||
@@ -441,7 +451,9 @@ func GetStoreSkus2(db *DaoDB, vendorID, storeID int, skuIDs []int, mustDirty boo
|
||||
LEFT JOIN sku_category t4 ON t3.category_id = t4.id AND t4.deleted_at = ?
|
||||
LEFT JOIN data_resource t11 ON t11.main_url = t3.img
|
||||
LEFT JOIN data_resource t12 ON t12.main_url = t3.img2
|
||||
LEFT JOIN data_resource t15 ON t15.main_url = t3.img3
|
||||
LEFT JOIN data_resource t13 ON t13.main_url = t3.desc_img
|
||||
LEFT JOIN sku_exinfo_map tsu ON tsu.name_id = t3.id AND tsu.deleted_at = ? AND tsu.vendor_id = t14.vendor_id
|
||||
`
|
||||
sqlParams := []interface{}{
|
||||
vendorID, utils.DefaultTimeValue,
|
||||
@@ -449,6 +461,7 @@ func GetStoreSkus2(db *DaoDB, vendorID, storeID int, skuIDs []int, mustDirty boo
|
||||
utils.DefaultTimeValue, // model.SkuStatusNormal,
|
||||
utils.DefaultTimeValue,
|
||||
utils.DefaultTimeValue,
|
||||
utils.DefaultTimeValue,
|
||||
}
|
||||
if globals.IsStoreSkuAct {
|
||||
sql += `
|
||||
@@ -606,7 +619,6 @@ func GetStoreSkuPriceAndWeight(db *DaoDB, vendorStoreID string, vendorID int, ve
|
||||
} else {
|
||||
sqlParams = append(sqlParams, vendorSkuIDs)
|
||||
}
|
||||
// globals.SugarLogger.Debugf(sql)
|
||||
err = GetRows(db, &l, sql, sqlParams...)
|
||||
return l, err
|
||||
}
|
||||
@@ -965,17 +977,20 @@ func DeleteSkuNameExPrefixOverdue(db *DaoDB) (num int64, err error) {
|
||||
|
||||
func GetStoreSkusByNameIDs(db *DaoDB, storeIDs []int, nameID int) (skuList []*StoreSkuSyncInfo, err error) {
|
||||
sql := `
|
||||
SELECT a.*,c.unit,c.name
|
||||
SELECT a.*, c.unit, c.name, b.name_id, a.status store_sku_status
|
||||
FROM store_sku_bind a
|
||||
JOIN sku b ON a.sku_id = b.id
|
||||
JOIN sku_name c ON b.name_id = c.id
|
||||
WHERE b.name_id = ?
|
||||
WHERE 1=1
|
||||
AND a.deleted_at = ?
|
||||
`
|
||||
sqlParams := []interface{}{
|
||||
nameID,
|
||||
utils.DefaultTimeValue,
|
||||
}
|
||||
if nameID != 0 {
|
||||
sql += " AND b.name_id = ?"
|
||||
sqlParams = append(sqlParams, nameID)
|
||||
}
|
||||
if len(storeIDs) > 0 {
|
||||
sql += " AND a.store_id in (" + GenQuestionMarks(len(storeIDs)) + ")"
|
||||
sqlParams = append(sqlParams, storeIDs)
|
||||
@@ -1522,13 +1537,14 @@ func UpdateYbOtherSku(db *DaoDB, storeSkuSyncInfo *StoreSkuSyncInfo) (err error)
|
||||
func UpdateJdsWareID(db *DaoDB, storeSkuSyncInfo *StoreSkuSyncInfo) (err error) {
|
||||
sql := `
|
||||
UPDATE store_sku_bind
|
||||
SET jds_ware_id = ?
|
||||
SET jds_ware_id = ?, jds_id = ?
|
||||
WHERE store_id = ?
|
||||
AND sku_id = ?
|
||||
AND deleted_at = ?
|
||||
`
|
||||
sqlParams := []interface{}{
|
||||
storeSkuSyncInfo.JdsWareID,
|
||||
storeSkuSyncInfo.VendorSkuID,
|
||||
storeSkuSyncInfo.StoreID,
|
||||
storeSkuSyncInfo.SkuID,
|
||||
utils.DefaultTimeValue,
|
||||
@@ -1550,6 +1566,7 @@ type tStoreSkuAudit struct {
|
||||
MidUnitPrice int `json:"midUnitPrice"`
|
||||
CityName string `json:"cityName"`
|
||||
PayPercentage int `json:"payPercentage"`
|
||||
StoreLevel string `json:"storeLevel"`
|
||||
}
|
||||
|
||||
func GetStoreSkuAudit(db *DaoDB, storeIDs, nameIDs, skuIDs, statuss, types []int, name, remark, keyword, marketManPhone, cityName string, applyTimeStart, applyTimeEnd, auditTimeStart, auditTimeEnd time.Time, pageSize, offset int) (pagedInfo *model.PagedInfo, err error) {
|
||||
@@ -1557,7 +1574,7 @@ func GetStoreSkuAudit(db *DaoDB, storeIDs, nameIDs, skuIDs, statuss, types []int
|
||||
sql := `
|
||||
SELECT SQL_CALC_FOUND_ROWS DISTINCT a.*,
|
||||
c.name sku_name, c.prefix, c.unit, c.spec_quality, c.spec_unit, c.img,
|
||||
d.name store_name, b.name, e.mid_unit_price, f.name city_name, d.pay_percentage
|
||||
d.name store_name, b.name, e.mid_unit_price, f.name city_name, d.pay_percentage, d.store_level
|
||||
FROM store_sku_audit a
|
||||
LEFT JOIN user b ON a.user_id = b.user_id
|
||||
LEFT JOIN sku_name c ON c.id = a.name_id AND c.deleted_at = ?
|
||||
@@ -1596,7 +1613,7 @@ func GetStoreSkuAudit(db *DaoDB, storeIDs, nameIDs, skuIDs, statuss, types []int
|
||||
}
|
||||
if auditTimeStart != utils.ZeroTimeValue && auditTimeEnd != utils.ZeroTimeValue {
|
||||
sql += " AND a.updated_at BETWEEN ? AND ?"
|
||||
sqlParams = append(sqlParams, applyTimeStart, applyTimeEnd)
|
||||
sqlParams = append(sqlParams, auditTimeStart, auditTimeEnd)
|
||||
}
|
||||
if len(types) > 0 {
|
||||
sql += " AND a.type IN (" + GenQuestionMarks(len(types)) + ")"
|
||||
@@ -1614,7 +1631,7 @@ func GetStoreSkuAudit(db *DaoDB, storeIDs, nameIDs, skuIDs, statuss, types []int
|
||||
sql += " AND f.name LIKE ? "
|
||||
sqlParams = append(sqlParams, "%"+cityName+"%")
|
||||
}
|
||||
sql += " ORDER BY a.updated_at DESC LIMIT ? OFFSET ?"
|
||||
sql += " ORDER BY a.updated_at LIMIT ? OFFSET ?"
|
||||
pageSize = jxutils.FormalizePageSize(pageSize)
|
||||
sqlParams = append(sqlParams, pageSize, offset)
|
||||
Begin(db)
|
||||
|
||||
@@ -154,12 +154,13 @@ func (*SkuCategory) TableUnique() [][]string {
|
||||
type SkuName struct {
|
||||
ModelIDCULD
|
||||
|
||||
Prefix string `orm:"size(255)" json:"prefix"`
|
||||
Name string `orm:"size(255)" json:"name"`
|
||||
ExPrefix string `orm:"size(255)" json:"exPrefix"`
|
||||
Prefix string `orm:"size(255)" json:"prefix"`
|
||||
Name string `orm:"size(255)" json:"name"`
|
||||
|
||||
ExPrefix string `orm:"size(255)" json:"exPrefix"`
|
||||
ExPrefixBegin *time.Time `orm:"null" json:"exPrefixBegin"`
|
||||
ExPrefixEnd *time.Time `orm:"null" json:"exPrefixEnd"`
|
||||
ExVendorID int `orm:"column(ex_vendor_id)" json:"exVendorID"`
|
||||
|
||||
BrandID int `orm:"column(brand_id);default(0)" json:"brandID"` // todo,此属性暂时没有使用,且有问题,应该是不同平台都有一个brandid
|
||||
CategoryID int `orm:"column(category_id);index" json:"categoryID"` // 标准类别
|
||||
@@ -171,8 +172,11 @@ type SkuName struct {
|
||||
SpecUnit string `orm:"size(8)" json:"-"` // 为份必然为克,这个主要作用只是用于确保SkuName的唯一性
|
||||
Price int `json:"price"` // 单位为分,标准价,不为份的就为实际标准价,为份的为每市斤价,实际还要乘质量。todo 为份的确定必须有质量
|
||||
|
||||
Img string `orm:"size(512)" json:"img"`
|
||||
Img2 string `orm:"size(512)" json:"img2"` // 第二张图片
|
||||
Img string `orm:"size(512)" json:"img"`
|
||||
Img2 string `orm:"size(512)" json:"img2"` // 第二张图片
|
||||
Img3 string `orm:"size(512)" json:"img3"` //第三张图片
|
||||
ImgWatermark string `orm:"size(512)" json:"imgWatermark"` //图片水印
|
||||
ImgMix string `orm:"size(512)" json:"imgMix"` //图片混合水印的图片
|
||||
// ImgEbai string `orm:"size(255)" json:"imgEbai"` // 饿百图片地址
|
||||
// ImgHashCode string `orm:"size(255);index" json:"img_hash_code"`
|
||||
|
||||
@@ -187,8 +191,9 @@ type SkuName struct {
|
||||
// JdSyncStatus int8 `orm:"default(2)" json:"jdSyncStatus"`
|
||||
|
||||
// LinkID int `orm:"column(link_id);null;index" json:"linkID"`
|
||||
YbNameSuffix string `json:"ybNameSuffix"` //银豹商品后缀
|
||||
JdsStockSwitch int8 `orm:"default(1)" json:"jdsStockSwitch"`
|
||||
YbNameSuffix string `json:"ybNameSuffix"` //银豹商品后缀
|
||||
JdsStockSwitch int8 `orm:"default(1)" json:"jdsStockSwitch"` //京东商城总库存
|
||||
PreparationTime int `orm:"default(1)" json:"preparationTime"` //商品准备时长
|
||||
}
|
||||
|
||||
func (*SkuName) TableUnique() [][]string {
|
||||
@@ -279,3 +284,20 @@ type SkuNameExt struct {
|
||||
PlacesStr string `json:"-"`
|
||||
MidUnitPrice int `json:"midUnitPrice"`
|
||||
}
|
||||
|
||||
type SkuExinfoMap struct {
|
||||
ModelIDCULD
|
||||
|
||||
NameID int `orm:"column(name_id)" json:"nameID"`
|
||||
VendorID int `orm:"column(vendor_id)" json:"vendorID"`
|
||||
BeginAt time.Time `orm:"type(datetime);index" json:"beginAt"` //设置起始时间
|
||||
EndAt time.Time `orm:"type(datetime);index" json:"endAt"` //设置结束时间
|
||||
ExPrefix string `orm:"size(255)" json:"exPrefix"` //额外前缀
|
||||
ImgWatermark string `orm:"size(512)" json:"imgWatermark"` //图片水印
|
||||
}
|
||||
|
||||
func (*SkuExinfoMap) TableIndex() [][]string {
|
||||
return [][]string{
|
||||
[]string{"NameID", "VendorID", "BeginAt", "EndAt"},
|
||||
}
|
||||
}
|
||||
|
||||
@@ -292,6 +292,7 @@ type Store struct {
|
||||
SMSNotifyMark int8 `orm:"column(sms_notify_mark);" json:"smsNotifyMark"` //今天是否已经推送过订单消息
|
||||
AutoReplyType int8 `json:"autoReplyType"` // 订单评价自动回复类型
|
||||
LinkStoreID int `orm:"column(link_store_id);default(0);index" json:"linkStoreID"` // 关联门店ID
|
||||
StoreLevel string `orm:"default(C);size(32)" json:"storeLevel"` // 门店等级(筛选用,京西的)
|
||||
|
||||
PrinterDisabled int8 `orm:"default(0)" json:"printerDisabled"` // 是否禁用网络打印机
|
||||
PrinterFontSize int8 `orm:"default(0)" json:"printerFontSize"` // 打印字体-1:小,0:正常,1:大
|
||||
@@ -335,6 +336,7 @@ type Store struct {
|
||||
PayeeBankBranchName string `orm:"size(255)" json:"payeeBankBranchName"` // 开户支行
|
||||
PayeeBankCode string `orm:"size(8)" json:"payeeBankCode"` // 开户行代码
|
||||
PayPercentage int `json:"payPercentage"`
|
||||
OldPayPercentage int `json:"oldPayPercentage"`
|
||||
|
||||
// OperatorName string `orm:"size(8)" json:"operatorName"` // 运营人姓名
|
||||
OperatorPhone string `orm:"size(16)" json:"operatorPhone"` // 京东运营人电话
|
||||
|
||||
@@ -94,3 +94,7 @@ func (c *DeliveryHandler) GetWaybillFee(order *model.GoodsOrder) (deliveryFeeInf
|
||||
func (c *DeliveryHandler) ComplaintRider(bill *model.Waybill, resonID int, resonContent string) (err error) {
|
||||
return err
|
||||
}
|
||||
|
||||
func (c *DeliveryHandler) OnWaybillMsg() {
|
||||
|
||||
}
|
||||
|
||||
@@ -1 +1,7 @@
|
||||
package jdeclp
|
||||
|
||||
import "git.rosy.net.cn/jx-callback/globals/testinit"
|
||||
|
||||
func init() {
|
||||
testinit.Init()
|
||||
}
|
||||
|
||||
@@ -1,8 +1,13 @@
|
||||
package mtps
|
||||
|
||||
import (
|
||||
"crypto/sha1"
|
||||
"errors"
|
||||
"fmt"
|
||||
"net/http"
|
||||
"net/url"
|
||||
"sort"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"git.rosy.net.cn/baseapi/platformapi/mtpsapi"
|
||||
@@ -99,9 +104,72 @@ func (c *DeliveryHandler) onWaybillMsg(msg *mtpsapi.CallbackOrderMsg) (retVal *m
|
||||
globals.SugarLogger.Warnf("onWaybillMsg unknown msg:%v", msg)
|
||||
return mtpsapi.SuccessResponse
|
||||
}
|
||||
c.pushToGy(order, msg)
|
||||
globals.SugarLogger.Debugf("onWaybillMsg test, %v", msg)
|
||||
return mtpsapi.Err2CallbackResponse(partner.CurOrderManager.OnWaybillStatusChanged(order), order.VendorStatus)
|
||||
}
|
||||
|
||||
func (c *DeliveryHandler) pushToGy(waybill *model.Waybill, msg *mtpsapi.CallbackOrderMsg) {
|
||||
order, _ := dao.GetSimpleOrder(dao.GetDB(), waybill.VendorOrderID)
|
||||
//查不到订单可能就是果园的订单
|
||||
if order == nil {
|
||||
cl := http.Client{}
|
||||
params := make(map[string]interface{})
|
||||
params["mt_peisong_id"] = msg.MtPeisongID
|
||||
params["courier_name"] = msg.CourierName
|
||||
params["delivery_id"] = msg.DeliveryID
|
||||
params["appkey"] = msg.AppKey
|
||||
params["order_id"] = msg.OrderID
|
||||
params["courier_phone"] = msg.CourierPhone
|
||||
params["status"] = msg.Status
|
||||
params["timestamp"] = msg.Timestamp
|
||||
params["cancel_reason_id"] = msg.CancelReasonId
|
||||
params["cancel_reason"] = msg.CancelReason
|
||||
urls := utils.Map2URLValues(params)
|
||||
sign := signParams(urls)
|
||||
params["sign"] = sign
|
||||
request, err := http.NewRequest(http.MethodPost, "http://callback-jxgy.jxc4.com/mtps/status", strings.NewReader(utils.Map2URLValues(params).Encode()))
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
request.PostForm.Set("mt_peisong_id", msg.MtPeisongID)
|
||||
request.PostForm.Set("courier_name", msg.CourierName)
|
||||
request.PostForm.Set("delivery_id", utils.Int64ToStr(msg.DeliveryID))
|
||||
request.PostForm.Set("appkey", msg.AppKey)
|
||||
request.PostForm.Set("order_id", msg.OrderID)
|
||||
request.PostForm.Set("courier_phone", msg.CourierPhone)
|
||||
request.PostForm.Set("status", utils.Int2Str(msg.Status))
|
||||
request.PostForm.Set("timestamp", utils.Int64ToStr(msg.Timestamp))
|
||||
request.PostForm.Set("cancel_reason_id", utils.Int2Str(msg.CancelReasonId))
|
||||
request.PostForm.Set("cancel_reason", msg.CancelReason)
|
||||
request.PostForm.Set("sign", sign)
|
||||
fmt.Println("testgy request : %v", request.FormValue("sign"))
|
||||
request.Header.Set("content_type", "application/x-www-form-urlencoded; charset=UTF-8")
|
||||
cl.Do(request)
|
||||
}
|
||||
}
|
||||
|
||||
func signParams(params url.Values) string {
|
||||
keys := make([]string, 0)
|
||||
for k := range params {
|
||||
if k != "sign" {
|
||||
keys = append(keys, k)
|
||||
}
|
||||
}
|
||||
|
||||
sort.Strings(keys)
|
||||
finalStr := "b1M}9?:sTbsB[OF2gNORnN(|(iy9rB8(`7]|[wGLnbmt`evfM>E:A90DjHAW:UPE"
|
||||
for _, key := range keys {
|
||||
valStr := strings.Join(params[key], "")
|
||||
if valStr != "" {
|
||||
finalStr += key + valStr
|
||||
}
|
||||
}
|
||||
|
||||
// baseapi.SugarLogger.Debug(finalStr)
|
||||
return fmt.Sprintf("%x", sha1.Sum([]byte(finalStr)))
|
||||
}
|
||||
|
||||
func (c *DeliveryHandler) callbackMsg2Waybill(msg *mtpsapi.CallbackOrderMsg) (retVal *model.Waybill) {
|
||||
retVal = &model.Waybill{
|
||||
VendorWaybillID: msg.MtPeisongID,
|
||||
|
||||
@@ -59,7 +59,7 @@ func (c *PrinterHandler) getOrderContent(order *model.GoodsOrder, storeTel strin
|
||||
|
||||
<BR>
|
||||
商品明细: <BR>
|
||||
品名 数量 单价 小计<BR>
|
||||
品名 数量 <BR>
|
||||
--------------------------------<BR>`
|
||||
// <BOLD>实际支付:</BOLD>%s<BR>
|
||||
orderParams := []interface{}{
|
||||
@@ -79,8 +79,9 @@ func (c *PrinterHandler) getOrderContent(order *model.GoodsOrder, storeTel strin
|
||||
|
||||
for _, sku := range order.Skus {
|
||||
orderFmt += `%s<BR>`
|
||||
orderFmt += `%8s%10s%10s<BR>`
|
||||
orderParams = append(orderParams, sku.SkuName, "x"+utils.Int2Str(sku.Count), jxutils.IntPrice2StandardCurrencyString(sku.SalePrice), jxutils.IntPrice2StandardCurrencyString(sku.SalePrice*int64(sku.Count)))
|
||||
orderFmt += `%8s<BR>`
|
||||
orderParams = append(orderParams, sku.SkuName, "x"+utils.Int2Str(sku.Count))
|
||||
//jxutils.IntPrice2StandardCurrencyString(sku.SalePrice), jxutils.IntPrice2StandardCurrencyString(sku.SalePrice*int64(sku.Count))
|
||||
}
|
||||
orderFmt += `<BR>
|
||||
<BOLD>共%d种%d件商品</BOLD>
|
||||
@@ -133,7 +134,7 @@ func (c *PrinterHandler) getOrderContentBig(order *model.GoodsOrder, storeTel st
|
||||
|
||||
<BR>
|
||||
<B>商品明细: <BR></B>
|
||||
<B>品名数量单价小计<BR></B>
|
||||
<B>品名 数量<BR></B>
|
||||
--------------------------------<BR>`
|
||||
// <B><BOLD>实际支付:</BOLD></B><B>%s<BR></B>
|
||||
orderParams := []interface{}{
|
||||
@@ -153,8 +154,9 @@ func (c *PrinterHandler) getOrderContentBig(order *model.GoodsOrder, storeTel st
|
||||
|
||||
for _, sku := range order.Skus {
|
||||
orderFmt += `<B>%s<BR></B>`
|
||||
orderFmt += `<B>%s %s %s<BR><BR></B>`
|
||||
orderParams = append(orderParams, sku.SkuName, "x"+utils.Int2Str(sku.Count), jxutils.IntPrice2StandardCurrencyString(sku.SalePrice), jxutils.IntPrice2StandardCurrencyString(sku.SalePrice*int64(sku.Count)))
|
||||
orderFmt += `<B>%s<BR><BR></B>`
|
||||
orderParams = append(orderParams, sku.SkuName, "x"+utils.Int2Str(sku.Count))
|
||||
//jxutils.IntPrice2StandardCurrencyString(sku.SalePrice), jxutils.IntPrice2StandardCurrencyString(sku.SalePrice*int64(sku.Count))
|
||||
}
|
||||
orderFmt += `<BR>
|
||||
<B><BOLD>共%d种%d件商品</BOLD></B>
|
||||
|
||||
@@ -60,7 +60,7 @@ func (c *PrinterHandler) getOrderContent(order *model.GoodsOrder, storeTel strin
|
||||
客户备注: *
|
||||
<big>%s*
|
||||
商品明细: *
|
||||
品名 数量 单价 小计
|
||||
品名 数量
|
||||
--------------------------------*
|
||||
`
|
||||
// <S011>实际支付: %s*
|
||||
@@ -81,7 +81,8 @@ func (c *PrinterHandler) getOrderContent(order *model.GoodsOrder, storeTel strin
|
||||
for _, sku := range order.Skus {
|
||||
orderFmt += `%s*`
|
||||
orderFmt += `%8s%10s%10s*`
|
||||
orderParams = append(orderParams, sku.SkuName, "x"+utils.Int2Str(sku.Count), jxutils.IntPrice2StandardCurrencyString(sku.SalePrice), jxutils.IntPrice2StandardCurrencyString(sku.SalePrice*int64(sku.Count)))
|
||||
orderParams = append(orderParams, sku.SkuName, "x"+utils.Int2Str(sku.Count))
|
||||
// jxutils.IntPrice2StandardCurrencyString(sku.SalePrice), jxutils.IntPrice2StandardCurrencyString(sku.SalePrice*int64(sku.Count))
|
||||
}
|
||||
orderFmt += `
|
||||
*
|
||||
@@ -135,7 +136,7 @@ func (c *PrinterHandler) getOrderContentBig(order *model.GoodsOrder, storeTel st
|
||||
<big>客户备注: *
|
||||
<big>%s*
|
||||
<big>商品明细: *
|
||||
<big>品名数量单价小计*
|
||||
<big>品名 数量*
|
||||
--------------------------------*
|
||||
`
|
||||
// <big>实际支付: %s*
|
||||
@@ -155,8 +156,9 @@ func (c *PrinterHandler) getOrderContentBig(order *model.GoodsOrder, storeTel st
|
||||
}
|
||||
for _, sku := range order.Skus {
|
||||
orderFmt += `<big>%s*`
|
||||
orderFmt += `<big>%s %s %s*`
|
||||
orderParams = append(orderParams, sku.SkuName, "x"+utils.Int2Str(sku.Count), jxutils.IntPrice2StandardCurrencyString(sku.SalePrice), jxutils.IntPrice2StandardCurrencyString(sku.SalePrice*int64(sku.Count)))
|
||||
orderFmt += `<big>%s*`
|
||||
orderParams = append(orderParams, sku.SkuName, "x"+utils.Int2Str(sku.Count))
|
||||
// jxutils.IntPrice2StandardCurrencyString(sku.SalePrice), jxutils.IntPrice2StandardCurrencyString(sku.SalePrice*int64(sku.Count))
|
||||
}
|
||||
orderFmt += `
|
||||
<big>共%d种%d件商品*
|
||||
@@ -231,7 +233,7 @@ func (c *PrinterHandler) getOrderContent2(order *model.GoodsOrder, storeTel stri
|
||||
}
|
||||
for _, sku := range order.Skus {
|
||||
orderFmt += `|5%s`
|
||||
orderFmt += `|5%8s%10s%10s`
|
||||
orderFmt += `|5%8s`
|
||||
orderParams = append(orderParams, sku.SkuName, "x"+utils.Int2Str(sku.Count), jxutils.IntPrice2StandardCurrencyString(sku.SalePrice), jxutils.IntPrice2StandardCurrencyString(sku.SalePrice*int64(sku.Count)))
|
||||
}
|
||||
orderFmt += `
|
||||
|
||||
@@ -36,6 +36,7 @@ func (c *PrinterHandler) getOrderContent(order *model.GoodsOrder, storeTel strin
|
||||
if order.VendorID == model.VendorIDEBAI {
|
||||
getCode = fmt.Sprintf("<FS2>饿百取货码:%s</FS2>\\n\n", jxutils.GetEbaiOrderGetCode(order))
|
||||
}
|
||||
//TODO 去掉单价和小计,2020-06-18
|
||||
orderFmt := `
|
||||
<FS2><center>%s</center></FS2>\n\n
|
||||
<center>手机买菜上京西</center>
|
||||
@@ -57,7 +58,7 @@ func (c *PrinterHandler) getOrderContent(order *model.GoodsOrder, storeTel strin
|
||||
\n
|
||||
\n
|
||||
商品明细: \n
|
||||
品名 数量 单价 小计\n
|
||||
品名 数量 \n
|
||||
--------------------------------\n`
|
||||
// <FB>实际支付:</FB>%s\n
|
||||
orderParams := []interface{}{
|
||||
@@ -77,8 +78,9 @@ func (c *PrinterHandler) getOrderContent(order *model.GoodsOrder, storeTel strin
|
||||
|
||||
for _, sku := range order.Skus {
|
||||
orderFmt += `%s\n`
|
||||
orderFmt += `%8s%10s%10s\n`
|
||||
orderParams = append(orderParams, sku.SkuName, "x"+utils.Int2Str(sku.Count), jxutils.IntPrice2StandardCurrencyString(sku.SalePrice), jxutils.IntPrice2StandardCurrencyString(sku.SalePrice*int64(sku.Count)))
|
||||
orderFmt += `%8s\n`
|
||||
orderParams = append(orderParams, sku.SkuName, "x"+utils.Int2Str(sku.Count))
|
||||
//jxutils.IntPrice2StandardCurrencyString(sku.SalePrice), jxutils.IntPrice2StandardCurrencyString(sku.SalePrice*int64(sku.Count))
|
||||
}
|
||||
orderFmt += `\n
|
||||
<FB>共%d种%d件商品</FB>
|
||||
@@ -125,7 +127,7 @@ func (c *PrinterHandler) getOrderContentBig(order *model.GoodsOrder, storeTel st
|
||||
\n
|
||||
\n
|
||||
<FS2>商品明细: \n</FS2>
|
||||
<FS2>品名数量单价小计\n</FS2>
|
||||
<FS2>品名 数量\n</FS2>
|
||||
--------------------------------\n`
|
||||
// <FS2><FB>实际支付:</FB>%s\n</FS2>
|
||||
orderParams := []interface{}{
|
||||
@@ -145,8 +147,9 @@ func (c *PrinterHandler) getOrderContentBig(order *model.GoodsOrder, storeTel st
|
||||
|
||||
for _, sku := range order.Skus {
|
||||
orderFmt += `<FS2>%s\n</FS2>`
|
||||
orderFmt += `<FS2>%s %s %s\n\n</FS2>`
|
||||
orderParams = append(orderParams, sku.SkuName, "x"+utils.Int2Str(sku.Count), jxutils.IntPrice2StandardCurrencyString(sku.SalePrice), jxutils.IntPrice2StandardCurrencyString(sku.SalePrice*int64(sku.Count)))
|
||||
orderFmt += `<FS2>%s\n\n</FS2>`
|
||||
orderParams = append(orderParams, sku.SkuName, "x"+utils.Int2Str(sku.Count))
|
||||
//jxutils.IntPrice2StandardCurrencyString(sku.SalePrice), jxutils.IntPrice2StandardCurrencyString(sku.SalePrice*int64(sku.Count))
|
||||
}
|
||||
orderFmt += `\n
|
||||
<FS2><FB>共%d种%d件商品</FB></FS2>
|
||||
|
||||
@@ -58,7 +58,7 @@ func (c *PrinterHandler) getOrderContent(order *model.GoodsOrder, storeTel strin
|
||||
<RN>
|
||||
<RN>
|
||||
商品明细: <RN>
|
||||
品名 数量 单价 小计<RN>
|
||||
品名 数量 <RN>
|
||||
********************************<RN>`
|
||||
// <B1>实际支付:</B1>%s<RN>
|
||||
orderParams := []interface{}{
|
||||
@@ -78,8 +78,9 @@ func (c *PrinterHandler) getOrderContent(order *model.GoodsOrder, storeTel strin
|
||||
|
||||
for _, sku := range order.Skus {
|
||||
orderFmt += `%s<RN>`
|
||||
orderFmt += `%8s%10s%10s<RN>`
|
||||
orderParams = append(orderParams, sku.SkuName, "x"+utils.Int2Str(sku.Count), jxutils.IntPrice2StandardCurrencyString(sku.SalePrice), jxutils.IntPrice2StandardCurrencyString(sku.SalePrice*int64(sku.Count)))
|
||||
orderFmt += `%8s<RN>`
|
||||
orderParams = append(orderParams, sku.SkuName, "x"+utils.Int2Str(sku.Count))
|
||||
//jxutils.IntPrice2StandardCurrencyString(sku.SalePrice), jxutils.IntPrice2StandardCurrencyString(sku.SalePrice*int64(sku.Count))
|
||||
}
|
||||
orderFmt += `<RN>
|
||||
<B1>共%d种%d件商品</B1>
|
||||
@@ -126,7 +127,7 @@ func (c *PrinterHandler) getOrderContentBig(order *model.GoodsOrder, storeTel st
|
||||
<RN>
|
||||
<RN>
|
||||
<S2>商品明细: <RN></S2>
|
||||
<S2>品名数量单价小计<RN></S2>
|
||||
<S2>品名 数量<RN></S2>
|
||||
********************************<RN>`
|
||||
// <S2><B1>实际支付:</B1>%s<RN></S2>
|
||||
orderParams := []interface{}{
|
||||
@@ -146,8 +147,9 @@ func (c *PrinterHandler) getOrderContentBig(order *model.GoodsOrder, storeTel st
|
||||
|
||||
for _, sku := range order.Skus {
|
||||
orderFmt += `<S2>%s<RN></S2>`
|
||||
orderFmt += `<S2>%s %s %s<RN><RN></S2>`
|
||||
orderParams = append(orderParams, sku.SkuName, "x"+utils.Int2Str(sku.Count), jxutils.IntPrice2StandardCurrencyString(sku.SalePrice), jxutils.IntPrice2StandardCurrencyString(sku.SalePrice*int64(sku.Count)))
|
||||
orderFmt += `<S2>%s<RN><RN></S2>`
|
||||
orderParams = append(orderParams, sku.SkuName, "x"+utils.Int2Str(sku.Count))
|
||||
//jxutils.IntPrice2StandardCurrencyString(sku.SalePrice), jxutils.IntPrice2StandardCurrencyString(sku.SalePrice*int64(sku.Count))
|
||||
}
|
||||
orderFmt += `<RN>
|
||||
<S2><B1>共%d种%d件商品</B1></S2>
|
||||
|
||||
@@ -134,6 +134,7 @@ func (p *PurchaseHandler) GetOrder4PartRefund(vendorOrderID string) (order *mode
|
||||
order.DiscountMoney = discountMoney
|
||||
order.Skus = append(order.Skus, giftSkus...)
|
||||
order.ActualPayPrice = utils.MustInterface2Int64(result2["user_fee"])
|
||||
order.TotalShopMoney = utils.MustInterface2Int64(result2["shop_fee"])
|
||||
jxutils.RefreshOrderSkuRelated(order)
|
||||
} else if err2Ext, ok := err2.(*utils.ErrorWithCode); !ok || err2Ext.IntCode() != ebaiapi.ErrOrderIsNotPartRefund {
|
||||
err = err2
|
||||
|
||||
@@ -204,10 +204,24 @@ func (c *PurchaseHandler) ConfirmReceivedReturnGoods(ctx *jxcontext.Context, ord
|
||||
|
||||
// 发起全款退款
|
||||
func (c *PurchaseHandler) RefundOrder(ctx *jxcontext.Context, order *model.GoodsOrder, reason string) (err error) {
|
||||
return fmt.Errorf("%s不支持售后全额退款,请让买家发起退款", model.VendorChineseNames[model.VendorIDEBAI])
|
||||
return c.PartRefundOrder(ctx, order, order.Skus, reason)
|
||||
}
|
||||
|
||||
// 发起部分退款
|
||||
func (c *PurchaseHandler) PartRefundOrder(ctx *jxcontext.Context, order *model.GoodsOrder, refundSkuList []*model.OrderSku, reason string) (err error) {
|
||||
return fmt.Errorf("%s不支持售后部分退款,请让买家发起退款", model.VendorChineseNames[model.VendorIDEBAI])
|
||||
if globals.EnableEbaiStoreWrite {
|
||||
err = api.EbaiAPI.OrderPartRefund(order.VendorOrderID, orderSkus2AfsSkus(refundSkuList))
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
func orderSkus2AfsSkus(refundSkuList []*model.OrderSku) (removeSkuList []*ebaiapi.RefundSku) {
|
||||
for _, v := range refundSkuList {
|
||||
refundSku := &ebaiapi.RefundSku{
|
||||
CustomeSkuID: utils.Int2Str(v.SkuID),
|
||||
Number: utils.Int2Str(v.Count),
|
||||
}
|
||||
removeSkuList = append(removeSkuList, refundSku)
|
||||
}
|
||||
return removeSkuList
|
||||
}
|
||||
|
||||
@@ -28,6 +28,14 @@ var (
|
||||
175: "赠品专区",
|
||||
18: "烧烤吧台",
|
||||
}
|
||||
|
||||
//果园果切的饿百分类ID
|
||||
gygqVendorCatID = map[int]int{
|
||||
201227732: 1,
|
||||
201220933: 1,
|
||||
201223525: 1,
|
||||
201220334: 1,
|
||||
}
|
||||
)
|
||||
|
||||
func (p *PurchaseHandler) GetStoreSkusBatchSize(funcID int) (batchSize int) {
|
||||
@@ -316,10 +324,16 @@ func (p *PurchaseHandler) UpdateStoreSkusStock(ctx *jxcontext.Context, vendorOrg
|
||||
}
|
||||
|
||||
func genSkuParamsFromStoreSkuInfo2(storeSku *dao.StoreSkuSyncInfo, isCreate, isExd bool) (params map[string]interface{}) {
|
||||
var img string
|
||||
if storeSku.ImgMix != "" {
|
||||
img = storeSku.ImgMix
|
||||
} else {
|
||||
img = storeSku.Img
|
||||
}
|
||||
photos := []map[string]interface{}{
|
||||
map[string]interface{}{
|
||||
"is_master": true,
|
||||
"url": storeSku.Img,
|
||||
"url": img,
|
||||
},
|
||||
}
|
||||
if storeSku.Img2 != "" {
|
||||
@@ -328,14 +342,21 @@ func genSkuParamsFromStoreSkuInfo2(storeSku *dao.StoreSkuSyncInfo, isCreate, isE
|
||||
"url": storeSku.Img2,
|
||||
})
|
||||
}
|
||||
if storeSku.Img3 != "" {
|
||||
photos = append(photos, map[string]interface{}{
|
||||
"is_master": false,
|
||||
"url": storeSku.Img3,
|
||||
})
|
||||
}
|
||||
params = map[string]interface{}{
|
||||
// "name": utils.LimitMixedStringLen(storeSku.SkuName, ebaiapi.MaxSkuNameByteCount),
|
||||
"left_num": model.MaxStoreSkuStockQty,
|
||||
// "category_id": utils.Str2Int64(storeSku.VendorCatID),
|
||||
"predict_cat": 0, // 不使用推荐类目
|
||||
// "cat3_id": getEbaiCat(storeSku.VendorVendorCatID),
|
||||
"weight": storeSku.Weight,
|
||||
"photos": photos,
|
||||
"weight": storeSku.Weight,
|
||||
"photos": photos,
|
||||
"preparation_time": storeSku.PreparationTime,
|
||||
}
|
||||
if !isExd {
|
||||
params["category_id"] = utils.Str2Int64(storeSku.VendorCatID)
|
||||
@@ -347,6 +368,21 @@ func genSkuParamsFromStoreSkuInfo2(storeSku *dao.StoreSkuSyncInfo, isCreate, isE
|
||||
params["cat3_id"] = storeSku.ExdCategoryThirdID
|
||||
params["category_id"] = utils.Str2Int64WithDefault(storeSku.VendorCatID, 0)
|
||||
}
|
||||
//证明是果园的几个果切分类,需要填加工服务
|
||||
if gygqVendorCatID[int(storeSku.VendorVendorCatID)] == 1 {
|
||||
params["process_type"] = model.YES
|
||||
processDetail := []map[string]interface{}{
|
||||
map[string]interface{}{
|
||||
"type": "去皮",
|
||||
"time": 2,
|
||||
},
|
||||
map[string]interface{}{
|
||||
"type": "不加工",
|
||||
"time": 0,
|
||||
},
|
||||
}
|
||||
params["process_detail"] = processDetail
|
||||
}
|
||||
if storeSku.DescImg != "" {
|
||||
params["rtf"] = storeSku.DescImg
|
||||
}
|
||||
|
||||
@@ -164,9 +164,15 @@ func skuInfo2Param(ctx *jxcontext.Context, sku *dao.StoreSkuSyncInfo) (param *jd
|
||||
FixedStatus: jxStatus2jdStatus(sku.MergedStatus),
|
||||
IsSale: jdapi.IsSaleNo, // todo ?
|
||||
|
||||
Upc: sku.Upc,
|
||||
Images: jxutils.BatchString2Slice(sku.Img, sku.Img2),
|
||||
Upc: sku.Upc,
|
||||
// Images: jxutils.BatchString2Slice(sku.Img, sku.Img2),
|
||||
}
|
||||
if sku.ImgMix != "" {
|
||||
param.Images = jxutils.BatchString2Slice(sku.ImgMix, sku.Img2)
|
||||
} else {
|
||||
param.Images = jxutils.BatchString2Slice(sku.Img, sku.Img2)
|
||||
}
|
||||
|
||||
if param.CategoryID == 0 {
|
||||
param.CategoryID = int64(getDefJdCategoryID())
|
||||
}
|
||||
|
||||
@@ -148,7 +148,7 @@ func (p *PurchaseHandler) UpdateStore(db *dao.DaoDB, storeID int, userName strin
|
||||
StationNo: store.VendorStoreID,
|
||||
Operator: userName,
|
||||
Phone: phone,
|
||||
Mobile: store.Tel2,
|
||||
Mobile: store.Tel1,
|
||||
}
|
||||
if store.SyncStatus&model.SyncFlagDeletedMask == 0 {
|
||||
storeParams.OutSystemID = utils.Int2Str(int(store.ID))
|
||||
|
||||
@@ -62,9 +62,9 @@ func (p *PurchaseHandler) PickupGoods(order *model.GoodsOrder, isSelfDelivery bo
|
||||
status, err := p.GetOrderStatus("", order.VendorOrderID2)
|
||||
//说明此时该订单在平台上已经取消了
|
||||
if status == model.OrderStatusApplyCancel {
|
||||
err = ChangeOrderStatus(order.VendorOrderID, model.OrderStatusFinishedPickup, "自动拣货完成")
|
||||
} else {
|
||||
err = ChangeOrderStatus(order.VendorOrderID, model.OrderStatusCanceled, "订单状态发生了改变")
|
||||
} else {
|
||||
err = ChangeOrderStatus(order.VendorOrderID, model.OrderStatusFinishedPickup, "自动拣货完成")
|
||||
}
|
||||
return err
|
||||
}
|
||||
@@ -100,6 +100,7 @@ func (p *PurchaseHandler) AgreeOrRefuseCancel(ctx *jxcontext.Context, order *mod
|
||||
return err
|
||||
}
|
||||
func (p *PurchaseHandler) CancelOrder(ctx *jxcontext.Context, order *model.GoodsOrder, reason string) (err error) {
|
||||
ChangeOrderStatus(order.VendorOrderID, model.OrderStatusCanceled, reason)
|
||||
return err
|
||||
}
|
||||
func (p *PurchaseHandler) AdjustOrder(ctx *jxcontext.Context, order *model.GoodsOrder, removedSkuList []*model.OrderSku, reason string) (err error) {
|
||||
|
||||
@@ -122,6 +122,7 @@ func (p *PurchaseHandler) UpdateStoreSkus(ctx *jxcontext.Context, storeID int, v
|
||||
VenderID: jdshopapi.VenderID,
|
||||
PromiseID: jdshopapi.JdsPromiseID,
|
||||
ShopCategorys: []int{utils.Str2Int(v.VendorCatID)},
|
||||
JdPrice: jxutils.IntPrice2Standard(v.UnitPrice),
|
||||
}
|
||||
var desc string
|
||||
if v.DescImg != "" {
|
||||
@@ -178,11 +179,7 @@ func (p *PurchaseHandler) UpdateStoreSkus(ctx *jxcontext.Context, storeID int, v
|
||||
imageURL, err = uploadImg(img, name, "tou")
|
||||
}
|
||||
}
|
||||
err2 := api.JdShopAPI.TransparentImageAdd(v.JdsWareID, imageURL)
|
||||
if err2 != nil {
|
||||
failedList = putils.GetErrMsg2FailedSingleList(storeSkuList, err, storeID, model.VendorChineseNames[model.VendorIDJDShop], "更新商品基础信息")
|
||||
return failedList, err
|
||||
}
|
||||
api.JdShopAPI.TransparentImageAdd(v.JdsWareID, imageURL)
|
||||
}
|
||||
for _, vv := range v.StoreSkuSyncInfoJds {
|
||||
updateSkusParam, err := buildUpdateSkusParam(v, vv, false)
|
||||
@@ -190,8 +187,7 @@ func (p *PurchaseHandler) UpdateStoreSkus(ctx *jxcontext.Context, storeID int, v
|
||||
failedList = putils.GetErrMsg2FailedSingleList(storeSkuList, err, storeID, model.VendorChineseNames[model.VendorIDJDShop], "更新商品基础信息")
|
||||
return failedList, err
|
||||
}
|
||||
vendorSkuID, err := api.JdShopAPI.UpdateSkus(updateSkusParam)
|
||||
vv.VendorSkuID = vendorSkuID
|
||||
_, err = api.JdShopAPI.UpdateSkus(updateSkusParam)
|
||||
}
|
||||
}
|
||||
if err != nil {
|
||||
@@ -209,9 +205,10 @@ func (p *PurchaseHandler) DeleteStoreSkus(ctx *jxcontext.Context, storeID int, v
|
||||
if err == nil {
|
||||
err = api.JdShopAPI.DeleteWare(utils.Str2Int(v.VendorSkuID2))
|
||||
}
|
||||
}
|
||||
if err != nil {
|
||||
failedList = putils.GetErrMsg2FailedSingleList(storeSkuList, err, storeID, model.VendorChineseNames[model.VendorIDJDShop], "删除商品")
|
||||
if err != nil {
|
||||
failedList = append(failedList, putils.GetErrMsg2FailedSingleList(storeSkuList, err, storeID, model.VendorChineseNames[model.VendorIDJDShop], "删除商品")...)
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
return failedList, err
|
||||
@@ -240,10 +237,10 @@ func (p *PurchaseHandler) UpdateStoreSkusStatus(ctx *jxcontext.Context, vendorOr
|
||||
if globals.EnableJdShopWrite {
|
||||
var stock = 0
|
||||
for _, v := range storeSkuList {
|
||||
if status == model.SkuStatusNormal {
|
||||
stock = 9999
|
||||
}
|
||||
if storeID == model.JdShopMainStoreID {
|
||||
if status == model.SkuStatusNormal {
|
||||
stock = 9999
|
||||
}
|
||||
if v.JdsStockSwitch == model.NO {
|
||||
stock = 0
|
||||
}
|
||||
@@ -253,6 +250,9 @@ func (p *PurchaseHandler) UpdateStoreSkusStatus(ctx *jxcontext.Context, vendorOr
|
||||
err = err2
|
||||
if len(storeSkus) > 0 {
|
||||
if storeSkus[0].JdsID != 0 && vendorStoreID != "" {
|
||||
if storeSkus[0].Status == model.SkuStatusNormal {
|
||||
stock = 9999
|
||||
}
|
||||
err = api.JdShopAPI.UpdateSkuSiteStock(storeSkus[0].JdsID, stock, utils.Str2Int(vendorStoreID))
|
||||
}
|
||||
}
|
||||
@@ -269,9 +269,9 @@ func (p *PurchaseHandler) UpdateStoreSkusPrice(ctx *jxcontext.Context, vendorOrg
|
||||
if globals.EnableJdShopWrite && vendorStoreID == model.JdShopMainVendorStoreID {
|
||||
for _, v := range storeSkuList {
|
||||
err = api.JdShopAPI.UpdateSkuJdPrice(utils.Str2Int(v.VendorSkuID), jxutils.IntPrice2Standard(v.VendorPrice))
|
||||
}
|
||||
if err != nil {
|
||||
failedList = putils.GetErrMsg2FailedSingleList(storeSkuList, err, storeID, model.VendorChineseNames[model.VendorIDJDShop], "修改商品价格")
|
||||
if err != nil {
|
||||
failedList = append(failedList, putils.GetErrMsg2FailedSingleList(storeSkuList, err, storeID, model.VendorChineseNames[model.VendorIDJDShop], "修改商品价格")...)
|
||||
}
|
||||
}
|
||||
}
|
||||
return failedList, err
|
||||
@@ -660,9 +660,17 @@ func buildCreateWareParam(storeSku *dao.StoreSkuSyncInfo) (createSkuParamWare *j
|
||||
ggValueID int64 //规格的属性id
|
||||
attrsPropSku []*jdshopapi.CreateSkuParamAttrs
|
||||
multiPropSku []*jdshopapi.CreateSkuParamAttrs
|
||||
specQuality string
|
||||
)
|
||||
valuesSku, maxNo, _ := api.JdShopAPI.FindValuesByAttrId(attrIDs["规格"])
|
||||
specQuality := utils.Float64ToStr(float64(v.SpecQuality)) + v.SpecUnit
|
||||
if v.SpecUnit == model.SpecUnitNames[1] || v.SpecUnit == model.SpecUnitNames[2] {
|
||||
specQuality = strings.TrimRight(fmt.Sprintf("%.2f", float64(v.SpecQuality)), "0.") + v.SpecUnit
|
||||
} else {
|
||||
specQuality = utils.Float64ToStr(float64(v.SpecQuality)) + v.SpecUnit
|
||||
}
|
||||
if v.Comment != "" {
|
||||
specQuality = v.Comment
|
||||
}
|
||||
for _, v := range valuesSku {
|
||||
if v.Name == specQuality {
|
||||
ggValueID = v.ID
|
||||
@@ -754,40 +762,16 @@ func filterSensitiveWord(name string) (result string) {
|
||||
}
|
||||
|
||||
func buildUpdateSkusParam(storeSku *dao.StoreSkuSyncInfo, v *dao.StoreSkuSyncInfo, isCreate bool) (updateSkusParam *jdshopapi.UpdateSkusParam, err error) {
|
||||
updateSkusParam = &jdshopapi.UpdateSkusParam{
|
||||
WareID: storeSku.JdsWareID,
|
||||
}
|
||||
attrIDs := make(map[string]int)
|
||||
attrs, err := api.JdShopAPI.FindAttrs(int(storeSku.VendorVendorCatID))
|
||||
for _, v := range attrs {
|
||||
if v.Name == "规格" {
|
||||
attrIDs[v.Name] = v.ID
|
||||
} else if v.Name == "类别" {
|
||||
attrIDs[v.Name] = v.ID
|
||||
}
|
||||
}
|
||||
var (
|
||||
ggValueID int64 //规格的属性id
|
||||
attrsPropSku []*jdshopapi.CreateSkuParamAttrs
|
||||
skus []*jdshopapi.UpdateSkusParamSkus
|
||||
multiPropSku []*jdshopapi.CreateSkuParamAttrs
|
||||
specQuality string
|
||||
)
|
||||
valuesSku, maxNo, _ := api.JdShopAPI.FindValuesByAttrId(attrIDs["规格"])
|
||||
specQuality := utils.Float64ToStr(float64(v.SpecQuality)) + v.SpecUnit
|
||||
for _, v := range valuesSku {
|
||||
if v.Name == specQuality {
|
||||
ggValueID = v.ID
|
||||
}
|
||||
updateSkusParam = &jdshopapi.UpdateSkusParam{
|
||||
WareID: storeSku.JdsWareID,
|
||||
}
|
||||
if ggValueID == 0 { //说明没有建这个规格,要建上
|
||||
catID, _ := api.JdShopAPI.SaveVenderAttrValue(specQuality, attrIDs["规格"], int(storeSku.VendorVendorCatID), maxNo+1)
|
||||
ggValueID = catID
|
||||
}
|
||||
attrSku := &jdshopapi.CreateSkuParamAttrs{
|
||||
AttrID: utils.Int2Str(attrIDs["规格"]),
|
||||
AttrValues: []string{utils.Int64ToStr(ggValueID)},
|
||||
}
|
||||
attrsPropSku = append(attrsPropSku, attrSku)
|
||||
sku := &jdshopapi.UpdateSkusParamSkus{
|
||||
WareID: storeSku.JdsWareID,
|
||||
JdPrice: jxutils.IntPrice2Standard(v.VendorPrice),
|
||||
@@ -795,17 +779,20 @@ func buildUpdateSkusParam(storeSku *dao.StoreSkuSyncInfo, v *dao.StoreSkuSyncInf
|
||||
Type2: "com.jd.pop.ware.ic.api.domain.Sku",
|
||||
OuterID: utils.Int2Str(v.SkuID),
|
||||
}
|
||||
sku.SaleAttrs = attrsPropSku
|
||||
if v.Status == model.SkuStatusNormal {
|
||||
//库存设置
|
||||
if v.StoreSkuStatus == model.SkuStatusNormal {
|
||||
sku.StockNum = "9999"
|
||||
} else {
|
||||
sku.StockNum = "0"
|
||||
}
|
||||
if !isCreate {
|
||||
result, err2 := api.JdShopAPI.FindSkuById(utils.Str2Int64(v.VendorSkuID))
|
||||
err = err2
|
||||
if specQuality != result.SaleAttrs[0].AttrValueAlias[0] {
|
||||
api.JdShopAPI.DeleteSku(utils.Str2Int64(v.VendorSkuID))
|
||||
//规格类别设置
|
||||
attrIDs := make(map[string]int)
|
||||
attrs, err := api.JdShopAPI.FindAttrs(int(storeSku.VendorVendorCatID))
|
||||
for _, v := range attrs {
|
||||
if v.Name == "规格" {
|
||||
attrIDs[v.Name] = v.ID
|
||||
} else if v.Name == "类别" {
|
||||
attrIDs[v.Name] = v.ID
|
||||
}
|
||||
}
|
||||
if attrIDs["类别"] != 0 {
|
||||
@@ -819,6 +806,58 @@ func buildUpdateSkusParam(storeSku *dao.StoreSkuSyncInfo, v *dao.StoreSkuSyncInf
|
||||
multiPropSku = append(multiPropSku, attrlb)
|
||||
}
|
||||
sku.MultiCateProps = multiPropSku
|
||||
if v.SpecUnit == model.SpecUnitNames[1] || v.SpecUnit == model.SpecUnitNames[2] {
|
||||
specQuality = strings.TrimRight(fmt.Sprintf("%.2f", float64(v.SpecQuality)), "0.") + v.SpecUnit
|
||||
} else {
|
||||
specQuality = utils.Float64ToStr(float64(v.SpecQuality)) + v.SpecUnit
|
||||
}
|
||||
valuesSku, maxNo, _ := api.JdShopAPI.FindValuesByAttrId(attrIDs["规格"])
|
||||
if isCreate {
|
||||
for _, vv := range valuesSku {
|
||||
if vv.Name == specQuality {
|
||||
ggValueID = vv.ID
|
||||
break
|
||||
}
|
||||
}
|
||||
if ggValueID == 0 { //说明没有建这个规格,要建上
|
||||
catID, _ := api.JdShopAPI.SaveVenderAttrValue(specQuality, attrIDs["规格"], int(storeSku.VendorVendorCatID), maxNo+1)
|
||||
ggValueID = catID
|
||||
}
|
||||
attrSku := &jdshopapi.CreateSkuParamAttrs{
|
||||
AttrID: utils.Int2Str(attrIDs["规格"]),
|
||||
AttrValues: []string{utils.Int64ToStr(ggValueID)},
|
||||
}
|
||||
attrsPropSku = append(attrsPropSku, attrSku)
|
||||
sku.SaleAttrs = attrsPropSku
|
||||
} else {
|
||||
vendorSku, err2 := api.JdShopAPI.FindSkuById(utils.Str2Int64(v.VendorSkuID))
|
||||
err = err2
|
||||
vendorAttrValue := vendorSku.SaleAttrs[0].AttrValueAlias[0]
|
||||
if v.Comment != "" {
|
||||
specQuality = v.Comment
|
||||
}
|
||||
if v.Comment != vendorAttrValue {
|
||||
err = api.JdShopAPI.UpdateWareSaleAttrvalueAlias(&jdshopapi.UpdateWareSaleAttrvalueAliasParam{
|
||||
WareID: v.JdsWareID,
|
||||
Props: []*jdshopapi.CreateSkuParamAttrs2{
|
||||
&jdshopapi.CreateSkuParamAttrs2{
|
||||
AttrID: vendorSku.SaleAttrs[0].AttrID,
|
||||
AttrValues: []string{vendorSku.SaleAttrs[0].AttrValues[0]},
|
||||
AttrValueAlias: []string{specQuality},
|
||||
Type: "com.jd.pop.ware.ic.api.domain.prop",
|
||||
Type2: "com.jd.pop.ware.ic.api.domain.Prop",
|
||||
},
|
||||
},
|
||||
})
|
||||
sku.SkuID = utils.Str2Int64(v.VendorSkuID)
|
||||
}
|
||||
attrSku := &jdshopapi.CreateSkuParamAttrs{
|
||||
AttrID: vendorSku.SaleAttrs[0].AttrID,
|
||||
AttrValues: []string{vendorSku.SaleAttrs[0].AttrValues[0]},
|
||||
}
|
||||
attrsPropSku = append(attrsPropSku, attrSku)
|
||||
sku.SaleAttrs = attrsPropSku
|
||||
}
|
||||
skus = append(skus, sku)
|
||||
updateSkusParam.Skus = skus
|
||||
return updateSkusParam, err
|
||||
|
||||
@@ -1423,7 +1423,7 @@ func GetMatterOrderStatus(ctx *jxcontext.Context, vendorOrderID string) (result
|
||||
var (
|
||||
db = dao.GetDB()
|
||||
)
|
||||
order, err := partner.CurOrderManager.LoadOrder(vendorOrderID, model.VendorIDJX)
|
||||
order, err := dao.GetSimpleOrder(db, vendorOrderID)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
@@ -5,6 +5,8 @@ import (
|
||||
"regexp"
|
||||
"strings"
|
||||
|
||||
"github.com/astaxie/beego"
|
||||
|
||||
"git.rosy.net.cn/baseapi/platformapi/mtwmapi"
|
||||
"git.rosy.net.cn/baseapi/utils"
|
||||
"git.rosy.net.cn/jx-callback/business/jxutils"
|
||||
@@ -246,7 +248,7 @@ func (p *PurchaseHandler) createOrUpdateStoreSkus(ctx *jxcontext.Context, storeI
|
||||
syncType = "更新商品"
|
||||
}
|
||||
for i, storeSku := range storeSkuList {
|
||||
isNeedUpdatePrice := isCreate //storeSku.SkuSyncStatus&( model.SyncFlagPriceMask| model.SyncFlagNewMask) != 0
|
||||
isNeedUpdatePrice := storeSku.SkuSyncStatus&(model.SyncFlagPriceMask|model.SyncFlagNewMask) != 0
|
||||
foodData := make(map[string]interface{})
|
||||
foodDataList[i] = foodData
|
||||
foodData[mtwmapi.KeyAppFoodCode] = utils.Int2Str(storeSku.SkuID)
|
||||
@@ -265,6 +267,9 @@ func (p *PurchaseHandler) createOrUpdateStoreSkus(ctx *jxcontext.Context, storeI
|
||||
foodData["unit"] = storeSku.Unit
|
||||
foodData["box_num"] = 1
|
||||
foodData["box_price"] = jxutils.IntPrice2Standard(storeSku.BoxFee)
|
||||
if beego.BConfig.RunMode == "jxgy" {
|
||||
foodData["common_attr_value"] = switchAttr(storeSku.VendorVendorCatID)
|
||||
}
|
||||
catCode := tryCatName2Code(storeSku.VendorCatID)
|
||||
if catCode != "" {
|
||||
foodData["category_code"] = catCode
|
||||
@@ -277,7 +282,11 @@ func (p *PurchaseHandler) createOrUpdateStoreSkus(ctx *jxcontext.Context, storeI
|
||||
if img2 == "" {
|
||||
img2 = storeSku.Img
|
||||
}
|
||||
foodData["picture"] = strings.Join(jxutils.BatchString2Slice(storeSku.Img, img2, storeSku.Img, storeSku.Img, storeSku.Img), ",")
|
||||
if storeSku.ImgMix != "" {
|
||||
foodData["picture"] = strings.Join(jxutils.BatchString2Slice(storeSku.ImgMix, img2, storeSku.ImgMix, storeSku.ImgMix, storeSku.ImgMix), ",")
|
||||
} else {
|
||||
foodData["picture"] = strings.Join(jxutils.BatchString2Slice(storeSku.Img, img2, storeSku.Img, storeSku.Img, storeSku.Img), ",")
|
||||
}
|
||||
} else {
|
||||
foodData["picture"] = strings.Join(jxutils.BatchString2Slice(storeSku.Img, storeSku.Img2), ",")
|
||||
}
|
||||
@@ -360,6 +369,28 @@ func (p *PurchaseHandler) DeleteStoreSkus(ctx *jxcontext.Context, storeID int, v
|
||||
return failedList, err
|
||||
}
|
||||
|
||||
func switchAttr(vendorCatID int64) (attrs string) {
|
||||
switch vendorCatID {
|
||||
case 200002727:
|
||||
return mtwmapi.MtwmSkuAttr200002727
|
||||
case 200001555:
|
||||
return mtwmapi.MtwmSkuAttr200001555
|
||||
case 200002728:
|
||||
return mtwmapi.MtwmSkuAttr200002728
|
||||
case 200001519, 200000592:
|
||||
return mtwmapi.MtwmSkuAttr200000592
|
||||
case 200002704, 200002731:
|
||||
return mtwmapi.MtwmSkuAttr200002731
|
||||
case 200002716:
|
||||
return mtwmapi.MtwmSkuAttr200002716
|
||||
case 200002667, 200002713, 200002670:
|
||||
return mtwmapi.MtwmSkuAttr200002670
|
||||
case 200002680:
|
||||
return mtwmapi.MtwmSkuAttr200002680
|
||||
}
|
||||
return attrs
|
||||
}
|
||||
|
||||
func stockCount2Mtwm(stock int) (mtwmStock string) {
|
||||
return utils.Int2Str(stock)
|
||||
}
|
||||
|
||||
@@ -395,7 +395,7 @@ enableElmStoreWrite = false
|
||||
enableMtwmStoreWrite = false
|
||||
enableWscStoreWrite = false
|
||||
enableYbStoreWrite = false
|
||||
enableJdShopWrite = false
|
||||
enableJdShopWrite = true
|
||||
|
||||
jdOrgCode = "320406"
|
||||
jdLoginName = "jd_jxcs1223"
|
||||
|
||||
@@ -199,6 +199,8 @@ func (c *SkuController) UpdateSkuName() {
|
||||
delete(payload, "exPrefix")
|
||||
delete(payload, "exPrefixBegin")
|
||||
delete(payload, "exPrefixEnd")
|
||||
delete(payload, "imgWaterMark")
|
||||
delete(payload, "exVendorID")
|
||||
retVal, err = cms.UpdateSkuName(params.Ctx, params.NameID, payload, params.IsExd)
|
||||
}
|
||||
return retVal, "", err
|
||||
@@ -403,9 +405,11 @@ func (c *SkuController) GetJdUpcCodeByName() {
|
||||
// @Description 批量设置商品额外前缀
|
||||
// @Param token header string true "认证token"
|
||||
// @Param nameIDs formData string true "商品nameIDs"
|
||||
// @Param exPrefix formData string true "商品额外前缀"
|
||||
// @Param exPrefix formData string false "商品额外前缀"
|
||||
// @Param fromDate formData string true "生效开始时间,格式 2006-01-01 "
|
||||
// @Param toDate formData string true "生效结束时间,格式 2006-01-01 "
|
||||
// @Param imgWaterMark formData string false "商品水印图"
|
||||
// @Param vendorID formData int true "平台ID"
|
||||
// @Param isAsync formData bool false "是否异步"
|
||||
// @Param isContinueWhenError formData bool false "单个同步失败是否继续,缺省false"
|
||||
// @Success 200 {object} controllers.CallResult
|
||||
@@ -415,7 +419,7 @@ func (c *SkuController) UpdateSkuNamesExPrefix() {
|
||||
c.callUpdateSkuNamesExPrefix(func(params *tSkuUpdateSkuNamesExPrefixParams) (retVal interface{}, errCode string, err error) {
|
||||
var skuIDList []int
|
||||
if err = jxutils.Strings2Objs(params.NameIDs, &skuIDList); err == nil {
|
||||
retVal, err = cms.UpdateSkuNamesExPrefix(params.Ctx, skuIDList, params.ExPrefix, params.FromDate, params.ToDate, params.IsAsync, params.IsContinueWhenError)
|
||||
retVal, err = cms.UpdateSkuNamesExPrefix(params.Ctx, skuIDList, params.ImgWaterMark, params.VendorID, params.ExPrefix, params.FromDate, params.ToDate, params.IsAsync, params.IsContinueWhenError)
|
||||
}
|
||||
return retVal, "", err
|
||||
})
|
||||
@@ -479,3 +483,27 @@ func (c *SkuController) RefreshJdDepot() {
|
||||
return retVal, "", err
|
||||
})
|
||||
}
|
||||
|
||||
// @Title 批量设置商品额外信息
|
||||
// @Description 批量设置商品额外信息
|
||||
// @Param token header string true "认证token"
|
||||
// @Param nameIDs formData string true "商品nameIDs"
|
||||
// @Param exPrefix formData string false "商品额外前缀"
|
||||
// @Param fromDate formData string true "生效开始时间,格式 2006-01-01 "
|
||||
// @Param toDate formData string true "生效结束时间,格式 2006-01-01 "
|
||||
// @Param imgWaterMark formData string false "商品水印图"
|
||||
// @Param vendorID formData int true "平台ID"
|
||||
// @Param isAsync formData bool false "是否异步"
|
||||
// @Param isContinueWhenError formData bool false "单个同步失败是否继续,缺省false"
|
||||
// @Success 200 {object} controllers.CallResult
|
||||
// @Failure 200 {object} controllers.CallResult
|
||||
// @router /UpdateSkuExinfoMap [put]
|
||||
func (c *SkuController) UpdateSkuExinfoMap() {
|
||||
c.callUpdateSkuExinfoMap(func(params *tSkuUpdateSkuExinfoMapParams) (retVal interface{}, errCode string, err error) {
|
||||
var skuIDList []int
|
||||
if err = jxutils.Strings2Objs(params.NameIDs, &skuIDList); err == nil {
|
||||
retVal, err = cms.UpdateSkuExinfoMap(params.Ctx, skuIDList, params.ImgWaterMark, params.VendorID, params.ExPrefix, params.FromDate, params.ToDate, params.IsAsync, params.IsContinueWhenError)
|
||||
}
|
||||
return retVal, "", err
|
||||
})
|
||||
}
|
||||
|
||||
@@ -42,6 +42,7 @@ type StoreController struct {
|
||||
// @Param orderCountTo query int false "订单量结束"
|
||||
// @Param marketManPhone query string false "市场负责人电话"
|
||||
// @Param briefLevel query int false "返回信息精简模式"
|
||||
// @Param storeLevels query string false "门店等级"
|
||||
// @Param offset query int false "门店列表起始序号(以0开始,缺省为0)"
|
||||
// @Param pageSize query int false "门店列表页大小(缺省为50,-1表示全部)"
|
||||
// @Success 200 {object} controllers.CallResult
|
||||
|
||||
@@ -1088,3 +1088,18 @@ func (c *OrderController) SendJdwlForJdsOrder() {
|
||||
return retVal, "", err
|
||||
})
|
||||
}
|
||||
|
||||
// @Title 手动拉取京东商城订单
|
||||
// @Description 手动拉取京东商城订单
|
||||
// @Param token header string true "认证token"
|
||||
// @Param fromTime formData string true "订单起始时间"
|
||||
// @Param toTime formData string true "订单结束时间"
|
||||
// @Success 200 {object} controllers.CallResult
|
||||
// @Failure 200 {object} controllers.CallResult
|
||||
// @router /SaveJdsOrders [post]
|
||||
func (c *OrderController) SaveJdsOrders() {
|
||||
c.callSaveJdsOrders(func(params *tOrderSaveJdsOrdersParams) (retVal interface{}, errCode string, err error) {
|
||||
err = orderman.SaveJdsOrders(params.Ctx, utils.Str2Time(params.FromTime), utils.Str2Time(params.ToTime))
|
||||
return retVal, "", err
|
||||
})
|
||||
}
|
||||
|
||||
@@ -35,6 +35,7 @@ func Init() {
|
||||
orm.RegisterModel(&model.StoreSkuAudit{})
|
||||
orm.RegisterModel(&model.SkuCategory{})
|
||||
orm.RegisterModel(&model.ThingMap{})
|
||||
orm.RegisterModel(&model.SkuExinfoMap{})
|
||||
|
||||
orm.RegisterModel(&model.AuthBind{}, &model.User{})
|
||||
|
||||
|
||||
5
main.go
5
main.go
@@ -143,8 +143,11 @@ func main() {
|
||||
if err := tasks.RefreshYilianyunToken(); err != nil {
|
||||
globals.SugarLogger.Errorf("RefreshYilianyunToken failed with error:%s", err)
|
||||
return
|
||||
}
|
||||
|
||||
}
|
||||
// if globals.IsProductEnv() {
|
||||
// orderman.SaveJdsOrders(nil, time.Now().Add(-2*time.Hour), time.Now())
|
||||
// }
|
||||
orderman.LoadPendingOrders()
|
||||
|
||||
// 延时的原因是等回调准备好
|
||||
|
||||
@@ -2816,5 +2816,4 @@ func init() {
|
||||
MethodParams: param.Make(),
|
||||
Filters: nil,
|
||||
Params: nil})
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user