diff --git a/business/jxstore/cms/store_sku.go b/business/jxstore/cms/store_sku.go index fb8102425..d19fdfdfb 100644 --- a/business/jxstore/cms/store_sku.go +++ b/business/jxstore/cms/store_sku.go @@ -6,6 +6,7 @@ import ( "strings" "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" ) @@ -214,133 +215,135 @@ func GetStoreSkus(storeID int, isFocused bool, keyword string, params map[string } func UpdateStoreSku(storeID int, skuBindInfo *StoreSkuBindInfo, userName string) (num int64, err error) { + return UpdateStoreSkus(storeID, []*StoreSkuBindInfo{skuBindInfo}, userName) +} + +func UpdateStoreSkus(storeID int, skuBindInfos []*StoreSkuBindInfo, userName string) (num int64, err error) { db := dao.GetDB() - skuBinds := skuBindInfo.Skus - var existBinds []*tStoreSkuBindAndSpec - addNum, delNum, updateNum := 0, 0, 0 - if err = dao.GetRows(db, &existBinds, ` + needSyncIDMap := make(map[int]int) + dao.Begin(db) + defer func() { + if r := recover(); r != nil { + dao.Rollback(db) + panic(r) + } + }() + for _, skuBindInfo := range skuBindInfos { + skuBinds := skuBindInfo.Skus + var existBinds []*tStoreSkuBindAndSpec + if err = dao.GetRows(db, &existBinds, ` 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 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 { - dao.Rollback(db) - panic(r) - } - }() - unitPrice := 0 - if skuBindInfo.UnitPrice != 0 { - unitPrice = skuBindInfo.UnitPrice - } else { - unitPrice = existBinds[0].UnitPrice - } - for _, v := range existBinds { + existBindsMap := make(map[int]*model.StoreSkuBind, len(existBinds)) + unitPrice := 0 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 - } + unitPrice = skuBindInfo.UnitPrice + } else { + unitPrice = existBinds[0].UnitPrice } - 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 { + 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 } - 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) - } - } else { - if v.IsFocus != -1 { - dao.WrapUpdateULEntity(skuBind, userName) + needSyncIDMap[v.ID] = 1 } + existBindsMap[v.SkuID] = &v.StoreSkuBind } - if skuBind != nil { - if v.IsSale != 0 { - if v.IsSale == 1 { - skuBind.Status = model.StoreSkuBindStatusNormal - } else { - skuBind.Status = model.StoreSkuBindStatusDontSale - } - skuBind.JdSyncStatus |= model.SyncFlagSaleMask - skuBind.ElmSyncStatus |= model.SyncFlagSaleMask - skuBind.EbaiSyncStatus |= model.SyncFlagSaleMask - } - if ok { - if v.IsFocus == -1 { - delNum++ - _, 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) - } else { - // todo 如果修改ebai与elm ID怎么处理呢? - if v.IsFocus == 1 { - skuBind.DeletedAt = utils.DefaultTimeValue + 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 } - updateNum++ - skuBind.JdSyncStatus |= model.SyncFlagModifiedMask - skuBind.ElmSyncStatus |= model.SyncFlagModifiedMask - skuBind.EbaiSyncStatus |= model.SyncFlagModifiedMask - _, err = dao.UpdateEntity(db, skuBind) + 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) } } else { - if v.EbaiID != 0 { - skuBind.EbaiID = v.EbaiID + if v.IsFocus != -1 { + dao.WrapUpdateULEntity(skuBind, userName) } - if v.ElmID != 0 { - skuBind.ElmID = v.ElmID + } + if skuBind != nil { + if v.IsSale != 0 { + if v.IsSale == 1 { + skuBind.Status = model.StoreSkuBindStatusNormal + } else { + skuBind.Status = model.StoreSkuBindStatusDontSale + } + skuBind.JdSyncStatus |= model.SyncFlagSaleMask + skuBind.ElmSyncStatus |= model.SyncFlagSaleMask + skuBind.EbaiSyncStatus |= model.SyncFlagSaleMask } - addNum++ - skuBind.JdSyncStatus = model.SyncFlagNewMask - skuBind.ElmSyncStatus = model.SyncFlagNewMask - skuBind.EbaiSyncStatus = model.SyncFlagNewMask - err = dao.CreateEntity(db, skuBind) + if ok { + if v.IsFocus == -1 { + _, 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) + needSyncIDMap[skuBind.ID] = 1 + } else { + // todo 如果修改ebai与elm ID怎么处理呢? + if v.IsFocus == 1 { + skuBind.DeletedAt = utils.DefaultTimeValue + } + skuBind.JdSyncStatus |= model.SyncFlagModifiedMask + skuBind.ElmSyncStatus |= model.SyncFlagModifiedMask + skuBind.EbaiSyncStatus |= model.SyncFlagModifiedMask + _, err = dao.UpdateEntity(db, skuBind) + needSyncIDMap[skuBind.ID] = 1 + } + } else { + if v.EbaiID != 0 { + skuBind.EbaiID = v.EbaiID + } + if v.ElmID != 0 { + skuBind.ElmID = v.ElmID + } + skuBind.JdSyncStatus = model.SyncFlagNewMask + skuBind.ElmSyncStatus = model.SyncFlagNewMask + skuBind.EbaiSyncStatus = model.SyncFlagNewMask + err = dao.CreateEntity(db, skuBind) + needSyncIDMap[skuBind.ID] = 1 + } + } + if err != nil { + dao.Rollback(db) + return 0, err } } - if err != nil { - dao.Rollback(db) - return 0, err - } - } - if skuBindInfo.UnitPrice != 0 { - num = int64(addNum + len(existBinds)) } else { - num = int64(addNum + delNum + updateNum) + dao.Rollback(db) + return 0, err } - dao.Commit(db) - err = CurVendorSync.SyncStoreSku(db, storeID, skuIDs, false, userName) } - return num, err + dao.Commit(db) + skuIDs := jxutils.IntMap2List(needSyncIDMap) + err = CurVendorSync.SyncStoreSku(db, storeID, skuIDs, false, userName) + return int64(len(skuIDs)), err } // 计算SKU价格,unitPrice为一斤的单价,specQuality为质量,单位为克 diff --git a/business/jxutils/jxutils_cms.go b/business/jxutils/jxutils_cms.go index 8ce18a49b..f52bfd0c1 100644 --- a/business/jxutils/jxutils_cms.go +++ b/business/jxutils/jxutils_cms.go @@ -90,3 +90,12 @@ func ConvertDistanceToLogLat(lng, lat, distance, angle float64) (newLng, newLat newLat = lat + (distance*math.Cos(angle*math.Pi/180))/oneDu //将距离转换成纬度的计算公式 return newLng, newLat } + +func IntMap2List(intMap map[int]int) []int { + retVal := make([]int, len(intMap)) + index := 0 + for k := range intMap { + retVal[index] = k + } + return retVal +}