解决冲突

This commit is contained in:
qidongsheng
2020-06-22 09:49:38 +08:00
43 changed files with 1295 additions and 317 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -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) { //删除

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -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 += `,

View File

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

View File

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

View File

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

View File

@@ -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"` // 打印字体-10正常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"` // 京东运营人电话

View File

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

View File

@@ -1 +1,7 @@
package jdeclp
import "git.rosy.net.cn/jx-callback/globals/testinit"
func init() {
testinit.Init()
}

View File

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

View File

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

View File

@@ -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 += `

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -395,7 +395,7 @@ enableElmStoreWrite = false
enableMtwmStoreWrite = false
enableWscStoreWrite = false
enableYbStoreWrite = false
enableJdShopWrite = false
enableJdShopWrite = true
jdOrgCode = "320406"
jdLoginName = "jd_jxcs1223"

View File

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

View File

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

View File

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

View File

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

View File

@@ -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()
// 延时的原因是等回调准备好

View File

@@ -2816,5 +2816,4 @@ func init() {
MethodParams: param.Make(),
Filters: nil,
Params: nil})
}