From cdcac5ffb49ab00498a7773677b58c1b630f827e Mon Sep 17 00:00:00 2001 From: gazebo Date: Tue, 18 Sep 2018 21:45:16 +0800 Subject: [PATCH] - store sku unit price. --- business/jxstore/cms/store_sku.go | 109 +++++++++++++++++----- business/model/store_sku.go | 1 + business/partner/purchase/jd/store_sku.go | 4 +- controllers/cms_store_sku.go | 6 +- 4 files changed, 90 insertions(+), 30 deletions(-) diff --git a/business/jxstore/cms/store_sku.go b/business/jxstore/cms/store_sku.go index 755e95553..dad168aac 100644 --- a/business/jxstore/cms/store_sku.go +++ b/business/jxstore/cms/store_sku.go @@ -1,35 +1,53 @@ package cms import ( + "math" "strconv" + "strings" "git.rosy.net.cn/baseapi/utils" "git.rosy.net.cn/jx-callback/business/model" "git.rosy.net.cn/jx-callback/business/model/dao" ) +// GetStoreSkus用 type StoreSkuNameExt struct { model.SkuName - Skus interface{} `orm:"-" json:"skus"` - SkusStr string `json:"-"` + UnitPrice int `json:"unitPrice"` + Skus []map[string]interface{} `orm:"-" json:"skus"` + SkusStr string `json:"-"` } +// GetStoreSkus用 type StoreSkuNamesInfo struct { TotalCount int `json:"totalCount"` SkuNames []*StoreSkuNameExt `json:"skuNames"` } -type StoreSkuBindInfo struct { - SkuID int `json:"skuID"` +// UpdateStoreSku用,API调用时 +type StoreSkuBindSkuInfo struct { SubStoreID int `json:"subStoreID"` + SkuID int `json:"skuID"` IsFocus int `json:"isFocus"` // -1:不关注,0:忽略,1:关注 IsSale int `json:"isSale"` // -1:不可售,0:忽略,1:可售 - Price int `json:"price"` ElmID int64 `json:"elmID"` EbaiID int64 `json:"ebaiID"` } +// UpdateStoreSku用,API调用时 +type StoreSkuBindInfo struct { + NameID int `json:"nameID"` + UnitPrice int `json:"unitPrice"` + Skus []*StoreSkuBindSkuInfo `json:"skus"` +} + +type tStoreSkuBindAndSpec struct { + model.StoreSkuBind + SpecQuality float32 + SpecUnit string +} + func GetStoreSkus(storeID int, isFocused bool, keyword string, params map[string]interface{}, offset, pageSize int) (skuNamesInfo *StoreSkuNamesInfo, err error) { db := dao.GetDB() sql := ` @@ -147,7 +165,12 @@ func GetStoreSkus(storeID int, isFocused bool, keyword string, params map[string t1.price, t1.img, t1.elm_img_hash_code, - CONCAT("[", GROUP_CONCAT(DISTINCT CONCAT('{"id":', t2.id, ',"status":', t2.status, ',"createdAt":"', CONCAT(REPLACE(t2.created_at," ","T"),"+08:00"), '","updatedAt":"', CONCAT(REPLACE(t2.updated_at," ","T"),"+08:00"), '","lastOperator":"', t2.last_operator, '","specQuality":', t2.spec_quality, ',"specUnit":"', t2.spec_unit, '","weight":', t2.weight, ',"jdID":', t2.jd_id, ',"categoryID":', t2.category_id, ',"nameID":', t2.name_id, ',"subStoreID":', IF(t4.sub_store_id IS NULL, 0, t4.sub_store_id), ',"price":', IF(t4.price IS NULL, 0, t4.price), ',"storeSkuStatus":', IF(t4.status IS NULL, 0, t4.status), "}")), "]") skus_str + CONCAT("[", GROUP_CONCAT(DISTINCT CONCAT('{"id":', t2.id, ',"status":', t2.status, ',"createdAt":"', + CONCAT(REPLACE(t2.created_at," ","T"),"+08:00"), '","updatedAt":"', CONCAT(REPLACE(t2.updated_at," ","T"),"+08:00"), + '","lastOperator":"', t2.last_operator, '","specQuality":', t2.spec_quality, ',"specUnit":"', t2.spec_unit, '","weight":', t2.weight, + ',"jdID":', t2.jd_id, ',"categoryID":', t2.category_id, ',"nameID":', t2.name_id, ',"subStoreID":', IF(t4.sub_store_id IS NULL, 0, t4.sub_store_id), + ',"price":', IF(t4.price IS NULL, 0, t4.price), ',"unitPrice":', IF(t4.unit_price IS NULL, 0, t4.unit_price), + ',"storeSkuStatus":', IF(t4.status IS NULL, 0, t4.status), "}")), "]") skus_str ` + sql + ` ORDER BY t1.id LIMIT ? OFFSET ?` @@ -176,6 +199,12 @@ func GetStoreSkus(storeID int, isFocused bool, keyword string, params map[string if err = utils.UnmarshalUseNumber([]byte(skuName.SkusStr), &skuName.Skus); err != nil { break } + if len(skuName.Skus) > 0 { + skuName.UnitPrice = int(utils.MustInterface2Int64(skuName.Skus[0]["unitPrice"])) + for _, v := range skuName.Skus { + delete(v, "unitPrice") + } + } } } } @@ -184,23 +213,21 @@ func GetStoreSkus(storeID int, isFocused bool, keyword string, params map[string return skuNamesInfo, err } -func UpdateStoreSku(storeID int, skuBinds []*StoreSkuBindInfo, userName string) (num int64, err error) { +func UpdateStoreSku(storeID int, skuBindInfo *StoreSkuBindInfo, userName string) (num int64, err error) { db := dao.GetDB() - var existBinds []*model.StoreSkuBind - skuIDs := make([]int, len(skuBinds)) - for k, v := range skuBinds { - skuIDs[k] = v.SkuID - } - questions := "(" + dao.GenQuestionMarks(len(skuBinds)) + ")" + skuBinds := skuBindInfo.Skus + var existBinds []*tStoreSkuBindAndSpec if err = dao.GetRows(db, &existBinds, ` - SELECT * - FROM store_sku_bind + SELECT t1.*, t2.spec_quality, t2.spec_unit + FROM store_sku_bind t1 + JOIN sku t2 ON t1.sku_id = t2.id WHERE store_id = ? - AND sku_id IN `+questions, storeID, skuIDs); err == nil { - existBindsMap := make(map[int]*model.StoreSkuBind, len(existBinds)) - for _, v := range existBinds { - existBindsMap[v.SkuID] = v + AND t2.name_id = ?`, storeID, skuBindInfo.NameID); err == nil { + skuIDs := make([]int, len(existBinds)) + for k, v := range existBinds { + skuIDs[k] = v.SkuID } + existBindsMap := make(map[int]*model.StoreSkuBind, len(existBinds)) dao.Begin(db) defer func() { if r := recover(); r != nil { @@ -208,14 +235,44 @@ func UpdateStoreSku(storeID int, skuBinds []*StoreSkuBindInfo, userName string) panic(r) } }() + unitPrice := 0 + if skuBindInfo.UnitPrice != 0 { + unitPrice = skuBindInfo.UnitPrice + } else { + unitPrice = existBinds[0].UnitPrice + } + for _, v := range existBinds { + if skuBindInfo.UnitPrice != 0 { + v.UnitPrice = unitPrice + v.Price = calStoreSkuPrice(unitPrice, v.SpecQuality, v.SpecUnit) + v.JdSyncStatus |= model.SyncFlagPriceMask + v.ElmSyncStatus |= model.SyncFlagPriceMask + v.EbaiSyncStatus |= model.SyncFlagPriceMask + dao.WrapUpdateULEntity(v, userName) + if _, err2 := dao.UpdateEntity(db, &v.StoreSkuBind); err2 != nil { + dao.Rollback(db) + return 0, err2 + } + } + existBindsMap[v.SkuID] = &v.StoreSkuBind + } for _, v := range skuBinds { skuBind, ok := existBindsMap[v.SkuID] if !ok { if v.IsFocus == 1 { + sku := &model.Sku{} + sku.ID = v.SkuID + if err2 := dao.GetEntity(db, sku); err2 != nil { + dao.Rollback(db) + return 0, err2 + } skuBind = &model.StoreSkuBind{ StoreID: storeID, SkuID: v.SkuID, SubStoreID: v.SubStoreID, // todo 这个应该从用户信息中自动获得 + UnitPrice: unitPrice, + Price: calStoreSkuPrice(unitPrice, sku.SpecQuality, sku.SpecUnit), + Status: model.StoreSkuBindStatusDontSale, } dao.WrapAddIDCULDEntity(skuBind, userName) } @@ -225,12 +282,6 @@ func UpdateStoreSku(storeID int, skuBinds []*StoreSkuBindInfo, userName string) } } if skuBind != nil { - if v.Price != 0 { - skuBind.Price = v.Price - skuBind.JdSyncStatus |= model.SyncFlagPriceMask - skuBind.ElmSyncStatus |= model.SyncFlagPriceMask - skuBind.EbaiSyncStatus |= model.SyncFlagPriceMask - } if v.IsSale != 0 { if v.IsSale == 1 { skuBind.Status = model.StoreSkuBindStatusNormal @@ -286,3 +337,11 @@ func UpdateStoreSku(storeID int, skuBinds []*StoreSkuBindInfo, userName string) } return num, err } + +// 计算SKU价格,unitPrice为一斤的单价,specQuality为质量,单位为克 +func calStoreSkuPrice(unitPrice int, specQuality float32, specUnit string) int { + if strings.ToLower(specUnit) == "kg" { + specQuality *= 1000 + } + return int(math.Round(float64(float32(unitPrice) * specQuality / 500))) +} diff --git a/business/model/store_sku.go b/business/model/store_sku.go index be93edadd..5bc1ae9c0 100644 --- a/business/model/store_sku.go +++ b/business/model/store_sku.go @@ -32,6 +32,7 @@ type StoreSkuBind struct { SkuID int `orm:"column(sku_id)"` SubStoreID int `orm:"column(sub_store_id)"` Price int // 单位为分,不用int64的原因是这里不需要累加 + UnitPrice int // 这个是一斤的门店商品价,放在这里的原因是避免额外增加一张store sku_name表,逻辑上要保证同一SKU NAME中的所有SKU这个字段的数据一致 Status int ElmID int64 `orm:"column(elm_id);index"` diff --git a/business/partner/purchase/jd/store_sku.go b/business/partner/purchase/jd/store_sku.go index ad9c04f7a..f65fb4a13 100644 --- a/business/partner/purchase/jd/store_sku.go +++ b/business/partner/purchase/jd/store_sku.go @@ -37,13 +37,13 @@ func (p *PurchaseHandler) SyncStoreSku(storeID int, skuIDs []int, isForce bool, for _, v := range batchItemList { storeSku := v.(*model.StoreSkuBind) if storeSku.JdSyncStatus&model.SyncFlagChangedMask != 0 { - if storeSku.JdSyncStatus&model.SyncFlagPriceMask != 0 || isForce { + if storeSku.JdSyncStatus&(model.SyncFlagPriceMask|model.SyncFlagNewMask) != 0 || isForce { skuPriceInfoList = append(skuPriceInfoList, &jdapi.SkuPriceInfo{ OutSkuId: utils.Int2Str(storeSku.SkuID), Price: storeSku.Price, }) } - if storeSku.JdSyncStatus&model.SyncFlagSaleMask != 0 || isForce { + if storeSku.JdSyncStatus&(model.SyncFlagSaleMask|model.SyncFlagNewMask) != 0 || isForce { vendibility := &jdapi.StockVendibility{ OutSkuId: utils.Int2Str(storeSku.SkuID), DoSale: true, diff --git a/controllers/cms_store_sku.go b/controllers/cms_store_sku.go index 9f322b807..ca8dde949 100644 --- a/controllers/cms_store_sku.go +++ b/controllers/cms_store_sku.go @@ -47,9 +47,9 @@ func (c *StoreSkuController) GetStoreSkus() { // @router /UpdateStoreSku [put] func (c *StoreSkuController) UpdateStoreSku() { c.callUpdateStoreSku(func(params *tStoreSkuUpdateStoreSkuParams) (retVal interface{}, errCode string, err error) { - var skuBinds []*cms.StoreSkuBindInfo - if err = utils.UnmarshalUseNumber([]byte(params.Payload), &skuBinds); err == nil { - retVal, err = cms.UpdateStoreSku(params.StoreID, skuBinds, GetUserNameFromToken(params.Token)) + var skuBindInfo cms.StoreSkuBindInfo + if err = utils.UnmarshalUseNumber([]byte(params.Payload), &skuBindInfo); err == nil { + retVal, err = cms.UpdateStoreSku(params.StoreID, &skuBindInfo, GetUserNameFromToken(params.Token)) } return retVal, "", err })