diff --git a/business/jxstore/cms/sku.go b/business/jxstore/cms/sku.go index 4609fac23..fa1a9d17b 100644 --- a/business/jxstore/cms/sku.go +++ b/business/jxstore/cms/sku.go @@ -813,7 +813,10 @@ func UpdateSku(ctx *jxcontext.Context, skuID int, payload map[string]interface{} // globals.SugarLogger.Debug(utils.Format4Output(valid, false)) dao.Begin(db) defer func() { - dao.Rollback(db) + if r := recover(); r != nil { + dao.Rollback(db) + panic(r) + } }() maskValue := model.SyncFlagModifiedMask if valid["specQuality"] != nil || valid["specUnit"] != nil { @@ -827,21 +830,57 @@ func UpdateSku(ctx *jxcontext.Context, skuID int, payload map[string]interface{} SET t1.spec_quality = t2.spec_quality, t1.spec_unit = t2.spec_unit WHERE t1.deleted_at = ? AND t2.id = ? AND t1.unit <> ? - `, utils.DefaultTimeValue, skuID, model.SpecialUnit); err != nil { - return 0, err - } - if _, err = SetStoreSkuSyncStatus2(db, nil, CurVendorSync.SingleStoreVendorIDs, []int{skuID}, model.SyncFlagModifiedMask); err == nil { - dao.Commit(db) - _, err = CurVendorSync.SyncSku(ctx, db, -1, sku.ID, false, false, userName) + `, utils.DefaultTimeValue, skuID, model.SpecialUnit); err == nil { + if _, err = SetStoreSkuSyncStatus2(db, nil, CurVendorSync.SingleStoreVendorIDs, []int{skuID}, model.SyncFlagModifiedMask); err == nil { + if maskValue&model.SyncFlagSpecMask != 0 { + err = refreshStoreSkuPrice(ctx, db, skuID) + } + } } } else { err = ErrEntityNotExist } } + if err == nil { + dao.Commit(db) + _, err = CurVendorSync.SyncSku(ctx, db, -1, sku.ID, false, false, userName) + } else { + dao.Rollback(db) + } } return num, err } +func refreshStoreSkuPrice(ctx *jxcontext.Context, db *dao.DaoDB, skuID int) (err error) { + dao.Begin(db) + defer func() { + if r := recover(); r != nil || err != nil { + dao.Rollback(db) + if r != nil { + panic(r) + } + } + }() + for vendorID := range partner.PurchasePlatformHandlers { + storeSkuList, err := dao.GetStoreSkus2(db, vendorID, 0, []int{skuID}, false) + if err == nil { + for _, v := range storeSkuList { + v.Price = int64(jxutils.CaculateSkuPrice(int(v.UnitPrice), v.SpecQuality, v.SpecUnit, v.Unit)) + storeSku := &model.StoreSkuBind{} + storeSku.ID = v.BindID + if _, err = dao.UpdateEntityLogically(db, storeSku, map[string]interface{}{ + "Price": v.Price, + dao.GetSyncStatusStructField(model.VendorNames[vendorID]): v.StoreSkuSyncStatus | model.SyncFlagPriceMask, + }, ctx.GetUserName(), nil); err != nil { + return err + } + } + } + } + dao.Commit(db) + return err +} + func DeleteSku(ctx *jxcontext.Context, skuID int, userName string) (num int64, err error) { db := dao.GetDB() dao.Begin(db) diff --git a/business/model/dao/store_sku.go b/business/model/dao/store_sku.go index c513b9481..66923c9d4 100644 --- a/business/model/dao/store_sku.go +++ b/business/model/dao/store_sku.go @@ -171,6 +171,9 @@ func GetStoreCategories(db *DaoDB, vendorID, storeID int, level int) (cats []*Sk // 以store_sku_bind为基础来做同步,正常情况下使用 // 单多门店模式厂商通用 func GetStoreSkus2(db *DaoDB, vendorID, storeID int, skuIDs []int, isDirty bool) (skus []*StoreSkuSyncInfo, err error) { + if vendorID < 0 { + panic("vendorID<0") + } isSingleStorePF := model.MultiStoresVendorMap[vendorID] != 1 tableName := "t1" if !isSingleStorePF { @@ -226,8 +229,11 @@ func GetStoreSkus2(db *DaoDB, vendorID, storeID int, skuIDs []int, isDirty bool) LEFT JOIN store_sku_category_map t5sku ON t2.category_id = t5sku.category_id AND t5sku.store_id = t1.store_id AND t5sku.deleted_at = ?` sqlParams = append(sqlParams, utils.DefaultTimeValue, utils.DefaultTimeValue) } - sql += " WHERE t1.store_id = ?" - sqlParams = append(sqlParams, storeID) + sql += " WHERE 1 = 1" + if storeID > 0 { + sql += " AND t1.store_id = ?" + sqlParams = append(sqlParams, storeID) + } if isDirty { sql += " AND (t1.%s_sync_status <> 0 OR (%s.%s_id <> 0 AND t3.id IS NULL))" fmtParams = append(fmtParams, fieldPrefix, tableName, fieldPrefix)