添加抖音授权登录,国美测试接口,修改运单重复骑手,添加推送骑手信息
This commit is contained in:
@@ -1,89 +1,91 @@
|
||||
package douyin
|
||||
//
|
||||
//import (
|
||||
// "git.rosy.net.cn/jx-callback/business/auth2/authprovider/weixin"
|
||||
//
|
||||
// "git.rosy.net.cn/baseapi/platformapi/weixinapi"
|
||||
// "git.rosy.net.cn/jx-callback/business/auth2"
|
||||
// "git.rosy.net.cn/jx-callback/business/auth2/authprovider"
|
||||
// "git.rosy.net.cn/jx-callback/business/model"
|
||||
// "git.rosy.net.cn/jx-callback/globals"
|
||||
// "git.rosy.net.cn/jx-callback/globals/api"
|
||||
//)
|
||||
//
|
||||
//const (
|
||||
// AuthTypeTiktokMini = "tiktokmini" // 抖音小程序
|
||||
//)
|
||||
//
|
||||
//type TiktopMiniAuther struct {
|
||||
// authprovider.DefAuther
|
||||
//}
|
||||
//
|
||||
//
|
||||
//var (
|
||||
// AutherObjMini *TiktopMiniAuther
|
||||
//)
|
||||
//
|
||||
//func init() {
|
||||
// AutherObjMini = new(TiktopMiniAuther)
|
||||
// auth2.RegisterAuther(AuthTypeTiktokMini, AutherObjMini)
|
||||
//}
|
||||
//
|
||||
//func (a *TiktopMiniAuther) VerifySecret(dummy, code string) (authBindEx *auth2.AuthBindEx, err error) {
|
||||
// globals.SugarLogger.Debugf("toktok mini VerifySecret jsCode:%s", code)
|
||||
//
|
||||
// sessionInfo, err := api.TiktokApi.GetTiktokToken(code)
|
||||
// if err == nil {
|
||||
// if authBindEx, err = a.UnionFindAuthBind(AuthTypeTiktokMini, api.TiktokApi.GetAppID(), []string{AuthTypeTiktokMini}, sessionInfo.Data.OpenId, sessionInfo.Data.UnionId, sessionInfo); err == nil {
|
||||
// authBindEx.UserData = sessionInfo.Data
|
||||
// }
|
||||
// }
|
||||
// return authBindEx, err
|
||||
//}
|
||||
//
|
||||
//// 特殊接口
|
||||
//func (a *TiktopMiniAuther) DecryptData(authInfo *auth2.AuthInfo, jsCode, encryptedData, iv string) (decryptedDataBase64 string, err error) {
|
||||
// globals.SugarLogger.Debugf("weixin mini DecryptData jsCode:%s, encryptedData:%s, iv:%s", jsCode, encryptedData, iv)
|
||||
// var sessionKey string
|
||||
// appID, jsCode := weixin.SplitJsCode(jsCode)
|
||||
// if jsCode != "" {
|
||||
// sessionInfo, err := getWxApp(appID).SNSCode2Session(jsCode)
|
||||
// if err == nil {
|
||||
// // if authBindEx, err := a.UnionFindAuthBind(AuthTypeMini, getWxApp(appID).GetAppID(), []string{AuthTypeMini}, sessionInfo.OpenID, "", nil); err == nil {
|
||||
// // if authBindEx.UserID != authInfo.GetID() {
|
||||
// // return "", fmt.Errorf("jsCode与token不匹配")
|
||||
// // }
|
||||
// // } else {
|
||||
// // return "", err
|
||||
// // }
|
||||
// sessionKey = sessionInfo.SessionKey
|
||||
// } else {
|
||||
// return "", err
|
||||
// }
|
||||
// } else {
|
||||
// if authInfo.AuthBindInfo.Type != AuthTypeTiktokMini {
|
||||
// // return "", ErrAuthTypeShouldBeMini
|
||||
// }
|
||||
// sessionKey = authInfo.AuthBindInfo.UserData.(string)
|
||||
// }
|
||||
// decryptedData, err := weixinapi.SNSDecodeMiniProgramData(encryptedData, sessionKey, iv)
|
||||
// if err != nil {
|
||||
// return "", err
|
||||
// }
|
||||
// return string(decryptedData), nil
|
||||
//}
|
||||
//
|
||||
//func (a *TiktopMiniAuther) GetUserType() (userType int8) {
|
||||
// return model.UserTypeStoreBoss
|
||||
//}
|
||||
//
|
||||
//func getWxApp(appID string) (miniApi *weixinapi.API) {
|
||||
// miniApi = api.WeixinMiniAPI
|
||||
// if len(appID) > 0 && appID == api.WeixinMiniAppID2 {
|
||||
// miniApi = api.WeixinMiniAPI2
|
||||
// }
|
||||
// if len(appID) > 0 && appID == api.WeixinMiniAppIDsc {
|
||||
// miniApi = api.WeixinMiniAPIsc
|
||||
// }
|
||||
// return miniApi
|
||||
//}
|
||||
|
||||
import (
|
||||
"git.rosy.net.cn/jx-callback/business/auth2/authprovider/weixin"
|
||||
|
||||
"git.rosy.net.cn/baseapi/platformapi/weixinapi"
|
||||
"git.rosy.net.cn/jx-callback/business/auth2"
|
||||
"git.rosy.net.cn/jx-callback/business/auth2/authprovider"
|
||||
"git.rosy.net.cn/jx-callback/business/model"
|
||||
"git.rosy.net.cn/jx-callback/globals"
|
||||
"git.rosy.net.cn/jx-callback/globals/api"
|
||||
)
|
||||
|
||||
const (
|
||||
AuthTypeTiktokMini = "tiktokmini" // 抖音小程序
|
||||
)
|
||||
|
||||
type TiktopMiniAuther struct {
|
||||
authprovider.DefAuther
|
||||
}
|
||||
|
||||
var (
|
||||
AutherObjMini *TiktopMiniAuther
|
||||
)
|
||||
|
||||
func init() {
|
||||
AutherObjMini = new(TiktopMiniAuther)
|
||||
auth2.RegisterAuther(AuthTypeTiktokMini, AutherObjMini)
|
||||
}
|
||||
|
||||
func (a *TiktopMiniAuther) VerifySecret(dummy, code string) (authBindEx *auth2.AuthBindEx, err error) {
|
||||
globals.SugarLogger.Debugf("toktok mini VerifySecret jsCode:%s", code)
|
||||
|
||||
sessionInfo, err := api.TiktokApi.GetTiktokToken2(code)
|
||||
if err == nil {
|
||||
sessionKey := sessionInfo.Data.SessionKey
|
||||
sessionInfo.Data.SessionKey = ""
|
||||
if authBindEx, err = a.UnionFindAuthBind(AuthTypeTiktokMini, api.TiktokApi.GetAppID(), []string{AuthTypeTiktokMini}, sessionInfo.Data.OpenId, sessionInfo.Data.Unionid, sessionInfo); err == nil {
|
||||
authBindEx.UserData = sessionKey
|
||||
}
|
||||
}
|
||||
|
||||
return authBindEx, err
|
||||
}
|
||||
|
||||
// 特殊接口
|
||||
func (a *TiktopMiniAuther) DecryptData(authInfo *auth2.AuthInfo, jsCode, encryptedData, iv string) (decryptedDataBase64 string, err error) {
|
||||
globals.SugarLogger.Debugf("weixin mini DecryptData jsCode:%s, encryptedData:%s, iv:%s", jsCode, encryptedData, iv)
|
||||
var sessionKey string
|
||||
appID, jsCode := weixin.SplitJsCode(jsCode)
|
||||
if jsCode != "" {
|
||||
sessionInfo, err := getWxApp(appID).SNSCode2Session(jsCode)
|
||||
if err == nil {
|
||||
// if authBindEx, err := a.UnionFindAuthBind(AuthTypeMini, getWxApp(appID).GetAppID(), []string{AuthTypeMini}, sessionInfo.OpenID, "", nil); err == nil {
|
||||
// if authBindEx.UserID != authInfo.GetID() {
|
||||
// return "", fmt.Errorf("jsCode与token不匹配")
|
||||
// }
|
||||
// } else {
|
||||
// return "", err
|
||||
// }
|
||||
sessionKey = sessionInfo.SessionKey
|
||||
} else {
|
||||
return "", err
|
||||
}
|
||||
} else {
|
||||
if authInfo.AuthBindInfo.Type != AuthTypeTiktokMini {
|
||||
// return "", ErrAuthTypeShouldBeMini
|
||||
}
|
||||
sessionKey = authInfo.AuthBindInfo.UserData.(string)
|
||||
}
|
||||
decryptedData, err := weixinapi.SNSDecodeMiniProgramData(encryptedData, sessionKey, iv)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
return string(decryptedData), nil
|
||||
}
|
||||
|
||||
func (a *TiktopMiniAuther) GetUserType() (userType int8) {
|
||||
return model.UserTypeStoreBoss
|
||||
}
|
||||
|
||||
func getWxApp(appID string) (miniApi *weixinapi.API) {
|
||||
miniApi = api.WeixinMiniAPI
|
||||
if len(appID) > 0 && appID == api.WeixinMiniAppID2 {
|
||||
miniApi = api.WeixinMiniAPI2
|
||||
}
|
||||
if len(appID) > 0 && appID == api.WeixinMiniAppIDsc {
|
||||
miniApi = api.WeixinMiniAPIsc
|
||||
}
|
||||
return miniApi
|
||||
}
|
||||
|
||||
@@ -35,12 +35,13 @@ func (c *BaseScheduler) CreateWaybillOnProviders(ctx *jxcontext.Context, order *
|
||||
courierVendorIDMap := jxutils.IntList2Map(courierVendorIDs)
|
||||
excludeCourierVendorIDMap := jxutils.IntList2Map(excludeCourierVendorIDs)
|
||||
errList := errlist.New()
|
||||
|
||||
for _, storeCourier := range storeCourierList {
|
||||
if (courierVendorIDs == nil || courierVendorIDMap[storeCourier.VendorID] == 1) &&
|
||||
(excludeCourierVendorIDs == nil || excludeCourierVendorIDMap[storeCourier.VendorID] == 0) {
|
||||
if handler := partner.GetDeliveryPlatformFromVendorID(storeCourier.VendorID); handler != nil && handler.Use4CreateWaybill {
|
||||
courierVendorID := storeCourier.VendorID
|
||||
// 创建订单
|
||||
// 创建运单
|
||||
bill, err2 := c.CreateWaybill(courierVendorID, order, maxDeliveryFee)
|
||||
if err = err2; err == nil {
|
||||
globals.SugarLogger.Debugf("CreateWaybillOnProviders orderID:%s userName:%s vendorID:%d bill:%v", order.VendorOrderID, userName, courierVendorID, bill)
|
||||
|
||||
@@ -591,7 +591,7 @@ func (s *DefScheduler) OnWaybillStatusChanged(bill *model.Waybill, isPending boo
|
||||
globals.SugarLogger.Infof("OnWaybillStatusChanged orderID:%s purchase platform waybill arrvied later, may cause problem", order.VendorOrderID)
|
||||
}
|
||||
s.updateOrderByBill(order, bill, false)
|
||||
// 转自送
|
||||
// 取消三方平台
|
||||
s.cancelOtherWaybillsCheckOrderDeliveryFlag(savedOrderInfo, bill, partner.CancelWaybillReasonNotAcceptIntime, partner.CancelWaybillReasonStrNotAcceptIntime)
|
||||
//若接单时间不在门店的营业时间范围内要取消运单
|
||||
s.cancelWaybillNotInStoreOpentime(savedOrderInfo, bill)
|
||||
@@ -623,6 +623,7 @@ func (s *DefScheduler) OnWaybillStatusChanged(bill *model.Waybill, isPending boo
|
||||
s.ProxyCancelWaybill(order, bill, partner.CancelWaybillReasonNotAcceptIntime, partner.CancelWaybillReasonStrNotAcceptIntime)
|
||||
s.SelfDeliverDelivered(order, "自送或三方")
|
||||
}
|
||||
// 判断订单来源与运单是否为同一来源
|
||||
if model.IsWaybillPlatformOwn(bill) {
|
||||
if bill.Status == model.WaybillStatusDelivering && order.Status < model.OrderStatusEndBegin {
|
||||
// 强制将订单状态置为配送中?
|
||||
@@ -630,10 +631,14 @@ func (s *DefScheduler) OnWaybillStatusChanged(bill *model.Waybill, isPending boo
|
||||
partner.CurOrderManager.UpdateOrderStatusAndDeliveryFlag(order)
|
||||
}
|
||||
} else {
|
||||
// 判断订单是否为自送
|
||||
if model.IsOrderDeliveryByStore(savedOrderInfo.order) {
|
||||
// 转自送失败,取消三方配送
|
||||
if err := s.SelfDeliverDelivering(savedOrderInfo.order, bill.CourierMobile); err != nil {
|
||||
s.ProxyCancelWaybill(order, bill, partner.CancelWaybillReasonNotAcceptIntime, partner.CancelWaybillReasonStrSwitch2SelfFailed)
|
||||
if err := s.SelfDeliverDelivering(order, bill.CourierMobile); err != nil {
|
||||
if err := s.ProxyCancelWaybill(order, bill, partner.CancelWaybillReasonNotAcceptIntime, partner.CancelWaybillReasonStrSwitch2SelfFailed); err != nil {
|
||||
// 如果转自送失败,且取消三方失败,循环多次转自送
|
||||
s.swtich2SelfDeliverWithRetry(savedOrderInfo, bill, switch2SelfDeliverRetryCount, switch2SelfDeliverRetryGap)
|
||||
}
|
||||
partner.CurOrderManager.OnOrderMsg(order, "自送出设置失败", err.Error())
|
||||
}
|
||||
s.notify3rdPartyWaybill(order, bill, isBillAlreadyCandidate)
|
||||
@@ -980,7 +985,8 @@ func (s *DefScheduler) cancelOtherWaybills(savedOrderInfo *WatchOrderInfo, bill2
|
||||
if err == nil {
|
||||
err = err2
|
||||
}
|
||||
partner.CurOrderManager.OnOrderMsg(savedOrderInfo.order, "取消三方运单失败", err2.Error())
|
||||
partner.CurOrderManager.OnOrderMsg(savedOrderInfo.order, ""+
|
||||
"", err2.Error())
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
292
business/jxstore/cms/order_excel.go
Normal file
292
business/jxstore/cms/order_excel.go
Normal file
@@ -0,0 +1,292 @@
|
||||
package cms
|
||||
//
|
||||
//import (
|
||||
// "encoding/json"
|
||||
// "errors"
|
||||
// "fmt"
|
||||
// "git.rosy.net.cn/baseapi/utils"
|
||||
// "git.rosy.net.cn/jx-callback/business/jxutils/jxcontext"
|
||||
// "git.rosy.net.cn/jx-callback/business/jxutils/tasksch"
|
||||
// "git.rosy.net.cn/jx-callback/business/model"
|
||||
// "git.rosy.net.cn/jx-callback/business/model/dao"
|
||||
// "git.rosy.net.cn/jx-callback/business/partner/purchase/jx/localjx"
|
||||
// "github.com/360EntSecGroup-Skylar/excelize"
|
||||
// "io"
|
||||
// "mime/multipart"
|
||||
// "strings"
|
||||
//)
|
||||
//
|
||||
//// 根据excel新增待拣货订单
|
||||
//func CreateOrderByExcel(ctx *jxcontext.Context, files []*multipart.FileHeader) (hint string, err error) {
|
||||
// if len(files) == 0 {
|
||||
// return "", errors.New("没有文件上传!")
|
||||
// }
|
||||
// fileHeader := files[0]
|
||||
// file, err := fileHeader.Open()
|
||||
// hint, err = RefreshJxPriceByExcelBin(ctx, file, true, true)
|
||||
// file.Close()
|
||||
// return hint, err
|
||||
//}
|
||||
//
|
||||
//type CreateOrderByExcelStore struct {
|
||||
// BuyerComment int // 备注
|
||||
// StoreID int // 门店id
|
||||
// Skus int // 商品列表
|
||||
// ExpectedDeliveredTimestamp int // 预期送达时间
|
||||
// TotalPrice int // 总价格
|
||||
// FreightPrice int // 运费
|
||||
// OrderPrice int // 订单价格
|
||||
// ActualPayPrice int // 顾客实际支付
|
||||
// OrderID int // 订单id
|
||||
// StoreName int // 门店名称
|
||||
// Weight int // 重量
|
||||
// FromStoreID int // 物料ID
|
||||
// EarningType int // 结算方式(1为报价,2为扣点),0无
|
||||
// OrderType int // 订单类型
|
||||
// IsBuyNowPrice int // 守价的值只有0和1
|
||||
// IsPriceDefend int
|
||||
// OrderID2 int
|
||||
// UserID int // 用户id
|
||||
// AddressID int // 收货地址id
|
||||
// CreateType int // "创建类型, 0:预创建, 1:创建"
|
||||
// IsDeliverySelf int // 自提
|
||||
//}
|
||||
//
|
||||
//// 赋值excel表字段排序
|
||||
//func SortExcelTable() *CreateOrderByExcelStore {
|
||||
// return &CreateOrderByExcelStore{
|
||||
// StoreID: 1,
|
||||
// StoreName: 2,
|
||||
// UserID: 3,
|
||||
// AddressID: 4,
|
||||
// Skus: 5,
|
||||
// Weight: 6,
|
||||
// TotalPrice: 7,
|
||||
// FreightPrice: 8,
|
||||
// OrderPrice: 9,
|
||||
// ActualPayPrice: 10,
|
||||
// ExpectedDeliveredTimestamp: 11,
|
||||
// OrderType: 12,
|
||||
// FromStoreID: 13,
|
||||
// EarningType: 14,
|
||||
// BuyerComment: 15,
|
||||
//
|
||||
// CreateType: 16,
|
||||
// IsDeliverySelf: 17,
|
||||
// IsPriceDefend: 18,
|
||||
// IsBuyNowPrice: 19,
|
||||
// OrderID: 20,
|
||||
// OrderID2: 21,
|
||||
// }
|
||||
//}
|
||||
//
|
||||
//// 订单结构体
|
||||
//type ExcelOrderStruct struct {
|
||||
// BuyerComment string `json:"buyerComment"` // 备注
|
||||
// StoreID int `json:"storeID"`
|
||||
// Skus []*JxSkuInfo `json:"skus"`
|
||||
// ExpectedDeliveredTimestamp int64 `json:"expectedDeliveredTimestamp"` // 预期送达时间
|
||||
// TotalPrice int64 `json:"totalPrice"` // 单位为分 订单总价
|
||||
// FreightPrice int64 `json:"freightPrice"` // 单位为分 订单配送费
|
||||
// OrderPrice int64 `json:"orderPrice"` // 单位为分 订单商品价格
|
||||
// ActualPayPrice int64 `json:"actualPayPrice"` // 单位为分 顾客实际支付
|
||||
// OrderID int64 `json:"orderID"`
|
||||
// StoreName string `json:"storeName"`
|
||||
// Weight int `json:"weight"`
|
||||
// FromStoreID int `json:"fromStoreID"` //
|
||||
// EarningType int `json:"earningType"`
|
||||
// OrderType int `json:"orderType"`
|
||||
// IsBuyNowPrice int `json:"isBuyNowPrice"`
|
||||
// IsPriceDefend int `json:"isPriceDefend"`
|
||||
// OrderID2 string `json:"-"` // 订单id2
|
||||
// UserID string `json:"userID"` // 用户id
|
||||
// AddressId int64 `json:"address_id"` // 地址id
|
||||
//}
|
||||
//
|
||||
//// 商品列表
|
||||
//type JxSkuInfo struct {
|
||||
// SkuID int `json:"skuID"`
|
||||
// Count int `json:"count"`
|
||||
// Price int64 `json:"price,omitempty"` // 原价
|
||||
// SalePrice int64 `json:"salePrice,omitempty"` // 售卖价
|
||||
// Name string `json:"name"`
|
||||
// Weight int `json:"weight"`
|
||||
// GroupSign bool `json:"groupSign"`
|
||||
// DefendPrice int64 `json:"defendPrice"` //守价
|
||||
//}
|
||||
//
|
||||
//// 解析excel到订单结构体当中
|
||||
//func GetCellIntoOrder(rowNum int, row []string, sheetParam *CreateOrderByExcelStore, order *ExcelOrderStruct, nameMap map[string]string) (errMsg string) {
|
||||
// address := make(map[string]int64, 0)
|
||||
// for k, cell := range row {
|
||||
// switch k {
|
||||
// case sheetParam.StoreID:
|
||||
// order.StoreID = utils.Str2Int(cell)
|
||||
// case sheetParam.StoreName:
|
||||
// order.StoreName = cell
|
||||
// case sheetParam.UserID:
|
||||
// order.UserID = cell
|
||||
// case sheetParam.AddressID:
|
||||
// order.AddressId = utils.Str2Int64(cell)
|
||||
// case sheetParam.Skus:
|
||||
// shop := make([]*JxSkuInfo, 0, 0)
|
||||
// if err := json.Unmarshal([]byte(cell), shop); err != nil {
|
||||
// return fmt.Sprintf("解析excel文档用户商品列表错,检查数据格式是否正确")
|
||||
// }
|
||||
// order.Skus = shop
|
||||
// case sheetParam.Weight:
|
||||
// order.Weight = utils.Str2Int(cell)
|
||||
// case sheetParam.TotalPrice:
|
||||
// order.TotalPrice = utils.Str2Int64(cell)
|
||||
// case sheetParam.FreightPrice:
|
||||
// order.FreightPrice = utils.Str2Int64(cell)
|
||||
// case sheetParam.OrderPrice:
|
||||
// order.OrderPrice = utils.Str2Int64(cell)
|
||||
// case sheetParam.ActualPayPrice:
|
||||
// order.ActualPayPrice = utils.Str2Int64(cell)
|
||||
// case :
|
||||
//
|
||||
//
|
||||
//
|
||||
// }
|
||||
//
|
||||
// if k == sheetParam.SkuNameIDCol {
|
||||
// cellReplace := strings.ReplaceAll(cell, ",", ",")
|
||||
// if cellReplace != "" {
|
||||
// if cellReplace[len(cellReplace)-1:len(cellReplace)] == "," {
|
||||
// cellReplace = cellReplace[0 : len(cellReplace)-1]
|
||||
// }
|
||||
// nameIDs := strings.Split(cellReplace, ",")
|
||||
// for _, v := range nameIDs {
|
||||
// if nameMap[v] != "" {
|
||||
// return fmt.Sprintf(" Excel中含有重复的nameID![%v]列,[%v]行,nameID [%v]\n", k+1, rowNum+1, v)
|
||||
// } else {
|
||||
// nameMap[v] = v
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// storeSkuNamePrice.NameIDGroup = cellReplace
|
||||
// }
|
||||
// if k == sheetParam.SkuPriceCol {
|
||||
// if IsChineseChar(cell) {
|
||||
// return fmt.Sprintf("Excel格式排版发生了变化!在[%v]列,[%v]行附近可能增加或减少了一列", k+1, rowNum+1)
|
||||
// }
|
||||
// storeSkuNamePrice.Price = int(utils.Float64TwoInt64(utils.Str2Float64(cell) * 100))
|
||||
// }
|
||||
// if k == sheetParam.SkuUnitCol {
|
||||
// storeSkuNamePrice.Unit = cell
|
||||
// }
|
||||
// }
|
||||
// return errMsg
|
||||
//}
|
||||
//
|
||||
//func AnalysisExcelOrder(ctx *jxcontext.Context, reader io.Reader, isAsync, isContinueWhenError bool) {
|
||||
// excelSort := SortExcelTable()
|
||||
// taskSeqFunc := func(task *tasksch.SeqTask, step int, params ...interface{}) (result interface{}, err error) {
|
||||
// switch step {
|
||||
// case 0:
|
||||
// xlsx, err := excelize.OpenReader(reader)
|
||||
// if err != nil {
|
||||
// return "", err
|
||||
// }
|
||||
// rows, _ := xlsx.GetRows(xlsx.GetSheetName(1))
|
||||
// for rowNum, row := range rows {
|
||||
// if rowNum < model.YES { // 第一行跳过
|
||||
// continue
|
||||
// }
|
||||
// storeSkuNamePrice := &localjx.JxOrderInfo{}
|
||||
// errMsg += GetCellIntoStruct(rowNum, row, excelSort, storeSkuNamePrice, nameMap)
|
||||
// storeSkuNamePriceList = append(storeSkuNamePriceList, storeSkuNamePrice)
|
||||
// }
|
||||
// if errMsg != "" {
|
||||
// return "", errors.New(errMsg)
|
||||
// } else {
|
||||
// isErr = true
|
||||
// }
|
||||
// case 1:
|
||||
// db := dao.GetDB()
|
||||
// storeSkuNamePriceListOrg, _ := dao.GetStoreSkuNamePrice(db)
|
||||
// CreateOrUpdateStoreSkuNamePriceByExcel(db, ctx, storeSkuNamePriceList, storeSkuNamePriceListOrg)
|
||||
// storeSkuNamePriceListNew, _ := dao.GetStoreSkuNamePrice(db)
|
||||
// storeSkuNamePriceMapNew := StoreSkuNamePriceList2Map(ctx, storeSkuNamePriceListNew)
|
||||
// for _, v := range storeSkuNamePriceList {
|
||||
// if storeSkuNamePriceMapNew[v.OutSkuID] != nil {
|
||||
// storeSkuNamePriceListUpdate = append(storeSkuNamePriceListUpdate, storeSkuNamePriceMapNew[v.OutSkuID])
|
||||
// }
|
||||
// }
|
||||
// taskFunc := func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
|
||||
// storeSkuNamePrice := batchItemList[0].(*model.StoreSkuNamePrice)
|
||||
// var skuBindInfos []*StoreSkuBindInfo
|
||||
// nameIDGroup := strings.Split(storeSkuNamePrice.NameIDGroup, ",")
|
||||
// for _, v := range nameIDGroup {
|
||||
// if v != "" {
|
||||
// nameID := int(utils.Str2Int64(v))
|
||||
// for _, vv := range storeIDs {
|
||||
// skuList, err2 := dao.GetStoreSkusByNameIDs(db, []int{vv}, nameID)
|
||||
// err = err2
|
||||
// if len(skuList) > 0 {
|
||||
// unitPrice := 0
|
||||
// if skuList[0].Unit == model.UnitNames[0] {
|
||||
// if storeSkuNamePrice.Unit == "KG" {
|
||||
// unitPrice = storeSkuNamePrice.Price / 2
|
||||
// } else {
|
||||
// unitPrice = storeSkuNamePrice.Price
|
||||
// }
|
||||
// } else {
|
||||
// unitPrice = storeSkuNamePrice.Price
|
||||
// }
|
||||
// storeSkuBindInfo := &StoreSkuBindInfo{
|
||||
// NameID: nameID,
|
||||
// UnitPrice: unitPrice,
|
||||
// }
|
||||
// skuBindInfos = append(skuBindInfos, storeSkuBindInfo)
|
||||
// outSuccess := DataSuccess{
|
||||
// NameID: nameID,
|
||||
// Name: skuList[0].Name,
|
||||
// Unit: storeSkuNamePrice.Unit,
|
||||
// OrgPrice: utils.Str2Float64(utils.Int64ToStr(skuList[0].UnitPrice)) / 100,
|
||||
// NowPrice: utils.Str2Float64(utils.Int64ToStr(int64(unitPrice))) / 100,
|
||||
// MixPrice: utils.Str2Float64(utils.Int64ToStr(int64(unitPrice)-skuList[0].UnitPrice)) / 100,
|
||||
// }
|
||||
// dataLock.AppendDataSuccess(outSuccess)
|
||||
// } else {
|
||||
// //京西xx门店没有关注该商品
|
||||
// outFailed := DataFailed{
|
||||
// NameID: nameID,
|
||||
// Name: storeSkuNamePrice.Name,
|
||||
// Comment: fmt.Sprintf("京西[%v]门店没有关注该商品,商品nameID[%v],Excel上商品名[%v]", vv, nameID, storeSkuNamePrice.Name),
|
||||
// }
|
||||
// dataLock.AppendDataFailed(outFailed)
|
||||
// }
|
||||
// }
|
||||
// } else {
|
||||
// //nameID为空,还未填写nameID
|
||||
// outFailed := DataFailed{
|
||||
// NameID: 0,
|
||||
// Name: storeSkuNamePrice.Name,
|
||||
// Comment: fmt.Sprintf("商品nameID为空!,还未填写商品nameID,Excel上商品名[%v]", storeSkuNamePrice.Name),
|
||||
// }
|
||||
// dataLock.AppendDataFailed(outFailed)
|
||||
// }
|
||||
// }
|
||||
// retVal = skuBindInfos
|
||||
// return retVal, err
|
||||
// }
|
||||
// taskParallel := tasksch.NewParallelTask("刷新京西价", tasksch.NewParallelConfig().SetIsContinueWhenError(isContinueWhenError), ctx, taskFunc, storeSkuNamePriceListUpdate)
|
||||
// tasksch.HandleTask(taskParallel, task, true).Run()
|
||||
// skuBindInfosInter, err = taskParallel.GetResult(0)
|
||||
// case 2:
|
||||
// //更新京西价
|
||||
// for _, v := range skuBindInfosInter {
|
||||
// skuBindInfoList = append(skuBindInfoList, v.(*StoreSkuBindInfo))
|
||||
// }
|
||||
// if isErr {
|
||||
// UpdateStoresSkus(ctx, 0, storeIDs, skuBindInfoList, false, false, isAsync, isContinueWhenError)
|
||||
// }
|
||||
// case 3:
|
||||
// //写Excel
|
||||
// WriteToExcelJx(task, dataLock.dataSuccessList, dataLock.dataFailedList)
|
||||
// }
|
||||
// return result, err
|
||||
// }
|
||||
//}
|
||||
@@ -740,7 +740,7 @@ func GetVendorStore(ctx *jxcontext.Context, vendorID int, vendorOrgCode, vendorS
|
||||
return nil, err
|
||||
}
|
||||
if handler := CurVendorSync.GetStoreHandler(vendorID); handler != nil {
|
||||
result, err2 := handler.ReadStore(ctx, vendorOrgCode, vendorStoreID)
|
||||
result, err2 := handler.ReadStore(ctx, vendorOrgCode, vendorStoreID, "")
|
||||
if err = err2; err == nil {
|
||||
retVal = &StoreExt{
|
||||
Store: result.Store,
|
||||
@@ -1361,7 +1361,7 @@ func AddStoreVendorMap(ctx *jxcontext.Context, db *dao.DaoDB, vendorID int, vend
|
||||
}
|
||||
if handler := CurVendorSync.GetStoreHandler(vendorID); handler != nil {
|
||||
if vendorOrgCode != globals.Mtwm2Code {
|
||||
store, err2 := handler.ReadStore(ctx, vendorOrgCode, storeMap.VendorStoreID)
|
||||
store, err2 := handler.ReadStore(ctx, vendorOrgCode, storeMap.VendorStoreID, storeMap.VendorStoreName)
|
||||
if err = err2; err == nil || storeMap.IsSync == 0 {
|
||||
if store != nil {
|
||||
storeMap.DeliveryType = store.DeliveryType
|
||||
@@ -1398,7 +1398,7 @@ func AddStoreVendorMap(ctx *jxcontext.Context, db *dao.DaoDB, vendorID int, vend
|
||||
storeMap.SyncStatus = model.SyncFlagNewMask //京东商城要去建店
|
||||
} else {
|
||||
if handler := CurVendorSync.GetStoreHandler(vendorID); handler != nil {
|
||||
store, err2 := handler.ReadStore(ctx, vendorOrgCode, storeMap.VendorStoreID)
|
||||
store, err2 := handler.ReadStore(ctx, vendorOrgCode, storeMap.VendorStoreID,storeMap.VendorStoreName)
|
||||
if err = err2; err == nil || storeMap.IsSync == 0 {
|
||||
if store != nil {
|
||||
storeMap.Status = store.Status
|
||||
@@ -1567,7 +1567,7 @@ func UpdateStoreVendorMap(ctx *jxcontext.Context, db *dao.DaoDB, storeID, vendor
|
||||
|
||||
if vendorID != model.VendorIDJX && vendorID != model.VendorIDYB {
|
||||
if vendorStoreID := utils.Interface2String(valid["vendorStoreID"]); vendorStoreID != "" {
|
||||
vendorStoreInfo, err2 := storeHandler.ReadStore(ctx, storeMap.VendorOrgCode, vendorStoreID)
|
||||
vendorStoreInfo, err2 := storeHandler.ReadStore(ctx, storeMap.VendorOrgCode, vendorStoreID,storeMap.VendorStoreName)
|
||||
if err = err2; err == nil {
|
||||
valid["deliveryType"] = vendorStoreInfo.DeliveryType
|
||||
}
|
||||
@@ -2256,7 +2256,7 @@ func GetStoresVendorSnapshot(ctx *jxcontext.Context, parentTask tasksch.ITask, v
|
||||
storeMap := batchItemList[0].(*model.StoreMap)
|
||||
if model.IsVendorRemote(storeMap.VendorID) {
|
||||
if handler := partner.GetPurchasePlatformFromVendorID(storeMap.VendorID); handler != nil {
|
||||
store, err2 := handler.ReadStore(ctx, storeMap.VendorOrgCode, storeMap.VendorStoreID)
|
||||
store, err2 := handler.ReadStore(ctx, storeMap.VendorOrgCode, storeMap.VendorStoreID,storeMap.VendorStoreName)
|
||||
if err = err2; err == nil {
|
||||
retVal = []interface{}{&model.VendorStoreSnapshot{
|
||||
StoreID: storeMap.StoreID,
|
||||
@@ -2910,13 +2910,13 @@ func GetVendorStoreInfo(ctx *jxcontext.Context, vendorIDList []int, isAsync, isC
|
||||
storeID := batchItemList[0].(string)
|
||||
if partner.IsMultiStore(vendorID) {
|
||||
multiHandler, _ := partner.GetPurchasePlatformFromVendorID(vendorID).(partner.IMultipleStoresHandler)
|
||||
storeDetail, err = multiHandler.ReadStore(ctx, "", storeID)
|
||||
storeDetail, err = multiHandler.ReadStore(ctx, "", storeID,"")
|
||||
if err != nil {
|
||||
return retVal, err
|
||||
}
|
||||
} else {
|
||||
singleHandler, _ := partner.GetPurchasePlatformFromVendorID(vendorID).(partner.ISingleStoreHandler)
|
||||
storeDetail, err = singleHandler.ReadStore(ctx, "", storeID)
|
||||
storeDetail, err = singleHandler.ReadStore(ctx, "", storeID,"")
|
||||
if err != nil {
|
||||
return retVal, err
|
||||
}
|
||||
@@ -5279,7 +5279,7 @@ func RefreshStoreIsOnline(ctx *jxcontext.Context) (err error) {
|
||||
func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
|
||||
storeMap := batchItemList[0].(*model.StoreMap)
|
||||
if handler := CurVendorSync.GetStoreHandler(storeMap.VendorID); handler != nil {
|
||||
if store, err := handler.ReadStore(ctx, storeMap.VendorOrgCode, storeMap.VendorStoreID); err == nil && store != nil {
|
||||
if store, err := handler.ReadStore(ctx, storeMap.VendorOrgCode, storeMap.VendorStoreID,""); err == nil && store != nil {
|
||||
if store.Status != model.StoreStatusDisabled {
|
||||
storeMap.IsOnline = 1
|
||||
} else {
|
||||
|
||||
@@ -3948,6 +3948,7 @@ func RefershStoreSkusMidPrice(ctx *jxcontext.Context, storeIDs []int, isCountry
|
||||
return err
|
||||
}
|
||||
|
||||
// 根据excel刷新门店商品信息
|
||||
func RefreshJxPriceByExcel(ctx *jxcontext.Context, storeIDs []int, files []*multipart.FileHeader, isAsync, isContinueWhenError bool) (hint string, err error) {
|
||||
if len(files) == 0 {
|
||||
return "", errors.New("没有文件上传!")
|
||||
@@ -4268,13 +4269,13 @@ func GetVendorStoreSkuPrice(ctx *jxcontext.Context, vendorIDs []int, skuID int,
|
||||
}
|
||||
if partner.IsMultiStore(vendorID) {
|
||||
multiHandler, _ := partner.GetPurchasePlatformFromVendorID(vendorID).(partner.IMultipleStoresHandler)
|
||||
storeDetail, err = multiHandler.ReadStore(ctx, v, vendorStoreID)
|
||||
storeDetail, err = multiHandler.ReadStore(ctx, v, vendorStoreID, "")
|
||||
if len(skuList) > 0 {
|
||||
inStoreSku.VendorSkuID = skuList[0].VendorSkuID
|
||||
}
|
||||
} else {
|
||||
singleHandler, _ := partner.GetPurchasePlatformFromVendorID(vendorID).(partner.ISingleStoreHandler)
|
||||
storeDetail, err = singleHandler.ReadStore(ctx, v, vendorStoreID)
|
||||
storeDetail, err = singleHandler.ReadStore(ctx, v, vendorStoreID, "")
|
||||
inStoreSku.SkuID = skuID
|
||||
}
|
||||
inStoreSkuList = append(inStoreSkuList, inStoreSku)
|
||||
|
||||
@@ -481,7 +481,7 @@ func buildStoreManageState(ctx *jxcontext.Context, db *dao.DaoDB, storeMap *mode
|
||||
}
|
||||
dao.WrapAddIDCULEntity(storeManage, ctx.GetUserName())
|
||||
handler := partner.GetPurchasePlatformFromVendorID(storeMap.VendorID)
|
||||
store, err := handler.ReadStore(ctx, storeDetail.VendorOrgCode, storeDetail.VendorStoreID)
|
||||
store, err := handler.ReadStore(ctx, storeDetail.VendorOrgCode, storeDetail.VendorStoreID, storeDetail.VendorStoreName)
|
||||
if err != nil || store == nil {
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -19,7 +19,8 @@ const (
|
||||
VendorIDJDShop = 5 //京东商城
|
||||
VendorIDWSC = 11 // 微盟微商城
|
||||
VendorIDPurchaseEnd = 11
|
||||
VendorIDJX = 9 // 这是一个假的京西VendorID
|
||||
VendorIDJX = 9 // 这是一个假的京西VendorID
|
||||
VendorGoMei = 12 // 国美
|
||||
|
||||
VendorIDWXPay = 51 // 微信支付
|
||||
|
||||
@@ -87,6 +88,7 @@ var (
|
||||
|
||||
VendorIDQiNiuCloud: "Qiniu",
|
||||
VendorIDJDWL: "Jdwl",
|
||||
VendorGoMei: "GoMei",
|
||||
}
|
||||
|
||||
VendorTypeName = map[int]string{
|
||||
@@ -127,6 +129,7 @@ var (
|
||||
VendorIDAutonavi: "高德导航",
|
||||
VendorIDQiNiuCloud: "七牛云",
|
||||
VendorIDShowAPI: "万维易源",
|
||||
VendorGoMei: "国美",
|
||||
}
|
||||
|
||||
VendorInfoMap = map[int]*VendorInfo{
|
||||
|
||||
@@ -425,9 +425,11 @@ const (
|
||||
)
|
||||
|
||||
const (
|
||||
YES = 1 //通用
|
||||
NO = 0
|
||||
DISABLED = -1
|
||||
YES = 1 //通用
|
||||
NO = 0
|
||||
DISABLED = -1
|
||||
B2BTag = "B2B"
|
||||
B2BNumberId = 10
|
||||
)
|
||||
|
||||
func IsPurchaseVendorExist(vendorID int) bool {
|
||||
|
||||
@@ -1486,3 +1486,29 @@ func InsertBrandCategories(db *DaoDB, userName string, brandID int) (err error)
|
||||
_, err = ExecuteSQL(db, sql, sqlParams)
|
||||
return err
|
||||
}
|
||||
//
|
||||
//// 根据国美门店id获取门店名称
|
||||
//func GetStoreByVendorId(db *DaoDB, vendorOrderID string, vendorCode int) (storeMaps []*model.StoreCourierMap, err error) {
|
||||
// if vendorOrderID == "" || vendorCode == 0 {
|
||||
// return nil, err
|
||||
// }
|
||||
// sql := `
|
||||
// SELECT t1.*
|
||||
// FROM store_courier_map t1
|
||||
// LEFT JOIN store t2 ON t1.store_id = t2.id AND t1.deleted_at = ?
|
||||
// WHERE t1.deleted_at = ? AND t2.
|
||||
// `
|
||||
// sqlParams := []interface{}{
|
||||
// utils.DefaultTimeValue,
|
||||
// }
|
||||
// if len(vendorOrderID) > 0 {
|
||||
// sql += " AND t1.vendor_store_id = ? "
|
||||
// sqlParams = append(sqlParams, vendorOrderID)
|
||||
// }
|
||||
//
|
||||
// sql += " AND t1.audit_status IN (" + GenQuestionMarks(len(auditStatuss)) + ")"
|
||||
// sqlParams = append(sqlParams, auditStatuss)
|
||||
// if err = GetRows(db, &courierStoreList, sql, sqlParams...); err == nil {
|
||||
// return courierStoreList, nil
|
||||
// }
|
||||
//}
|
||||
|
||||
@@ -73,8 +73,8 @@ type StoreSkuSyncInfo struct {
|
||||
Stock int
|
||||
|
||||
// 平台相关的store sku信息
|
||||
StoreSkuStatus int
|
||||
SkuSyncStatus int8
|
||||
StoreSkuStatus int // 库存状态
|
||||
SkuSyncStatus int8 // 锁定状态
|
||||
VendorSkuID string `orm:"column(vendor_sku_id)"`
|
||||
JdsWareID int64 `orm:"column(jds_ware_id)" json:"jdsWareID"`
|
||||
BindDeletedAt time.Time `orm:"type(datetime)" json:"bindDeletedAt"`
|
||||
@@ -128,7 +128,7 @@ type StoreSkuSyncInfo struct {
|
||||
VendorCatID string `orm:"column(vendor_cat_id)"`
|
||||
SkuVendorMapCatID string `orm:"column(sku_vendor_map_cat_id)"`
|
||||
|
||||
VendorPrice int64
|
||||
VendorPrice int64 // 平台价格
|
||||
LockTime *time.Time
|
||||
|
||||
MergedStatus int
|
||||
@@ -476,7 +476,7 @@ func GetStoreCategories(db *DaoDB, vendorID, storeID int, skuIDs []int, level in
|
||||
result := make([]*SkuStoreCatInfo, 0, 0)
|
||||
for _, v := range cats {
|
||||
if v.BrandId == 1 { // 京西菜市才做此判断
|
||||
if !strings.HasPrefix(v.ParentCatName, "B2B") {
|
||||
if !strings.Contains(v.ParentCatName, model.B2BTag) {
|
||||
result = append(result, v)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -548,7 +548,7 @@ func IsOrderHaveWaybill(order *GoodsOrder) bool {
|
||||
|
||||
// 订单是否有自己平台的有效运单
|
||||
func IsOrderHaveOwnWaybill(order *GoodsOrder) bool {
|
||||
return order.VendorID == order.WaybillVendorID && order.VendorWaybillID != ""
|
||||
return order.VendorID == order.WaybillVendorID && order.VendorWaybillID != ""
|
||||
}
|
||||
|
||||
// 订单的初始配送方式是否是门店自配送
|
||||
|
||||
@@ -127,11 +127,12 @@ type SkuCategory struct {
|
||||
Type int8 `json:"type"` // 类别类型,即是普通类别还是特殊用于做活动的类别
|
||||
Seq int `json:"seq"`
|
||||
|
||||
JdCategoryID int64 `orm:"column(jd_category_id)" json:"jdCategoryID"` // 这个是指对应的京东商品类别
|
||||
EbaiCategoryID int64 `orm:"column(ebai_category_id)" json:"ebaiCategoryID"` // 这个是指对应的饿百商品类别
|
||||
MtwmCategoryID int64 `orm:"column(mtwm_category_id)" json:"mtwmCategoryID"` // 这个是指对应的美团外卖商品类别
|
||||
YbCategoryID int64 `orm:"column(yb_category_id)" json:"ybCategoryID"` // 这个是指对应的银豹商品类别
|
||||
JdsCategoryID int64 `orm:"column(jds_category_id)" json:"jdsCategoryID"` // 这个是指对应的京东商城类别
|
||||
JdCategoryID int64 `orm:"column(jd_category_id)" json:"jdCategoryID"` // 这个是指对应的京东商品类别
|
||||
EbaiCategoryID int64 `orm:"column(ebai_category_id)" json:"ebaiCategoryID"` // 这个是指对应的饿百商品类别
|
||||
MtwmCategoryID int64 `orm:"column(mtwm_category_id)" json:"mtwmCategoryID"` // 这个是指对应的美团外卖商品类别
|
||||
YbCategoryID int64 `orm:"column(yb_category_id)" json:"ybCategoryID"` // 这个是指对应的银豹商品类别
|
||||
JdsCategoryID int64 `orm:"column(jds_category_id)" json:"jdsCategoryID"` // 这个是指对应的京东商城类别
|
||||
GoMeiCategoryID int64 `orm:"column(go_mei_category_id)" json:"goMeiCategoryID"` // 这个是指对应的国美商城类别
|
||||
|
||||
// ElmCategoryID int64 `orm:"column(elm_category_id)" json:"elmCategoryID"` // 这个是指对应的饿了么商品类别
|
||||
// WscCategoryID int64 `orm:"column(wsc_category_id)" json:"wscCategoryID"` // 这个是指对应的美团外卖商品类别
|
||||
|
||||
@@ -35,7 +35,8 @@ const (
|
||||
BrandOpenSMS = 8 //短信
|
||||
BrandOpenVoice = 16 //语音
|
||||
|
||||
BrandBalanceLimit = 1000
|
||||
BrandBalanceLimit = 1000
|
||||
GoMeiMaxCountNumber = 50 // 国美最大数据返回条数
|
||||
)
|
||||
|
||||
const (
|
||||
@@ -86,11 +87,13 @@ const (
|
||||
)
|
||||
|
||||
const (
|
||||
ExdStoreName = "饿鲜达"
|
||||
MatterStoreID = 666666
|
||||
JdShopMainVendorStoreID = "9999999"
|
||||
ExdStoreName = "饿鲜达"
|
||||
MatterStoreID = 666666
|
||||
JdShopMainVendorStoreID = "9999999" // 三方平台总商户id
|
||||
GoMeiShopMainVendorStoreID = "GMJ-MS-XOMRF-1J1" // 三方平台总商户id
|
||||
// JdShopMainVendorStoreID2 = "9999999"
|
||||
JdShopMainStoreID = 100000
|
||||
JdShopMainStoreID = 100000 // 本地商户门店地
|
||||
GoMeiShopMainStoreID = 200000 // 本店商户门店id
|
||||
// JdShopMainStoreID2 = 100000
|
||||
|
||||
VendorStoreTel = "18011597879"
|
||||
|
||||
@@ -99,11 +99,12 @@ type StoreSkuBind struct {
|
||||
Status int
|
||||
|
||||
// ElmID int64 `orm:"column(elm_id);index"`
|
||||
MtwmID int64 `orm:"column(mtwm_id);index"`
|
||||
EbaiID int64 `orm:"column(ebai_id);index"`
|
||||
YbID int64 `orm:"column(yb_id);index"`
|
||||
JdsID int64 `orm:"column(jds_id);index"`
|
||||
JdsWareID int64 `orm:"column(jds_ware_id)"`
|
||||
MtwmID int64 `orm:"column(mtwm_id);index"`
|
||||
EbaiID int64 `orm:"column(ebai_id);index"`
|
||||
YbID int64 `orm:"column(yb_id);index"`
|
||||
JdsID int64 `orm:"column(jds_id);index"`
|
||||
JdsWareID int64 `orm:"column(jds_ware_id)"`
|
||||
GmID string `orm:"column(gm_id)"`
|
||||
// WscID int64 `orm:"column(wsc_id);index"` // 表示微盟skuId
|
||||
// WscID2 int64 `orm:"column(wsc_id2);index"` // 表示微盟goodsId
|
||||
|
||||
@@ -113,6 +114,7 @@ type StoreSkuBind struct {
|
||||
EbaiSyncStatus int8 `orm:"default(2)"`
|
||||
YbSyncStatus int8 `orm:"default(2)"`
|
||||
JdsSyncStatus int8 `orm:"default(2)"` //京东商城
|
||||
GmSyncStatus int8 `orm:"default(2)"` //京东商城
|
||||
// WscSyncStatus int8 `orm:"default(2)"`
|
||||
|
||||
JdPrice int `json:"jdPrice"`
|
||||
@@ -121,6 +123,7 @@ type StoreSkuBind struct {
|
||||
JxPrice int `json:"jxPrice"`
|
||||
YbPrice int `json:"ybPrice"`
|
||||
JdsPrice int `json:"jdsPrice"`
|
||||
GmPrice int `json:"gmPrice"`
|
||||
|
||||
JdLockTime *time.Time `orm:"null" json:"jdLockTime"`
|
||||
JdsLockTime *time.Time `orm:"null" json:"jdsLockTime"`
|
||||
@@ -128,6 +131,7 @@ type StoreSkuBind struct {
|
||||
EbaiLockTime *time.Time `orm:"null" json:"ebaiLockTime"`
|
||||
JxLockTime *time.Time `orm:"null" json:"jxLockTime"`
|
||||
YbLockTime *time.Time `orm:"null" json:"ybLockTime"`
|
||||
GmLockTime *time.Time `orm:"null" json:"gmLockTime"`
|
||||
|
||||
AutoSaleAt time.Time `orm:"type(datetime);null" json:"autoSaleAt"`
|
||||
|
||||
|
||||
@@ -94,6 +94,7 @@ func (c *DeliveryHandler) onWaybillMsg(msg *dadaapi.CallbackMsg) (retVal *dadaap
|
||||
default:
|
||||
order.Status = model.WaybillStatusUnknown
|
||||
}
|
||||
delivery.GetOrderRiderInfoToPlatform(order.VendorOrderID)// 骑手位置更新
|
||||
return dadaapi.Err2CallbackResponse(partner.CurOrderManager.OnWaybillStatusChanged(order), utils.Int2Str(order.Status))
|
||||
}
|
||||
|
||||
|
||||
@@ -2,7 +2,6 @@ package delivery
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"git.rosy.net.cn/baseapi/platformapi/mtpsapi"
|
||||
"math"
|
||||
"time"
|
||||
|
||||
@@ -149,73 +148,3 @@ func OnWaybillCreated(waybill *model.Waybill) {
|
||||
model.VendorChineseNames[waybill.WaybillVendorID], waybill.VendorWaybillID, jxutils.IntPrice2StandardCurrencyString(deliveryFee), jxutils.IntPrice2StandardCurrencyString(alarmFee))
|
||||
}
|
||||
}
|
||||
|
||||
// 订单骑手信息推送:将获取到的三方配送订单,且订单状态为配送中的订单,将配送人员的信息返回给订单方
|
||||
// 该方法为定时任务,没五分钟推送一次订单消息,订单状态发生变化时
|
||||
//配送状态code,如下提供配送状态枚举值,
|
||||
//以及各配送状态对应在C端(用户端)和B端(商家PC端)后台展示的配送状态信息。
|
||||
//未同步配送状态时(C端:商家已接单;B端:待发配送)
|
||||
//0-配送单发往配送(C端:商家已接单;B端:待骑手接单)
|
||||
//1-已创建配送包裹(C端:商家已接单;B端:待骑手接单)
|
||||
//5-已分配骑手(C端:商家已接单;B端:已分配骑手)
|
||||
//10-骑手已接单(C端:骑手正在赶往商家;B端:待骑手取货)
|
||||
//15-骑手已到店(C端:骑手到店取货中;B端:骑手已到店)
|
||||
//20-骑手已取货(C端:商品配送中/骑手正在送货;B端:骑手已取货)
|
||||
//40-骑手已送达(C端:商品已送达;B端:骑手已送达)
|
||||
//100-配送单已取消(C端:商家已接单;B端:配送已取消)
|
||||
//注:若同步配送状态为“配送单已取消”,接口仍支持继续同步配送状态。 说明:商家如未上传此信息,则平台默认值为20(现已要求必传)。
|
||||
func GetOrderRiderInfoToPlatform(orderId string) {
|
||||
params := make(map[string]interface{}, 0)
|
||||
params["brandID"] = 0
|
||||
params["statuss"] = 20
|
||||
params["isDateFinish"] = false
|
||||
params["isIncludeFake"] = true
|
||||
params["mustInvoice"] = false
|
||||
params["adjustCount"] = 0
|
||||
params["waybillVendorIDs"] = `[101,102,103]`
|
||||
if orderId != "" { // 订单id会忽略其他参数
|
||||
params["keyword"] = orderId
|
||||
}
|
||||
//params["offset"] = 0
|
||||
//params["pageSize"] = 10000
|
||||
// 查询三天内一万条数据
|
||||
orders, _, err := dao.GetOrders(dao.GetDB(), nil, false, true, time.Now().Add(-24*3*time.Hour).Format("2006-01-02"), time.Now().Format("2006-01-02"), false, nil, false, "", params, 0, 10000)
|
||||
if err != nil {
|
||||
globals.SugarLogger.Errorf("GetOrder err :%v", err)
|
||||
return
|
||||
}
|
||||
|
||||
for _, v := range orders {
|
||||
var riderInfo *mtpsapi.RiderInfo
|
||||
if handlerInfo := partner.GetDeliveryPlatformFromVendorID(v.WaybillVendorID); handlerInfo != nil {
|
||||
riderInfo, err = handlerInfo.Handler.GetRiderInfo(v.VendorOrderID, utils.Str2Int64(v.VendorWaybillId2Waybill), v.VendorWaybillID)
|
||||
if err != nil {
|
||||
globals.SugarLogger.Errorf("Get Order waybill rider info err :%v", err)
|
||||
continue
|
||||
}
|
||||
}
|
||||
|
||||
// 目前只推送美团骑手信息
|
||||
switch v.VendorID {
|
||||
case model.VendorIDMTWM: // 美团发单
|
||||
paramsMap := utils.Struct2Map(riderInfo, "", true)
|
||||
if handler := partner.GetPurchaseOrderHandlerFromVendorID(v.VendorID); handler != nil {
|
||||
if err := handler.GetOrderRider(v.VendorOrgCode, v.VendorOrderID, paramsMap); err != nil {
|
||||
globals.SugarLogger.Errorf("Error pushing meituan rider information :%v", err)
|
||||
}
|
||||
}
|
||||
case model.VendorIDELM: // 饿了么
|
||||
case model.VendorIDEBAI: // 饿百发单
|
||||
|
||||
case model.VendorIDJD: // 京东发单
|
||||
case model.VendorIDGD: // 美团发单
|
||||
case model.VendorIDYB: // 银豹发单
|
||||
case model.VendorIDJDShop: // 京东商城
|
||||
case model.VendorIDWSC: // 微盟微商城
|
||||
default:
|
||||
globals.SugarLogger.Errorf("Order source error, non system order")
|
||||
return
|
||||
}
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
@@ -249,6 +249,7 @@ func OnWaybillMsg(msg *fnpsapi.OrderStatusNottify) (resp *fnpsapi.CallbackRespon
|
||||
globals.SugarLogger.Debugf("FNPS partner.CurOrderManager.OnWaybillStatusChanged fail :[%s]", err)
|
||||
return fnpsapi.Err2CallbackResponse(err, "")
|
||||
}
|
||||
delivery.GetOrderRiderInfoToPlatform(order.VendorOrderID) // 骑手位置更新
|
||||
return fnpsapi.Err2CallbackResponse(nil, "")
|
||||
}
|
||||
|
||||
@@ -284,7 +285,7 @@ func GetDesiredFee(vendorOrderID string) (desiredFee int64) {
|
||||
}
|
||||
|
||||
// 获取骑手信息
|
||||
func (c *DeliveryHandler) GetRiderInfo(orderId string, deliveryId int64, mtPeisongId string) (rider *mtpsapi.RiderInfo, err error) {
|
||||
func (c *DeliveryHandler) GetRiderInfo(orderId string, deliveryId int64, mtPeisongId string) (rider *mtpsapi.RiderInfo, err error) {
|
||||
// 获取订单状态
|
||||
order, err := api.FnAPI.QueryOrder(orderId)
|
||||
if err != nil {
|
||||
|
||||
@@ -119,6 +119,7 @@ func (c *DeliveryHandler) onWaybillMsg(msg *mtpsapi.CallbackOrderMsg) (retVal *m
|
||||
c.pushToGy(msg)
|
||||
return mtpsapi.SuccessResponse
|
||||
}
|
||||
delivery.GetOrderRiderInfoToPlatform(order.VendorOrderID)// 骑手位置更新
|
||||
// 加入调度器
|
||||
return mtpsapi.Err2CallbackResponse(partner.CurOrderManager.OnWaybillStatusChanged(order), order.VendorStatus)
|
||||
}
|
||||
|
||||
82
business/partner/delivery/rider.go
Normal file
82
business/partner/delivery/rider.go
Normal file
@@ -0,0 +1,82 @@
|
||||
package delivery
|
||||
|
||||
import (
|
||||
"git.rosy.net.cn/baseapi/platformapi/mtpsapi"
|
||||
"git.rosy.net.cn/baseapi/utils"
|
||||
"git.rosy.net.cn/jx-callback/business/model"
|
||||
"git.rosy.net.cn/jx-callback/business/model/dao"
|
||||
"git.rosy.net.cn/jx-callback/business/partner"
|
||||
"git.rosy.net.cn/jx-callback/globals"
|
||||
"time"
|
||||
)
|
||||
|
||||
// 订单骑手信息推送:将获取到的三方配送订单,且订单状态为配送中的订单,将配送人员的信息返回给订单方
|
||||
// 该方法为定时任务,没五分钟推送一次订单消息,订单状态发生变化时
|
||||
//配送状态code,如下提供配送状态枚举值,
|
||||
//以及各配送状态对应在C端(用户端)和B端(商家PC端)后台展示的配送状态信息。
|
||||
//未同步配送状态时(C端:商家已接单;B端:待发配送)
|
||||
//0-配送单发往配送(C端:商家已接单;B端:待骑手接单)
|
||||
//1-已创建配送包裹(C端:商家已接单;B端:待骑手接单)
|
||||
//5-已分配骑手(C端:商家已接单;B端:已分配骑手)
|
||||
//10-骑手已接单(C端:骑手正在赶往商家;B端:待骑手取货)
|
||||
//15-骑手已到店(C端:骑手到店取货中;B端:骑手已到店)
|
||||
//20-骑手已取货(C端:商品配送中/骑手正在送货;B端:骑手已取货)
|
||||
//40-骑手已送达(C端:商品已送达;B端:骑手已送达)
|
||||
//100-配送单已取消(C端:商家已接单;B端:配送已取消)
|
||||
//注:若同步配送状态为“配送单已取消”,接口仍支持继续同步配送状态。 说明:商家如未上传此信息,则平台默认值为20(现已要求必传)。
|
||||
func GetOrderRiderInfoToPlatform(orderId string) {
|
||||
globals.SugarLogger.Debug("==========GetOrderRiderInfoToPlatform", time.Now())
|
||||
params := make(map[string]interface{}, 0)
|
||||
params["brandID"] = 0
|
||||
params["statuss"] = []int{20}
|
||||
params["isDateFinish"] = false
|
||||
params["isIncludeFake"] = true
|
||||
params["mustInvoice"] = false
|
||||
params["adjustCount"] = 0
|
||||
params["waybillVendorIDs"] = `[101,102,103]`
|
||||
if orderId != "" { // 订单id会忽略其他参数
|
||||
params["keyword"] = orderId
|
||||
}
|
||||
|
||||
// 每五分钟查询当前订单信息,待配送状态订单1
|
||||
orders, _, err := dao.GetOrders(dao.GetDB(), nil, false, true, time.Now().Add(-24*time.Hour).Format("2006-01-02"), time.Now().Format("2006-01-02"), false, nil, false, "", params, 0, 10000)
|
||||
if err != nil {
|
||||
globals.SugarLogger.Errorf("GetOrder err :%v", err)
|
||||
return
|
||||
}
|
||||
|
||||
for _, v := range orders {
|
||||
globals.SugarLogger.Debug("==========orderId,vendorId,waybillId", v.VendorOrderID, v.VendorID, v.WaybillVendorID)
|
||||
var riderInfo *mtpsapi.RiderInfo
|
||||
if handlerInfo := partner.GetDeliveryPlatformFromVendorID(v.WaybillVendorID); handlerInfo != nil {
|
||||
riderInfo, err = handlerInfo.Handler.GetRiderInfo(v.VendorOrderID, utils.Str2Int64(v.VendorWaybillId2Waybill), v.VendorWaybillID)
|
||||
if err != nil {
|
||||
globals.SugarLogger.Errorf("Get Order waybill rider info err :%v", err)
|
||||
continue
|
||||
}
|
||||
}
|
||||
|
||||
// 目前只推送美团骑手信息
|
||||
switch v.VendorID {
|
||||
case model.VendorIDMTWM: // 美团发单
|
||||
paramsMap := utils.Struct2Map(riderInfo, "", true)
|
||||
if handler := partner.GetPurchaseOrderHandlerFromVendorID(v.VendorID); handler != nil {
|
||||
if err := handler.GetOrderRider(v.VendorOrgCode, v.VendorOrderID, paramsMap); err != nil {
|
||||
globals.SugarLogger.Errorf("Error pushing meituan rider information :%v", err)
|
||||
}
|
||||
}
|
||||
case model.VendorIDELM: // 饿了么
|
||||
case model.VendorIDEBAI: // 饿百发单
|
||||
|
||||
case model.VendorIDJD: // 京东发单
|
||||
case model.VendorIDGD: // 美团发单
|
||||
case model.VendorIDYB: // 银豹发单
|
||||
case model.VendorIDJDShop: // 京东商城
|
||||
case model.VendorIDWSC: // 微盟微商城
|
||||
default:
|
||||
globals.SugarLogger.Errorf("Order source error, non system order")
|
||||
return
|
||||
}
|
||||
}
|
||||
return
|
||||
}
|
||||
@@ -147,7 +147,7 @@ type IPurchasePlatformHandler interface {
|
||||
|
||||
////////
|
||||
// Store
|
||||
ReadStore(ctx *jxcontext.Context, vendorOrgCode, vendorStoreID string) (store *dao.StoreDetail, err error)
|
||||
ReadStore(ctx *jxcontext.Context, vendorOrgCode, vendorStoreID, vendorStoreName string) (store *dao.StoreDetail, err error)
|
||||
UpdateStore(db *dao.DaoDB, storeID int, userName string) (err error)
|
||||
CreateStore2(db *dao.DaoDB, storeID int, userName string, params map[string]interface{}, storeDetail *dao.StoreDetail) (vendorStoreID string, err error)
|
||||
DeleteStore(db *dao.DaoDB, storeID int, userName string) (err error)
|
||||
|
||||
@@ -171,7 +171,7 @@ func getCoordintate(data interface{}) float64 {
|
||||
return utils.MustInterface2Float64(data)
|
||||
}
|
||||
|
||||
func (p *PurchaseHandler) ReadStore(ctx *jxcontext.Context, vendorOrgCode, vendorStoreID string) (*dao.StoreDetail, error) {
|
||||
func (p *PurchaseHandler) ReadStore(ctx *jxcontext.Context, vendorOrgCode, vendorStoreID, vendorStoreName string) (*dao.StoreDetail, error) {
|
||||
baiduShopID := utils.Str2Int64WithDefault(vendorStoreID, 0)
|
||||
if baiduShopID == 0 {
|
||||
return nil, fmt.Errorf("饿百门店ID:%s非法,应该是一个整数", vendorStoreID)
|
||||
@@ -264,7 +264,7 @@ func (p *PurchaseHandler) UpdateStore(db *dao.DaoDB, storeID int, userName strin
|
||||
if store.SyncStatus&model.SyncFlagDeletedMask == 0 {
|
||||
shopID = store.ID
|
||||
}
|
||||
store2, err2 := p.ReadStore(jxcontext.AdminCtx, store.VendorOrgCode, store.VendorStoreID)
|
||||
store2, err2 := p.ReadStore(jxcontext.AdminCtx, store.VendorOrgCode, store.VendorStoreID,"")
|
||||
// globals.SugarLogger.Debugf("ebai UpdateStore2 store2:%s, err2:%v", utils.Format4Output(store2, true), err2)
|
||||
if err = err2; err == nil {
|
||||
if store2.ID == store.ID {
|
||||
@@ -284,16 +284,16 @@ func (p *PurchaseHandler) UpdateStore(db *dao.DaoDB, storeID int, userName strin
|
||||
if err = p.UpdateStoreStatus(jxcontext.AdminCtx, store.VendorOrgCode, storeID, store.VendorStoreID, mergeStatus); err != nil {
|
||||
return err
|
||||
}
|
||||
store := fmt.Sprintf("门店id:%d,门店名称:%s,第三方门店状态:%d,本地修改前门店状态%d,本地门店修改后状态:%d,第三方平台Id(ebai):%d", storeID,store.Name, store2.Status, store.Status, mergeStatus,store.VendorOrgCode)
|
||||
event.AddOperateEvent(jxcontext.AdminCtx,jxcontext.AdminCtx.GetTrackInfo(), store, "", "", 10, "UpdateStore")
|
||||
store := fmt.Sprintf("门店id:%d,门店名称:%s,第三方门店状态:%d,本地修改前门店状态%d,本地门店修改后状态:%d,第三方平台Id(ebai):%d", storeID, store.Name, store2.Status, store.Status, mergeStatus, store.VendorOrgCode)
|
||||
event.AddOperateEvent(jxcontext.AdminCtx, jxcontext.AdminCtx.GetTrackInfo(), store, "", "", 10, "UpdateStore")
|
||||
}
|
||||
params := genStoreMapFromStore(store)
|
||||
if err = api.EbaiAPI.ShopUpdate(params); err == nil {
|
||||
if store.PromoteInfo != "" {
|
||||
err = api.EbaiAPI.ShopAnnouncementSet("", utils.Str2Int64(store.VendorStoreID), store.PromoteInfo)
|
||||
}
|
||||
store := fmt.Sprintf("门店id:%d,门店名称:%s,第三方门店状态:%d,本地修改前门店状态%d,本地门店修改后状态:%d,第三方平台Id(ebai):%d", storeID,store.Name, store2.Status, store.Status, 100,store.VendorOrgCode)
|
||||
event.AddOperateEvent(jxcontext.AdminCtx,jxcontext.AdminCtx.GetTrackInfo(), store, "", "", 10, "UpdateStore")
|
||||
store := fmt.Sprintf("门店id:%d,门店名称:%s,第三方门店状态:%d,本地修改前门店状态%d,本地门店修改后状态:%d,第三方平台Id(ebai):%d", storeID, store.Name, store2.Status, store.Status, 100, store.VendorOrgCode)
|
||||
event.AddOperateEvent(jxcontext.AdminCtx, jxcontext.AdminCtx.GetTrackInfo(), store, "", "", 10, "UpdateStore")
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
15
business/partner/purchase/gomei/act.go
Normal file
15
business/partner/purchase/gomei/act.go
Normal file
@@ -0,0 +1,15 @@
|
||||
package gomei
|
||||
|
||||
import (
|
||||
"git.rosy.net.cn/jx-callback/business/jxutils/jxcontext"
|
||||
"git.rosy.net.cn/jx-callback/business/jxutils/tasksch"
|
||||
"git.rosy.net.cn/jx-callback/business/model"
|
||||
)
|
||||
|
||||
func (c *PurchaseHandler) SyncAct(ctx *jxcontext.Context, parentTask tasksch.ITask, act *model.Act2, actOrderRules []*model.ActOrderRule, actStoreSkuList []*model.ActStoreSku2) (err error) {
|
||||
return err
|
||||
}
|
||||
|
||||
func (c *PurchaseHandler) GetActAmple(ctx *jxcontext.Context, vendorStoreID, vendorOrgCode string) (ample int, err error) {
|
||||
return ample, err
|
||||
}
|
||||
502
business/partner/purchase/gomei/callback.go
Normal file
502
business/partner/purchase/gomei/callback.go
Normal file
@@ -0,0 +1,502 @@
|
||||
package gomei
|
||||
//
|
||||
//import (
|
||||
// "bytes"
|
||||
// "encoding/base64"
|
||||
// "encoding/hex"
|
||||
// "encoding/json"
|
||||
// "fmt"
|
||||
// "math"
|
||||
// "strings"
|
||||
// "time"
|
||||
//
|
||||
// "git.rosy.net.cn/jx-callback/business/authz/autils"
|
||||
// "git.rosy.net.cn/jx-callback/business/partner/delivery/dada"
|
||||
//
|
||||
// "git.rosy.net.cn/jx-callback/business/jxutils/jxcontext"
|
||||
// beego "github.com/astaxie/beego/server/web"
|
||||
//
|
||||
// "git.rosy.net.cn/baseapi/platformapi/dadaapi"
|
||||
// "git.rosy.net.cn/baseapi/platformapi/dingdingapi"
|
||||
// "git.rosy.net.cn/baseapi/platformapi/jcqapi"
|
||||
// "git.rosy.net.cn/baseapi/platformapi/jdshopapi"
|
||||
// "git.rosy.net.cn/baseapi/utils"
|
||||
// "git.rosy.net.cn/jx-callback/business/jxutils"
|
||||
// "git.rosy.net.cn/jx-callback/business/jxutils/ddmsg"
|
||||
// "git.rosy.net.cn/jx-callback/business/model"
|
||||
// "git.rosy.net.cn/jx-callback/business/model/dao"
|
||||
// "git.rosy.net.cn/jx-callback/business/partner"
|
||||
// "git.rosy.net.cn/jx-callback/globals"
|
||||
// "git.rosy.net.cn/jx-callback/globals/api"
|
||||
// "git.rosy.net.cn/jx-callback/globals/api2"
|
||||
//)
|
||||
//
|
||||
////TODO 以下是京东商城云顶推送消息使用的代码,现在都是以网页爬取的形式拿订单了,下面的都不用了
|
||||
////TODO 位置在 orderman/order.go 的 SaveJdsOrders
|
||||
//func OnCallbackMsg(msg *jdshopapi.CallBackResult) (err error) {
|
||||
// msgType := msg.MsgType
|
||||
// switch msgType {
|
||||
// case jcqapi.TopicOrderPay:
|
||||
// utils.CallFuncAsync(func() {
|
||||
// SaveJdsOrders(msg)
|
||||
// })
|
||||
// case jcqapi.TopicOrderCancel:
|
||||
// utils.CallFuncAsync(func() {
|
||||
// order := getRealOrderID(msg.OrderID)
|
||||
// if order != nil {
|
||||
// if order.Status != model.OrderStatusCanceled {
|
||||
// CurPurchaseHandler.CancelOrder(jxcontext.AdminCtx, order, "系统取消")
|
||||
// }
|
||||
// }
|
||||
// })
|
||||
// case jcqapi.TopicOrderOut:
|
||||
// utils.CallFuncAsync(func() {
|
||||
// globals.SugarLogger.Debugf("jdsOrderOut", utils.Format4Output(msg, false))
|
||||
// orders := getAllRealOrderID(msg.OrderID)
|
||||
// if len(orders) > 0 {
|
||||
// for _, order := range orders {
|
||||
// if order.ActualPayPrice == 0 {
|
||||
// if jxutils.StandardPrice2Int(utils.Str2Float64(msg.OrderPayment)) == 0 {
|
||||
// order.ActualPayPrice = jxutils.StandardPrice2Int(utils.Str2Float64(msg.OrderTotalPrice) + utils.Str2Float64(msg.FreightPrice) - utils.Str2Float64(msg.SellerDiscount))
|
||||
// } else {
|
||||
// order.ActualPayPrice = jxutils.StandardPrice2Int(utils.Str2Float64(msg.OrderPayment))
|
||||
// }
|
||||
// order.TotalShopMoney = utils.Float64TwoInt64(float64(order.ActualPayPrice) * jdshopapi.JdsPayPercentage)
|
||||
// partner.CurOrderManager.UpdateOrderFields(order, []string{"ActualPayPrice", "TotalShopMoney"})
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// })
|
||||
// default:
|
||||
// return fmt.Errorf("暂不支持的topic类型!topic: %v", msgType)
|
||||
// }
|
||||
// return err
|
||||
//}
|
||||
//
|
||||
//func SaveJdsOrders(msg *jdshopapi.CallBackResult) (err error) {
|
||||
// if msg.OrderState == "TRADE_CANCELED" {
|
||||
// return nil
|
||||
// } //清洗脏数据 部分数据按照
|
||||
// order, err := result2Orders(msg)
|
||||
// if err != nil && order == nil {
|
||||
// return err
|
||||
// }
|
||||
// globals.SugarLogger.Debugf("SaveJdsOrders : %v", utils.Format4Output(order, false))
|
||||
// partner.CurOrderManager.OnOrderNew(order, model.Order2Status(order))
|
||||
// noticeMsg := fmt.Sprintf("京东商城新订单,订单号:[%v] ,将要发到的门店id:[%v] , 门店名:[%v]", order.VendorOrderID, order.StoreID, order.StoreName)
|
||||
// if order.OrderType == model.OrderTypeAddressErr {
|
||||
// noticeMsg += " 此订单地址有问题,需要矫正坐标!"
|
||||
// }
|
||||
// var role = autils.NewRole("jdshop", 0)
|
||||
// userIDList, err := api2.RoleMan.GetRoleUserList(role)
|
||||
// for _, v := range userIDList {
|
||||
// ddmsg.SendUserMessage(dingdingapi.MsgTyeText, v, "京东商城来新订单了!", noticeMsg)
|
||||
// }
|
||||
// // ddmsg.SendUserMessage(dingdingapi.MsgTyeText, "1439B3E07D3911EA881A525400E86DC0", "京东商城来新订单了!", noticeMsg)
|
||||
// return err
|
||||
//}
|
||||
//
|
||||
//func result2Orders(msg *jdshopapi.CallBackResult) (order *model.GoodsOrder, err error) {
|
||||
// var (
|
||||
// db = dao.GetDB()
|
||||
// )
|
||||
// //有可能是库里已经有这个订单了
|
||||
// orderE, err := partner.CurOrderManager.LoadOrder(msg.OrderID+"00000001", model.VendorIDJDShop)
|
||||
// if orderE != nil {
|
||||
// return order, fmt.Errorf("已经存在此订单!")
|
||||
// }
|
||||
// order = &model.GoodsOrder{
|
||||
// VendorOrderID2: msg.OrderID,
|
||||
// VendorOrderID: msg.OrderID + "00000001",
|
||||
// VendorID: model.VendorIDJDShop,
|
||||
// BaseFreightMoney: jxutils.StandardPrice2Int(utils.Str2Float64(msg.FreightPrice)),
|
||||
// VendorStatus: msg.OrderState,
|
||||
// VendorUserID: msg.Pin,
|
||||
// BuyerComment: msg.OrderRemark,
|
||||
// PickDeadline: utils.DefaultTimeValue,
|
||||
// OriginalData: string(utils.MustMarshal(msg)),
|
||||
// OrderCreatedAt: utils.Str2Time(msg.OrderStartTime),
|
||||
// ConsigneeAddress: Decrypt(msg.ConsigneeInfo.FullAddress, msg.VendorOrgCode),
|
||||
// ConsigneeName: Decrypt(msg.ConsigneeInfo.Fullname, msg.VendorOrgCode),
|
||||
// // ConsigneeMobile: Decrypt(msg.ConsigneeInfo.Mobile),
|
||||
// // ConsigneeMobile2: Decrypt(msg.ConsigneeInfo.Telephone),
|
||||
// ActualPayPrice: jxutils.StandardPrice2Int(utils.Str2Float64(msg.OrderPayment)),
|
||||
// Status: model.OrderStatusNew,
|
||||
// TotalShopMoney: utils.Float64TwoInt64(math.Round(float64(jxutils.StandardPrice2Int(utils.Str2Float64(msg.OrderPayment))) * jdshopapi.JdsPayPercentage)),
|
||||
// DeliveryType: model.OrderDeliveryTypeStoreSelf,
|
||||
// StatusTime: utils.Str2Time(msg.OrderStartTime),
|
||||
// OrderSeq: 0,
|
||||
// VendorOrgCode: msg.VendorOrgCode,
|
||||
// }
|
||||
// if utils.Str2Float64(msg.BalanceUsed) != 0 {
|
||||
// order.ActualPayPrice += jxutils.StandardPrice2Int(utils.Str2Float64(msg.BalanceUsed))
|
||||
// order.TotalShopMoney += utils.Float64TwoInt64(math.Round(float64(jxutils.StandardPrice2Int(utils.Str2Float64(msg.BalanceUsed))) * jdshopapi.JdsPayPercentage))
|
||||
// }
|
||||
// if len(msg.ConsigneeInfo.Mobile) != 11 {
|
||||
// order.ConsigneeMobile = Decrypt(msg.ConsigneeInfo.Mobile, msg.VendorOrgCode)
|
||||
// } else {
|
||||
// order.ConsigneeMobile = msg.ConsigneeInfo.Mobile
|
||||
// }
|
||||
// if len(msg.ConsigneeInfo.Telephone) != 11 {
|
||||
// order.ConsigneeMobile2 = Decrypt(msg.ConsigneeInfo.Telephone, msg.VendorOrgCode)
|
||||
// } else {
|
||||
// order.ConsigneeMobile2 = msg.ConsigneeInfo.Telephone
|
||||
// }
|
||||
// if order.TotalShopMoney < 100 {
|
||||
// order.TotalShopMoney = 100
|
||||
// }
|
||||
// if order.ConsigneeAddress != "" {
|
||||
// var cityCode int
|
||||
// place, err := dao.GetPlaceByJdsCode(db, utils.Str2Int(msg.ConsigneeInfo.CityID))
|
||||
// if place == nil {
|
||||
// cityCode = 510100
|
||||
// } else {
|
||||
// if place.Level == 3 {
|
||||
// cityCode = place.ParentCode
|
||||
// } else if place.Level == 2 {
|
||||
// cityCode = place.Code
|
||||
// }
|
||||
// }
|
||||
// lng, lat, err2 := api.AutonaviAPI.GetCoordinateFromAddressByPage(order.ConsigneeAddress, cityCode)
|
||||
// if err = err2; err != nil {
|
||||
// globals.SugarLogger.Infof("高德page err: %v", err)
|
||||
// }
|
||||
// lng2, lat2, _ := api.AutonaviAPI.GetCoordinateFromAddress(order.ConsigneeAddress, "")
|
||||
// distance := jxutils.EarthDistance(lng, lat, lng2, lat2)
|
||||
// if distance > 1 {
|
||||
// order.OrderType = model.OrderTypeAddressErr
|
||||
// }
|
||||
// if err == nil && lng != 0 && lat != 0 {
|
||||
// order.ConsigneeLng = jxutils.StandardCoordinate2Int(lng)
|
||||
// order.ConsigneeLat = jxutils.StandardCoordinate2Int(lat)
|
||||
// } else {
|
||||
// order.ConsigneeLng = jxutils.StandardCoordinate2Int(lng2)
|
||||
// order.ConsigneeLat = jxutils.StandardCoordinate2Int(lat2)
|
||||
// }
|
||||
// order.CoordinateType = model.CoordinateTypeMars
|
||||
// }
|
||||
// // storeList, err := common.GetStoreListByLocation(jxcontext.AdminCtx, jxutils.IntCoordinate2Standard(order.ConsigneeLng), jxutils.IntCoordinate2Standard(order.ConsigneeLat), 3000, false, true, 0)
|
||||
// // if err != nil {
|
||||
// // globals.SugarLogger.Debugf("jds GetStoreListByLocation error: %v", err.Error())
|
||||
// // return order, err
|
||||
// // }
|
||||
// // if len(storeList) > 0 {
|
||||
// // for _, store := range storeList {
|
||||
// for _, v := range msg.ItemInfoList {
|
||||
// sku := &model.OrderSku{
|
||||
// VendorID: model.VendorIDJDShop,
|
||||
// VendorOrderID: order.VendorOrderID,
|
||||
// Count: utils.Str2Int(v.ItemTotal),
|
||||
// VendorSkuID: v.SkuID,
|
||||
// SkuName: v.SkuName,
|
||||
// VendorPrice: jxutils.StandardPrice2Int(utils.Str2Float64(v.JdPrice)),
|
||||
// SalePrice: jxutils.StandardPrice2Int(utils.Str2Float64(v.JdPrice)),
|
||||
// // SkuID: utils.Str2Int(v.OuterSkuID),
|
||||
// }
|
||||
// if v.OuterSkuID != "" {
|
||||
// sku.SkuID = utils.Str2Int(v.OuterSkuID)
|
||||
// }
|
||||
// _, _, _, specUnit, _, specQuality := jxutils.SplitSkuName(v.SkuName)
|
||||
// sku.Weight = jxutils.FormatSkuWeight(specQuality, specUnit)
|
||||
// order.Skus = append(order.Skus, sku)
|
||||
// }
|
||||
// if order.ActualPayPrice > 100000 {
|
||||
// buildOrderTo102919(order)
|
||||
// globals.SugarLogger.Debugf("resultjdsOrders return 8")
|
||||
// }
|
||||
// var store *dao.StoreDetail
|
||||
// if msg.OrderExt != "" {
|
||||
// orderExt := &jdshopapi.OrderExt{}
|
||||
// if err = json.Unmarshal([]byte(msg.OrderExt), &orderExt); err == nil {
|
||||
// order.VendorStoreID = orderExt.SiteID
|
||||
// if store, err = dao.GetStoreDetailByVendorStoreID(db, order.VendorStoreID, model.VendorIDJDShop, ""); store != nil && err == nil {
|
||||
// order.StoreID = store.ID
|
||||
// order.JxStoreID = store.ID
|
||||
// order.StoreName = store.Name
|
||||
// globals.SugarLogger.Debugf("jds GetStoreListByLocation, orderID: %v storeID :%v", order.VendorOrderID, order.StoreID)
|
||||
// //结算类型
|
||||
// if store.PayPercentage < 50 {
|
||||
// order.EarningType = model.EarningTypePoints
|
||||
// } else {
|
||||
// order.EarningType = model.EarningTypeQuote
|
||||
// }
|
||||
// var (
|
||||
// shopPriceSum int
|
||||
// // saleNormalSum int
|
||||
// )
|
||||
// for _, sku := range order.Skus {
|
||||
// storeSkuList, _ := dao.GetStoresSkusInfo(db, []int{order.StoreID}, []int{sku.SkuID})
|
||||
// if len(storeSkuList) > 0 {
|
||||
// // if storeSkuList[0].Status == model.StoreSkuBindStatusNormal {
|
||||
// // saleNormalSum += 1
|
||||
// // }
|
||||
// shopPriceSum += storeSkuList[0].Price * sku.Count
|
||||
// sku.ShopPrice = int64(storeSkuList[0].Price)
|
||||
// } else {
|
||||
// shopPriceSum += int(sku.SalePrice) * 70 / 100
|
||||
// }
|
||||
// }
|
||||
// //可售数小于一半就不行
|
||||
// // if math.Mod(float64(len(order.Skus)), float64(2)) == 0 {
|
||||
// // if saleNormalSum < len(order.Skus)/2 {
|
||||
// // buildOrderTo102919(order)
|
||||
// // globals.SugarLogger.Debugf("resultjdsOrders return 1")
|
||||
// // } else {
|
||||
// if order.EarningType == model.EarningTypeQuote && shopPriceSum+700 > int(order.TotalShopMoney) {
|
||||
// buildOrderTo102919(order)
|
||||
// globals.SugarLogger.Debugf("resultjdsOrders return 2")
|
||||
// }
|
||||
// // }
|
||||
// // } else {
|
||||
// // if saleNormalSum <= len(order.Skus)/2 {
|
||||
// // buildOrderTo102919(order)
|
||||
// // globals.SugarLogger.Debugf("resultjdsOrders return 3")
|
||||
// // } else {
|
||||
// // if order.EarningType == model.EarningTypeQuote && shopPriceSum+700 > int(order.TotalShopMoney) {
|
||||
// // buildOrderTo102919(order)
|
||||
// // globals.SugarLogger.Debugf("resultjdsOrders return 4")
|
||||
// // }
|
||||
// // }
|
||||
// // }
|
||||
// } else {
|
||||
// buildOrderTo102919(order)
|
||||
// globals.SugarLogger.Debugf("resultjdsOrders return 5")
|
||||
// }
|
||||
// } else {
|
||||
// buildOrderTo102919(order)
|
||||
// globals.SugarLogger.Debugf("resultjdsOrders return 6")
|
||||
// }
|
||||
// } else {
|
||||
// buildOrderTo102919(order)
|
||||
// globals.SugarLogger.Debugf("resultjdsOrders return 7")
|
||||
// }
|
||||
// // 如果是暂停,表示是预订单g
|
||||
// if msg.OrderState == jdshopapi.OrderStatusPause || msg.OrderState == jdshopapi.OrderStatusPopPause {
|
||||
// order.BusinessType = model.BusinessTypeDingshida
|
||||
// if time2, err := getAPI(msg.VendorOrgCode).GetOrderExtInfoByOrderId(order.VendorOrderID2); err == nil {
|
||||
// if time2 == "" {
|
||||
// order.ExpectedDeliveredTime = order.OrderCreatedAt.Add(time.Hour)
|
||||
// } else {
|
||||
// order.ExpectedDeliveredTime = utils.Str2Time(time2)
|
||||
// }
|
||||
// } else {
|
||||
// order.ExpectedDeliveredTime = order.OrderCreatedAt.Add(time.Hour)
|
||||
// err = nil
|
||||
// }
|
||||
// order.PickDeadline = order.ExpectedDeliveredTime.Add(-time.Hour)
|
||||
// } else if msg.OrderState == jdshopapi.OrderStatusWait || msg.OrderState == "WAIT_GOODS_RECEIVE_CONFIRM" || msg.OrderState == "FINISHED_L" {
|
||||
// order.ExpectedDeliveredTime = order.OrderCreatedAt.Add(time.Hour)
|
||||
// order.BusinessType = model.BusinessTypeImmediate
|
||||
// } else if msg.OrderState == "UN_KNOWN" {
|
||||
// order.ExpectedDeliveredTime = order.OrderCreatedAt.Add(time.Hour)
|
||||
// order.BusinessType = model.BusinessTypeImmediate
|
||||
// } else {
|
||||
// globals.SugarLogger.Debugf("暂不支持的京东商城订单类型!type: %v", msg.OrderState)
|
||||
// return nil, err
|
||||
// }
|
||||
//
|
||||
// if msg.IDSopShipmenttype == jdshopapi.IdSopShipmenttypeTC {
|
||||
// if msg.VendorOrgCode == "1" {
|
||||
// if time2, err := getAPI(msg.VendorOrgCode).GetOrderExtInfoByOrderId(order.VendorOrderID2); err == nil {
|
||||
// order.BusinessType = model.BusinessTypeDingshida
|
||||
// if time2 == "" {
|
||||
// order.ExpectedDeliveredTime = order.OrderCreatedAt.Add(time.Hour)
|
||||
// } else {
|
||||
// order.ExpectedDeliveredTime = utils.Str2Time(time2)
|
||||
// }
|
||||
// }
|
||||
// } else {
|
||||
// order.BusinessType = model.BusinessTypeImmediate
|
||||
// if time2, err := getAPI(msg.VendorOrgCode).GetOrderExtInfoByOrderId(order.VendorOrderID2); err == nil {
|
||||
// if time2 == "" {
|
||||
// order.ExpectedDeliveredTime = order.OrderCreatedAt.Add(time.Hour)
|
||||
// } else {
|
||||
// order.ExpectedDeliveredTime = utils.Str2Time(time2)
|
||||
// }
|
||||
// } else {
|
||||
// order.ExpectedDeliveredTime = order.OrderCreatedAt.Add(time.Hour)
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// setJdsOrderSeq(order)
|
||||
// if order.OrderType == model.OrderTypeAddressErr {
|
||||
// buildOrderTo102919(order)
|
||||
// globals.SugarLogger.Debugf("resultjdsOrders return 9")
|
||||
// }
|
||||
// // billParams, _ := GetDaDaBillParams(db, order)
|
||||
// // if result, err := api.DadaAPI.QueryDeliverFee(billParams); err == nil {
|
||||
// // if result.Fee > 10 {
|
||||
// // buildOrderTo102919(order)
|
||||
// // globals.SugarLogger.Debugf("resultjdsOrders return 10")
|
||||
// // }
|
||||
// // }
|
||||
// if store != nil {
|
||||
// distance := jxutils.EarthDistance(jxutils.IntCoordinate2Standard(order.ConsigneeLng), jxutils.IntCoordinate2Standard(order.ConsigneeLat), jxutils.IntCoordinate2Standard(store.Lng), jxutils.IntCoordinate2Standard(store.Lat))
|
||||
// if distance > 4 {
|
||||
// buildOrderTo102919(order)
|
||||
// globals.SugarLogger.Debugf("resultjdsOrders return 4")
|
||||
// }
|
||||
// }
|
||||
// if order.ExpectedDeliveredTime.Sub(order.OrderCreatedAt) <= time.Hour+time.Minute {
|
||||
// order.BusinessType = model.BusinessTypeImmediate
|
||||
// }
|
||||
// // buildOrderTo102919(order)
|
||||
// return order, err
|
||||
//}
|
||||
//
|
||||
//func buildOrderTo102919(order *model.GoodsOrder) {
|
||||
// // if order.VendorOrgCode == "1" {
|
||||
// // order.StoreID = 102919
|
||||
// // order.JxStoreID = 102919
|
||||
// // order.StoreName = "商城模板(成都发货)"
|
||||
// // order.VendorStoreID = model.JdShopMainVendorStoreID
|
||||
// // } else {
|
||||
// order.StoreID = model.JdShopMainStoreID
|
||||
// order.JxStoreID = model.JdShopMainStoreID
|
||||
// order.StoreName = "商城模板店2"
|
||||
// order.VendorStoreID = model.JdShopMainVendorStoreID
|
||||
// // }
|
||||
// order.DeliveryFlag = model.OrderDeliveryFlagMaskScheduleDisabled
|
||||
//}
|
||||
//
|
||||
//func setJdsOrderSeq(order *model.GoodsOrder) (err error) {
|
||||
// type tCount struct {
|
||||
// Count int `json:"count"`
|
||||
// }
|
||||
// var count = &tCount{}
|
||||
// sql := `
|
||||
// SELECT count(*) 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.Count + 1
|
||||
// return err
|
||||
//}
|
||||
//
|
||||
//func Decrypt(p, vendorOrgCode string) (result string) {
|
||||
// if p == "" {
|
||||
// return ""
|
||||
// }
|
||||
// data, _ := base64.StdEncoding.DecodeString(strings.ReplaceAll(p, " ", "+"))
|
||||
// key := GetKey(hex.EncodeToString(data)[4:36], vendorOrgCode)
|
||||
// globals.SugarLogger.Debugf("Decrypt keys : %v", key)
|
||||
// data2, _ := base64.StdEncoding.DecodeString(key)
|
||||
// b := bytes.NewBuffer(data)
|
||||
// b.Next(18)
|
||||
// iv := make([]byte, 16)
|
||||
// b.Read(iv)
|
||||
// main := make([]byte, len(data)-18-16)
|
||||
// b.Read(main)
|
||||
// decryptedData, _ := utils.AESCBCDecpryt(main, data2[:16], iv)
|
||||
// return string(decryptedData)
|
||||
//}
|
||||
//
|
||||
//func getRealOrderID(orderID string) (order *model.GoodsOrder) {
|
||||
// var (
|
||||
// db = dao.GetDB()
|
||||
// )
|
||||
// sql := `
|
||||
// SELECT * FROM goods_order WHERE vendor_order_id2 = ? ORDER BY vendor_order_id DESC LIMIT 1
|
||||
// `
|
||||
// sqlParams := []interface{}{
|
||||
// orderID,
|
||||
// }
|
||||
// dao.GetRow(db, &order, sql, sqlParams)
|
||||
// return order
|
||||
//}
|
||||
//
|
||||
//func getAllRealOrderID(orderID string) (orders []*model.GoodsOrder) {
|
||||
// var (
|
||||
// db = dao.GetDB()
|
||||
// )
|
||||
// sql := `
|
||||
// SELECT * FROM goods_order WHERE vendor_order_id2 = ?
|
||||
// `
|
||||
// sqlParams := []interface{}{
|
||||
// orderID,
|
||||
// }
|
||||
// dao.GetRows(db, &orders, sql, sqlParams)
|
||||
// return orders
|
||||
//}
|
||||
//
|
||||
//func GetDaDaBillParams(db *dao.DaoDB, order *model.GoodsOrder) (billParams *dadaapi.OperateOrderParams, err error) {
|
||||
// billParams = &dadaapi.OperateOrderParams{
|
||||
// OriginID: jxutils.ComposeUniversalOrderID(order.VendorOrderID, order.VendorID),
|
||||
// CargoPrice: jxutils.IntPrice2Standard(limitOrderPrice(order.ActualPayPrice)),
|
||||
// IsPrepay: 0,
|
||||
// ReceiverName: utils.FilterMb4(order.ConsigneeName),
|
||||
// ReceiverAddress: utils.FilterMb4(order.ConsigneeAddress),
|
||||
// ReceiverPhone: order.ConsigneeMobile,
|
||||
// }
|
||||
// if billParams.ShopNo, err = getDadaShopID(order, db); err == nil {
|
||||
// if billParams.CityCode, err = getDataCityCodeFromOrder(order, db); err == nil {
|
||||
// // storeTel := ""
|
||||
// // storeID := jxutils.GetSaleStoreIDFromOrder(order)
|
||||
// // storeDeatail, _ := dao.GetStoreDetail(db, storeID, order.VendorID)
|
||||
// // if storeDeatail.Tel2 != "" {
|
||||
// // storeTel = ",门店电话:" + storeDeatail.Tel2
|
||||
// // }
|
||||
// billParams.ReceiverLng, billParams.ReceiverLat, _ = jxutils.IntCoordinate2MarsStandard(order.ConsigneeLng, order.ConsigneeLat, order.CoordinateType)
|
||||
// billParams.Info = fmt.Sprintf("%s第%d号订单, %s", model.VendorChineseNames[order.VendorID], order.OrderSeq, utils.FilterMb4("客户电话:"+order.ConsigneeMobile+","+order.BuyerComment+"取货失败或配送遇到问题请联系18048531223,禁止未配送直接完成定单!"))
|
||||
// billParams.CargoType = dadaapi.CargoTypeFresh
|
||||
// billParams.CargoWeight = float64(jxutils.IntWeight2Float(limitOrderWeight(order.Weight)))
|
||||
// billParams.CargoNum = order.GoodsCount
|
||||
// }
|
||||
// }
|
||||
// return billParams, err
|
||||
//}
|
||||
//
|
||||
//func limitOrderPrice(price int64) int64 {
|
||||
// var maxOrderPrice int64 = 6399
|
||||
// if price > maxOrderPrice {
|
||||
// return maxOrderPrice
|
||||
// }
|
||||
// return price
|
||||
//}
|
||||
//
|
||||
//func limitOrderWeight(weight int) int {
|
||||
// maxOrderWeight := 5000 // 5公斤
|
||||
// if weight > maxOrderWeight {
|
||||
// return maxOrderWeight
|
||||
// }
|
||||
// return weight
|
||||
//}
|
||||
//
|
||||
//func getDadaShopID(order *model.GoodsOrder, db *dao.DaoDB) (retVal string, err error) {
|
||||
// saleStoreID := jxutils.GetSaleStoreIDFromOrder(order)
|
||||
// storeCourierList, err2 := dao.GetOpenedStoreCouriersByStoreID(db, saleStoreID, model.VendorIDDada)
|
||||
// if err = err2; err != nil && !dao.IsNoRowsError(err) {
|
||||
// return "", err
|
||||
// }
|
||||
// if len(storeCourierList) == 0 {
|
||||
// return "", partner.ErrStoreHaveNoCourier
|
||||
// }
|
||||
// retVal = storeCourierList[0].VendorStoreID
|
||||
// if beego.BConfig.RunMode == "dev" {
|
||||
// retVal = "test_0001"
|
||||
// }
|
||||
// return retVal, nil
|
||||
//}
|
||||
//
|
||||
//func getDataCityCodeFromOrder(order *model.GoodsOrder, db *dao.DaoDB) (retVal string, err error) {
|
||||
// jxStoreID := jxutils.GetSaleStoreIDFromOrder(order)
|
||||
// sql := `
|
||||
// SELECT t2.tel_code
|
||||
// FROM store t1
|
||||
// JOIN place t2 on t1.city_code = t2.code
|
||||
// WHERE t1.id = ?
|
||||
// `
|
||||
// codeInfo := &struct {
|
||||
// TelCode string
|
||||
// }{}
|
||||
// if err = dao.GetRow(db, codeInfo, sql, jxStoreID); err != nil {
|
||||
// globals.SugarLogger.Errorf("GetDataCityCodeFromOrder can not find store info for vendorID:%d, store:%s, error:%v", order.VendorID, order.VendorStoreID, err)
|
||||
// if err == nil {
|
||||
// err = dada.ErrCanNotFindDadaCityCode
|
||||
// }
|
||||
// return "", err
|
||||
// }
|
||||
// return codeInfo.TelCode, nil
|
||||
//}
|
||||
34
business/partner/purchase/gomei/callback_test.go
Normal file
34
business/partner/purchase/gomei/callback_test.go
Normal file
@@ -0,0 +1,34 @@
|
||||
package gomei
|
||||
//
|
||||
//import (
|
||||
// "fmt"
|
||||
// "git.rosy.net.cn/baseapi/platformapi/jdshopapi"
|
||||
// "testing"
|
||||
//)
|
||||
//
|
||||
//func TestSaveJdsOrders(t *testing.T) {
|
||||
// type args struct {
|
||||
// msg *jdshopapi.CallBackResult
|
||||
// }
|
||||
// tests := []struct {
|
||||
// name string
|
||||
// args args
|
||||
// wantErr bool
|
||||
// }{
|
||||
// // TODO: Add test cases.
|
||||
// }
|
||||
// fmt.Println("测试1")
|
||||
// for _, tt := range tests {
|
||||
// t.Run(tt.name, func(t *testing.T) {
|
||||
// if err := SaveJdsOrders(tt.args.msg); (err != nil) != tt.wantErr {
|
||||
// t.Errorf("SaveJdsOrders() error = %v, wantErr %v", err, tt.wantErr)
|
||||
// }
|
||||
// })
|
||||
// }
|
||||
// fmt.Println("测试2")
|
||||
//}
|
||||
//
|
||||
//func TestDecrypt(t *testing.T) {
|
||||
// InitKey()
|
||||
// fmt.Println(Decrypt("dGeoMeGNcXeT8iCHn3hTrCFYY8qfMnOptNcMFzAJA2/Dx/CPiZ526ec0NN0kWKs4+HwEGCLu9hAB9D0MIf8UB6q4G8IVgD3oXlOb89CFgGe0yO1HA9j51ESPFXh8=", "1"))
|
||||
//}
|
||||
120
business/partner/purchase/gomei/gomei.go
Normal file
120
business/partner/purchase/gomei/gomei.go
Normal file
@@ -0,0 +1,120 @@
|
||||
package gomei
|
||||
|
||||
import (
|
||||
"encoding/base64"
|
||||
gomei "git.rosy.net.cn/baseapi/platformapi/gome_live_show"
|
||||
"git.rosy.net.cn/baseapi/platformapi/jdshopapi"
|
||||
"git.rosy.net.cn/baseapi/utils"
|
||||
"git.rosy.net.cn/jx-callback/business/jxutils/jxcontext"
|
||||
"git.rosy.net.cn/jx-callback/business/model"
|
||||
"git.rosy.net.cn/jx-callback/business/model/dao"
|
||||
"git.rosy.net.cn/jx-callback/business/partner"
|
||||
"git.rosy.net.cn/jx-callback/business/partner/putils"
|
||||
"git.rosy.net.cn/jx-callback/globals"
|
||||
"git.rosy.net.cn/jx-callback/globals/api"
|
||||
)
|
||||
|
||||
var (
|
||||
CurPurchaseHandler *PurchaseHandler
|
||||
)
|
||||
|
||||
type PurchaseHandler struct {
|
||||
partner.BasePurchasePlatform
|
||||
putils.DefSingleStorePlatform
|
||||
}
|
||||
|
||||
func init() {
|
||||
if api.GuoMeiApi != nil {
|
||||
CurPurchaseHandler = New()
|
||||
partner.RegisterPurchasePlatform(CurPurchaseHandler)
|
||||
}
|
||||
}
|
||||
|
||||
func New() (obj *PurchaseHandler) {
|
||||
obj = new(PurchaseHandler)
|
||||
obj.ISingleStoreStoreSkuHandler = obj
|
||||
return obj
|
||||
}
|
||||
|
||||
func getAPI(appOrgCode string) (apiObj *gomei.API) {
|
||||
if appOrgCode == "" {
|
||||
globals.SugarLogger.Warnf("getAPI appOrgCode is empty")
|
||||
}
|
||||
|
||||
return partner.CurAPIManager.GetAPI(model.VendorGoMei, appOrgCode).(*gomei.API)
|
||||
}
|
||||
|
||||
func GetAPI(appOrgCode string) (apiObj *jdshopapi.API) {
|
||||
apiObj = partner.CurAPIManager.GetAPI(model.VendorGoMei, appOrgCode).(*jdshopapi.API)
|
||||
if configs, err := dao.QueryConfigs(dao.GetDB(), "jdsCookie2", model.ConfigTypeCookie, ""); err == nil {
|
||||
apiObj.SetCookieWithStr(configs[0].Value)
|
||||
}
|
||||
return apiObj
|
||||
}
|
||||
|
||||
func (p *PurchaseHandler) GetVendorID() int {
|
||||
return model.VendorGoMei
|
||||
}
|
||||
|
||||
func (p *PurchaseHandler) UploadImg(ctx *jxcontext.Context, vendorOrgCode, imgURL string, imgData []byte, imgName string, imgType int) (imgHint string, err error) {
|
||||
if globals.EnableJdShopWrite {
|
||||
if imgType > model.ImgTypeLocal {
|
||||
result, err := getAPI(vendorOrgCode).UploadPicture(base64.StdEncoding.EncodeToString(imgData), 0, imgName)
|
||||
if err == nil {
|
||||
imgHint = result.Data.Url
|
||||
}
|
||||
}
|
||||
} else {
|
||||
imgHint = utils.GetUpperUUID()
|
||||
}
|
||||
return imgHint, err
|
||||
}
|
||||
|
||||
// 获取国美商户的分类标签,官方未提供接口.->查询所有门店分类,去重复!目前国美分类只有一级
|
||||
func (p *PurchaseHandler) GetVendorCategories(ctx *jxcontext.Context) (vendorCats []*model.SkuVendorCategory, err error) {
|
||||
storeList, err := getAPI(string(model.VendorGoMei)).QueryStoreList(&gomei.GetStoreListReq{
|
||||
Page: gomei.Page{
|
||||
PageSize: model.BrandBalanceLimit,
|
||||
PageNumber: 1,
|
||||
},
|
||||
})
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if storeList.Data.Total == 0 {
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
result := make(map[string]*model.SkuVendorCategory, 0)
|
||||
for _, v := range storeList.Data.Records {
|
||||
storeCategoryList, err := GetAllStoreCategories(string(model.VendorGoMei), v.StoreCode)
|
||||
//storeCategoryList, err := api.GuoMeiApi.QueryStoreCategoryList(&gomei.QueryStoreGoodsCategoryListReq{
|
||||
// Page: gomei.Page{PageNumber: 1, PageSize: model.BrandBalanceLimit},
|
||||
// StoreCode: v.StoreCode,
|
||||
//})
|
||||
if err != nil || len(storeCategoryList) <= 0 {
|
||||
continue
|
||||
}
|
||||
for _, c := range storeCategoryList {
|
||||
cat := &model.SkuVendorCategory{
|
||||
VendorID: model.VendorGoMei,
|
||||
Name: c.CategoryName,
|
||||
Level: 1,
|
||||
VendorCategoryID: c.CategoryCode,
|
||||
ParentID: "",
|
||||
IsLeaf: 0,
|
||||
}
|
||||
result[cat.Name] = cat
|
||||
}
|
||||
}
|
||||
|
||||
for _, v := range result {
|
||||
vendorCats = append(vendorCats, v)
|
||||
}
|
||||
return vendorCats, err
|
||||
}
|
||||
|
||||
func (p *PurchaseHandler) GetOrderRider(vendorOrgCode, vendorStoreID string, param map[string]interface{}) (err error) {
|
||||
return nil
|
||||
}
|
||||
78
business/partner/purchase/gomei/key.go
Normal file
78
business/partner/purchase/gomei/key.go
Normal file
@@ -0,0 +1,78 @@
|
||||
package gomei
|
||||
|
||||
import (
|
||||
"encoding/base64"
|
||||
"encoding/hex"
|
||||
"encoding/json"
|
||||
"git.rosy.net.cn/baseapi/platformapi/jdshopapi"
|
||||
|
||||
"git.rosy.net.cn/jx-callback/globals"
|
||||
)
|
||||
|
||||
var (
|
||||
KeyList []*Key
|
||||
KeyList2 []*Key
|
||||
)
|
||||
|
||||
type Key struct {
|
||||
ID string `json:"id"`
|
||||
KeyExp int64 `json:"key_exp"`
|
||||
KeyStatus int `json:"key_status"`
|
||||
KeyDigest string `json:"key_digest"`
|
||||
KeyType string `json:"key_type"`
|
||||
KeyString string `json:"key_string"`
|
||||
KeyEffective int64 `json:"key_effective"`
|
||||
Version int `json:"version"`
|
||||
}
|
||||
|
||||
func InitKey() {
|
||||
newapi := jdshopapi.New("37d36b62c0d14bd4b872f948b335c95czinj", "E1D746D42474D5F1F1A10CECE75D99F6", "efa7e1d1a22640fa990e6cf164b28608")
|
||||
keyResult, err := newapi.KeyGet()
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
for _, v := range keyResult.Response.ServiceKeyList[0].Keys {
|
||||
data, _ := json.Marshal(v)
|
||||
vv := &Key{}
|
||||
err = json.Unmarshal(data, &vv)
|
||||
KeyList = append(KeyList, vv)
|
||||
}
|
||||
keyResult2, err := jdshopapi.New("f9c5ce9a5ce24218936924f7c4864cc9owe1", "E1D746D42474D5F1F1A10CECE75D99F6", "efa7e1d1a22640fa990e6cf164b28608").KeyGet()
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
for _, v := range keyResult2.Response.ServiceKeyList[0].Keys {
|
||||
data, _ := json.Marshal(v)
|
||||
vv := &Key{}
|
||||
err = json.Unmarshal(data, &vv)
|
||||
KeyList2 = append(KeyList2, vv)
|
||||
}
|
||||
globals.SugarLogger.Debugf("jdshop key refreshed..")
|
||||
}
|
||||
|
||||
func GetKey(keySign, vendorOrgCode string) (key string) {
|
||||
if vendorOrgCode == "1" {
|
||||
for _, v := range KeyList {
|
||||
data, _ := base64.StdEncoding.DecodeString(v.ID)
|
||||
if keySign == hex.EncodeToString(data) {
|
||||
return v.KeyString
|
||||
}
|
||||
}
|
||||
} else {
|
||||
for _, v := range KeyList2 {
|
||||
//data, _ := base64.StdEncoding.DecodeString(v.ID)
|
||||
//if keySign == hex.EncodeToString(data) {
|
||||
return v.KeyString
|
||||
}
|
||||
}
|
||||
// } else {
|
||||
// for _, v := range KeyList2 {
|
||||
// data, _ := base64.StdEncoding.DecodeString(v.ID)
|
||||
// if keySign == hex.EncodeToString(data) {
|
||||
// return v.KeyString
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
globals.SugarLogger.Debugf("no key can equal..")
|
||||
return key
|
||||
}
|
||||
322
business/partner/purchase/gomei/order.go
Normal file
322
business/partner/purchase/gomei/order.go
Normal file
@@ -0,0 +1,322 @@
|
||||
package gomei
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"git.rosy.net.cn/jx-callback/globals"
|
||||
"net/http"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"git.rosy.net.cn/jx-callback/business/model/dao"
|
||||
|
||||
"git.rosy.net.cn/baseapi"
|
||||
"git.rosy.net.cn/baseapi/platformapi"
|
||||
"git.rosy.net.cn/baseapi/platformapi/jdshopapi"
|
||||
"git.rosy.net.cn/baseapi/utils"
|
||||
"git.rosy.net.cn/jx-callback/business/jxutils"
|
||||
"git.rosy.net.cn/jx-callback/business/jxutils/jxcontext"
|
||||
"git.rosy.net.cn/jx-callback/business/jxutils/tasksch"
|
||||
"git.rosy.net.cn/jx-callback/business/model"
|
||||
"git.rosy.net.cn/jx-callback/business/partner"
|
||||
"git.rosy.net.cn/jx-callback/globals/api"
|
||||
)
|
||||
|
||||
func (p *PurchaseHandler) AcceptOrRefuseFailedGetOrder(ctx *jxcontext.Context, order *model.GoodsOrder, isAcceptIt bool) (err error) {
|
||||
return err
|
||||
}
|
||||
|
||||
func (p *PurchaseHandler) Map2Order(orderData map[string]interface{}) (order *model.GoodsOrder) {
|
||||
result := &jdshopapi.AllOrdersResult{}
|
||||
if err := utils.Map2StructByJson(orderData, &result, false); err != nil {
|
||||
fmt.Println("err===============", err)
|
||||
return nil
|
||||
}
|
||||
fmt.Println("err===============", orderData)
|
||||
|
||||
jdsOrder := result.OrderList[0]
|
||||
order = &model.GoodsOrder{
|
||||
VendorOrderID: utils.Int64ToStr(jdsOrder.OrderID),
|
||||
VendorID: model.VendorIDJDShop,
|
||||
BaseFreightMoney: jxutils.StandardPrice2Int(jdsOrder.Freight),
|
||||
VendorStatus: utils.Int2Str(jdsOrder.OrderStatus),
|
||||
VendorUserID: jdsOrder.UserPin,
|
||||
BuyerComment: jdsOrder.UserRemark,
|
||||
PickDeadline: utils.DefaultTimeValue,
|
||||
OriginalData: string(utils.MustMarshal(jdsOrder)),
|
||||
Status: status2Jxstatus(jdsOrder.OrderStatus),
|
||||
}
|
||||
return order
|
||||
}
|
||||
func (p *PurchaseHandler) GetOrder(vendorOrgCode, vendorOrderID, vendorStoreID string) (order *model.GoodsOrder, err error) {
|
||||
resultOrders, err := api.JdShopAPI.AllOrders(&jdshopapi.AllOrdersParam{
|
||||
OrderID: vendorOrderID,
|
||||
Current: 1,
|
||||
PageSize: 10,
|
||||
})
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
fmt.Println("resultOrders===============", resultOrders)
|
||||
return p.Map2Order(utils.Struct2FlatMap(resultOrders)), err
|
||||
}
|
||||
func (p *PurchaseHandler) GetOrderStatus(vendorOrgCode, vendorOrderID string) (status int, err error) {
|
||||
//jdsOrder, err := GetJdsOrder(vendorOrderID, vendorOrgCode)
|
||||
//jdsOrder, err := GetJdsOrder2(vendorOrderID, vendorOrgCode)
|
||||
//r := regexp.MustCompile(`"orderState":"(.*)","orderType`)
|
||||
//if len(r.FindStringSubmatch(jdsOrder)) > 0 {
|
||||
// return status2Jxstatus(r.FindStringSubmatch(jdsOrder)[1]), err
|
||||
//}
|
||||
if order, err := p.GetOrder(vendorOrgCode, vendorOrderID, ""); err == nil && order != nil {
|
||||
return order.Status, err
|
||||
}
|
||||
return 0, err
|
||||
}
|
||||
|
||||
func (p *PurchaseHandler) AcceptOrRefuseOrder(order *model.GoodsOrder, isAcceptIt bool, userName string) (err error) {
|
||||
//var (
|
||||
// status int
|
||||
// remark string
|
||||
//)
|
||||
//if isAcceptIt {
|
||||
// status = model.OrderStatusAccepted
|
||||
// //京东商城第二个号要自动接单
|
||||
// if order.VendorOrgCode == "2" {
|
||||
// err = getAPI(order.VendorOrgCode).SetOrderStateToWait(utils.Str2Int64(order.VendorOrderID2))
|
||||
// }
|
||||
//} else {
|
||||
// status = model.OrderStatusCanceled
|
||||
//}
|
||||
//return ChangeOrderStatus(order.VendorOrderID, status, remark)
|
||||
return err
|
||||
}
|
||||
func (p *PurchaseHandler) PickupGoods(order *model.GoodsOrder, isSelfDelivery bool, userName string) (err error) {
|
||||
status, err := p.GetOrderStatus(order.VendorOrgCode, order.VendorOrderID2)
|
||||
if err != nil {
|
||||
globals.SugarLogger.Debug("jdShop GetOrders err := ", err)
|
||||
return err
|
||||
}
|
||||
//说明此时该订单在平台上已经取消了
|
||||
if status == model.OrderStatusCanceled {
|
||||
err = ChangeOrderStatus(order.VendorOrderID, model.OrderStatusCanceled, "订单在京东商城已被取消!")
|
||||
} else {
|
||||
if jxutils.GetSaleStoreIDFromOrder(order) != model.JdShopMainStoreID {
|
||||
//可能还没接单?
|
||||
if status == model.OrderStatusNew {
|
||||
p.AcceptOrRefuseOrder(order, true, "")
|
||||
}
|
||||
err = ChangeOrderStatus(order.VendorOrderID, model.OrderStatusFinishedPickup, "自动拣货完成")
|
||||
//if status == model.OrderStatusAccepted {
|
||||
err = p.OrderExport(jxcontext.AdminCtx, order.VendorOrderID, order.VendorOrderID, true)
|
||||
//}
|
||||
}
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
func (p *PurchaseHandler) CallCourier(ctx *jxcontext.Context, order *model.GoodsOrder) (err error) {
|
||||
return err
|
||||
} // 取货失败后再次招唤平台配送
|
||||
func (p *PurchaseHandler) ConfirmReceiveGoods(ctx *jxcontext.Context, order *model.GoodsOrder) (err error) {
|
||||
return err
|
||||
} // 投递失败后确认收到退货
|
||||
func (p *PurchaseHandler) CanSwitch2SelfDeliver(order *model.GoodsOrder) (isCan bool, err error) {
|
||||
return isCan, err
|
||||
}
|
||||
func (p *PurchaseHandler) Swtich2SelfDeliver(order *model.GoodsOrder, userName string) (err error) {
|
||||
return err
|
||||
}
|
||||
func (p *PurchaseHandler) Swtich2SelfDelivered(order *model.GoodsOrder, userName string) (err error) {
|
||||
return err
|
||||
}
|
||||
func (p *PurchaseHandler) SelfDeliverDelivering(order *model.GoodsOrder, userName string) (err error) {
|
||||
ChangeOrderStatus(order.VendorOrderID, model.OrderStatusDelivering, "")
|
||||
return err
|
||||
}
|
||||
func (p *PurchaseHandler) SelfDeliverDelivered(order *model.GoodsOrder, userName string) (err error) {
|
||||
//ChangeOrderStatus(order.VendorOrderID, model.OrderStatusFinished, "")
|
||||
//if order.VendorOrgCode == "2" {
|
||||
// getAPI(order.VendorOrgCode).SetOrderStateToFinish(utils.Str2Int64(order.VendorOrderID2))
|
||||
//}
|
||||
return err
|
||||
}
|
||||
func (p *PurchaseHandler) GetOrderRealMobile(ctx *jxcontext.Context, order *model.GoodsOrder) (mobile string, err error) {
|
||||
return mobile, err
|
||||
}
|
||||
func (p *PurchaseHandler) ReplyOrderComment(ctx *jxcontext.Context, vendorOrgCode string, orderComment *model.OrderComment, replyComment string) (err error) {
|
||||
return err
|
||||
}
|
||||
func (p *PurchaseHandler) AgreeOrRefuseCancel(ctx *jxcontext.Context, order *model.GoodsOrder, isAgree bool, reason string) (err error) {
|
||||
return err
|
||||
}
|
||||
func (p *PurchaseHandler) CancelOrder(ctx *jxcontext.Context, order *model.GoodsOrder, reason string) (err error) {
|
||||
ChangeOrderStatus(order.VendorOrderID, model.OrderStatusCanceled, reason)
|
||||
if order.EclpOutID != "" {
|
||||
_, err = api.JdEclpAPI.CancelOrder(order.EclpOutID)
|
||||
}
|
||||
return err
|
||||
}
|
||||
func (p *PurchaseHandler) AdjustOrder(ctx *jxcontext.Context, order *model.GoodsOrder, removedSkuList []*model.OrderSku, reason string) (err error) {
|
||||
var (
|
||||
db = dao.GetDB()
|
||||
diffShopPrice int64
|
||||
diffSalePrice int64
|
||||
)
|
||||
if order.Status >= model.OrderStatusDelivering {
|
||||
return fmt.Errorf("配送中以后的订单无法进行售前退款!")
|
||||
}
|
||||
//1、删除原order_sku 中售前调整的商品
|
||||
for _, sku := range removedSkuList {
|
||||
sql := `DELETE FROM order_sku WHERE vendor_order_id = ? AND vendor_id = ? AND sku_id = ?`
|
||||
sqlParams := []interface{}{order.VendorOrderID, order.VendorID, sku.SkuID}
|
||||
dao.ExecuteSQL(db, sql, sqlParams)
|
||||
|
||||
diffShopPrice += sku.ShopPrice
|
||||
diffSalePrice += sku.SalePrice
|
||||
}
|
||||
//2、修改goods_order 中的shopprice,若是扣点的订单,还要改new_earning_price和total_shop_money
|
||||
order.AdjustCount += 1
|
||||
order.ShopPrice = order.ShopPrice - diffShopPrice
|
||||
if order.EarningType == model.EarningTypePoints {
|
||||
order.TotalShopMoney = utils.Float64TwoInt64(float64(float64(order.TotalShopMoney)/jdshopapi.JdsPayPercentage-float64(diffSalePrice)) * jdshopapi.JdsPayPercentage)
|
||||
jxutils.RefreshOrderEarningPrice2(order, order.OrderPayPercentage)
|
||||
partner.CurOrderManager.UpdateOrderFields(order, []string{"TotalShopMoney", "NewEarningPrice"})
|
||||
}
|
||||
partner.CurOrderManager.UpdateOrderFields(order, []string{"AdjustCount", "ShopPrice"})
|
||||
return err
|
||||
}
|
||||
|
||||
func (p *PurchaseHandler) GetJdsOrders(ctx *jxcontext.Context, orderCreatedStart, orderCreatedEnd string, current, pageSize int) (orderResult *jdshopapi.AllOrdersResult, err error) {
|
||||
//jdsapi := getAPI("2")
|
||||
//globals.SugarLogger.Debugf("此时的cookie , %d", jdsapi.GetCookieCount())
|
||||
//orderResult, err = jdsapi.AllOrders(&jdshopapi.AllOrdersParam{
|
||||
// Current: current,
|
||||
// PageSize: pageSize,
|
||||
// OrderCreateDateRange: []string{orderCreatedStart, orderCreatedEnd},
|
||||
//})
|
||||
return orderResult, err
|
||||
}
|
||||
|
||||
func ChangeOrderStatus(vendorOrderID string, status int, remark string) (err error) {
|
||||
orderStatus := &model.OrderStatus{
|
||||
VendorOrderID: vendorOrderID,
|
||||
VendorID: model.VendorIDJDShop,
|
||||
OrderType: model.OrderTypeOrder,
|
||||
RefVendorOrderID: vendorOrderID,
|
||||
RefVendorID: model.VendorIDJDShop,
|
||||
VendorStatus: utils.Int2Str(status),
|
||||
Status: status,
|
||||
StatusTime: time.Now(),
|
||||
Remark: remark,
|
||||
}
|
||||
jxutils.CallMsgHandlerAsync(func() {
|
||||
err = partner.CurOrderManager.OnOrderStatusChanged("", orderStatus)
|
||||
}, jxutils.ComposeUniversalOrderID(vendorOrderID, model.VendorIDJDShop))
|
||||
return err
|
||||
}
|
||||
|
||||
func (p *PurchaseHandler) OrderExport(ctx *jxcontext.Context, vendorOrderID, vendorWaybillID string, isAuto bool) (err error) {
|
||||
//companyID := jdshopapi.JdsDeliveryCompany3rd
|
||||
////表示是门店手动发京东
|
||||
//if !isAuto {
|
||||
// companyID = jdshopapi.JdsDeliveryCompanyJD
|
||||
//}
|
||||
//if order, _ := partner.CurOrderManager.LoadOrder(vendorOrderID, model.VendorIDJDShop); order != nil {
|
||||
// err = getAPI(order.VendorOrgCode).OrderShipment(utils.Str2Int64(order.VendorOrderID2), companyID, vendorWaybillID)
|
||||
//}
|
||||
return err
|
||||
}
|
||||
|
||||
func (p *PurchaseHandler) OrderTransfer(ctx *jxcontext.Context, vendorOrderID, vendorWaybillID string, isAuto bool) (err error) {
|
||||
companyID := jdshopapi.JdsDeliveryCompany3rd
|
||||
//表示是门店手动发京东
|
||||
if !isAuto {
|
||||
companyID = jdshopapi.JdsDeliveryCompanyJD
|
||||
}
|
||||
err = api.JdShopAPI.UpdateWaybill(vendorOrderID[:12], companyID, vendorOrderID)
|
||||
return err
|
||||
}
|
||||
|
||||
func status2Jxstatus(status int) (statusJx int) {
|
||||
//if status == jdshopapi.OrderStatusPopPause || status == jdshopapi.OrderStatusPause {
|
||||
// statusJx = model.OrderStatusNew
|
||||
//} else if status == jdshopapi.OrderStatusWait {
|
||||
// statusJx = model.OrderStatusAccepted
|
||||
//} else if status == jdshopapi.OrderStatusCancel {
|
||||
// statusJx = model.OrderStatusCanceled
|
||||
//}
|
||||
if status == jdshopapi.OrderStatusFinishedPickup {
|
||||
statusJx = model.OrderStatusAccepted
|
||||
} else if status == jdshopapi.OrderStatusNew {
|
||||
statusJx = model.OrderStatusNew
|
||||
} else if status == jdshopapi.OrderStatusCancelm2 {
|
||||
statusJx = model.OrderStatusCanceled
|
||||
}
|
||||
return statusJx
|
||||
}
|
||||
|
||||
const (
|
||||
ProdURL = "http://116.196.82.188:8080/v2/"
|
||||
)
|
||||
|
||||
func apiToYd(url string, params map[string]interface{}) (retVal map[string]interface{}, err error) {
|
||||
cl := &http.Client{}
|
||||
err = platformapi.AccessPlatformAPIWithRetry(cl,
|
||||
func() *http.Request {
|
||||
request, _ := http.NewRequest(http.MethodPost, ProdURL+url, strings.NewReader(utils.Map2URLValues(params).Encode()))
|
||||
request.Header.Set("Content-Type", "application/x-www-form-urlencoded")
|
||||
return request
|
||||
},
|
||||
nil,
|
||||
func(response *http.Response, bodyStr string, jsonResult1 map[string]interface{}) (errLevel string, err error) {
|
||||
if jsonResult1 == nil {
|
||||
return platformapi.ErrLevelRecoverableErr, fmt.Errorf("mapData is nil")
|
||||
}
|
||||
if err == nil {
|
||||
if jsonResult1["code"] != nil {
|
||||
if utils.Interface2Int64WithDefault(jsonResult1["code"], 0) != 0 {
|
||||
errLevel = platformapi.ErrLevelGeneralFail
|
||||
err = utils.NewErrorCode(jsonResult1["desc"].(string), jsonResult1["code"].(string))
|
||||
baseapi.SugarLogger.Debugf("yd AccessAPI failed, jsonResult1:%s", utils.Format4Output(jsonResult1, true))
|
||||
}
|
||||
}
|
||||
retVal = jsonResult1
|
||||
}
|
||||
return errLevel, err
|
||||
})
|
||||
return retVal, err
|
||||
}
|
||||
|
||||
func GetJdsOrder(vendorOrderID, vendorOrgCode string) (jdsOrder *jdshopapi.GetEnOrderResult, err error) {
|
||||
jdmcshopapi := jdshopapi.New("f9c5ce9a5ce24218936924f7c4864cc9owe1", "E1D746D42474D5F1F1A10CECE75D99F6", "efa7e1d1a22640fa990e6cf164b28608")
|
||||
result, err := jdmcshopapi.GetOrderById(utils.Str2Int64(vendorOrderID[0:12]), false)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return result, err
|
||||
}
|
||||
|
||||
func GetJdsOrder2(vendorOrderID, vendorOrgCode string) (jdsOrder string, err error) {
|
||||
params := make(map[string]interface{})
|
||||
params["orderID"] = vendorOrderID
|
||||
params["token"] = jdshopapi.JdsYdToken
|
||||
params["vendorOrgCode"] = vendorOrgCode
|
||||
result, err := apiToYd("order/GetJdsOrder", params)
|
||||
//jdsOrder2 := &jdshopapi.GetOrderResult{}
|
||||
return strings.ReplaceAll(result["data"].(string), "\\", ""), err
|
||||
}
|
||||
|
||||
func (c *PurchaseHandler) GetSelfTakeCode(ctx *jxcontext.Context, order *model.GoodsOrder) (selfTakeCode string, err error) {
|
||||
return selfTakeCode, err
|
||||
}
|
||||
|
||||
func (c *PurchaseHandler) ConfirmSelfTake(ctx *jxcontext.Context, order *model.GoodsOrder, selfTakeCode string) (err error) {
|
||||
return err
|
||||
}
|
||||
|
||||
func (c *PurchaseHandler) ListOrders(ctx *jxcontext.Context, vendorOrgCode string, parentTask tasksch.ITask, queryDate time.Time, vendorStoreID string) (vendorOrderIDs []string, err error) {
|
||||
return vendorOrderIDs, err
|
||||
}
|
||||
|
||||
func (c *PurchaseHandler) ComplaintRider(vendorOrderId string, resonID int, resonContent string) (err error) {
|
||||
return err
|
||||
}
|
||||
138
business/partner/purchase/gomei/order_afs.go
Normal file
138
business/partner/purchase/gomei/order_afs.go
Normal file
@@ -0,0 +1,138 @@
|
||||
package gomei
|
||||
|
||||
import (
|
||||
"crypto/md5"
|
||||
"fmt"
|
||||
"math"
|
||||
"time"
|
||||
|
||||
"git.rosy.net.cn/jx-callback/business/model/dao"
|
||||
|
||||
"git.rosy.net.cn/baseapi/utils"
|
||||
"git.rosy.net.cn/jx-callback/business/jxutils/jxcontext"
|
||||
"git.rosy.net.cn/jx-callback/business/model"
|
||||
"git.rosy.net.cn/jx-callback/business/partner"
|
||||
"git.rosy.net.cn/jx-callback/globals"
|
||||
)
|
||||
|
||||
func (c *PurchaseHandler) AgreeOrRefuseRefund(ctx *jxcontext.Context, afsOrder *model.AfsOrder, approveType int, reason string) (err error) {
|
||||
var status int
|
||||
if approveType == partner.AfsApproveTypeRefused {
|
||||
status = model.AfsOrderStatusFailed
|
||||
} else {
|
||||
status = model.AfsOrderStatusFinished
|
||||
|
||||
}
|
||||
orderStatus := &model.OrderStatus{
|
||||
VendorOrderID: afsOrder.AfsOrderID, // 是售后单ID,不是订单ID,订单ID在RefVendorOrderID中
|
||||
VendorID: afsOrder.VendorID,
|
||||
OrderType: model.OrderTypeAfsOrder,
|
||||
RefVendorOrderID: afsOrder.VendorOrderID,
|
||||
RefVendorID: afsOrder.VendorID,
|
||||
VendorStatus: utils.Int2Str(status),
|
||||
Status: status,
|
||||
StatusTime: time.Now(),
|
||||
Remark: reason,
|
||||
}
|
||||
partner.CurOrderManager.OnAfsOrderStatusChanged(orderStatus)
|
||||
return err
|
||||
}
|
||||
|
||||
// 确认收到退货
|
||||
func (c *PurchaseHandler) ConfirmReceivedReturnGoods(ctx *jxcontext.Context, order *model.AfsOrder) (err error) {
|
||||
err = fmt.Errorf("京东商城当前不支持ConfirmReceivedReturnGoods")
|
||||
return err
|
||||
}
|
||||
|
||||
// 发起全款退款
|
||||
func (c *PurchaseHandler) RefundOrder(ctx *jxcontext.Context, order *model.GoodsOrder, reason string) (err error) {
|
||||
err = c.PartRefundOrder(ctx, order, order.Skus, reason)
|
||||
return err
|
||||
}
|
||||
|
||||
// 发起部分退款
|
||||
func (c *PurchaseHandler) PartRefundOrder(ctx *jxcontext.Context, order *model.GoodsOrder, refundSkuList []*model.OrderSku, reason string) (err error) {
|
||||
globals.SugarLogger.Debugf("PartRefundOrder jdshop, order :%v", utils.Format4Output(order, true))
|
||||
var (
|
||||
skuMap = make(map[int]*model.OrderSku)
|
||||
salePrice int64
|
||||
db = dao.GetDB()
|
||||
)
|
||||
for _, sku := range order.Skus {
|
||||
skuMap[sku.SkuID] = sku
|
||||
}
|
||||
orderStatus := buildOrderStatus(ctx, order, reason)
|
||||
afsOrder := &model.AfsOrder{
|
||||
VendorID: order.VendorID,
|
||||
AfsOrderID: orderStatus.VendorOrderID,
|
||||
VendorOrderID: orderStatus.RefVendorOrderID,
|
||||
// VendorStoreID: order.VendorStoreID,
|
||||
// StoreID: jxutils.GetSaleStoreIDFromOrder(order),
|
||||
AfsCreatedAt: time.Now(),
|
||||
VendorAppealType: "",
|
||||
AppealType: model.AfsAppealTypeRefund,
|
||||
VendorReasonType: utils.Int2Str(model.AfsReasonNotOthers),
|
||||
ReasonType: model.AfsReasonNotOthers,
|
||||
ReasonDesc: utils.LimitUTF8StringLen(reason, 1024),
|
||||
ReasonImgList: "",
|
||||
RefundType: model.AfsTypePartRefund,
|
||||
|
||||
VendorOrgCode: "",
|
||||
}
|
||||
for _, sku := range refundSkuList {
|
||||
orderSku := &model.OrderSkuFinancial{
|
||||
Count: sku.Count,
|
||||
VendorSkuID: utils.Int2Str(sku.SkuID),
|
||||
SkuID: sku.SkuID,
|
||||
}
|
||||
storeSkus, _ := dao.GetStoresSkusInfo(db, []int{model.JdShopMainStoreID}, []int{sku.SkuID})
|
||||
if len(storeSkus) > 0 {
|
||||
orderSku.VendorSkuID = utils.Int64ToStr(storeSkus[0].JdsID)
|
||||
}
|
||||
if skuMap[sku.SkuID] != nil {
|
||||
orderSku.Name = skuMap[sku.SkuID].SkuName
|
||||
orderSku.UserMoney = skuMap[sku.SkuID].SalePrice * int64(sku.Count)
|
||||
salePrice += skuMap[sku.SkuID].SalePrice * int64(sku.Count)
|
||||
}
|
||||
afsOrder.SkuUserMoney += orderSku.UserMoney
|
||||
afsOrder.Skus = append(afsOrder.Skus, orderSku)
|
||||
}
|
||||
err = partner.CurOrderManager.OnAfsOrderNew(afsOrder, orderStatus)
|
||||
return err
|
||||
}
|
||||
|
||||
func buildOrderStatus(ctx *jxcontext.Context, order *model.GoodsOrder, reason string) (orderStatus *model.OrderStatus) {
|
||||
orderStatus = &model.OrderStatus{
|
||||
VendorOrderID: utils.Int64ToStr(GenAfsOrderNo(ctx)), // 是售后单ID,不是订单ID,订单ID在RefVendorOrderID中
|
||||
VendorID: order.VendorID,
|
||||
OrderType: model.OrderTypeAfsOrder,
|
||||
RefVendorOrderID: order.VendorOrderID,
|
||||
RefVendorID: order.VendorID,
|
||||
VendorStatus: utils.Int2Str(model.AfsOrderStatusWait4Approve),
|
||||
Status: model.AfsOrderStatusWait4Approve,
|
||||
StatusTime: time.Now(),
|
||||
Remark: reason,
|
||||
}
|
||||
orderStatus.Status = model.AfsOrderStatusWait4Approve
|
||||
return orderStatus
|
||||
}
|
||||
|
||||
func GenAfsOrderNo(ctx *jxcontext.Context) (orderNo int64) {
|
||||
const prefix = 70
|
||||
const randPartNum = 100
|
||||
orderNoBeginTimestamp := utils.Str2Time("2010-01-01 00:00:00").Unix()
|
||||
orderNo = time.Now().Unix() - orderNoBeginTimestamp
|
||||
orderNo = orderNo * randPartNum
|
||||
md5Bytes := md5.Sum([]byte(utils.GetUUID()))
|
||||
randPart := 0
|
||||
for k, v := range md5Bytes {
|
||||
randPart += int(v) << ((k % 3) * 8)
|
||||
}
|
||||
orderNo += int64(randPart % randPartNum)
|
||||
orderNo += int64(math.Pow10(int(math.Log10(float64(orderNo)))+1)) * prefix
|
||||
return orderNo
|
||||
}
|
||||
|
||||
func (c *PurchaseHandler) GetOrderAfsInfo(ctx *jxcontext.Context, vendorOrderID, afsOrderID string) (orderAfsInfo *partner.OrderAfsInfo, err error) {
|
||||
return &partner.OrderAfsInfo{}, err
|
||||
}
|
||||
5
business/partner/purchase/gomei/order_comment.go
Normal file
5
business/partner/purchase/gomei/order_comment.go
Normal file
@@ -0,0 +1,5 @@
|
||||
package gomei
|
||||
|
||||
func (c *PurchaseHandler) StartRefreshComment() {
|
||||
|
||||
}
|
||||
87
business/partner/purchase/gomei/store.go
Normal file
87
business/partner/purchase/gomei/store.go
Normal file
@@ -0,0 +1,87 @@
|
||||
package gomei
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
gomei "git.rosy.net.cn/baseapi/platformapi/gome_live_show"
|
||||
"git.rosy.net.cn/baseapi/platformapi/jdshopapi"
|
||||
"git.rosy.net.cn/baseapi/utils"
|
||||
"git.rosy.net.cn/jx-callback/business/jxutils"
|
||||
"git.rosy.net.cn/jx-callback/business/jxutils/jxcontext"
|
||||
"git.rosy.net.cn/jx-callback/business/jxutils/tasksch"
|
||||
"git.rosy.net.cn/jx-callback/business/model"
|
||||
"git.rosy.net.cn/jx-callback/business/model/dao"
|
||||
"git.rosy.net.cn/jx-callback/globals/api"
|
||||
)
|
||||
|
||||
func (p *PurchaseHandler) ReadStore(ctx *jxcontext.Context, vendorOrgCode, vendorStoreID, vendorStoreName string) (storeDetail *dao.StoreDetail, err error) {
|
||||
if vendorStoreName != "" {
|
||||
result2, _ := api.GuoMeiApi.QueryStoreList(&gomei.GetStoreListReq{
|
||||
StoreName: vendorStoreName,
|
||||
})
|
||||
if len(result2.Data.Records) != model.YES {
|
||||
return storeDetail, fmt.Errorf("国美未查询到该平台门店,平台门店ID:[%v]", vendorStoreID)
|
||||
}
|
||||
storeDetail = &dao.StoreDetail{}
|
||||
storeDetail.Name = result2.Data.Records[0].StoreName
|
||||
storeDetail.Lat = jxutils.StandardCoordinate2Int(utils.Str2Float64("0.000"))
|
||||
storeDetail.Lng = jxutils.StandardCoordinate2Int(utils.Str2Float64("0.000"))
|
||||
}
|
||||
return storeDetail, err
|
||||
}
|
||||
|
||||
// stoerIDs为nil表示所有
|
||||
func (p *PurchaseHandler) UpdateStore(db *dao.DaoDB, storeID int, userName string) (err error) {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (p *PurchaseHandler) CreateStore2(db *dao.DaoDB, storeID int, userName string, params map[string]interface{}, storeDetail *dao.StoreDetail) (vendorStoreID string, err error) {
|
||||
return "", err
|
||||
}
|
||||
|
||||
func (p *PurchaseHandler) DeleteStore(db *dao.DaoDB, storeID int, userName string) (err error) {
|
||||
return err
|
||||
}
|
||||
|
||||
func (p *PurchaseHandler) RefreshAllStoresID(ctx *jxcontext.Context, parentTask tasksch.ITask, isAsync bool) (hint string, err error) {
|
||||
return hint, err
|
||||
}
|
||||
|
||||
func (p *PurchaseHandler) GetStoreStatus(ctx *jxcontext.Context, vendorOrgCode string, storeID int, vendorStoreID string) (storeStatus int, err error) {
|
||||
return storeStatus, err
|
||||
}
|
||||
|
||||
func (p *PurchaseHandler) EnableAutoAcceptOrder(ctx *jxcontext.Context, vendorOrgCode string, storeID int, vendorStoreID string, isSetEnable bool) (err error) {
|
||||
return err
|
||||
}
|
||||
|
||||
func (c *PurchaseHandler) UpdateStoreStatus(ctx *jxcontext.Context, vendorOrgCode string, storeID int, vendorStoreID string, status int) (err error) {
|
||||
err = api.JdShopAPI.UpdateStatus(utils.Str2Int(vendorStoreID), jxStatus2JdsStatus(status))
|
||||
return err
|
||||
}
|
||||
|
||||
func (c *PurchaseHandler) UpdateStoreOpTime(ctx *jxcontext.Context, vendorOrgCode string, storeID int, vendorStoreID string, opTimeList []int16) (err error) {
|
||||
return err
|
||||
}
|
||||
|
||||
func (c *PurchaseHandler) GetAllStoresVendorID(ctx *jxcontext.Context, vendorOrgCode string) (vendorStoreIDs []string, err error) {
|
||||
return vendorStoreIDs, err
|
||||
}
|
||||
|
||||
func (c *PurchaseHandler) UpdateStoreCustomID(ctx *jxcontext.Context, vendorOrgCode, vendorStoreID string, storeID int64) (err error) {
|
||||
return err
|
||||
}
|
||||
|
||||
func jxStatus2JdsStatus(status int) (result int) {
|
||||
if status == model.StoreStatusOpened {
|
||||
result = jdshopapi.JdsStoreStatusOnline
|
||||
} else if status == model.StoreStatusHaveRest || status == model.StoreStatusClosed {
|
||||
result = jdshopapi.JdsStoreStatusRest
|
||||
} else {
|
||||
result = jdshopapi.JdsStoreStatusDisable
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
func (c *PurchaseHandler) UpdateStoreLineStatus(ctx *jxcontext.Context, vendorOrgCode string, storeID int, vendorStoreID string, lineStatus int) (err error) {
|
||||
return err
|
||||
}
|
||||
911
business/partner/purchase/gomei/store_sku.go
Normal file
911
business/partner/purchase/gomei/store_sku.go
Normal file
@@ -0,0 +1,911 @@
|
||||
package gomei
|
||||
|
||||
import "regexp"
|
||||
|
||||
//
|
||||
//import (
|
||||
// "fmt"
|
||||
// gomei "git.rosy.net.cn/baseapi/platformapi/gome_live_show"
|
||||
// "regexp"
|
||||
// "strings"
|
||||
// "time"
|
||||
//
|
||||
// "git.rosy.net.cn/baseapi/platformapi/jdshopapi"
|
||||
//
|
||||
// "git.rosy.net.cn/jx-callback/globals/api"
|
||||
//
|
||||
// "git.rosy.net.cn/baseapi/utils"
|
||||
// "git.rosy.net.cn/jx-callback/business/jxutils"
|
||||
// "git.rosy.net.cn/jx-callback/business/jxutils/jxcontext"
|
||||
// "git.rosy.net.cn/jx-callback/business/model"
|
||||
// "git.rosy.net.cn/jx-callback/business/model/dao"
|
||||
// "git.rosy.net.cn/jx-callback/business/partner"
|
||||
// "git.rosy.net.cn/jx-callback/business/partner/putils"
|
||||
// "git.rosy.net.cn/jx-callback/globals"
|
||||
//)
|
||||
//
|
||||
const (
|
||||
deleteErr1 = "已经删除的不能直接下架"
|
||||
deleteErr2 = "SKU"
|
||||
deleteErr3 = "已删除"
|
||||
)
|
||||
|
||||
var (
|
||||
sensitiveWordRegexp = regexp.MustCompile(`商品名称中含有敏感词(\[.*\])`)
|
||||
)
|
||||
|
||||
//func (p *PurchaseHandler) CreateStoreSkus(ctx *jxcontext.Context, storeID int, vendorStoreID string, storeSkuList []*dao.StoreSkuSyncInfo) (failedList []*partner.StoreSkuInfoWithErr, err error) {
|
||||
// if globals.EnableJdShopWrite {
|
||||
// if vendorStoreID == model.GoMeiShopMainVendorStoreID {
|
||||
// for _, v := range storeSkuList {
|
||||
// //判断京东商城上是否有这个商品了,如果有就是添加规格而不是创建商品
|
||||
// //如果是京东商城2,是下架的商品,弄上架 ,先改为有下架的不管,重新建
|
||||
// name := filterSensitiveWord(v.Name)
|
||||
// flag := false
|
||||
// result, err := getAPI(v.VendorOrgCode).SearchWare4Valid(name, 1, 100)
|
||||
// if err != nil {
|
||||
// failedList = putils.GetErrMsg2FailedSingleList(storeSkuList, err, storeID, model.VendorChineseNames[model.VendorIDJDShop], "创建商品")
|
||||
// return failedList, err
|
||||
// }
|
||||
// for _, v := range result.Data {
|
||||
// if v.Title == name {
|
||||
// flag = true
|
||||
// //下架
|
||||
// if v.WareStatus == 2 || v.WareStatus == 1028 {
|
||||
// flag = false
|
||||
// //wareStatusUpdateWareID = utils.Int64ToStr(v.WareID)
|
||||
// }
|
||||
// break
|
||||
// }
|
||||
// }
|
||||
// if flag {
|
||||
// wareSaveParam := &jdshopapi.WareSaveParam{
|
||||
// WareID: result.Data[0].WareID,
|
||||
// Title: v.Name,
|
||||
// CategoryID: int(v.VendorVendorCatID),
|
||||
// VenderID: jdshopapi.VendorID2,
|
||||
// Length: 200,
|
||||
// Wide: 100,
|
||||
// Height: 100,
|
||||
// Weight: "1",
|
||||
// BrandID: jdshopapi.BrandIdNO,
|
||||
// ShopCategorys: []int{utils.Str2Int(v.VendorCatID)},
|
||||
// PromiseID: -1,
|
||||
// MultiCateProps: []interface{}{},
|
||||
// PropsSet: []interface{}{},
|
||||
// SaleAttrs: []interface{}{},
|
||||
// WareStatus: 8,
|
||||
// }
|
||||
// var wareSaveSkus []*jdshopapi.WareSaveSkus
|
||||
// //先把已有的规格放进去
|
||||
// wareResult, _ := getAPI(v.VendorOrgCode).FindWareById(wareSaveParam.WareID)
|
||||
// if wareResult != nil {
|
||||
// for _, v := range wareResult.Images {
|
||||
// wareSaveParam.ImageMap.Num0000000000 = append(wareSaveParam.ImageMap.Num0000000000, &jdshopapi.CreateSkuParamImages{
|
||||
// ColorID: v.ColorID,
|
||||
// ImgURL: v.ImgURL,
|
||||
// ImgIndex: v.ImgIndex,
|
||||
// })
|
||||
// }
|
||||
// }
|
||||
// skus, _, _ := getAPI(v.VendorOrgCode).SearchSkuList2([]int{int(wareSaveParam.WareID)})
|
||||
// if len(skus) > 0 {
|
||||
// for _, vv := range skus {
|
||||
// sku := &jdshopapi.WareSaveSkus{
|
||||
// SkuID: vv.SkuID,
|
||||
// JdPrice: utils.Float64ToStr(vv.JdPrice),
|
||||
// StockNum: vv.StockNum,
|
||||
// Props: []*jdshopapi.WareSaveSkusProp{
|
||||
// &jdshopapi.WareSaveSkusProp{
|
||||
// AttrID: utils.Str2Int(vv.SaleAttrs[0].AttrID),
|
||||
// AttrValues: utils.Str2Int64(vv.SaleAttrs[0].AttrValues[0]),
|
||||
// AttrValueAlias: vv.SaleAttrs[0].AttrValueAlias[0],
|
||||
// },
|
||||
// },
|
||||
// OuterID: vv.OuterID,
|
||||
// }
|
||||
// wareSaveSkus = append(wareSaveSkus, sku)
|
||||
// }
|
||||
// }
|
||||
// // }
|
||||
// for _, vv := range v.StoreSkuSyncInfoJds {
|
||||
// v.JdsWareID = result.Data[0].WareID
|
||||
// vv.JdsWareID = result.Data[0].WareID
|
||||
// _, wareSaveSku, err := buildUpdateSkusParam(v, vv, true)
|
||||
// wareSaveSkus = append(wareSaveSkus, wareSaveSku)
|
||||
// if err != nil {
|
||||
// failedList = putils.GetErrMsg2FailedSingleList(storeSkuList, err, storeID, model.VendorChineseNames[model.VendorIDJDShop], "创建商品")
|
||||
// return failedList, err
|
||||
// }
|
||||
//
|
||||
// wareSaveParam.Skus = wareSaveSkus
|
||||
// if wareResult, err2 := getAPI(v.VendorOrgCode).WareSave(wareSaveParam); err2 == nil {
|
||||
// for _, vvv := range wareResult {
|
||||
// if vvv.OuterID == wareSaveSku.OuterID {
|
||||
// vv.VendorSkuID = utils.Int64ToStr(vvv.SkuID)
|
||||
// break
|
||||
// }
|
||||
// }
|
||||
// //创建商品后要上架,改价,库存,门店关注商品等
|
||||
// if err = getAPI(v.VendorOrgCode).WareDoUpdate("up", utils.Int64ToStr(wareSaveParam.WareID)); err == nil {
|
||||
// err = getAPI(v.VendorOrgCode).StoreSkuBindStore(true, []string{vv.VendorSkuID}, nil)
|
||||
// }
|
||||
// }
|
||||
// // }
|
||||
// }
|
||||
// } else {
|
||||
// // 商品不存在,直接添加商品,添加分类,添加规格,门店关注上线
|
||||
// otherImg := make([]string, 0, 0)
|
||||
// if v.Img2 != "" {
|
||||
// otherImg = append(otherImg, v.Img2)
|
||||
// }
|
||||
// if v.Img3 != "" {
|
||||
// otherImg = append(otherImg, v.Img3)
|
||||
// }
|
||||
// if v.Img4 != "" {
|
||||
// otherImg = append(otherImg, v.Img4)
|
||||
// }
|
||||
// if v.Img5 != "" {
|
||||
// otherImg = append(otherImg, v.Img5)
|
||||
// }
|
||||
//
|
||||
// // 规格集合
|
||||
// spec := &gomei.SpecProperty{
|
||||
// SpecCode: v.VendorNameID,
|
||||
// SpecName: v.Unit,
|
||||
// SpecValues: nil,
|
||||
// }
|
||||
// specValuesList := make([]*gomei.SpecValues, 0, 0)
|
||||
// for _, c := range v.StoreSkuSyncInfoJds {
|
||||
// specValues := &gomei.SpecValues{
|
||||
// SpecValueCode: c.JdsStockSwitch,
|
||||
// SpecValueName: fmt.Sprintf("%f", c.SpecQuality) + c.SpecUnit,
|
||||
// }
|
||||
// specValuesList = append(specValuesList, specValues)
|
||||
// }
|
||||
// spec.SpecValues = append(spec.SpecValues, specValuesList...)
|
||||
// specProperty := append(make([]*gomei.SpecProperty, 0, 0), spec)
|
||||
//
|
||||
// api.GuoMeiApi.CreateMerchantGoodsOnStore(&gomei.CreateGoodsListToStore{
|
||||
// GoodsName: v.SkuName,
|
||||
// MainPictureURL: v.Img,
|
||||
// Detail: v.Name,
|
||||
// Cat3Code: v.VendorCatID,
|
||||
// SpecProperty: specProperty, // 规格集合
|
||||
// SkuSaleList: nil, // 售卖组
|
||||
// GoodsType: v.SkuVendorCatID,
|
||||
// OtherPictureURL: otherImg,
|
||||
// VideoURL: "",
|
||||
// SpecCode: "",
|
||||
// SpecName: "",
|
||||
// SpecValues: "",
|
||||
// SpecValueCode: "",
|
||||
// SpecValueName: "",
|
||||
// Specification: "", // 规格集合
|
||||
// MarketPrice: utils.Int64ToFloat64(v.Price),
|
||||
// ThirdSkuCode: string(v.SkuID),
|
||||
// })
|
||||
// _, _, wareSaveParam, err := buildCreateWareParam(v)
|
||||
// if err != nil {
|
||||
// failedList = putils.GetErrMsg2FailedSingleList(storeSkuList, err, storeID, model.VendorChineseNames[model.VendorIDJDShop], "创建商品")
|
||||
// return failedList, err
|
||||
// }
|
||||
// var (
|
||||
// wareID int64
|
||||
// resultAttrs = make(map[string]int64)
|
||||
// )
|
||||
// var createSkuResult []*jdshopapi.WareSaveResult
|
||||
// createSkuResult, err = getAPI(v.VendorOrgCode).WareSave(wareSaveParam)
|
||||
// wareID = createSkuResult[0].WareID
|
||||
//
|
||||
// var paramAttrs = make(map[string]*jdshopapi.WareSaveSkus)
|
||||
// for _, vv := range wareSaveParam.Skus {
|
||||
// for _, vvv := range vv.Props {
|
||||
// paramAttrs[vvv.AttrValueAlias] = vv
|
||||
// }
|
||||
// }
|
||||
// for _, vv1 := range createSkuResult {
|
||||
// for _, vvv1 := range vv1.Props {
|
||||
// if paramAttrs[vvv1.AttrValueAlias] != nil {
|
||||
// resultAttrs[paramAttrs[vvv1.AttrValueAlias].OuterID] = vv1.SkuID
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// for _, vv2 := range v.StoreSkuSyncInfoJds {
|
||||
// vv2.JdsWareID = createSkuResult[0].WareID
|
||||
// if resultAttrs[utils.Int2Str(vv2.SkuID)] != 0 {
|
||||
// vv2.VendorSkuID = utils.Int64ToStr(resultAttrs[utils.Int2Str(vv2.SkuID)])
|
||||
// }
|
||||
// }
|
||||
// //创建商品后要上架,改价,库存,门店关注商品等
|
||||
// if err = getAPI(v.VendorOrgCode).WareDoUpdate("up", utils.Int64ToStr(wareID)); err == nil {
|
||||
// for _, vv2 := range v.StoreSkuSyncInfoJds {
|
||||
// if resultAttrs[utils.Int2Str(vv2.SkuID)] != 0 {
|
||||
// err = getAPI(v.VendorOrgCode).StoreSkuBindStore(true, []string{utils.Int64ToStr(resultAttrs[utils.Int2Str(vv2.SkuID)])}, nil)
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// // }
|
||||
// if err != nil {
|
||||
// failedList = putils.GetErrMsg2FailedSingleList(storeSkuList, err, storeID, model.VendorChineseNames[model.VendorIDJDShop], "创建商品")
|
||||
// return failedList, err
|
||||
// } else {
|
||||
// //追加商品透图
|
||||
// imageURL := ""
|
||||
// img := v.Img
|
||||
// if img != "" {
|
||||
// suffix := img[strings.LastIndex(img, "."):]
|
||||
// if suffix != ".png" {
|
||||
// if resBinary, _, _ := jxutils.DownloadFileByURL(img + model.SkuNameImgToPng); err == nil {
|
||||
// downloadURL, _ := jxutils.UploadExportContent(resBinary, utils.Int64ToStr(time.Now().Unix()))
|
||||
// imageURL, _ = uploadImg(downloadURL, name, "tou", v.VendorOrgCode)
|
||||
// }
|
||||
// } else {
|
||||
// imageURL, _ = uploadImg(img, name, "tou", v.VendorOrgCode)
|
||||
// }
|
||||
// }
|
||||
// if v.VendorOrgCode == "1" {
|
||||
// api.JdShopAPI.TransparentImageAdd(wareID, imageURL)
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// if err != nil {
|
||||
// failedList = putils.GetErrMsg2FailedSingleList(storeSkuList, err, storeID, model.VendorChineseNames[model.VendorIDJDShop], "创建商品")
|
||||
// return failedList, err
|
||||
// }
|
||||
//
|
||||
// }
|
||||
// } else {
|
||||
// //如果是普通店关注商品
|
||||
// for _, v := range storeSkuList {
|
||||
// for _, vv := range v.StoreSkuSyncInfoJds {
|
||||
// storeSkus, _ := dao.GetStoresSkusInfo(dao.GetDB(), []int{model.GoMeiShopMainStoreID}, []int{vv.SkuID})
|
||||
// if len(storeSkus) > 0 {
|
||||
// for _, storeSku := range storeSkus {
|
||||
// if storeSku.JdsID != 0 {
|
||||
// status := vv.Status
|
||||
// stock := vv.Stock
|
||||
// price := vv.VendorPrice
|
||||
// // 商品上架
|
||||
// if status == model.StoreSkuBindStatusNormal {
|
||||
// _, err = getAPI(vv.VendorOrgCode).OnOffLineGoodsOnStore(&gomei.ShelfGoodsForStoreReq{
|
||||
// StoreCode: vendorStoreID,
|
||||
// SkuCode: []string{storeSku.GmID},
|
||||
// ShelveStatus: gomei.PutOnTheShelf,
|
||||
// })
|
||||
// if err != nil {
|
||||
// failedList = putils.GetErrMsg2FailedSingleList(storeSkuList, err, storeID, model.VendorChineseNames[model.VendorGoMei], "国美商品已经存在,关注商品")
|
||||
// return failedList, err
|
||||
// }
|
||||
// }
|
||||
// // 修改库存
|
||||
// if stock != 0 {
|
||||
// _, err = getAPI(vv.VendorOrgCode).UpdateStockForStore(&gomei.StoreGoodsStockUpdateReq{
|
||||
// StoreCode: vendorStoreID,
|
||||
// ItemStocks: []*gomei.StoreSkuNum{{SkuCode: storeSku.GmID, StockNum: gomei.GoMeiMaxStock}},
|
||||
// })
|
||||
// if err != nil {
|
||||
// failedList = putils.GetErrMsg2FailedSingleList(storeSkuList, err, storeID, model.VendorChineseNames[model.VendorIDJDShop], "国美修改商品库存")
|
||||
// return failedList, err
|
||||
// }
|
||||
// }
|
||||
// // 同步价格
|
||||
// _, err = getAPI(v.VendorOrgCode).UpdateOnGoodsPriceForStore(&gomei.StoreGoodsPriceUpdateReq{
|
||||
// StoreCode: vendorStoreID,
|
||||
// SkuCode: storeSku.GmID,
|
||||
// SalePrice: utils.Int64ToFloat64(price),
|
||||
// })
|
||||
// if err != nil {
|
||||
// failedList = putils.GetErrMsg2FailedSingleList(storeSkuList, err, storeID, model.VendorChineseNames[model.VendorIDJDShop], "国美关注商品价格同步")
|
||||
// return failedList, err
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// return failedList, err
|
||||
//}
|
||||
//
|
||||
//func (p *PurchaseHandler) UpdateStoreSkus(ctx *jxcontext.Context, storeID int, vendorStoreID string, storeSkuList []*dao.StoreSkuSyncInfo) (failedList []*partner.StoreSkuInfoWithErr, err error) {
|
||||
// if globals.EnableJdShopWrite && vendorStoreID == model.JdShopMainVendorStoreID {
|
||||
// if vendorStoreID == model.JdShopMainVendorStoreID {
|
||||
// for _, v := range storeSkuList {
|
||||
// name := filterSensitiveWord(v.Name)
|
||||
// updateWareParam := &jdshopapi.UpdateWareParam{
|
||||
// WareID: v.JdsWareID,
|
||||
// Title: name,
|
||||
// VenderID: jdshopapi.VenderID,
|
||||
// // PromiseID: jdshopapi.JdsPromiseID,
|
||||
// ShopCategorys: []int{utils.Str2Int(v.VendorCatID)},
|
||||
// JdPrice: jxutils.IntPrice2Standard(v.UnitPrice),
|
||||
// }
|
||||
// if v.VendorVendorCatID != jdshopapi.JdsOtherMeatCatID {
|
||||
// updateWareParam.PromiseID = jdshopapi.JdsPromiseID
|
||||
// }
|
||||
// var desc string
|
||||
// if v.DescImg != "" {
|
||||
// pic3, err2 := uploadImg2(v.DescImg, name, "desc", v.VendorOrgCode)
|
||||
// err = err2
|
||||
// desc = `<p><img src="` + jdshopapi.JdsImgURL + pic3 + `" style="width: auto; height: auto; max-width: 100%;"><br></p><p><br></p>`
|
||||
// } else {
|
||||
// desc = `<p><br></p><p><br></p>`
|
||||
// }
|
||||
// updateWareParam.Introduction = desc
|
||||
// updateWareParam.MobileDesc = desc
|
||||
// img := ""
|
||||
// if v.ImgMix != "" {
|
||||
// img = v.ImgMix
|
||||
// } else {
|
||||
// img = v.Img
|
||||
// }
|
||||
// if img != "" {
|
||||
// pic1, err2 := uploadImg2(img, name, "1", v.VendorOrgCode)
|
||||
// err = err2
|
||||
// err = getAPI(v.VendorOrgCode).ImageUpdate(v.JdsWareID, 1, pic1)
|
||||
// if v.Img2 != "" {
|
||||
// pic2, err2 := uploadImg2(v.Img2, name, "2", v.VendorOrgCode)
|
||||
// err = err2
|
||||
// err = getAPI(v.VendorOrgCode).ImageUpdate(v.JdsWareID, 2, pic2)
|
||||
// } else {
|
||||
// err = getAPI(v.VendorOrgCode).ImageUpdate(v.JdsWareID, 2, pic1)
|
||||
// }
|
||||
// err = getAPI(v.VendorOrgCode).ImageUpdate(v.JdsWareID, 3, pic1)
|
||||
// }
|
||||
// var features = []*jdshopapi.CreateSkuParamFeatures{
|
||||
// &jdshopapi.CreateSkuParamFeatures{
|
||||
// Key: "is7ToReturn", //不支持7天无理由退货
|
||||
// Value: "0",
|
||||
// },
|
||||
// &jdshopapi.CreateSkuParamFeatures{
|
||||
// Key: "tssp", //支持自提
|
||||
// Value: "",
|
||||
// },
|
||||
// // &jdshopapi.CreateSkuParamFeatures{
|
||||
// // Key: "fdms", //分单?
|
||||
// // Value: "1",
|
||||
// // },
|
||||
// }
|
||||
// updateWareParam.Features = features
|
||||
// err = getAPI(v.VendorOrgCode).UpdateWare(updateWareParam)
|
||||
// if err == nil {
|
||||
// //追加商品透图
|
||||
// imageURL := ""
|
||||
// img := v.Img
|
||||
// if img != "" {
|
||||
// suffix := img[strings.LastIndex(img, "."):]
|
||||
// if suffix != ".png" {
|
||||
// if resBinary, _, err := jxutils.DownloadFileByURL(img + model.SkuNameImgToPng); err == nil {
|
||||
// downloadURL, err2 := jxutils.UploadExportContent(resBinary, utils.Int64ToStr(time.Now().Unix()))
|
||||
// err = err2
|
||||
// imageURL, err = uploadImg(downloadURL, name, "tou", v.VendorOrgCode)
|
||||
// }
|
||||
// } else {
|
||||
// imageURL, err = uploadImg(img, name, "tou", v.VendorOrgCode)
|
||||
// }
|
||||
// }
|
||||
// if v.VendorOrgCode == "1" {
|
||||
// api.JdShopAPI.TransparentImageAdd(v.JdsWareID, imageURL)
|
||||
// }
|
||||
// }
|
||||
// for _, vv := range v.StoreSkuSyncInfoJds {
|
||||
// updateSkusParam, _, err := buildUpdateSkusParam(v, vv, false)
|
||||
// if err != nil {
|
||||
// failedList = putils.GetErrMsg2FailedSingleList(storeSkuList, err, storeID, model.VendorChineseNames[model.VendorIDJDShop], "更新商品基础信息")
|
||||
// return failedList, err
|
||||
// }
|
||||
// _, err = getAPI(v.VendorOrgCode).UpdateSkus(updateSkusParam)
|
||||
// }
|
||||
// }
|
||||
// } else {
|
||||
// for _, v := range storeSkuList {
|
||||
// var wareSaveSkus []*jdshopapi.WareSaveSkus
|
||||
// name := filterSensitiveWord(v.Name)
|
||||
// //jds2
|
||||
// wareSaveParam := &jdshopapi.WareSaveParam{
|
||||
// WareID: v.JdsWareID,
|
||||
// Title: name,
|
||||
// CategoryID: int(v.VendorVendorCatID),
|
||||
// VenderID: jdshopapi.VendorID2,
|
||||
// Length: 100,
|
||||
// Wide: 100,
|
||||
// Height: 100,
|
||||
// Weight: utils.Int2Str(v.Weight),
|
||||
// BrandID: jdshopapi.BrandIdNO,
|
||||
// ShopCategorys: []int{utils.Str2Int(v.VendorCatID)},
|
||||
// PromiseID: -1,
|
||||
// MultiCateProps: []interface{}{},
|
||||
// PropsSet: []interface{}{},
|
||||
// SaleAttrs: []interface{}{},
|
||||
// }
|
||||
// var desc string
|
||||
// if v.DescImg != "" {
|
||||
// pic3, err2 := uploadImg2(v.DescImg, name, "desc", v.VendorOrgCode)
|
||||
// err = err2
|
||||
// desc = `<p><img src="` + jdshopapi.JdsImgURL + pic3 + `" style="width: auto; height: auto; max-width: 100%;"><br></p><p><br></p>`
|
||||
// } else {
|
||||
// desc = `<p><br></p><p><br></p>`
|
||||
// }
|
||||
// wareSaveParam.Notes = desc
|
||||
// //上传京东图片
|
||||
// //规则,有两张就传两张,没有就重复传一张
|
||||
// pic1, _ := uploadImg(v.Img, name, "1", v.VendorOrgCode)
|
||||
// img1 := &jdshopapi.CreateSkuParamImages{
|
||||
// ColorID: "0000000000",
|
||||
// ImgIndex: 1,
|
||||
// ImgURL: pic1,
|
||||
// }
|
||||
// img2 := &jdshopapi.CreateSkuParamImages{
|
||||
// ColorID: "0000000000",
|
||||
// ImgIndex: 2,
|
||||
// }
|
||||
// if v.Img2 == "" {
|
||||
// img2.ImgURL = pic1
|
||||
// } else {
|
||||
// pic2, err2 := uploadImg(v.Img, name, "2", v.VendorOrgCode)
|
||||
// err = err2
|
||||
// img2.ImgURL = pic2
|
||||
// }
|
||||
// img3 := &jdshopapi.CreateSkuParamImages{
|
||||
// ColorID: "0000000000",
|
||||
// ImgIndex: 3,
|
||||
// ImgURL: pic1,
|
||||
// }
|
||||
// //jds2图片
|
||||
// wareSaveParam.ImageMap.Num0000000000 = append(wareSaveParam.ImageMap.Num0000000000, img1, img2, img3)
|
||||
// for _, vv := range v.StoreSkuSyncInfoJds {
|
||||
// _, wareSaveSku, err2 := buildUpdateSkusParam(v, vv, true)
|
||||
// err = err2
|
||||
// wareSaveSku.SkuID = utils.Str2Int64(vv.VendorSkuID)
|
||||
// wareSaveSkus = append(wareSaveSkus, wareSaveSku)
|
||||
// }
|
||||
// getAPI("2").WareSave(wareSaveParam)
|
||||
// }
|
||||
// }
|
||||
// if err != nil {
|
||||
// failedList = putils.GetErrMsg2FailedSingleList(storeSkuList, err, storeID, model.VendorChineseNames[model.VendorIDJDShop], "更新商品基础信息")
|
||||
// }
|
||||
// }
|
||||
// return failedList, err
|
||||
//}
|
||||
//
|
||||
//func buildUpdateSkusParam(storeSku *dao.StoreSkuSyncInfo, v *dao.StoreSkuSyncInfo, vendorStoreId string, isCreate bool) (updateSkusParam *jdshopapi.UpdateSkusParam, wareSku *jdshopapi.WareSaveSkus, err error) {
|
||||
// // 判断分类是否存在
|
||||
// storeCategoriesList, err := GetAllStoreCategories(string(model.VendorGoMei), vendorStoreId)
|
||||
// if err != nil {
|
||||
// return nil, nil, err
|
||||
// }
|
||||
// isHaveCategory := false
|
||||
// for _, sc := range storeCategoriesList {
|
||||
// if sc.CategoryCode == string(storeSku.VendorVendorCatID) {
|
||||
// isHaveCategory = true
|
||||
// break
|
||||
// }
|
||||
// }
|
||||
// // 分类不存在则,创建分类
|
||||
// if !isHaveCategory {
|
||||
// if _, err := api.GuoMeiApi.AddStoreCategory(&gomei.StoreAddGoodsCategory{
|
||||
// StoreCode: vendorStoreId,
|
||||
// CategoryName: storeSku.CategoryName,
|
||||
// Rank: 0,
|
||||
// }); err != nil {
|
||||
// return nil, nil, err
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// // 规格组,规格设置(获取分类下的所有规格),线上规格
|
||||
// attrsList, err := GetAllSpecSizeList(&gomei.QueryGoodsSpecSizeReq{
|
||||
// Cat3Code: string(storeSku.VendorVendorCatID),
|
||||
// SpecName: "",
|
||||
// Page: gomei.Page{
|
||||
// PageNumber: gomei.PageNumber,
|
||||
// PageSize: gomei.PageSize,
|
||||
// },
|
||||
// })
|
||||
// if err != nil {
|
||||
// return nil, nil, err
|
||||
// }
|
||||
// // 本地规格
|
||||
// var ggValueID string //规格的属性id
|
||||
// var ggValueName string //规格名
|
||||
// // 判断本地规格和在线上是否存在
|
||||
// for _, goMeiSize := range attrsList {
|
||||
// if goMeiSize.SpecName == v.Unit {
|
||||
// ggValueID = goMeiSize.SpecCode
|
||||
// ggValueName = goMeiSize.SpecName
|
||||
// break
|
||||
// }
|
||||
// }
|
||||
// if ggValueID == "" {
|
||||
// // 规格不存在,创建规格,规格只有一个,规格属性有多个!
|
||||
// specList := make([]*gomei.SpecValueName, 0, 0)
|
||||
// for _, sl := range storeSku.StoreSkuSyncInfoJds {
|
||||
// data1 := &gomei.SpecValueName{SpecValueName: utils.Float64ToStr(float64(sl.SpecQuality)) + sl.Unit}
|
||||
// specList = append(specList, data1)
|
||||
// }
|
||||
// _, err = api.GuoMeiApi.CreateGoodsSpceList(&gomei.CreateSpecDetailParam{
|
||||
// SpecName: ggValueName,
|
||||
// SpecValues: specList, // 多个规格属性
|
||||
// Cat3Code: string(storeSku.VendorVendorCatID),
|
||||
// Remark: "",
|
||||
// })
|
||||
// if err != nil {
|
||||
// return nil, nil, err
|
||||
// }
|
||||
// } else {
|
||||
// // 存在规格,判断里面,规格属性是否充足
|
||||
//
|
||||
// }
|
||||
//
|
||||
//}
|
||||
//
|
||||
//func buildCreateWareParam(storeSku *dao.StoreSkuSyncInfo) (createSkuParamWare *jdshopapi.CreateSkuParamWare, createSkuParamSkus []*jdshopapi.CreateSkuParamSkus, wareSaveParam *jdshopapi.WareSaveParam, err error) {
|
||||
// var (
|
||||
// images []*jdshopapi.CreateSkuParamImages
|
||||
// vendorCatID int
|
||||
// )
|
||||
// if storeSku.VendorCatID == "0" {
|
||||
// resultCat, _ := getAPI(storeSku.VendorOrgCode).FindShopCategories() // 查询商家所有店内分类
|
||||
// for _, v := range resultCat {
|
||||
// if v.Name == storeSku.CategoryName {
|
||||
// vendorCatID = int(v.CID)
|
||||
// break
|
||||
// }
|
||||
// }
|
||||
// } else {
|
||||
// vendorCatID = utils.Str2Int(storeSku.VendorCatID)
|
||||
// }
|
||||
//
|
||||
// name := filterSensitiveWord(storeSku.Name)
|
||||
// wareSaveParam = &jdshopapi.WareSaveParam{
|
||||
// WareID: 0,
|
||||
// Title: name,
|
||||
// CategoryID: int(storeSku.VendorVendorCatID),
|
||||
// LastCategoryID: int(storeSku.VendorVendorCatID),
|
||||
// VenderID: jdshopapi.VendorID2,
|
||||
// Length: 200,
|
||||
// Wide: 100,
|
||||
// Height: 100,
|
||||
// Weight: "1",
|
||||
// BrandID: jdshopapi.BrandIdNO,
|
||||
// WareStatus: 8, //上架待审核,没用,建好了都要再上架一次
|
||||
// ShopCategorys: []int{vendorCatID},
|
||||
// PromiseID: 0,
|
||||
// MultiCateProps: []interface{}{},
|
||||
// PropsSet: []interface{}{},
|
||||
// SaleAttrs: []interface{}{},
|
||||
// TransparentImageAudit: []interface{}{},
|
||||
// OptionType: 1,
|
||||
// AvailableFeatures: []interface{}{},
|
||||
// CharacteristicService: []interface{}{},
|
||||
// ExtendFeatures: []interface{}{},
|
||||
// TempID: "10569615110055200", //必须要这个东西,不知道是啥
|
||||
// }
|
||||
// createSkuParamWare = &jdshopapi.CreateSkuParamWare{
|
||||
// Title: name,
|
||||
// ShopCategorys: []int{vendorCatID},
|
||||
// CategoryID: int(storeSku.VendorVendorCatID),
|
||||
// BrandID: jdshopapi.JxBrandId,
|
||||
// // TransportID: jdshopapi.TransportID,
|
||||
// WareStatus: 8, //上架待审核
|
||||
// OuterID: utils.Int2Str(storeSku.NameID),
|
||||
// // VenderID: jdshopapi.VenderID,
|
||||
// Length: 100,
|
||||
// Width: 100,
|
||||
// Height: 100,
|
||||
// Weight: 0.5,
|
||||
// JdPrice: jxutils.IntPrice2Standard(storeSku.UnitPrice),
|
||||
// // MarketPrice: jxutils.IntPrice2Standard(storeSku.UnitPrice),
|
||||
// // PromiseID: jdshopapi.JdsPromiseID,
|
||||
// }
|
||||
//
|
||||
// if storeSku.VendorOrgCode == "1" {
|
||||
// createSkuParamWare.VenderID = jdshopapi.VenderID
|
||||
// }
|
||||
//
|
||||
// if storeSku.VendorVendorCatID != jdshopapi.JdsOtherMeatCatID {
|
||||
// createSkuParamWare.PromiseID = jdshopapi.JdsPromiseID
|
||||
// }
|
||||
//
|
||||
// if storeSku.VendorVendorCatID == jdshopapi.JdsBeefCatID {
|
||||
// createSkuParamWare.MultiCategoryID = jdshopapi.JdsBeefLastCatID
|
||||
// }
|
||||
//
|
||||
// //上传京东图片
|
||||
// //规则,有两张就传两张,没有就重复传一张
|
||||
// pic1, err := uploadImg(storeSku.Img, name, "1", storeSku.VendorOrgCode)
|
||||
// img1 := &jdshopapi.CreateSkuParamImages{
|
||||
// ColorID: "0000000000",
|
||||
// ImgIndex: 1,
|
||||
// ImgURL: pic1,
|
||||
// }
|
||||
// img2 := &jdshopapi.CreateSkuParamImages{
|
||||
// ColorID: "0000000000",
|
||||
// ImgIndex: 2,
|
||||
// }
|
||||
// if storeSku.Img2 == "" {
|
||||
// img2.ImgURL = pic1
|
||||
// } else {
|
||||
// pic2, err2 := uploadImg(storeSku.Img, name, "2", storeSku.VendorOrgCode)
|
||||
// err = err2
|
||||
// img2.ImgURL = pic2
|
||||
// }
|
||||
// img3 := &jdshopapi.CreateSkuParamImages{
|
||||
// ColorID: "0000000000",
|
||||
// ImgIndex: 3,
|
||||
// ImgURL: pic1,
|
||||
// }
|
||||
// images = append(images, img1)
|
||||
// images = append(images, img2)
|
||||
// images = append(images, img3)
|
||||
// createSkuParamWare.Images = images
|
||||
// //jds2图片
|
||||
// // img4 := img1
|
||||
// // img4.ImgZoneID = "0000000000"
|
||||
// // img5 := img2
|
||||
// // img5.ImgZoneID = "0000000000"
|
||||
// // img6 := img3
|
||||
// // img6.ImgZoneID = "0000000000"
|
||||
// wareSaveParam.ImageMap.Num0000000000 = append(wareSaveParam.ImageMap.Num0000000000, img1, img2, img3)
|
||||
//
|
||||
// //商品详情拼接
|
||||
// var desc string
|
||||
// if storeSku.DescImg != "" {
|
||||
// pic3, err2 := uploadImg(storeSku.DescImg, name, "desc", storeSku.VendorOrgCode)
|
||||
// err = err2
|
||||
// desc = `<p><img src="` + jdshopapi.JdsImgURL + pic3 + `" style="width: auto; height: auto; max-width: 100%;"><br></p><p><br></p>`
|
||||
// } else {
|
||||
// desc = `<p><br></p><p><br></p>`
|
||||
// }
|
||||
// createSkuParamWare.MobileDesc = desc
|
||||
// createSkuParamWare.Introduction = desc
|
||||
// wareSaveParam.Notes = desc
|
||||
//
|
||||
// //设置商品属性值
|
||||
// var (
|
||||
// attrIDs = make(map[string]int) //贮存方式,净含量,保质期IDs
|
||||
// zctjValueID int64 //贮存条件冷藏0-4的id
|
||||
// gcjkValueID int64 //国产,进口的id
|
||||
// lbValueID int64 //类别的ID
|
||||
// bcztValueID int64 //保存状态ID
|
||||
// rmsjValueID int64 //热卖时间ID
|
||||
// attrsProp []*jdshopapi.CreateSkuParamAttrs
|
||||
// )
|
||||
// attrs, err := getAPI(storeSku.VendorOrgCode).FindAttrs(int(storeSku.VendorVendorCatID))
|
||||
// for _, v := range attrs {
|
||||
// if v.Name == "保质期" {
|
||||
// attrIDs[v.Name] = v.ID
|
||||
// } else if v.Name == "贮存条件" {
|
||||
// attrIDs[v.Name] = v.ID
|
||||
// } else if v.Name == "净含量" {
|
||||
// attrIDs[v.Name] = v.ID
|
||||
// } else if v.Name == "规格" {
|
||||
// attrIDs[v.Name] = v.ID
|
||||
// } else if v.Name == "国产/进口" {
|
||||
// attrIDs[v.Name] = v.ID
|
||||
// } else if v.Name == "类别" {
|
||||
// attrIDs[v.Name] = v.ID
|
||||
// } else if v.Name == "保存状态" {
|
||||
// attrIDs[v.Name] = v.ID
|
||||
// } else if v.Name == "热卖时间" {
|
||||
// attrIDs[v.Name] = v.ID
|
||||
// }
|
||||
// }
|
||||
// values, _, err := getAPI(storeSku.VendorOrgCode).FindValuesByAttrId(attrIDs["贮存条件"])
|
||||
// for _, v := range values {
|
||||
// if v.Name == "冷藏 0-4℃" {
|
||||
// zctjValueID = v.ID
|
||||
// }
|
||||
// }
|
||||
// if attrIDs["国产/进口"] != 0 {
|
||||
// values2, _, err2 := getAPI(storeSku.VendorOrgCode).FindValuesByAttrId(attrIDs["国产/进口"])
|
||||
// err = err2
|
||||
// for _, v := range values2 {
|
||||
// if v.Name == "国产" {
|
||||
// gcjkValueID = v.ID
|
||||
// }
|
||||
// }
|
||||
// attrgcjk := &jdshopapi.CreateSkuParamAttrs{
|
||||
// AttrID: utils.Int2Str(attrIDs["国产/进口"]),
|
||||
// AttrValues: []string{utils.Int64ToStr(gcjkValueID)},
|
||||
// }
|
||||
// attrsProp = append(attrsProp, attrgcjk)
|
||||
// }
|
||||
// if attrIDs["保存状态"] != 0 {
|
||||
// values2, _, err2 := getAPI(storeSku.VendorOrgCode).FindValuesByAttrId(attrIDs["保存状态"])
|
||||
// err = err2
|
||||
// for _, v := range values2 {
|
||||
// if v.Name == "冷藏" || v.Name == "活鲜" {
|
||||
// bcztValueID = v.ID
|
||||
// }
|
||||
// }
|
||||
// attrbczt := &jdshopapi.CreateSkuParamAttrs{
|
||||
// AttrID: utils.Int2Str(attrIDs["保存状态"]),
|
||||
// AttrValues: []string{utils.Int64ToStr(bcztValueID)},
|
||||
// }
|
||||
// attrsProp = append(attrsProp, attrbczt)
|
||||
// }
|
||||
// if attrIDs["热卖时间"] != 0 {
|
||||
// values2, _, err2 := getAPI(storeSku.VendorOrgCode).FindValuesByAttrId(attrIDs["热卖时间"])
|
||||
// err = err2
|
||||
// for _, v := range values2 {
|
||||
// if v.Name == "12月" {
|
||||
// rmsjValueID = v.ID
|
||||
// }
|
||||
// }
|
||||
// attrrmsj := &jdshopapi.CreateSkuParamAttrs{
|
||||
// AttrID: utils.Int2Str(attrIDs["热卖时间"]),
|
||||
// AttrValues: []string{utils.Int64ToStr(rmsjValueID)},
|
||||
// }
|
||||
// attrsProp = append(attrsProp, attrrmsj)
|
||||
// }
|
||||
// //牛肉创建不一样
|
||||
// if storeSku.VendorVendorCatID == jdshopapi.JdsBeefCatID {
|
||||
// var exValueID int64
|
||||
// values2, _, err2 := getAPI(storeSku.VendorOrgCode).FindValuesByAttrId(150390)
|
||||
// err = err2
|
||||
// for _, v := range values2 {
|
||||
// if v.Name == "其它" {
|
||||
// exValueID = v.ID
|
||||
// }
|
||||
// }
|
||||
// attrex := &jdshopapi.CreateSkuParamAttrs{
|
||||
// AttrID: utils.Int2Str(150390),
|
||||
// AttrValues: []string{utils.Int64ToStr(exValueID)},
|
||||
// }
|
||||
// attrsProp = append(attrsProp, attrex)
|
||||
// wareSaveParam.LastCategoryID = 17902
|
||||
// }
|
||||
// attrZctj := &jdshopapi.CreateSkuParamAttrs{
|
||||
// AttrID: utils.Int2Str(attrIDs["贮存条件"]),
|
||||
// AttrValues: []string{utils.Int64ToStr(zctjValueID)},
|
||||
// }
|
||||
// attrJhl := &jdshopapi.CreateSkuParamAttrs{
|
||||
// AttrID: utils.Int2Str(attrIDs["净含量"]),
|
||||
// AttrValues: []string{"0.5"},
|
||||
// }
|
||||
// attrBzq := &jdshopapi.CreateSkuParamAttrs{
|
||||
// AttrID: utils.Int2Str(attrIDs["保质期"]),
|
||||
// AttrValues: []string{"5"},
|
||||
// }
|
||||
// attrsProp = append(attrsProp, attrZctj)
|
||||
// attrsProp = append(attrsProp, attrJhl)
|
||||
// attrsProp = append(attrsProp, attrBzq)
|
||||
// createSkuParamWare.MultiCateProps = attrsProp
|
||||
// var features = []*jdshopapi.CreateSkuParamFeatures{
|
||||
// &jdshopapi.CreateSkuParamFeatures{
|
||||
// Key: "is7ToReturn", //不支持7天无理由退货
|
||||
// Value: "0",
|
||||
// },
|
||||
// // &jdshopapi.CreateSkuParamFeatures{
|
||||
// // Key: "tssp", //支持自提
|
||||
// // Value: "",
|
||||
// // },
|
||||
// // &jdshopapi.CreateSkuParamFeatures{
|
||||
// // Key: "fdms", //分单?
|
||||
// // Value: "1",
|
||||
// // },
|
||||
// }
|
||||
// createSkuParamWare.Features = features
|
||||
// //组合sku
|
||||
// var (
|
||||
// vendorPrice int64 = 0
|
||||
// wareSaveSkus []*jdshopapi.WareSaveSkus
|
||||
// )
|
||||
//
|
||||
// for _, v := range storeSku.StoreSkuSyncInfoJds {
|
||||
// var (
|
||||
// ggValueID int64 //规格的属性id
|
||||
// ggValueName string //规格的属性名
|
||||
// attrsPropSku []*jdshopapi.CreateSkuParamAttrs
|
||||
// attrsPropSku2 []*jdshopapi.WareSaveSkusProp //jds2
|
||||
// multiPropSku []*jdshopapi.CreateSkuParamAttrs
|
||||
// specQuality string
|
||||
// )
|
||||
// valuesSku, maxNo, _ := getAPI(storeSku.VendorOrgCode).FindValuesByAttrId(attrIDs["规格"])
|
||||
// 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
|
||||
// ggValueName = v.Name
|
||||
// }
|
||||
// }
|
||||
// if ggValueID == 0 { //说明没有建这个规格,要建上
|
||||
// catID, _ := getAPI(storeSku.VendorOrgCode).SaveVenderAttrValue(specQuality, attrIDs["规格"], int(storeSku.VendorVendorCatID), maxNo+1)
|
||||
// ggValueID = catID
|
||||
// ggValueName = specQuality
|
||||
// }
|
||||
// //jds1
|
||||
// attrSku := &jdshopapi.CreateSkuParamAttrs{
|
||||
// AttrID: utils.Int2Str(attrIDs["规格"]),
|
||||
// AttrValues: []string{utils.Int64ToStr(ggValueID)},
|
||||
// }
|
||||
// attrsPropSku = append(attrsPropSku, attrSku)
|
||||
// //jds2
|
||||
// attrSku2 := &jdshopapi.WareSaveSkusProp{
|
||||
// AttrID: attrIDs["规格"],
|
||||
// AttrValues: ggValueID,
|
||||
// AttrValueAlias: ggValueName,
|
||||
// }
|
||||
// attrsPropSku2 = append(attrsPropSku2, attrSku2)
|
||||
//
|
||||
// //jds1
|
||||
// sku := &jdshopapi.CreateSkuParamSkus{
|
||||
// JdPrice: jxutils.IntPrice2Standard(v.VendorPrice),
|
||||
// // StockNum: 9999,
|
||||
// Type: "com.jd.pop.ware.ic.api.domain.sku",
|
||||
// Type2: "com.jd.pop.ware.ic.api.domain.Sku",
|
||||
// OuterID: utils.Int2Str(v.SkuID),
|
||||
// }
|
||||
// sku.SaleAttrs = attrsPropSku
|
||||
// //jds2
|
||||
// sku2 := &jdshopapi.WareSaveSkus{
|
||||
// JdPrice: utils.Float64ToStr(jxutils.IntPrice2Standard(v.VendorPrice)),
|
||||
// OuterID: utils.Int2Str(v.SkuID),
|
||||
// }
|
||||
// sku2.Props = attrsPropSku2
|
||||
//
|
||||
// if attrIDs["类别"] != 0 {
|
||||
// values2, _, err2 := getAPI(storeSku.VendorOrgCode).FindValuesByAttrId(attrIDs["类别"])
|
||||
// err = err2
|
||||
// lbValueID = values2[len(values2)-1].ID
|
||||
// attrlb := &jdshopapi.CreateSkuParamAttrs{
|
||||
// AttrID: utils.Int2Str(attrIDs["类别"]),
|
||||
// AttrValues: []string{utils.Int64ToStr(lbValueID)},
|
||||
// }
|
||||
// multiPropSku = append(multiPropSku, attrlb)
|
||||
// }
|
||||
// sku.MultiCateProps = multiPropSku
|
||||
// createSkuParamSkus = append(createSkuParamSkus, sku)
|
||||
//
|
||||
// if v.VendorPrice > vendorPrice {
|
||||
// vendorPrice = v.VendorPrice
|
||||
// }
|
||||
// if v.Status == model.SkuStatusNormal {
|
||||
// sku.StockNum = 9999
|
||||
// sku2.StockNum = 9999
|
||||
// } else {
|
||||
// sku.StockNum = 0
|
||||
// sku2.StockNum = 0
|
||||
// }
|
||||
// wareSaveSkus = append(wareSaveSkus, sku2)
|
||||
// }
|
||||
// //市场价固定500
|
||||
// createSkuParamWare.MarketPrice = 500
|
||||
// wareSaveParam.Skus = wareSaveSkus
|
||||
// return createSkuParamWare, createSkuParamSkus, wareSaveParam, err
|
||||
//}
|
||||
//
|
||||
//// 国美获取线上所有规格列表
|
||||
//func GetAllSpecSizeList(param *gomei.QueryGoodsSpecSizeReq) ([]*gomei.QueryGoodsSpecSizeRecords, error) {
|
||||
// attrs, err := api.GuoMeiApi.QueryGoodsSizeList(param)
|
||||
// if err != nil {
|
||||
// return nil, err
|
||||
// }
|
||||
//
|
||||
// goMeiSizeList := make([]*gomei.QueryGoodsSpecSizeRecords, 0, 0)
|
||||
// for i := 1; i <= attrs.Data.PageTotal; i++ {
|
||||
// attrs, err := api.GuoMeiApi.QueryGoodsSizeList(&gomei.QueryGoodsSpecSizeReq{
|
||||
// Cat3Code: param.Cat3Code,
|
||||
// SpecName: "",
|
||||
// Page: gomei.Page{
|
||||
// PageNumber: i,
|
||||
// PageSize: gomei.PageSize,
|
||||
// },
|
||||
// })
|
||||
// if err != nil {
|
||||
// return nil, err
|
||||
// }
|
||||
// goMeiSizeList = append(goMeiSizeList, attrs.Data.Records...)
|
||||
// }
|
||||
// return goMeiSizeList, nil
|
||||
//}
|
||||
393
business/partner/purchase/gomei/store_sku_other.go
Normal file
393
business/partner/purchase/gomei/store_sku_other.go
Normal file
@@ -0,0 +1,393 @@
|
||||
package gomei
|
||||
|
||||
import (
|
||||
"encoding/base64"
|
||||
"fmt"
|
||||
gomei "git.rosy.net.cn/baseapi/platformapi/gome_live_show"
|
||||
"git.rosy.net.cn/baseapi/platformapi/jdshopapi"
|
||||
"git.rosy.net.cn/baseapi/utils"
|
||||
"git.rosy.net.cn/jx-callback/business/jxutils"
|
||||
"git.rosy.net.cn/jx-callback/business/jxutils/jxcontext"
|
||||
"git.rosy.net.cn/jx-callback/business/jxutils/tasksch"
|
||||
"git.rosy.net.cn/jx-callback/business/model"
|
||||
"git.rosy.net.cn/jx-callback/business/model/dao"
|
||||
"git.rosy.net.cn/jx-callback/business/partner"
|
||||
"git.rosy.net.cn/jx-callback/business/partner/putils"
|
||||
"git.rosy.net.cn/jx-callback/globals"
|
||||
"regexp"
|
||||
"strings"
|
||||
"time"
|
||||
)
|
||||
|
||||
// 删除不在使用商品(下架之后在删除) ok
|
||||
func (p *PurchaseHandler) DeleteStoreSkus(ctx *jxcontext.Context, storeID int, vendorStoreID string, storeSkuList []*partner.StoreSkuInfo) (failedList []*partner.StoreSkuInfoWithErr, err error) {
|
||||
if globals.EnableJdShopWrite && vendorStoreID == model.GoMeiShopMainVendorStoreID {
|
||||
for _, v := range storeSkuList {
|
||||
if v.IsDeletedBySku && storeID != 0 { // 如果门店id存在,则将该门店商品下架,所有门店该商品处于下架才可以删除!
|
||||
_, err = getAPI(v.VendorOrgCode).OnOffLineGoodsOnStore(&gomei.ShelfGoodsForStoreReq{
|
||||
StoreCode: vendorStoreID,
|
||||
SkuCode: []string{v.VendorSkuID},
|
||||
ShelveStatus: gomei.DownOnTheShelf,
|
||||
})
|
||||
}
|
||||
if err == nil {
|
||||
_, err = getAPI(v.VendorOrgCode).DeleteGoodsOnStore(v.VendorSkuID)
|
||||
}
|
||||
if err != nil {
|
||||
failedList = append(failedList, putils.GetErrMsg2FailedSingleList(storeSkuList, err, storeID, model.VendorChineseNames[model.VendorGoMei], "删除商品")...)
|
||||
}
|
||||
}
|
||||
}
|
||||
return failedList, err
|
||||
}
|
||||
|
||||
|
||||
|
||||
// 获取门店商品列表
|
||||
func (p *PurchaseHandler) GetStoreSkusFullInfo(ctx *jxcontext.Context, parentTask tasksch.ITask, storeID int, vendorStoreID string, storeSkuList []*partner.StoreSkuInfo) (skuNameList []*partner.SkuNameInfo, err error) {
|
||||
var (
|
||||
pageNo = 1
|
||||
pageSize = 50
|
||||
)
|
||||
result, err := getAPI(string(model.VendorGoMei)).QueryGoodsListById(&gomei.QueryGoodsListForStoreReq{
|
||||
Page: gomei.Page{
|
||||
PageNumber: pageNo,
|
||||
PageSize: pageSize,
|
||||
},
|
||||
})
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
for ; pageNo <= result.Data.Total/pageSize+1; pageNo++ {
|
||||
result2, err := getAPI(string(model.VendorGoMei)).QueryGoodsListById(&gomei.QueryGoodsListForStoreReq{
|
||||
Page: gomei.Page{
|
||||
PageNumber: pageNo,
|
||||
PageSize: pageSize,
|
||||
},
|
||||
})
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
for _, v := range result2.Data.Records {
|
||||
if skuName := vendorSku2Jx2(v); skuName != nil {
|
||||
skuNameList = append(skuNameList, skuName)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return skuNameList, err
|
||||
}
|
||||
|
||||
// 修改门店商品状态
|
||||
func (p *PurchaseHandler) UpdateStoreSkusStatus(ctx *jxcontext.Context, vendorOrgCode string, storeID int, vendorStoreID string, storeSkuList []*partner.StoreSkuInfo, status int) (failedList []*partner.StoreSkuInfoWithErr, err error) {
|
||||
if globals.EnableJdShopWrite {
|
||||
for _, v := range storeSkuList {
|
||||
if vendorSkuID, err := getMainStoreVendorSkuID(model.GoMeiShopMainStoreID, v.SkuID); err == nil && vendorSkuID != "" {
|
||||
storeSku := &gomei.ShelfGoodsForStoreReq{
|
||||
StoreCode: vendorStoreID,
|
||||
SkuCode: []string{vendorSkuID},
|
||||
}
|
||||
if status == 0 {
|
||||
storeSku.ShelveStatus = gomei.PutOnTheShelf
|
||||
} else {
|
||||
storeSku.ShelveStatus = gomei.DownOnTheShelf
|
||||
}
|
||||
_, err = getAPI(v.VendorOrgCode).OnOffLineGoodsOnStore(storeSku)
|
||||
}
|
||||
}
|
||||
if err != nil {
|
||||
failedList = putils.GetErrMsg2FailedSingleList(storeSkuList, err, storeID, model.VendorChineseNames[model.VendorGoMei], "修改商品库存")
|
||||
}
|
||||
}
|
||||
return failedList, err
|
||||
}
|
||||
|
||||
// 修改门店商品价格维护
|
||||
func (p *PurchaseHandler) UpdateStoreSkusPrice(ctx *jxcontext.Context, vendorOrgCode string, storeID int, vendorStoreID string, storeSkuList []*partner.StoreSkuInfo) (failedList []*partner.StoreSkuInfoWithErr, err error) {
|
||||
if globals.EnableJdShopWrite {
|
||||
for _, v := range storeSkuList {
|
||||
if vendorSkuID, err := getMainStoreVendorSkuID(model.GoMeiShopMainStoreID, v.SkuID); err == nil && vendorSkuID != "" {
|
||||
_, err = getAPI(v.VendorOrgCode).UpdateOnGoodsPriceForStore(&gomei.StoreGoodsPriceUpdateReq{
|
||||
StoreCode: vendorStoreID,
|
||||
SkuCode: vendorSkuID,
|
||||
SalePrice: utils.Int64ToFloat64(v.VendorPrice),
|
||||
})
|
||||
}
|
||||
if err != nil {
|
||||
failedList = append(failedList, putils.GetErrMsg2FailedSingleList(storeSkuList, err, storeID, model.VendorChineseNames[model.VendorIDJDShop], "修改商品价格")...)
|
||||
}
|
||||
}
|
||||
}
|
||||
return failedList, err
|
||||
}
|
||||
|
||||
// 门店商品库存维护
|
||||
func (p *PurchaseHandler) UpdateStoreSkusStock(ctx *jxcontext.Context, vendorOrgCode string, storeID int, vendorStoreID string, storeSkuList []*partner.StoreSkuInfo) (failedList []*partner.StoreSkuInfoWithErr, err error) {
|
||||
if globals.EnableJdShopWrite {
|
||||
for _, v := range storeSkuList {
|
||||
if vendorSkuID, err := getMainStoreVendorSkuID(model.GoMeiShopMainStoreID, v.SkuID); err == nil && vendorSkuID != "" {
|
||||
_, err = getAPI(v.VendorOrgCode).UpdateStockForStore(&gomei.StoreGoodsStockUpdateReq{
|
||||
StoreCode: vendorStoreID,
|
||||
ItemStocks: []*gomei.StoreSkuNum{
|
||||
{SkuCode: vendorSkuID, StockNum: int64(v.Stock)},
|
||||
},
|
||||
})
|
||||
}
|
||||
}
|
||||
if err != nil {
|
||||
failedList = append(failedList, putils.GetErrMsg2FailedSingleList(storeSkuList, err, storeID, model.VendorChineseNames[model.VendorIDJDShop], "修改商品库存")...)
|
||||
}
|
||||
}
|
||||
return failedList, err
|
||||
}
|
||||
|
||||
// 获取门店所有的分类
|
||||
func (p *PurchaseHandler) GetStoreAllCategories(ctx *jxcontext.Context, storeID int, vendorStoreID string) (cats []*partner.BareCategoryInfo, err error) {
|
||||
var (
|
||||
pageNo = 1
|
||||
pageSize = 50
|
||||
)
|
||||
result, err := getAPI(string(model.VendorGoMei)).QueryStoreCategoryList(&gomei.QueryStoreGoodsCategoryListReq{
|
||||
Page: gomei.Page{
|
||||
PageNumber: pageNo,
|
||||
PageSize: pageSize,
|
||||
},
|
||||
StoreCode: vendorStoreID,
|
||||
})
|
||||
for ; pageNo <= result.Data.Total/pageSize+1; pageNo++ {
|
||||
result2, err := getAPI(string(model.VendorGoMei)).QueryStoreCategoryList(&gomei.QueryStoreGoodsCategoryListReq{
|
||||
Page: gomei.Page{
|
||||
PageNumber: pageNo,
|
||||
PageSize: pageSize,
|
||||
},
|
||||
StoreCode: vendorStoreID,
|
||||
})
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
for _, v := range result2.Data.Records {
|
||||
var cat = &partner.BareCategoryInfo{
|
||||
VendorCatID: v.CategoryCode,
|
||||
Name: v.CategoryName,
|
||||
}
|
||||
cat.Level = 1
|
||||
cats = append(cats, cat)
|
||||
}
|
||||
}
|
||||
|
||||
return cats, err
|
||||
}
|
||||
|
||||
// 修改或者更新门店分类信息
|
||||
func (p *PurchaseHandler) UpdateStoreCategory(ctx *jxcontext.Context, storeID int, vendorStoreID string, storeCat *dao.SkuStoreCatInfo) (err error) {
|
||||
if globals.EnableJdShopWrite {
|
||||
_, status, err2 := updateOrCreateCategories(storeCat, vendorStoreID, false)
|
||||
err = err2
|
||||
if status == -1 {
|
||||
return fmt.Errorf("京东商城店内分类更新失败!")
|
||||
}
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
func (p *PurchaseHandler) CreateStoreCategory(ctx *jxcontext.Context, storeID int, vendorStoreID string, storeCat *dao.SkuStoreCatInfo) (err error) {
|
||||
if globals.EnableJdShopWrite {
|
||||
allCategoryList, status, err2 := updateOrCreateCategories(storeCat, vendorStoreID, true)
|
||||
err = err2
|
||||
if status == -1 {
|
||||
return fmt.Errorf("国美商城店内分类创建失败!")
|
||||
}
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
time.Sleep(time.Second * 2)
|
||||
|
||||
for _, v := range allCategoryList {
|
||||
if v.CategoryName == storeCat.Name {
|
||||
storeCat.VendorCatID = v.CategoryCode
|
||||
break
|
||||
}
|
||||
}
|
||||
if storeCat.VendorCatID == "" {
|
||||
return fmt.Errorf("国美商城店内分类创建可能失败了!storeID: %v", storeID)
|
||||
}
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
func (p *PurchaseHandler) DeleteStoreCategory(ctx *jxcontext.Context, storeID int, vendorStoreID, vendorCatID string, level int) (err error) {
|
||||
if globals.EnableJdShopWrite {
|
||||
_, err = getAPI(string(model.VendorGoMei)).DeleteStoreGoodsCategory(vendorStoreID, vendorCatID)
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
func (p *PurchaseHandler) IsErrSkuExist(err error) (isExist bool) {
|
||||
return false
|
||||
}
|
||||
|
||||
func (p *PurchaseHandler) IsErrCategoryExist(err error) (isExist bool) {
|
||||
return false
|
||||
}
|
||||
|
||||
func (p *PurchaseHandler) IsErrCategoryNotExist(err error) (isNotExist bool) {
|
||||
return false
|
||||
}
|
||||
|
||||
func (p *PurchaseHandler) GetStoreSkusBatchSize(funcID int) (batchSize int) {
|
||||
return 1
|
||||
}
|
||||
|
||||
func (p *PurchaseHandler) GetSensitiveWordRegexp() *regexp.Regexp {
|
||||
return sensitiveWordRegexp
|
||||
}
|
||||
|
||||
func (p *PurchaseHandler) IsErrSkuNotExist(err error) (isNotExist bool) {
|
||||
if strings.Contains(err.Error(), deleteErr1) || (strings.Contains(err.Error(), deleteErr2) && strings.Contains(err.Error(), deleteErr3)) {
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func GetAllStoreCategories(vendorOrgCode, vendorStoreId string) ([]*gomei.StoreGoodsCategoryListRecord, error) {
|
||||
var (
|
||||
pageNo = 1
|
||||
pageSize = 50
|
||||
)
|
||||
|
||||
result, err := getAPI(vendorOrgCode).QueryStoreCategoryList(&gomei.QueryStoreGoodsCategoryListReq{
|
||||
Page: gomei.Page{
|
||||
PageSize: pageSize,
|
||||
PageNumber: pageNo,
|
||||
},
|
||||
StoreCode: vendorStoreId,
|
||||
})
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
createShopCategoryParams := make([]*gomei.StoreGoodsCategoryListRecord, 0, 0)
|
||||
for ; pageNo <= result.Data.Total/pageSize+1; pageNo++ {
|
||||
result2, err := getAPI(vendorOrgCode).QueryStoreCategoryList(&gomei.QueryStoreGoodsCategoryListReq{
|
||||
Page: gomei.Page{
|
||||
PageNumber: pageNo,
|
||||
PageSize: pageSize,
|
||||
},
|
||||
StoreCode: vendorStoreId,
|
||||
})
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
for _, v := range result2.Data.Records {
|
||||
createShopCategoryParams = append(createShopCategoryParams, &gomei.StoreGoodsCategoryListRecord{
|
||||
CategoryCode: v.CategoryCode,
|
||||
CategoryName: v.CategoryName,
|
||||
Rank: v.Rank,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
return createShopCategoryParams, nil
|
||||
}
|
||||
|
||||
// 创建或者修改分类
|
||||
func updateOrCreateCategories(storeCat *dao.SkuStoreCatInfo, vendorStoreId string, isCreate bool) (createShopCategoryParams []*gomei.StoreGoodsCategoryListRecord, status int64, err error) {
|
||||
createShopCategoryParams, err = GetAllStoreCategories(storeCat.VendorOrgCode, vendorStoreId)
|
||||
if err != nil {
|
||||
return nil, -1, err
|
||||
}
|
||||
|
||||
if isCreate { // 创建分类
|
||||
_, err = getAPI(storeCat.VendorOrgCode).AddStoreCategory(&gomei.StoreAddGoodsCategory{
|
||||
StoreCode: vendorStoreId,
|
||||
CategoryName: storeCat.VendorCategoryName, // storeCat.StoreCatName
|
||||
Rank: 0,
|
||||
})
|
||||
if err != nil {
|
||||
return nil, -1, err
|
||||
}
|
||||
} else { // 修改分类,无法新增和修改排序,排序结构需要在国美系统上获取
|
||||
// 查询当前分类
|
||||
for _, v := range createShopCategoryParams {
|
||||
if v.CategoryCode != storeCat.VendorCatID {
|
||||
continue
|
||||
}
|
||||
_, err = getAPI(storeCat.VendorOrgCode).ModifyStoreGoodsCategory(&gomei.StoreModifyGoodsCategory{
|
||||
StoreCode: vendorStoreId,
|
||||
CategoryCode: storeCat.VendorCatID, // storeCat.StoreCatName
|
||||
CategoryName: storeCat.VendorCategoryName, // storeCat.StoreCatName
|
||||
Rank: v.Rank,
|
||||
})
|
||||
if err != nil {
|
||||
return nil, -1, err
|
||||
}
|
||||
}
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// 将平台商品信息转化为本地商品信息
|
||||
func vendorSku2Jx2(result *gomei.QueryGoodsListForStoreRecordRes) (skuName *partner.SkuNameInfo) {
|
||||
if result == nil {
|
||||
globals.SugarLogger.Warnf("vendorSku2Jx, strange result:%s", utils.Format4Output(result, true))
|
||||
return nil
|
||||
}
|
||||
skuName = &partner.SkuNameInfo{
|
||||
Name: result.GoodsName,
|
||||
SkuList: []*partner.SkuInfo{
|
||||
&partner.SkuInfo{
|
||||
StoreSkuInfo: partner.StoreSkuInfo{
|
||||
VendorSkuID: result.SkuCode,
|
||||
Stock: result.StockNum,
|
||||
VendorPrice: jxutils.StandardPrice2Int(result.SalePrice),
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
if result.ShelveStatus == gomei.PutOnTheShelf {
|
||||
skuName.Status = 1
|
||||
} else {
|
||||
skuName.Status = 0
|
||||
}
|
||||
|
||||
return skuName
|
||||
}
|
||||
|
||||
// 获取当前门店第三方商品id
|
||||
func getMainStoreVendorSkuID(mainStoreID int, skuID int) (vendorSkuID string, err error) {
|
||||
var (
|
||||
db = dao.GetDB()
|
||||
)
|
||||
storeSkus, err := dao.GetStoresSkusInfo(db, []int{mainStoreID}, []int{skuID})
|
||||
if len(storeSkus) > 0 {
|
||||
vendorSkuID = storeSkus[0].GmID
|
||||
}
|
||||
return vendorSkuID, err
|
||||
}
|
||||
|
||||
// 国美上传图片,转bese64字符串在上传,图片要求长宽和大小
|
||||
func uploadImg(img, name, index, vendorOrgCode string) (imgURL string, err error) {
|
||||
data, _, err := jxutils.DownloadFileByURL(img)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
// 获取图片地址
|
||||
uploadResult, err := getAPI(vendorOrgCode).UploadPicture(base64.StdEncoding.EncodeToString(data), 1, name+string(time.Now().Unix()))
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
return uploadResult.Data.Url, err
|
||||
}
|
||||
|
||||
func filterSensitiveWord(name string) (result string) {
|
||||
for _, v := range jdshopapi.SensitiveWordMap {
|
||||
if strings.Contains(name, v) {
|
||||
return strings.ReplaceAll(name, v, "")
|
||||
}
|
||||
}
|
||||
return name
|
||||
}
|
||||
@@ -43,7 +43,7 @@ var (
|
||||
}
|
||||
)
|
||||
|
||||
func (p *PurchaseHandler) ReadStore(ctx *jxcontext.Context, vendorOrgCode, vendorStoreID string) (*dao.StoreDetail, error) {
|
||||
func (p *PurchaseHandler) ReadStore(ctx *jxcontext.Context, vendorOrgCode, vendorStoreID, vendorStoreName string) (*dao.StoreDetail, error) {
|
||||
a := getAPI(vendorOrgCode)
|
||||
result, err := a.GetStoreInfoByStationNo2(vendorStoreID)
|
||||
if err == nil {
|
||||
@@ -205,12 +205,13 @@ func (p *PurchaseHandler) UpdateStore(db *dao.DaoDB, storeID int, userName strin
|
||||
modifyCloseStatus = true
|
||||
_, storeParams.CloseStatus = JxStoreStatus2JdStatus(jxutils.MergeStoreStatus(store.Status, store.JdStoreStatus)) // 1storeParams.CloseStatus
|
||||
}
|
||||
|
||||
fillOpTimeParams(storeParams, store.GetOpTimeList())
|
||||
// globals.SugarLogger.Debug(utils.Format4Output(storeParams, false))
|
||||
errList := errlist.New()
|
||||
if globals.EnableJdStoreWrite {
|
||||
store1:= fmt.Sprintf("门店id:%d,门店名称:%s,第三方门店状态:%d,本地修改前门店状态%d,本地门店修改后状态:%d,第三方平台Id(ebai):%d", storeID,store.Name, 100, store.Status, 100,store.VendorOrgCode)
|
||||
event.AddOperateEvent(jxcontext.AdminCtx,jxcontext.AdminCtx.GetTrackInfo(), store1, "", "", 10, "UpdateStore")
|
||||
store1 := fmt.Sprintf("门店id:%d,门店名称:%s,第三方门店状态:%d,本地修改前门店状态%d,本地门店修改后状态:%d,第三方平台Id(ebai):%s", storeID, store.Name, 100, store.Status, 100, store.VendorOrgCode)
|
||||
event.AddOperateEvent(jxcontext.AdminCtx, jxcontext.AdminCtx.GetTrackInfo(), store1, "", "", 10, "UpdateStore")
|
||||
errList.AddErr(a.UpdateStoreInfo4Open2(storeParams, modifyCloseStatus))
|
||||
}
|
||||
if store.FreightDeductionPack != "" {
|
||||
|
||||
@@ -3,9 +3,9 @@ package jd
|
||||
import (
|
||||
"strings"
|
||||
"testing"
|
||||
|
||||
"git.rosy.net.cn/jx-callback/business/jxutils/jxcontext"
|
||||
"git.rosy.net.cn/jx-callback/business/model"
|
||||
"time"
|
||||
|
||||
"git.rosy.net.cn/baseapi/utils"
|
||||
"git.rosy.net.cn/jx-callback/business/model/dao"
|
||||
@@ -17,7 +17,7 @@ const (
|
||||
)
|
||||
|
||||
func TestReadStore(t *testing.T) {
|
||||
result, err := new(PurchaseHandler).ReadStore(jxcontext.AdminCtx, "", TestJdStoreNo)
|
||||
result, err := new(PurchaseHandler).ListOrders(jxcontext.AdminCtx, "320406", nil,time.Now().Add(-2*24*time.Hour),"11993088")
|
||||
if err != nil {
|
||||
t.Fatal(err.Error())
|
||||
}
|
||||
@@ -26,7 +26,7 @@ func TestReadStore(t *testing.T) {
|
||||
|
||||
func TestUpdateStore(t *testing.T) {
|
||||
handler := new(PurchaseHandler)
|
||||
result, err := handler.ReadStore(jxcontext.AdminCtx, "", TestJdStoreNo)
|
||||
result, err := handler.ReadStore(jxcontext.AdminCtx, "", TestJdStoreNo,"")
|
||||
|
||||
// result := &model.Store{}
|
||||
// result.ID = 100164
|
||||
@@ -43,7 +43,7 @@ func TestUpdateStore(t *testing.T) {
|
||||
}
|
||||
|
||||
// same
|
||||
result, err = handler.ReadStore(jxcontext.AdminCtx, "", TestJdStoreNo)
|
||||
result, err = handler.ReadStore(jxcontext.AdminCtx, "", TestJdStoreNo,"")
|
||||
if result.Name != newName {
|
||||
t.Fatalf("result is not same, desired newName:%s, newName:%s", newName, result.Name)
|
||||
}
|
||||
|
||||
@@ -19,7 +19,7 @@ import (
|
||||
"git.rosy.net.cn/jx-callback/globals/api"
|
||||
)
|
||||
|
||||
func (p *PurchaseHandler) ReadStore(ctx *jxcontext.Context, vendorOrgCode, vendorStoreID string) (storeDetail *dao.StoreDetail, err error) {
|
||||
func (p *PurchaseHandler) ReadStore(ctx *jxcontext.Context, vendorOrgCode, vendorStoreID ,vendorStoreName string) (storeDetail *dao.StoreDetail, err error) {
|
||||
// result, err := api.JdShopAPI.NewInfoList(utils.Str2Int64(vendorStoreID))
|
||||
// storeDetail.VendorStoreID = vendorStoreID
|
||||
// storeDetail.Status = JdsStatus2jxStatus(result.StoreStatus)
|
||||
|
||||
@@ -42,7 +42,7 @@ func (p *PurchaseHandler) CreateStoreSkus(ctx *jxcontext.Context, storeID int, v
|
||||
flag := false
|
||||
//flag2 := false
|
||||
//var wareStatusUpdateWareID string
|
||||
result, err := getAPI(v.VendorOrgCode).SearchWare4Valid(name, 1, 100)
|
||||
result, err := getAPI(v.VendorOrgCode).SearchWare4Valid(name, 1, 100) // 搜索有效商品
|
||||
if err != nil {
|
||||
failedList = putils.GetErrMsg2FailedSingleList(storeSkuList, err, storeID, model.VendorChineseNames[model.VendorIDJDShop], "创建商品")
|
||||
return failedList, err
|
||||
@@ -84,7 +84,7 @@ func (p *PurchaseHandler) CreateStoreSkus(ctx *jxcontext.Context, storeID int, v
|
||||
var wareSaveSkus []*jdshopapi.WareSaveSkus
|
||||
//先把已有的规格放进去
|
||||
// if v.VendorOrgCode == "2" {
|
||||
wareResult, _ := getAPI(v.VendorOrgCode).FindWareById(wareSaveParam.WareID)
|
||||
wareResult, _ := getAPI(v.VendorOrgCode).FindWareById(wareSaveParam.WareID) // 获取单个商品详情
|
||||
if wareResult != nil {
|
||||
for _, v := range wareResult.Images {
|
||||
wareSaveParam.ImageMap.Num0000000000 = append(wareSaveParam.ImageMap.Num0000000000, &jdshopapi.CreateSkuParamImages{
|
||||
@@ -94,7 +94,7 @@ func (p *PurchaseHandler) CreateStoreSkus(ctx *jxcontext.Context, storeID int, v
|
||||
})
|
||||
}
|
||||
}
|
||||
skus, _, _ := getAPI(v.VendorOrgCode).SearchSkuList2([]int{int(wareSaveParam.WareID)})
|
||||
skus, _, _ := getAPI(v.VendorOrgCode).SearchSkuList2([]int{int(wareSaveParam.WareID)}) // 获取改商品的sku信息
|
||||
if len(skus) > 0 {
|
||||
for _, vv := range skus {
|
||||
sku := &jdshopapi.WareSaveSkus{
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package localjx
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"math"
|
||||
"regexp"
|
||||
@@ -98,7 +99,7 @@ func (l JxSkuInfoList) Swap(i, j int) {
|
||||
}
|
||||
|
||||
type JxOrderInfo struct {
|
||||
BuyerComment string `json:"buyerComment"`
|
||||
BuyerComment string `json:"buyerComment"` // 备注
|
||||
StoreID int `json:"storeID"`
|
||||
Skus []*JxSkuInfo `json:"skus"`
|
||||
|
||||
@@ -112,7 +113,7 @@ type JxOrderInfo struct {
|
||||
OrderID int64 `json:"orderID"`
|
||||
StoreName string `json:"storeName"`
|
||||
Weight int `json:"weight"`
|
||||
FromStoreID int `json:"fromStoreID"`
|
||||
FromStoreID int `json:"fromStoreID"` //
|
||||
EarningType int `json:"earningType"`
|
||||
OrderType int `json:"orderType"`
|
||||
IsBuyNowPrice int `json:"isBuyNowPrice"`
|
||||
@@ -530,6 +531,7 @@ func GetAvailableDeliverTime(ctx *jxcontext.Context, storeID int) (deliverTimerL
|
||||
}
|
||||
|
||||
func OnPayFinished(orderPay *model.OrderPay) (err error) {
|
||||
// 查询订单是购物订单还是充值订单
|
||||
order, err := partner.CurOrderManager.LoadOrder(orderPay.VendorOrderID, orderPay.VendorID)
|
||||
if err == nil {
|
||||
db := dao.GetDB()
|
||||
@@ -584,10 +586,12 @@ func OnPayFinished(orderPay *model.OrderPay) (err error) {
|
||||
storeOrder.OrderFinishedAt = time.Now()
|
||||
storeOrder.Status = model.OrderStatusFinished
|
||||
if _, err = dao.UpdateEntity(dao.GetDB(), storeOrder, "OrderFinishedAt", "Status"); err == nil {
|
||||
if storeOrder.StoreID == 668357 {
|
||||
storeOrder.StoreID = 131
|
||||
// 获取门店的品牌ID
|
||||
storeBrandId, err := GetStoreAcctOrderByVendorId(orderPay.VendorOrderID)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
partner.CurStoreAcctManager.InsertBrandBill(jxcontext.AdminCtx, 131, storeOrder.ActualPayPrice, 1, 1, "")
|
||||
partner.CurStoreAcctManager.InsertBrandBill(jxcontext.AdminCtx, storeBrandId, storeOrder.ActualPayPrice, model.BrandBillFeeTypeSys, model.BrandBillFeeTypeSys, "")
|
||||
}
|
||||
}
|
||||
case model.PayTypeTL_BrandBillCharge:
|
||||
@@ -822,7 +826,7 @@ func generateOrder(ctx *jxcontext.Context, jxOrder *JxOrderInfo, addressID int64
|
||||
if jxOrder.OrderType != model.OrderTypeMatter || (jxOrder.OrderType == model.OrderTypeMatter && fromStoreID == -1) {
|
||||
outJxOrder.Skus = append(outJxOrder.Skus, jxSku)
|
||||
outJxOrder.OrderPrice += int64(jxSku.Count) * jxSku.SalePrice
|
||||
} else { //以下else为物料订单袋子金额和数量处理
|
||||
} else { //以下else为物料订单袋子金额和数量处理
|
||||
if !result.Flag { //只要flag是false就按原价申请,是true再按订单量
|
||||
outJxOrder.Skus = append(outJxOrder.Skus, jxSku)
|
||||
outJxOrder.OrderPrice += int64(jxSku.Count) * jxSku.SalePrice
|
||||
@@ -993,6 +997,10 @@ func generateOrder(ctx *jxcontext.Context, jxOrder *JxOrderInfo, addressID int64
|
||||
outJxOrder.FreightPrice = 0
|
||||
}
|
||||
}
|
||||
if strings.Contains(storeDetail.BrandName, model.B2BTag) {
|
||||
outJxOrder.FreightPrice = 10000 // b2b运费一百元
|
||||
}
|
||||
|
||||
if err == nil {
|
||||
if jxOrder.OrderType == model.OrderTypeNormal {
|
||||
outJxOrder.TotalPrice = outJxOrder.OrderPrice + outJxOrder.FreightPrice
|
||||
@@ -2490,6 +2498,7 @@ func RefreshCouponsStatus(ctx *jxcontext.Context) (err error) {
|
||||
return err
|
||||
}
|
||||
|
||||
// 创建门店充值订单
|
||||
func CreateStoreAcctOrder(ctx *jxcontext.Context, orderType, storeID, price int, goodsVendorOrderID string) (vendorOrderID string, err error) {
|
||||
var (
|
||||
db = dao.GetDB()
|
||||
@@ -2528,6 +2537,34 @@ func CreateStoreAcctOrder(ctx *jxcontext.Context, orderType, storeID, price int,
|
||||
return order.VendorOrderID, err
|
||||
}
|
||||
|
||||
// 根据订单号获取门店充值记录
|
||||
func GetStoreAcctOrderByVendorId(vendorOrderID string) (int, error) {
|
||||
if vendorOrderID == "" {
|
||||
return 0, errors.New("参数vendorOrderID 不能为空")
|
||||
}
|
||||
sql := `
|
||||
SELECT t1.*
|
||||
FROM store_acct_order t1
|
||||
WHERE 1 = 1
|
||||
AND t1.vendor_order_id = ?
|
||||
`
|
||||
var sqlParams []interface{}
|
||||
sqlParams = append(sqlParams, vendorOrderID)
|
||||
|
||||
data := &model.StoreAcctOrder{}
|
||||
err := dao.GetRow(dao.GetDB(), &data, sql, sqlParams...)
|
||||
if data.StoreID == 0 {
|
||||
return 0, errors.New("充值订单为异常订单,无门店信息")
|
||||
}
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
|
||||
// 获取门店所属品牌
|
||||
storeDetail, _ := dao.GetStoreDetail(dao.GetDB(), data.StoreID, -1, "")
|
||||
return storeDetail.BrandID, nil
|
||||
}
|
||||
|
||||
func CreateBrandOrder(ctx *jxcontext.Context, brandID, price int) (vendorOrderID string, err error) {
|
||||
var (
|
||||
db = dao.GetDB()
|
||||
|
||||
@@ -1,7 +1,10 @@
|
||||
package mtwm
|
||||
|
||||
import (
|
||||
"git.rosy.net.cn/jx-callback/business/model"
|
||||
"git.rosy.net.cn/jx-callback/business/model/dao"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"git.rosy.net.cn/jx-callback/business/jxutils/jxcontext"
|
||||
|
||||
@@ -24,5 +27,23 @@ func TestGetVendorCategories(t *testing.T) {
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
for _, v := range result {
|
||||
data := model.SkuVendorCategory{
|
||||
ModelIDCUL: model.ModelIDCUL{
|
||||
CreatedAt: time.Now(),
|
||||
UpdatedAt: time.Now(),
|
||||
LastOperator: "刘磊",
|
||||
},
|
||||
VendorCategoryID: v.VendorCategoryID,
|
||||
VendorID: v.VendorID,
|
||||
Name: v.Name,
|
||||
IsLeaf: v.IsLeaf,
|
||||
Level: v.Level,
|
||||
ParentID: v.ParentID,
|
||||
}
|
||||
if err := dao.CreateEntity(dao.GetDB(),&data);err != nil {
|
||||
t.Log(utils.Format4Output(err, false))
|
||||
}
|
||||
}
|
||||
t.Log(utils.Format4Output(result, false))
|
||||
}
|
||||
|
||||
@@ -61,7 +61,7 @@ type tEbaiStoreInfo struct {
|
||||
DistrictID int `orm:"column(district_id)"`
|
||||
}
|
||||
|
||||
func (p *PurchaseHandler) ReadStore(ctx *jxcontext.Context, vendorOrgCode, vendorStoreID string) (retVal *dao.StoreDetail, err error) {
|
||||
func (p *PurchaseHandler) ReadStore(ctx *jxcontext.Context, vendorOrgCode, vendorStoreID,vendorStoreName string) (retVal *dao.StoreDetail, err error) {
|
||||
result, err := getAPIWithoutToken(vendorOrgCode).PoiGet(vendorStoreID)
|
||||
if err == nil {
|
||||
// globals.SugarLogger.Debug(utils.Format4Output(result, false))
|
||||
@@ -252,7 +252,7 @@ func (p *PurchaseHandler) UpdateStore(db *dao.DaoDB, storeID int, userName strin
|
||||
// name = jxutils.ComposeStoreName(storeDetail.Store.Name, model.VendorIDMTWM)
|
||||
// }
|
||||
}
|
||||
store := fmt.Sprintf("门店id:%d,门店名称:%s,第三方门店状态:%d,本地修改前门店状态%d,本地门店修改后状态:%d,第三方平台Id(美团):%d", storeID, remoteStoreInfo.Name, remoteStoreInfo.IsOnline, storeDetail.Status, mergedStoreStatus, storeDetail.VendorOrgCode)
|
||||
store := fmt.Sprintf("门店id:%d,门店名称:%s,第三方门店状态:%d,本地修改前门店状态%d,本地门店修改后状态:%d,第三方平台Id(美团):%s", storeID, remoteStoreInfo.Name, remoteStoreInfo.IsOnline, storeDetail.Status, mergedStoreStatus, storeDetail.VendorOrgCode)
|
||||
event.AddOperateEvent(jxcontext.AdminCtx, jxcontext.AdminCtx.GetTrackInfo(), store, "", "", 10, "UpdateStore")
|
||||
// openLevel, isOnline := bizStatusJX2Mtwm(mergedStoreStatus)
|
||||
//TODO 美团暂时不用那个电话
|
||||
@@ -353,7 +353,7 @@ func (p *PurchaseHandler) onStoreStatusChanged(msg *mtwmapi.CallbackMsg) (respon
|
||||
response = mtwmapi.Err2CallbackResponse(err, "")
|
||||
// 操作日志(美团外卖)
|
||||
ctx := jxcontext.AdminCtx
|
||||
store := fmt.Sprintf("美团外卖回调门店改变回调(营业状态/审核状态):门店id:%s,美团门店状态:%d.[121营业,120休息,18上线,19下线],本地修改后状态[%s]", vendorStoreID, int(utils.Str2Int64(msg.FormData.Get("poi_status"))), storeStatus)
|
||||
store := fmt.Sprintf("美团外卖回调门店改变回调(营业状态/审核状态):门店id:%s,美团门店状态:%d.[121营业,120休息,18上线,19下线],本地修改后状态[%d]", vendorStoreID, int(utils.Str2Int64(msg.FormData.Get("poi_status"))), storeStatus)
|
||||
event.AddOperateEvent(ctx, ctx.GetTrackInfo(), store, "", "", 10, "UpdateStore")
|
||||
return response
|
||||
}
|
||||
@@ -390,7 +390,7 @@ func (c *PurchaseHandler) UpdateStoreStatus(ctx *jxcontext.Context, vendorOrgCod
|
||||
} else {
|
||||
err = errors.New("门店还未上线,不能修改营业状态")
|
||||
}
|
||||
store := fmt.Sprintf("美团外卖回调门店改变回调(营业状态/审核状态):门店id:%s,美团门店状态:%d.[121营业,120休息,18上线,19下线],本地修改后状态[%s]", vendorStoreID, remoteStoreInfo.OpenLevel, openLevel)
|
||||
store := fmt.Sprintf("美团外卖回调门店改变回调(营业状态/审核状态):门店id:%s,美团门店状态:%d.[121营业,120休息,18上线,19下线],本地修改后状态[%d]", vendorStoreID, remoteStoreInfo.OpenLevel, openLevel)
|
||||
event.AddOperateEvent(ctx, ctx.GetTrackInfo(), store, "", "", 10, "UpdateStore")
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,20 +3,18 @@ package mtwm
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"git.rosy.net.cn/jx-callback/business/jxutils/jxcontext"
|
||||
|
||||
"git.rosy.net.cn/baseapi/platformapi/mtwmapi"
|
||||
"git.rosy.net.cn/baseapi/utils"
|
||||
// _ "git.rosy.net.cn/jx-callback/business/jxcallback/orderman"
|
||||
)
|
||||
|
||||
func TestReadStore(t *testing.T) {
|
||||
store, err := CurPurchaseHandler.ReadStore(jxcontext.AdminCtx, "", "4351018")
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
t.Log(utils.Format4Output(store, false))
|
||||
}
|
||||
//func TestReadStore(t *testing.T) {
|
||||
// store, err := CurPurchaseHandler.ReadStore(jxcontext.AdminCtx, "", "4351018")
|
||||
// if err != nil {
|
||||
// t.Fatal(err)
|
||||
// }
|
||||
// t.Log(utils.Format4Output(store, false))
|
||||
//}
|
||||
|
||||
func TestUpdateStore(t *testing.T) {
|
||||
err := CurPurchaseHandler.UpdateStore(nil, 100002, "test")
|
||||
|
||||
@@ -6,7 +6,7 @@ import (
|
||||
"git.rosy.net.cn/jx-callback/business/model/dao"
|
||||
)
|
||||
|
||||
func (p *PurchaseHandler) ReadStore(ctx *jxcontext.Context, vendorOrgCode, vendorStoreID string) (storeDetail *dao.StoreDetail, err error) {
|
||||
func (p *PurchaseHandler) ReadStore(ctx *jxcontext.Context, vendorOrgCode, vendorStoreID, vendorStoreName string) (storeDetail *dao.StoreDetail, err error) {
|
||||
return storeDetail, err
|
||||
}
|
||||
|
||||
|
||||
@@ -204,8 +204,11 @@ dbConnectStr = "root:WebServer@1@tcp(127.0.0.1:3306)/jxd_dev_0?charset=utf8mb4&l
|
||||
getWeixinTokenURL = "http://www.jxc4.com/v2/sys/GetWXToken"
|
||||
getYLYTokenURL = "http://www.jxc4.com/v2/sys/GetYLYToken"
|
||||
|
||||
tiktokAppKey = "ttaceeda5333d7a7ab01"
|
||||
tiktokAppSecret = "58ad9aa661599411cfce52a50724c4b86d4421c7"
|
||||
tiktokAppKey = "tta6a1d01c399f264201"
|
||||
tiktokAppSecret = "1e0d98ad7b2e9b1ba5d7529a7e17fa9b9d65380a"
|
||||
#国美
|
||||
gomeiAppKey = "N0R033L2QQFR53"
|
||||
gomeiAppSecret = "686ffc3e31c24594838baed045563790"
|
||||
[prod]
|
||||
EnableDocs = false
|
||||
|
||||
@@ -320,9 +323,11 @@ fnCallbackURL = "http://callback.jxc4.com/fn/msg"
|
||||
jxPrintAppID = "1000"
|
||||
jxPrintAppKey = "rfBd56ti2SMtYvSg"
|
||||
|
||||
tiktokAppKey = "ttaceeda5333d7a7ab01"
|
||||
tiktokAppSecret = "58ad9aa661599411cfce52a50724c4b86d4421c7"
|
||||
|
||||
tiktokAppKey = "tta6a1d01c399f264201"
|
||||
tiktokAppSecret = "1e0d98ad7b2e9b1ba5d7529a7e17fa9b9d65380a"
|
||||
#国美
|
||||
gomeiAppKey = "N0R033L2QQFR53"
|
||||
gomeiAppSecret = "686ffc3e31c24594838baed045563790"
|
||||
[jxgy]
|
||||
httpport = 8088
|
||||
EnableDocs = false
|
||||
@@ -417,8 +422,11 @@ jxPrintAppID = "1000"
|
||||
jxPrintAppKey = "rfBd56ti2SMtYvSg"
|
||||
|
||||
storeName = "京西果园"
|
||||
tiktokAppKey = "ttaceeda5333d7a7ab01"
|
||||
tiktokAppSecret = "58ad9aa661599411cfce52a50724c4b86d4421c7"
|
||||
tiktokAppKey = "tta6a1d01c399f264201"
|
||||
tiktokAppSecret = "1e0d98ad7b2e9b1ba5d7529a7e17fa9b9d65380a"
|
||||
#国美
|
||||
gomeiAppKey = "N0R033L2QQFR53"
|
||||
gomeiAppSecret = "686ffc3e31c24594838baed045563790"
|
||||
[test]
|
||||
jdOrgCode = "82029"
|
||||
jdToken = "594ab45a-9a73-4a43-82b0-a64cbd55d883"
|
||||
@@ -596,5 +604,8 @@ fnCallbackURL = "http://callback.jxc4.com/fn/msg"
|
||||
jxPrintAppID = "1000"
|
||||
jxPrintAppKey = "rfBd56ti2SMtYvSg"
|
||||
|
||||
tiktokAppKey = "ttaceeda5333d7a7ab01"
|
||||
tiktokAppSecret = "58ad9aa661599411cfce52a50724c4b86d4421c7"
|
||||
tiktokAppKey = "tta6a1d01c399f264201"
|
||||
tiktokAppSecret = "1e0d98ad7b2e9b1ba5d7529a7e17fa9b9d65380a"
|
||||
#国美
|
||||
gomeiAppKey = "N0R033L2QQFR53"
|
||||
gomeiAppSecret = "686ffc3e31c24594838baed045563790"
|
||||
@@ -2,15 +2,19 @@ package controllers
|
||||
|
||||
import (
|
||||
"git.rosy.net.cn/baseapi/utils"
|
||||
"git.rosy.net.cn/jx-callback/business/auth2"
|
||||
"git.rosy.net.cn/jx-callback/business/jxstore/cms"
|
||||
"git.rosy.net.cn/jx-callback/business/jxstore/common"
|
||||
"git.rosy.net.cn/jx-callback/business/jxstore/misc"
|
||||
"git.rosy.net.cn/jx-callback/business/jxstore/permission"
|
||||
"git.rosy.net.cn/jx-callback/business/jxstore/secretNumber"
|
||||
"git.rosy.net.cn/jx-callback/business/jxutils"
|
||||
"git.rosy.net.cn/jx-callback/business/jxutils/netprinter"
|
||||
"git.rosy.net.cn/jx-callback/business/model"
|
||||
"git.rosy.net.cn/jx-callback/business/model/dao"
|
||||
"git.rosy.net.cn/jx-callback/globals/api"
|
||||
"github.com/astaxie/beego/server/web"
|
||||
"github.com/pkg/errors"
|
||||
)
|
||||
|
||||
type StoreController struct {
|
||||
@@ -60,9 +64,10 @@ type StoreController struct {
|
||||
func (c *StoreController) GetStores() {
|
||||
c.callGetStores(func(params *tStoreGetStoresParams) (retVal interface{}, errCode string, err error) {
|
||||
timeList, err := jxutils.BatchStr2Time(params.OrderTimeFrom, params.OrderTimeTo)
|
||||
if err == nil {
|
||||
retVal, err = cms.GetStores(params.Ctx, params.Keyword, params.MapData, params.Offset, params.PageSize, timeList[0], timeList[1], params.OrderCountFrom, params.OrderCountTo)
|
||||
if err != nil {
|
||||
return nil, "", err
|
||||
}
|
||||
retVal, err = cms.GetStores(params.Ctx, params.Keyword, params.MapData, params.Offset, params.PageSize, timeList[0], timeList[1], params.OrderCountFrom, params.OrderCountTo)
|
||||
return retVal, "", err
|
||||
})
|
||||
}
|
||||
@@ -704,8 +709,39 @@ func (c *StoreController) DeletePrinterSeq() {
|
||||
// @router /GetStoreCategoryMap [get]
|
||||
func (c *StoreController) GetStoreCategoryMap() {
|
||||
c.callGetStoreCategoryMap(func(params *tStoreGetStoreCategoryMapParams) (retVal interface{}, errCode string, err error) {
|
||||
retVal, err = cms.GetStoreCategoryMap(params.Ctx, params.ParentID, params.Level, params.StoreID)
|
||||
return retVal, "", err
|
||||
// 判断门店是不是b2b门店,如果是,用户必须为系统管理员(门店老板和运营人员)
|
||||
store, err := dao.GetStoreList(dao.GetDB(), []int{params.StoreID}, nil, nil, nil, nil, "")
|
||||
if err != nil {
|
||||
return nil, "", err
|
||||
}
|
||||
if len(store) != model.YES {
|
||||
return nil, "", errors.New("门店数据异常,门店id不唯一:" + string(params.StoreID))
|
||||
}
|
||||
// 获取门店分类
|
||||
categoryList, err := cms.GetStoreCategoryMap(params.Ctx, params.ParentID, params.Level, params.StoreID)
|
||||
// 门店为b2b
|
||||
if store[0].BrandID == model.B2BNumberId {
|
||||
// 获取用户权限,如果是普通用户不展示b2b相关目录,如果是门店老板或者管理则展示全部
|
||||
userAuth, err := auth2.GetTokenInfo(params.Token)
|
||||
if err != nil {
|
||||
return nil, "", err
|
||||
}
|
||||
|
||||
userRole, err := permission.GetUserRole(params.Ctx, userAuth.UserID)
|
||||
if err != nil {
|
||||
return nil, "", err
|
||||
}
|
||||
if len(userRole) == 0 { // 普通用户,无用户权限
|
||||
//result := make([]*model.StoreCategoryMap, 0, 0)
|
||||
//for _, v := range categoryList {
|
||||
// if !strings.Contains(v.StoreCategoryName, model.B2BTag) {
|
||||
// result = append(result, v)
|
||||
// }
|
||||
//}
|
||||
return nil, "", errors.New("用户为普通用户,无法查看B2B门店信息")
|
||||
}
|
||||
}
|
||||
return categoryList, "", err
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
@@ -564,6 +564,23 @@ func (c *StoreSkuController) RefreshJxPriceByExcel() {
|
||||
})
|
||||
}
|
||||
|
||||
// @Title 根据Excel导入订单,订单状态设置为待拣货
|
||||
// @Description 根据Excel导入订单,订单状态设置为待拣货
|
||||
// @Param token header string true "认证token"
|
||||
// @Param isAsync formData bool true "是否异步,缺省是同步"
|
||||
// @Param isContinueWhenError formData bool true "单个同步失败是否继续,缺省false"
|
||||
// @Success 200 {object} controllers.CallResult
|
||||
// @Failure 200 {object} controllers.CallResult
|
||||
// @router /RefreshJxOrderByExcel [post]
|
||||
//func (c *StoreSkuController) RefreshJxOrderByExcel() {
|
||||
// c.callRefreshJxOrderByExcel(func(params *tStoreSkuRefreshJxOrderByExcelParams) (retVal interface{}, errCode string, err error) {
|
||||
// r := c.Ctx.Request
|
||||
// files := r.MultipartForm.File["userfiles"]
|
||||
// retVal, err = cms.RefreshJxPriceByExcel(params.Ctx, storeIDList, files, params.IsAsync, params.IsContinueWhenError)
|
||||
// return retVal, "", err
|
||||
// })
|
||||
//}
|
||||
|
||||
// @Title 根据Excel中SkuID批量关注商品
|
||||
// @Description 根据Excel中SkuID批量关注商品
|
||||
// @Param token header string true "认证token"
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package api
|
||||
|
||||
import (
|
||||
gomei "git.rosy.net.cn/baseapi/platformapi/gome_live_show"
|
||||
"git.rosy.net.cn/baseapi/platformapi/jxprintapi"
|
||||
"git.rosy.net.cn/baseapi/platformapi/qywxapi"
|
||||
"git.rosy.net.cn/baseapi/platformapi/tiktok"
|
||||
@@ -111,6 +112,7 @@ var (
|
||||
SMSClient *aliyunsmsclient.SmsClient
|
||||
|
||||
TiktokApi *tiktok.API
|
||||
GuoMeiApi *gomei.API
|
||||
)
|
||||
|
||||
func init() {
|
||||
@@ -295,4 +297,7 @@ func Init() {
|
||||
|
||||
QywxAPI = qywxapi.New(beego.AppConfig.DefaultString("qywxID", ""), beego.AppConfig.DefaultString("qywxSecret", ""), "")
|
||||
TiktokApi = tiktok.New(beego.AppConfig.DefaultString("tiktokAppSecret", ""), beego.AppConfig.DefaultString("tiktokAppKey", ""))
|
||||
// 国美aip
|
||||
GuoMeiApi = gomei.New(beego.AppConfig.DefaultString("gomeiAppKey", ""), beego.AppConfig.DefaultString("gomeiAppSecret", ""), "")
|
||||
|
||||
}
|
||||
|
||||
@@ -62,6 +62,8 @@ func (a *APIManager) GetAPI(vendorID int, appOrgCode string) (pfAPI interface{})
|
||||
pfAPI = api.EbaiAPI
|
||||
case model.VendorIDJDShop:
|
||||
pfAPI = api.JdShopAPI
|
||||
case model.VendorGoMei:
|
||||
pfAPI = api.GuoMeiApi
|
||||
}
|
||||
return pfAPI
|
||||
}
|
||||
@@ -80,6 +82,8 @@ func (a *APIManager) GetAppOrgCodeList(vendorID int) (appOrgCodeList []string) {
|
||||
appOrgCodeList = []string{api.EbaiAPI.GetSource()}
|
||||
case model.VendorIDJDShop:
|
||||
appOrgCodeList = []string{"2"}
|
||||
case model.VendorGoMei:
|
||||
appOrgCodeList = []string{api.GuoMeiApi.GetAppKey()}
|
||||
}
|
||||
return appOrgCodeList
|
||||
}
|
||||
|
||||
7
main.go
7
main.go
@@ -37,14 +37,15 @@ import (
|
||||
_ "git.rosy.net.cn/jx-callback/business/partner/printer/yilianyun"
|
||||
_ "git.rosy.net.cn/jx-callback/business/partner/printer/zhongwu"
|
||||
|
||||
_ "git.rosy.net.cn/jx-callback/business/auth2/authprovider/alipay"
|
||||
_ "git.rosy.net.cn/jx-callback/business/auth2/authprovider/dingding"
|
||||
_ "git.rosy.net.cn/jx-callback/business/auth2/authprovider/douyin"
|
||||
_ "git.rosy.net.cn/jx-callback/business/model/dao"
|
||||
_ "git.rosy.net.cn/jx-callback/business/partner/purchase/ebai"
|
||||
_ "git.rosy.net.cn/jx-callback/business/partner/purchase/jd"
|
||||
_ "git.rosy.net.cn/jx-callback/business/partner/purchase/jx"
|
||||
_ "git.rosy.net.cn/jx-callback/business/partner/purchase/mtwm"
|
||||
_ "git.rosy.net.cn/jx-callback/business/partner/purchase/weimob/wsc"
|
||||
|
||||
_ "git.rosy.net.cn/jx-callback/business/auth2/authprovider/alipay"
|
||||
_ "git.rosy.net.cn/jx-callback/business/auth2/authprovider/dingding"
|
||||
//_ "git.rosy.net.cn/jx-callback/business/auth2/authprovider/douyin"
|
||||
_ "git.rosy.net.cn/jx-callback/business/auth2/authprovider/mobile"
|
||||
_ "git.rosy.net.cn/jx-callback/business/auth2/authprovider/password"
|
||||
|
||||
@@ -3087,6 +3087,16 @@ func init() {
|
||||
Filters: nil,
|
||||
Params: nil})
|
||||
|
||||
// 根据excel生成待拣货订单
|
||||
//web.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:StoreSkuController"] = append(web.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:StoreSkuController"],
|
||||
// web.ControllerComments{
|
||||
// Method: "RefreshJxOrderByExcel",
|
||||
// Router: `/RefreshJxOrderByExcel`,
|
||||
// AllowHTTPMethods: []string{"post"},
|
||||
// MethodParams: param.Make(),
|
||||
// Filters: nil,
|
||||
// Params: nil})
|
||||
|
||||
web.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:StoreSkuController"] = append(web.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:StoreSkuController"],
|
||||
web.ControllerComments{
|
||||
Method: "RefreshJxPriceByVendor",
|
||||
|
||||
Reference in New Issue
Block a user