Files
jx-callback/business/partner/purchase/jd/sku.go
2018-09-21 10:57:00 +08:00

277 lines
8.8 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package jd
// 这里函数取得的信息除了与自身实体相关的ID比如PARENT ID都已经转换成了本地ID了
import (
"git.rosy.net.cn/baseapi/utils"
"git.rosy.net.cn/jx-callback/business/jxutils"
"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"
)
const (
DefBrandID = 35247
DefJdCategoryID = 20362
)
type skuInfoExt struct {
model.SkuName
Img string
JdID int64 `orm:"column(jd_id)"` // 商家类别
JdCategoryID int `orm:"column(jd_category_id)"` // 到家类别
SkuCatID int64 `orm:"column(sku_cat_id)"` // 商家特殊类别
}
func (p *PurchaseHandler) CreateCategory(db *dao.DaoDB, cat *model.SkuCategory, userName string) (err error) {
var jdPid int64
if cat.ParentID != 0 {
pCat := &model.SkuCategory{}
pCat.ID = cat.ParentID
if err = dao.GetEntity(db, pCat); err == nil {
jdPid = pCat.JdID
} else {
return err
}
}
if globals.EnableStoreWrite {
result, err2 := api.JdAPI.AddShopCategory(jdPid, cat.Name, int(cat.Level), cat.Seq, userName)
if err = err2; err == nil {
if jdID := utils.Str2Int64WithDefault(result, 0); jdID != 0 {
cat.JdID = jdID
}
}
}
return err
}
func (p *PurchaseHandler) ReadCategories() (cats []*model.SkuCategory, err error) {
result, err := api.JdAPI.QueryCategoriesByOrgCode()
if err == nil {
cats = make([]*model.SkuCategory, len(result))
for k, v := range result {
cats[k] = &model.SkuCategory{
ParentID: int(v.ParentId), // 这里是暂存传递数据用正确的值应该是本地的ID
Name: v.Name,
Level: int8(v.Level),
Seq: v.Sort,
JdID: v.Id,
}
}
return cats, nil
}
return nil, err
}
func (p *PurchaseHandler) UpdateCategory(db *dao.DaoDB, cat *model.SkuCategory, userName string) error {
if !globals.EnableStoreWrite {
return nil
}
return api.JdAPI.UpdateShopCategory(cat.JdID, cat.Name)
}
func (p *PurchaseHandler) DeleteCategory(db *dao.DaoDB, cat *model.SkuCategory, userName string) error {
if !globals.EnableStoreWrite {
return nil
}
return api.JdAPI.DelShopCategory(cat.JdID)
}
func (p *PurchaseHandler) ReorderCategories(db *dao.DaoDB, parentCatID int, userName string) (err error) {
var parentJDID int64
if parentCatID != 0 {
cat := &model.SkuCategory{}
cat.ID = parentCatID
if err = dao.GetEntity(db, cat); err != nil {
return err
}
parentJDID = cat.JdID
}
var cats []*model.SkuCategory
if err = dao.GetRows(db, &cats, "SELECT * FROM sku_category WHERE parent_id = ? ORDER BY seq", parentCatID); err == nil {
jdCatIDs := make([]int64, len(cats))
for k, v := range cats {
jdCatIDs[k] = v.JdID
}
if globals.EnableStoreWrite {
err = api.JdAPI.ChangeShopCategoryOrder(parentJDID, jdCatIDs)
}
}
return err
}
func (p *PurchaseHandler) cuSku(db *dao.DaoDB, sku *model.Sku, handler func(skuExt *skuInfoExt, skuName string, shopCategories []int64, addParams map[string]interface{}) (string, error)) (err error) {
var otherInfo skuInfoExt
err = dao.GetRow(nil, &otherInfo, `
SELECT t2.*, t3.jd_id, t3.jd_category_id, t4.jd_id sku_cat_id
FROM sku t1
JOIN sku_name t2 ON t1.name_id = t2.id
JOIN sku_category t3 ON t2.category_id = t3.id
LEFT JOIN sku_category t4 ON t1.category_id = t4.id
WHERE t1.id = ?
`, sku.ID)
if err == nil {
shopCategories := []int64{otherInfo.JdID}
if otherInfo.SkuCatID != 0 {
shopCategories = append(shopCategories, otherInfo.SkuCatID)
}
if otherInfo.JdCategoryID == 0 {
otherInfo.JdCategoryID = DefJdCategoryID
}
if otherInfo.BrandID == 0 {
otherInfo.BrandID = DefBrandID
}
addParams := map[string]interface{}{}
if otherInfo.IsGlobal == 0 { //如果不是全国可售,要查可售区域
sellPlaces, err2 := dao.GetSellCities(db, otherInfo.ID, model.VendorIDJD)
if err = err2; err == nil && len(sellPlaces) > 0 {
sellCites := make([]int, len(sellPlaces))
for k, v := range sellPlaces {
sellCites[k] = v.JdCode
}
addParams["sellCities"] = sellCites
}
}
if err == nil {
skuName := jxutils.ComposeSkuName(otherInfo.Prefix, otherInfo.Name, otherInfo.Comment, otherInfo.Unit, sku.SpecQuality, sku.SpecUnit, 0)
globals.SugarLogger.Debug(skuName)
result, err2 := handler(&otherInfo, skuName, shopCategories, addParams)
if err = err2; err == nil {
if jdID := utils.Str2Int64WithDefault(result, 0); jdID != 0 {
sku.JdID = jdID
}
}
}
}
return err
}
func (p *PurchaseHandler) CreateSku(db *dao.DaoDB, sku *model.Sku, userName string) (err error) {
return p.cuSku(db, sku, func(skuExt *skuInfoExt, skuName string, shopCategories []int64, addParams map[string]interface{}) (vendorSkuID string, err error) {
if globals.EnableStoreWrite {
vendorSkuID, err = api.JdAPI.AddSku(utils.Int2Str(sku.ID), skuExt.JdCategoryID, shopCategories, skuExt.BrandID, skuName, skuExt.Price, jxutils.IntWeight2Float(sku.Weight), []string{skuExt.Img}, 1, true, addParams)
}
return vendorSkuID, err
})
}
func (p *PurchaseHandler) ReadSku(vendorSkuID string) (skuNameExt *model.SkuNameExt, err error) {
jdSkuID := utils.Str2Int64(vendorSkuID)
result, _, err := api.JdAPI.QuerySkuInfos("", jdSkuID, 0, 0, false)
if err == nil {
if len(result) == 1 {
skuNameExt = &model.SkuNameExt{}
if picInfo, err2 := api.JdAPI.QueryListBySkuIds([]int64{jdSkuID}, nil); err2 == nil && len(picInfo) > 0 {
skuNameExt.Img = utils.Interface2String(picInfo[0]["sourceImgUrl"])
}
mapData := result[0]
skuNameStr := utils.Interface2String(mapData["skuName"])
prefix, name, comment, specUnit, unit, specQuality := jxutils.SplitSkuName(skuNameStr)
if name == "" {
name = skuNameStr
unit = "份"
specUnit = "g"
}
skuNameExt.Prefix = prefix
skuNameExt.Name = name
skuNameExt.Comment = comment
skuNameExt.Unit = unit
skuNameExt.Price = int(utils.MustInterface2Int64(mapData["skuPrice"]))
skuNameExt.Skus = []*model.Sku{
&model.Sku{
SpecQuality: specQuality,
SpecUnit: specUnit,
Weight: jxutils.FloatWeight2Int(float32(utils.MustInterface2Float64(mapData["weight"]))),
JdID: utils.MustInterface2Int64(mapData["skuId"]),
Status: jdStatus2jxStatus(int(utils.MustInterface2Int64(mapData["fixedStatus"]))),
},
}
skuNameExt.Skus[0].ID = int(utils.Str2Int64(utils.Interface2String(mapData["outSkuId"])))
db := dao.GetDB()
shopCategories := utils.Interface2Int64List(mapData["shopCategories"])
if len(shopCategories) > 0 {
skuCat := &model.SkuCategory{}
skuCat.JdID = shopCategories[0]
if dao.GetEntity(db, skuCat, "JdID") == nil {
skuNameExt.CategoryID = skuCat.ID
}
}
sellCities := utils.Interface2Int64List(mapData["sellCities"])
for _, v := range sellCities {
if v == 0 {
skuNameExt.IsGlobal = 1
}
}
if len(sellCities) == 0 || skuNameExt.IsGlobal == 1 {
skuNameExt.IsGlobal = 1
} else {
var places []*model.Place
if err = dao.GetRows(db, &places, "SELECT * FROM place WHERE jd_code IN ("+dao.GenQuestionMarks(len(sellCities))+") AND level = 2", sellCities); err == nil {
skuNameExt.Places = make([]int, len(places))
for k, v := range places {
skuNameExt.Places[k] = v.Code
}
}
}
} else {
err = partner.ErrCanNotFindItem
}
}
return skuNameExt, err
}
func (p *PurchaseHandler) UpdateSku(db *dao.DaoDB, sku *model.Sku, userName string) (err error) {
return p.cuSku(db, sku, func(skuExt *skuInfoExt, skuName string, shopCategories []int64, addParams map[string]interface{}) (vendorSkuID string, err error) {
params := utils.MergeMaps(addParams)
params["categoryId"] = skuExt.JdCategoryID
params["shopCategories"] = shopCategories
params["brandId"] = skuExt.BrandID
params["skuName"] = skuName
params["weight"] = jxutils.IntWeight2Float(sku.Weight)
params["images"] = []string{skuExt.Img}
params["fixedStatus"] = jxStatus2jdStatus(sku.Status)
if globals.EnableStoreWrite {
vendorSkuID, err = api.JdAPI.UpdateSku(utils.Int2Str(sku.ID), params)
}
return vendorSkuID, err
})
}
func (p *PurchaseHandler) DeleteSku(db *dao.DaoDB, sku *model.Sku, userName string) (err error) {
params := map[string]interface{}{
"fixedStatus": 4,
}
if globals.EnableStoreWrite {
_, err = api.JdAPI.UpdateSku(utils.Int2Str(sku.ID), params)
}
return err
}
func jdStatus2jxStatus(jdStatus int) (jxStatus int) {
switch jdStatus {
case 1:
jxStatus = model.SkuStatusNormal
case 2:
jxStatus = model.SkuStatusDontSale
case 4:
jxStatus = model.SkuStatusDeleted
}
return jxStatus
}
func jxStatus2jdStatus(jxStatus int) (jdStatus int) {
switch jxStatus {
case model.SkuStatusNormal:
jdStatus = 1
case model.SkuStatusDontSale:
jdStatus = 2
case model.SkuStatusDeleted:
jdStatus = 4
}
return jdStatus
}