From 5cecffc5012fddd1f26e9e17a4fb56ce101dff86 Mon Sep 17 00:00:00 2001 From: gazebo Date: Wed, 4 Dec 2019 18:17:44 +0800 Subject: [PATCH] +ConstrainPayPercentage --- business/jxstore/cms/store_sku.go | 315 +++++++++++++++--------------- business/jxutils/jxutils_cms.go | 7 + controllers/cms_store_sku.go | 9 +- 3 files changed, 177 insertions(+), 154 deletions(-) diff --git a/business/jxstore/cms/store_sku.go b/business/jxstore/cms/store_sku.go index 7f36dda0e..477d82c58 100644 --- a/business/jxstore/cms/store_sku.go +++ b/business/jxstore/cms/store_sku.go @@ -15,6 +15,7 @@ import ( "git.rosy.net.cn/jx-callback/business/partner" "git.rosy.net.cn/baseapi/utils" + "git.rosy.net.cn/baseapi/utils/errlist" "git.rosy.net.cn/jx-callback/business/auth2/authprovider/weixin" "git.rosy.net.cn/jx-callback/business/jxutils" "git.rosy.net.cn/jx-callback/business/jxutils/jxcontext" @@ -959,9 +960,7 @@ func updateStoresSkusWithoutSync(ctx *jxcontext.Context, db *dao.DaoDB, storeIDs } scaleFactor := float64(1) if isScale { - if storeDetail.PayPercentage > 0 { - scaleFactor = float64(storeDetail.PayPercentage) / 100 - } + scaleFactor = float64(jxutils.ConstrainPayPercentage(storeDetail.PayPercentage) / 100) } for _, skuBindInfo := range skuBindInfos { // 关注且没有给价时,需要尝试从store_sku_bind中得到已有的单价 @@ -1270,7 +1269,7 @@ func UpdateStoresSkusSale(ctx *jxcontext.Context, storeIDs []int, skuBindSkuInfo return hint, err } -func CopyStoreSkus(ctx *jxcontext.Context, fromStoreID, toStoreID int, copyMode string, isScale bool, params map[string]interface{}, userName string) (num int64, err error) { +func CopyStoreSkus(ctx *jxcontext.Context, fromStoreID int, toStoreIDs []int, copyMode string, isScale bool, params map[string]interface{}, userName string) (num int64, err error) { if copyMode != CopyStoreSkuModeFresh && copyMode != CopyStoreSkuModeUpdate && copyMode != CopyStoreSkuModeUpdatePrice { return 0, fmt.Errorf("不支持的拷贝模式:%s", copyMode) } @@ -1280,11 +1279,6 @@ func CopyStoreSkus(ctx *jxcontext.Context, fromStoreID, toStoreID int, copyMode if err != nil { return 0, err } - toStore, err := checkStoreExisting(db, toStoreID) - if err != nil { - return 0, err - } - sqlCatAndSku := "" sqlCatAndSkuParams := make([]interface{}, 0) if params["categoryIDs"] != nil { @@ -1311,10 +1305,16 @@ func CopyStoreSkus(ctx *jxcontext.Context, fromStoreID, toStoreID int, copyMode if params["pricePercentage"] != nil { pricePercentage = params["pricePercentage"].(int) } - - now := time.Now() - if fromStoreID == toStoreID { - sql := ` + errList := errlist.New() + for _, toStoreID := range toStoreIDs { + toStore, err := checkStoreExisting(db, toStoreID) + if err != nil { + errList.AddErr(err) + break + } + now := time.Now() + if fromStoreID == toStoreID { + sql := ` UPDATE store_sku_bind t1 JOIN sku t2 ON t1.sku_id = t2.id AND t2.deleted_at = ? JOIN sku_name t3 ON t2.name_id = t3.id AND t2.deleted_at = ? @@ -1329,36 +1329,41 @@ func CopyStoreSkus(ctx *jxcontext.Context, fromStoreID, toStoreID int, copyMode t1.ebai_sync_status = t1.ebai_sync_status | ? WHERE t1.store_id = ? AND t1.deleted_at = ? ` - sqlParams := []interface{}{ - utils.DefaultTimeValue, - utils.DefaultTimeValue, - utils.DefaultTimeValue, - userName, - now, - pricePercentage, - pricePercentage, - pricePercentage, - model.SyncFlagPriceMask, - model.SyncFlagPriceMask, - model.SyncFlagPriceMask, - toStoreID, - utils.DefaultTimeValue, + sqlParams := []interface{}{ + utils.DefaultTimeValue, + utils.DefaultTimeValue, + utils.DefaultTimeValue, + userName, + now, + pricePercentage, + pricePercentage, + pricePercentage, + model.SyncFlagPriceMask, + model.SyncFlagPriceMask, + model.SyncFlagPriceMask, + toStoreID, + utils.DefaultTimeValue, + } + sql += sqlCatAndSku + sqlParams = append(sqlParams, sqlCatAndSkuParams) + num2, err2 := dao.ExecuteSQL(db, sql, sqlParams) + if err2 != nil { + errList.AddErr(err2) + } else { + num += num2 + } + break } - sql += sqlCatAndSku - sqlParams = append(sqlParams, sqlCatAndSkuParams) - num, err = dao.ExecuteSQL(db, sql, sqlParams) - return num, err - } - dao.Begin(db) - defer func() { - dao.Rollback(db) - if r := recover(); r != nil { - panic(r) - } - }() - if copyMode == CopyStoreSkuModeFresh { - // 将toStore中存在,但fromStore中不存在的置删除标志 - sqlDelete := ` + dao.Begin(db) + defer func() { + if r := recover(); r != nil { + dao.Rollback(db) + panic(r) + } + }() + if copyMode == CopyStoreSkuModeFresh { + // 将toStore中存在,但fromStore中不存在的置删除标志 + sqlDelete := ` UPDATE store_sku_bind t1 LEFT JOIN store_sku_bind t0 ON t0.store_id = ? AND t0.sku_id = t1.sku_id AND t0.deleted_at = ? JOIN sku t2 ON t1.sku_id = t2.id/* AND t2.deleted_at = ?*/ @@ -1374,53 +1379,51 @@ func CopyStoreSkus(ctx *jxcontext.Context, fromStoreID, toStoreID int, copyMode t1.ebai_sync_status = IF((t1.ebai_sync_status & ?) <> 0, 0, ?) WHERE t1.store_id = ? AND t1.deleted_at = ? AND t0.id IS NULL ` - sqlDeleteParams := []interface{}{ - fromStoreID, - utils.DefaultTimeValue, - // utils.DefaultTimeValue, - // utils.DefaultTimeValue, - utils.DefaultTimeValue, - now, - now, - userName, - model.StoreSkuBindStatusDeleted, - model.SyncFlagNewMask, - model.SyncFlagDeletedMask, - model.SyncFlagNewMask, - model.SyncFlagDeletedMask, - model.SyncFlagNewMask, - model.SyncFlagDeletedMask, - toStoreID, - utils.DefaultTimeValue, + sqlDeleteParams := []interface{}{ + fromStoreID, + utils.DefaultTimeValue, + // utils.DefaultTimeValue, + // utils.DefaultTimeValue, + utils.DefaultTimeValue, + now, + now, + userName, + model.StoreSkuBindStatusDeleted, + model.SyncFlagNewMask, + model.SyncFlagDeletedMask, + model.SyncFlagNewMask, + model.SyncFlagDeletedMask, + model.SyncFlagNewMask, + model.SyncFlagDeletedMask, + toStoreID, + utils.DefaultTimeValue, + } + sqlDelete += sqlCatAndSku + sqlDeleteParams = append(sqlDeleteParams, sqlCatAndSkuParams) + // globals.SugarLogger.Debug(sqlDelete) + num2, err2 := dao.ExecuteSQL(db, sqlDelete, sqlDeleteParams) + if err = err2; err != nil { + errList.AddErr(err) + dao.Rollback(db) + break + } + num += num2 + globals.SugarLogger.Debugf("CopyStoreSkus fromStoreID:%d, toStoreID:%d, trackInfo:%s num1:%d", fromStoreID, toStoreID, ctx.GetTrackInfo(), num2) } - sqlDelete += sqlCatAndSku - sqlDeleteParams = append(sqlDeleteParams, sqlCatAndSkuParams) - // globals.SugarLogger.Debug(sqlDelete) - if num, err = dao.ExecuteSQL(db, sqlDelete, sqlDeleteParams); err != nil { - return 0, err + isModifyStatus := 1 + syncStatus := model.SyncFlagStoreSkuOnlyMask + if copyMode == CopyStoreSkuModeUpdatePrice { + isModifyStatus = 0 + syncStatus = model.SyncFlagPriceMask } - globals.SugarLogger.Debugf("CopyStoreSkus trackInfo:%s num1:%d", ctx.GetTrackInfo(), num) - } - isModifyStatus := 1 - syncStatus := model.SyncFlagStoreSkuOnlyMask - if copyMode == CopyStoreSkuModeUpdatePrice { - isModifyStatus = 0 - syncStatus = model.SyncFlagPriceMask - } - scaleFactor := float64(1) - if isScale { - fromPayPercentage := fromStore.PayPercentage - if fromPayPercentage <= 0 { - fromPayPercentage = 100 + scaleFactor := float64(1) + if isScale { + fromPayPercentage := jxutils.ConstrainPayPercentage(fromStore.PayPercentage) + toPayPercentage := jxutils.ConstrainPayPercentage(toStore.PayPercentage) + scaleFactor = float64(fromPayPercentage) / float64(toPayPercentage) } - toPayPercentage := toStore.PayPercentage - if toPayPercentage <= 0 { - toPayPercentage = 100 - } - scaleFactor = float64(fromPayPercentage) / float64(toPayPercentage) - } - // 处理toStore中与fromStore中都存在的 - sql := ` + // 处理toStore中与fromStore中都存在的 + sql := ` UPDATE store_sku_bind t1 JOIN store t11 ON t11.id = t1.store_id LEFT JOIN store_sku_bind t0 ON t0.store_id = ? AND t0.sku_id = t1.sku_id AND t0.deleted_at = ? @@ -1441,41 +1444,43 @@ func CopyStoreSkus(ctx *jxcontext.Context, fromStoreID, toStoreID int, copyMode t1.ebai_sync_status = t1.ebai_sync_status | ? WHERE t1.store_id = ? AND t1.deleted_at = ? AND t0.id IS NOT NULL ` - sqlParams := []interface{}{ - fromStoreID, - utils.DefaultTimeValue, - // utils.DefaultTimeValue, - // utils.DefaultTimeValue, - utils.DefaultTimeValue, - userName, - now, - pricePercentage, - pricePercentage, - scaleFactor, - pricePercentage, - pricePercentage, - scaleFactor, - pricePercentage, - pricePercentage, - scaleFactor, - isModifyStatus, - syncStatus, - syncStatus, - syncStatus, - toStoreID, - utils.DefaultTimeValue, - } - sql += sqlCatAndSku - sqlParams = append(sqlParams, sqlCatAndSkuParams) - // globals.SugarLogger.Debug(sql) - num, err = dao.ExecuteSQL(db, sql, sqlParams) - globals.SugarLogger.Debugf("CopyStoreSkus trackInfo:%s num2:%d", ctx.GetTrackInfo(), num) - if err != nil { - return 0, err - } - - // 添加toStore中不存在,但fromStore存在的 - sql = ` + sqlParams := []interface{}{ + fromStoreID, + utils.DefaultTimeValue, + // utils.DefaultTimeValue, + // utils.DefaultTimeValue, + utils.DefaultTimeValue, + userName, + now, + pricePercentage, + pricePercentage, + scaleFactor, + pricePercentage, + pricePercentage, + scaleFactor, + pricePercentage, + pricePercentage, + scaleFactor, + isModifyStatus, + syncStatus, + syncStatus, + syncStatus, + toStoreID, + utils.DefaultTimeValue, + } + sql += sqlCatAndSku + sqlParams = append(sqlParams, sqlCatAndSkuParams) + // globals.SugarLogger.Debug(sql) + num2, err2 := dao.ExecuteSQL(db, sql, sqlParams) + globals.SugarLogger.Debugf("CopyStoreSkus fromStoreID:%d, toStoreID:%d, trackInfo:%s num2:%d", fromStoreID, toStoreID, ctx.GetTrackInfo(), num2) + if err = err2; err != nil { + errList.AddErr(err) + dao.Rollback(db) + break + } + num += num2 + // 添加toStore中不存在,但fromStore存在的 + sql = ` INSERT INTO store_sku_bind(created_at, updated_at, last_operator, deleted_at, store_id, sku_id, sub_store_id, price, jx_price, unit_price, status, jd_sync_status, ebai_sync_status, mtwm_sync_status) SELECT ?, ?, ?, ?, ?, @@ -1491,39 +1496,43 @@ func CopyStoreSkus(ctx *jxcontext.Context, fromStoreID, toStoreID int, copyMode LEFT JOIN store_sku_bind t0 ON t1.sku_id = t0.sku_id AND t0.store_id = ? AND t0.deleted_at = ? WHERE t1.store_id = ? AND t1.deleted_at = ? ` - sqlParams = []interface{}{ - now, now, userName, utils.DefaultTimeValue, toStoreID, - pricePercentage, - pricePercentage, - scaleFactor, - pricePercentage, - pricePercentage, - scaleFactor, - pricePercentage, - pricePercentage, - scaleFactor, - isModifyStatus, - model.SkuStatusDontSale, - model.SyncFlagNewMask, - model.SyncFlagNewMask, - model.SyncFlagNewMask, - utils.DefaultTimeValue, - utils.DefaultTimeValue, - utils.DefaultTimeValue, - toStoreID, - utils.DefaultTimeValue, - fromStoreID, - utils.DefaultTimeValue, + sqlParams = []interface{}{ + now, now, userName, utils.DefaultTimeValue, toStoreID, + pricePercentage, + pricePercentage, + scaleFactor, + pricePercentage, + pricePercentage, + scaleFactor, + pricePercentage, + pricePercentage, + scaleFactor, + isModifyStatus, + model.SkuStatusDontSale, + model.SyncFlagNewMask, + model.SyncFlagNewMask, + model.SyncFlagNewMask, + utils.DefaultTimeValue, + utils.DefaultTimeValue, + utils.DefaultTimeValue, + toStoreID, + utils.DefaultTimeValue, + fromStoreID, + utils.DefaultTimeValue, + } + sql += sqlCatAndSku + " AND t0.id IS NULL" + sqlParams = append(sqlParams, sqlCatAndSkuParams) + num2, err = dao.ExecuteSQL(db, sql, sqlParams) + if err != nil { + errList.AddErr(err) + dao.Rollback(db) + break + } + num += num2 + globals.SugarLogger.Debugf("CopyStoreSkus fromStoreID:%d, toStoreID:%d, trackInfo:%s num3:%d", fromStoreID, toStoreID, ctx.GetTrackInfo(), num2) + dao.Commit(db) } - sql += sqlCatAndSku + " AND t0.id IS NULL" - sqlParams = append(sqlParams, sqlCatAndSkuParams) - num, err = dao.ExecuteSQL(db, sql, sqlParams) - if err != nil { - return 0, err - } - globals.SugarLogger.Debugf("CopyStoreSkus trackInfo:%s num3:%d", ctx.GetTrackInfo(), num) - dao.Commit(db) - return num, err + return num, errList.GetErrListAsOne() } func shouldPendingStorePriceChange(ctx *jxcontext.Context, storeID int, skuBindInfo *StoreSkuBindInfo) (shouldPending bool, err error) { diff --git a/business/jxutils/jxutils_cms.go b/business/jxutils/jxutils_cms.go index 11449a847..e7d20815a 100644 --- a/business/jxutils/jxutils_cms.go +++ b/business/jxutils/jxutils_cms.go @@ -326,6 +326,13 @@ func CaculatePriceByPricePack(l model.PricePercentagePack, defPricePercentage, p return CaculateSkuVendorPrice(price, pricePercentage, priceAdd) } +func ConstrainPayPercentage(payPerCentage int) int { + if payPerCentage <= 50 { + payPerCentage = 70 + } + return payPerCentage +} + func IsSkuSpecial(specQuality float32, specUnit string) bool { return int(specQuality) == model.SpecialSpecQuality && (specUnit == model.SpecialSpecUnit || specUnit == model.SpecialSpecUnit2) } diff --git a/controllers/cms_store_sku.go b/controllers/cms_store_sku.go index 803d8f8d4..740cec50a 100644 --- a/controllers/cms_store_sku.go +++ b/controllers/cms_store_sku.go @@ -249,6 +249,7 @@ func (c *StoreSkuController) UpdateStoresSkusByBind() { // @Param token header string true "认证token" // @Param fromStoreID formData int true "源门店ID" // @Param toStoreID formData int true "目标门店ID" +// @Param toStoreIDs formData string false "目标门店ID列表" // @Param copyMode formData string true "拷贝模式,fresh:目标门店数据全部清除后拷贝,update:确保指定的源数据全部拷贝,已有的忽略" // @Param pricePercentage formData int false "价格调整百分比,缺省为100%" // @Param categoryIDs formData string false "json数据,skuName所属的类别,[1,2,3]" @@ -259,7 +260,13 @@ func (c *StoreSkuController) UpdateStoresSkusByBind() { // @router /CopyStoreSkus [post] func (c *StoreSkuController) CopyStoreSkus() { c.callCopyStoreSkus(func(params *tStoreSkuCopyStoreSkusParams) (retVal interface{}, errCode string, err error) { - retVal, err = cms.CopyStoreSkus(params.Ctx, params.FromStoreID, params.ToStoreID, params.CopyMode, params.IsScale, params.MapData, params.Ctx.GetUserName()) + var toStoreIDs []int + if err = jxutils.Strings2Objs(params.ToStoreIDs, &toStoreIDs); err == nil { + if params.ToStoreID > 0 { + toStoreIDs = append(toStoreIDs, params.ToStoreID) + } + retVal, err = cms.CopyStoreSkus(params.Ctx, params.FromStoreID, toStoreIDs, params.CopyMode, params.IsScale, params.MapData, params.Ctx.GetUserName()) + } return retVal, "", err }) }