From 78b542d5e0332b9344a23093b5c2b8e1702b6d15 Mon Sep 17 00:00:00 2001 From: gazebo Date: Tue, 27 Nov 2018 14:44:08 +0800 Subject: [PATCH] - UpdateStoresSkus, add IsSale to StoreSkuBindInfo --- business/jxstore/cms/store_sku.go | 237 +++++++++++++++--------------- business/model/store_sku.go | 1 + controllers/cms_store_sku.go | 10 +- 3 files changed, 128 insertions(+), 120 deletions(-) diff --git a/business/jxstore/cms/store_sku.go b/business/jxstore/cms/store_sku.go index 1dcf2a907..3c58e3350 100644 --- a/business/jxstore/cms/store_sku.go +++ b/business/jxstore/cms/store_sku.go @@ -48,6 +48,7 @@ type StoreSkuBindInfo struct { NameID int `json:"nameID"` UnitPrice int `json:"unitPrice"` // 对于是份的SKU就是单价(每斤价格),其它则为总价 IsFocus int `json:"isFocus"` // -1:不关注,0:忽略,1:关注 + IsSale int `json:"isSale"` // -1:不可售,0:忽略,1:可售 SubStoreID int `json:"subStoreID"` Skus []*StoreSkuBindSkuInfo `json:"skus"` } @@ -234,13 +235,14 @@ func GetStoreSkus(ctx *jxcontext.Context, storeID int, isFocus bool, keyword str return skuNamesInfo, err } -func UpdateStoreSku(ctx *jxcontext.Context, storeID int, skuBindInfo *StoreSkuBindInfo, userName string) (num int64, err error) { - return UpdateStoreSkus(ctx, storeID, []*StoreSkuBindInfo{skuBindInfo}, userName) +func UpdateStoreSku(ctx *jxcontext.Context, storeID int, skuBindInfo *StoreSkuBindInfo) (num int64, err error) { + return UpdateStoreSkus(ctx, storeID, []*StoreSkuBindInfo{skuBindInfo}) } -func UpdateStoreSkus(ctx *jxcontext.Context, storeID int, skuBindInfos []*StoreSkuBindInfo, userName string) (num int64, err error) { - skuIDs, err := updateStoreSkusWithoutSync(ctx, storeID, skuBindInfos, userName) - if err == nil { +func UpdateStoreSkus(ctx *jxcontext.Context, storeID int, skuBindInfos []*StoreSkuBindInfo) (num int64, err error) { + skuIDs, err := updateStoresSkusWithoutSync(ctx, []int{storeID}, skuBindInfos) + num = int64(len(skuIDs)) + if err == nil && num > 0 { db := dao.GetDB() _, err = CurVendorSync.SyncStoresSkus(ctx, db, nil, []int{storeID}, skuIDs, false, false) return int64(len(skuIDs)), err @@ -248,8 +250,19 @@ func UpdateStoreSkus(ctx *jxcontext.Context, storeID int, skuBindInfos []*StoreS return 0, err } -func updateStoreSkusWithoutSync(ctx *jxcontext.Context, storeID int, skuBindInfos []*StoreSkuBindInfo, userName string) (needSyncSkus []int, err error) { +func UpdateStoresSkus(ctx *jxcontext.Context, storeIDs []int, skuBindInfos []*StoreSkuBindInfo) (num int64, err error) { + skuIDs, err := updateStoresSkusWithoutSync(ctx, storeIDs, skuBindInfos) + num = int64(len(skuIDs)) + if num > 0 { + db := dao.GetDB() + _, err = CurVendorSync.SyncStoresSkus(ctx, db, nil, storeIDs, skuIDs, false, false) + } + return num, err +} + +func updateStoresSkusWithoutSync(ctx *jxcontext.Context, storeIDs []int, skuBindInfos []*StoreSkuBindInfo) (needSyncSkus []int, err error) { db := dao.GetDB() + userName := ctx.GetUserName() needSyncIDMap := make(map[int]int) dao.Begin(db) defer func() { @@ -258,117 +271,115 @@ func updateStoreSkusWithoutSync(ctx *jxcontext.Context, storeID int, skuBindInfo panic(r) } }() - for _, skuBindInfo := range skuBindInfos { - inSkuBinds := skuBindInfo.Skus - var allBinds []*tStoreSkuBindAndSpec - if err = dao.GetRows(db, &allBinds, ` + for _, storeID := range storeIDs { + for _, skuBindInfo := range skuBindInfos { + inSkuBinds := skuBindInfo.Skus + var allBinds []*tStoreSkuBindAndSpec + if err = dao.GetRows(db, &allBinds, ` SELECT t2.*, t1.id real_sku_id, t1.spec_quality, t1.spec_unit, t3.price sku_name_price, t3.unit sku_name_unit FROM sku t1 LEFT JOIN store_sku_bind t2 ON t2.sku_id = t1.id AND store_id = ? AND t2.deleted_at = ? JOIN sku_name t3 ON t1.name_id = t3.id AND t3.deleted_at = ? WHERE t1.name_id = ? AND t1.deleted_at = ? `, storeID, utils.DefaultTimeValue, utils.DefaultTimeValue, skuBindInfo.NameID, utils.DefaultTimeValue); err == nil { - globals.SugarLogger.Debug(utils.Format4Output(allBinds, false)) - inSkuBinsMap := make(map[int]*StoreSkuBindSkuInfo, len(inSkuBinds)) - for _, v := range inSkuBinds { - inSkuBinsMap[v.SkuID] = v - } - unitPrice := 0 - if skuBindInfo.UnitPrice != 0 { - unitPrice = skuBindInfo.UnitPrice - } else { - unitPrice = allBinds[0].UnitPrice - if unitPrice == 0 { - unitPrice = allBinds[0].SkuNamePrice + globals.SugarLogger.Debug(utils.Format4Output(allBinds, false)) + inSkuBinsMap := make(map[int]*StoreSkuBindSkuInfo, len(inSkuBinds)) + for _, v := range inSkuBinds { + inSkuBinsMap[v.SkuID] = v } - } - for _, v := range allBinds { - var num int64 - inSkuBind := inSkuBinsMap[v.RealSkuID] - // globals.SugarLogger.Debug(utils.Format4Output(inSkuBind, false)) - var skuBind *model.StoreSkuBind - if v.ID == 0 { - if skuBindInfo.IsFocus == 1 { - skuBind = &model.StoreSkuBind{ - StoreID: storeID, - SkuID: v.RealSkuID, - SubStoreID: skuBindInfo.SubStoreID, // todo 这个应该从用户信息中自动获得 - UnitPrice: unitPrice, - Price: jxutils.CaculateSkuPrice(unitPrice, v.SpecQuality, v.SpecUnit, v.SkuNameUnit), - Status: model.StoreSkuBindStatusDontSale, // 缺省不可售? - } - if inSkuBind != nil && inSkuBind.IsSale == 1 { - skuBind.Status = model.StoreSkuBindStatusNormal - } - setStoreSkuBindStatus(skuBind, model.SyncFlagNewMask) - dao.WrapAddIDCULDEntity(skuBind, userName) - globals.SugarLogger.Debug(utils.Format4Output(skuBind, false)) - if err = dao.CreateEntity(db, skuBind); err != nil { - dao.Rollback(db) - return nil, err - } - num = 1 - } + unitPrice := 0 + if skuBindInfo.UnitPrice != 0 { + unitPrice = skuBindInfo.UnitPrice } else { - skuBind = &v.StoreSkuBind - - if skuBindInfo.IsFocus == -1 { - if num, err = dao.DeleteEntityLogically(db, skuBind, map[string]interface{}{ - model.FieldStatus: model.StoreSkuBindStatusDeleted, - model.FieldJdSyncStatus: model.SyncFlagDeletedMask, - model.FieldElmSyncStatus: model.SyncFlagDeletedMask, - model.FieldEbaiSyncStatus: model.SyncFlagDeletedMask, - }, userName, nil); err != nil { - dao.Rollback(db) - return nil, err - } - } else { - needUpdate := false + unitPrice = allBinds[0].UnitPrice + if unitPrice == 0 { + unitPrice = allBinds[0].SkuNamePrice + } + } + for _, v := range allBinds { + var num int64 + inSkuBind := inSkuBinsMap[v.RealSkuID] + // globals.SugarLogger.Debug(utils.Format4Output(inSkuBind, false)) + var skuBind *model.StoreSkuBind + if v.ID == 0 { if skuBindInfo.IsFocus == 1 { - skuBind.Status = model.StoreSkuBindStatusDontSale // 缺省不可售? - skuBind.DeletedAt = utils.DefaultTimeValue - needUpdate = true - } - if inSkuBind != nil && inSkuBind.IsSale != 0 { - if inSkuBind.IsSale == 1 { - skuBind.Status = model.StoreSkuBindStatusNormal - } else { - skuBind.Status = model.StoreSkuBindStatusDontSale + skuBind = &model.StoreSkuBind{ + StoreID: storeID, + SkuID: v.RealSkuID, + SubStoreID: skuBindInfo.SubStoreID, // todo 这个应该从用户信息中自动获得 + UnitPrice: unitPrice, + Price: jxutils.CaculateSkuPrice(unitPrice, v.SpecQuality, v.SpecUnit, v.SkuNameUnit), + Status: model.StoreSkuBindStatusDontSale, // 缺省不可售? } - setStoreSkuBindStatus(skuBind, model.SyncFlagSaleMask) - needUpdate = true - } - if skuBindInfo.UnitPrice != 0 { // 这里是否需要加此条件限制 - skuBind.UnitPrice = unitPrice - skuBind.Price = jxutils.CaculateSkuPrice(unitPrice, v.SpecQuality, v.SpecUnit, v.SkuNameUnit) - setStoreSkuBindStatus(skuBind, model.SyncFlagPriceMask) - needUpdate = true - } - if inSkuBind != nil && inSkuBind.EbaiID != 0 { - skuBind.EbaiID = inSkuBind.EbaiID - needUpdate = true - } - if inSkuBind != nil && inSkuBind.ElmID != 0 { - skuBind.ElmID = inSkuBind.ElmID - needUpdate = true - } - if needUpdate { - setStoreSkuBindStatus(skuBind, model.SyncFlagModifiedMask) - dao.WrapUpdateULEntity(skuBind, userName) - if num, err = dao.UpdateEntity(db, skuBind); err != nil { + if tmpStatus := getSkuSaleStatus(inSkuBind, skuBindInfo); tmpStatus != model.StoreSkuBindStatusNA { + skuBind.Status = tmpStatus + } + setStoreSkuBindStatus(skuBind, model.SyncFlagNewMask) + dao.WrapAddIDCULDEntity(skuBind, userName) + globals.SugarLogger.Debug(utils.Format4Output(skuBind, false)) + if err = dao.CreateEntity(db, skuBind); err != nil { dao.Rollback(db) return nil, err } + num = 1 + } + } else { + skuBind = &v.StoreSkuBind + + if skuBindInfo.IsFocus == -1 { + if num, err = dao.DeleteEntityLogically(db, skuBind, map[string]interface{}{ + model.FieldStatus: model.StoreSkuBindStatusDeleted, + model.FieldJdSyncStatus: model.SyncFlagDeletedMask, + model.FieldElmSyncStatus: model.SyncFlagDeletedMask, + model.FieldEbaiSyncStatus: model.SyncFlagDeletedMask, + }, userName, nil); err != nil { + dao.Rollback(db) + return nil, err + } + } else { + needUpdate := false + if skuBindInfo.IsFocus == 1 { + skuBind.Status = model.StoreSkuBindStatusDontSale // 缺省不可售? + skuBind.DeletedAt = utils.DefaultTimeValue + needUpdate = true + } + if tmpStatus := getSkuSaleStatus(inSkuBind, skuBindInfo); tmpStatus != model.StoreSkuBindStatusNA { + skuBind.Status = tmpStatus + setStoreSkuBindStatus(skuBind, model.SyncFlagSaleMask) + needUpdate = true + } + if skuBindInfo.UnitPrice != 0 { // 这里是否需要加此条件限制 + skuBind.UnitPrice = unitPrice + skuBind.Price = jxutils.CaculateSkuPrice(unitPrice, v.SpecQuality, v.SpecUnit, v.SkuNameUnit) + setStoreSkuBindStatus(skuBind, model.SyncFlagPriceMask) + needUpdate = true + } + if inSkuBind != nil && inSkuBind.EbaiID != 0 { + skuBind.EbaiID = inSkuBind.EbaiID + needUpdate = true + } + if inSkuBind != nil && inSkuBind.ElmID != 0 { + skuBind.ElmID = inSkuBind.ElmID + needUpdate = true + } + if needUpdate { + setStoreSkuBindStatus(skuBind, model.SyncFlagModifiedMask) + dao.WrapUpdateULEntity(skuBind, userName) + if num, err = dao.UpdateEntity(db, skuBind); err != nil { + dao.Rollback(db) + return nil, err + } + } } } + if skuBind != nil && num == 1 { + needSyncIDMap[skuBind.SkuID] = 1 + } } - if skuBind != nil && num == 1 { - needSyncIDMap[skuBind.SkuID] = 1 - } + } else { + dao.Rollback(db) + return nil, err } - } else { - dao.Rollback(db) - return nil, err } } dao.Commit(db) @@ -376,23 +387,19 @@ func updateStoreSkusWithoutSync(ctx *jxcontext.Context, storeID int, skuBindInfo return skuIDs, err } -func UpdateStoresSkus(ctx *jxcontext.Context, storeIDs []int, skuBindInfos []*StoreSkuBindInfo, userName string) (num int64, err error) { - for _, storeID := range storeIDs { - skuIDs, err2 := updateStoreSkusWithoutSync(ctx, storeID, skuBindInfos, userName) - if err = err2; err != nil { - return 0, err - } - num += int64(len(skuIDs)) +func getSkuSaleStatus(inSkuBind *StoreSkuBindSkuInfo, skuBindInfo *StoreSkuBindInfo) int { + tempSale := 0 + if inSkuBind != nil { + tempSale = inSkuBind.IsSale + } else { + tempSale = skuBindInfo.IsSale } - skuIDs := make([]int, 0) - for _, v := range skuBindInfos { - for _, v2 := range v.Skus { - skuIDs = append(skuIDs, v2.SkuID) - } + if tempSale == -1 { + return model.StoreSkuBindStatusDontSale + } else if tempSale == 1 { + return model.StoreSkuBindStatusNormal } - db := dao.GetDB() - _, err = CurVendorSync.SyncStoresSkus(ctx, db, nil, storeIDs, skuIDs, false, false) - return num, err + return model.StoreSkuBindStatusNA } func updateStoreSkusSaleWithoutSync(ctx *jxcontext.Context, storeID int, skuBindSkuInfos []*StoreSkuBindSkuInfo, userName string) (needSyncSkus []int, err error) { diff --git a/business/model/store_sku.go b/business/model/store_sku.go index f1fc44350..f13d62d51 100644 --- a/business/model/store_sku.go +++ b/business/model/store_sku.go @@ -1,6 +1,7 @@ package model const ( + StoreSkuBindStatusNA = -2 StoreSkuBindStatusDeleted = -1 StoreSkuBindStatusDontSale = 0 StoreSkuBindStatusNormal = 1 diff --git a/controllers/cms_store_sku.go b/controllers/cms_store_sku.go index a972fe8e7..1e1105517 100644 --- a/controllers/cms_store_sku.go +++ b/controllers/cms_store_sku.go @@ -41,7 +41,7 @@ func (c *StoreSkuController) GetStoreSkus() { // @Title 修改商家商品绑定 // @Description 修改商家商品绑定 // @Param token header string true "认证token" -// @Param storeID formData int true "需要修改的商品名ID,payload中的相应数据会被忽略" +// @Param storeID formData int true 门店ID" // @Param payload formData string true "json数据,StoreSkuBindInfo对象" // @Success 200 {object} controllers.CallResult // @Failure 200 {object} controllers.CallResult @@ -50,7 +50,7 @@ func (c *StoreSkuController) UpdateStoreSku() { c.callUpdateStoreSku(func(params *tStoreSkuUpdateStoreSkuParams) (retVal interface{}, errCode string, err error) { var skuBindInfo cms.StoreSkuBindInfo if err = utils.UnmarshalUseNumber([]byte(params.Payload), &skuBindInfo); err == nil { - retVal, err = cms.UpdateStoreSku(params.Ctx, params.StoreID, &skuBindInfo, params.Ctx.GetUserName()) + retVal, err = cms.UpdateStoreSku(params.Ctx, params.StoreID, &skuBindInfo) } return retVal, "", err }) @@ -59,7 +59,7 @@ func (c *StoreSkuController) UpdateStoreSku() { // @Title 批量修改商家商品绑定 // @Description 批量修改商家商品绑定 // @Param token header string true "认证token" -// @Param storeID formData int true "需要修改的商品名ID,payload中的相应数据会被忽略" +// @Param storeID formData int true "门店ID" // @Param payload formData string true "json数据,StoreSkuBindInfo对象数组" // @Success 200 {object} controllers.CallResult // @Failure 200 {object} controllers.CallResult @@ -68,7 +68,7 @@ func (c *StoreSkuController) UpdateStoreSkus() { c.callUpdateStoreSkus(func(params *tStoreSkuUpdateStoreSkusParams) (retVal interface{}, errCode string, err error) { var skuBindInfos []*cms.StoreSkuBindInfo if err = utils.UnmarshalUseNumber([]byte(params.Payload), &skuBindInfos); err == nil { - retVal, err = cms.UpdateStoreSkus(params.Ctx, params.StoreID, skuBindInfos, params.Ctx.GetUserName()) + retVal, err = cms.UpdateStoreSkus(params.Ctx, params.StoreID, skuBindInfos) } return retVal, "", err }) @@ -121,7 +121,7 @@ func (c *StoreSkuController) UpdateStoresSkus() { var skuBindInfos []*cms.StoreSkuBindInfo if err = utils.UnmarshalUseNumber([]byte(params.StoreIDs), &storeIDs); err == nil { if err = utils.UnmarshalUseNumber([]byte(params.Payload), &skuBindInfos); err == nil { - retVal, err = cms.UpdateStoresSkus(params.Ctx, storeIDs, skuBindInfos, params.Ctx.GetUserName()) + retVal, err = cms.UpdateStoresSkus(params.Ctx, storeIDs, skuBindInfos) } } return retVal, "", err