diff --git a/business/jxstore/cms/store_sku.go b/business/jxstore/cms/store_sku.go index 5e6647f55..314fd4827 100644 --- a/business/jxstore/cms/store_sku.go +++ b/business/jxstore/cms/store_sku.go @@ -502,13 +502,23 @@ func updateStoresSkusWithoutSync(ctx *jxcontext.Context, storeIDs []int, skuBind 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 { + sql := ` + 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 = ?` + sqlParams := []interface{}{ + storeID, + utils.DefaultTimeValue, + utils.DefaultTimeValue, + skuBindInfo.NameID, + utils.DefaultTimeValue, + } + if err = dao.GetRows(db, &allBinds, sql, sqlParams...); err == nil { // globals.SugarLogger.Debug(utils.Format4Output(allBinds, false)) inSkuBinsMap := make(map[int]*StoreSkuBindSkuInfo, len(inSkuBinds)) for _, v := range inSkuBinds { @@ -904,28 +914,93 @@ func filterStorePriceChange(ctx *jxcontext.Context, storeIDs []int, skuBindInfos for _, storeID := range storeIDs { for _, skuBindInfo := range skuBindInfos { shouldPending := shouldPendingStorePriceChange(ctx, storeID, skuBindInfo) - if shouldPending { - changeReq := &model.StoreOpRequest{ - Type: model.RequestTypeChangePrice, - StoreID: storeID, - ItemID: skuBindInfo.NameID, - Status: model.RequestStatusNew, - UserID: ctx.GetUserName(), - IntParam1: skuBindInfo.UnitPrice, - IntParam2: skuBindInfo.IsSale, - } + if shouldPending && (skuBindInfo.UnitPrice != 0 || skuBindInfo.IsFocus == 1) { + var ( + opInfoList []*StoreOpRequestInfo + sql string + sqlParams []interface{} + opType int8 + ) + if skuBindInfo.IsFocus == 1 { - changeReq.Type = model.RequestTypeFocusSkuName - } - if len(skuBindInfo.Skus) > 0 { - changeReq.JsonParam = string(utils.MustMarshal(skuBindInfo.Skus)) + opType = model.RequestTypeFocusSkuName + sql = ` + SELECT DISTINCT t1.*, t3.unit_price + FROM store_op_request t1 + JOIN sku t2 ON t2.name_id = t1.item_id + LEFT JOIN store_sku_bind t3 ON t3.store_id = t1.store_id AND t3.sku_id = t2.id AND t3.deleted_at = ? + WHERE t1.store_id = ? AND t1.item_id = ? AND t1.deleted_at = ? AND t1.type IN (?, ?)` + sqlParams = []interface{}{ + utils.DefaultTimeValue, + storeID, + skuBindInfo.NameID, + utils.DefaultTimeValue, + model.RequestTypeChangePrice, + model.RequestTypeFocusSkuName, + } + } else { + opType = model.RequestTypeChangePrice + sql = ` + SELECT DISTINCT t3.*, t1.unit_price + FROM store_sku_bind t1 + JOIN sku t2 ON t2.id = t1.sku_id AND t2.name_id = ? + LEFT JOIN store_op_request t3 ON t3.store_id = t1.store_id AND t3.item_id = t2.name_id AND t3.deleted_at = ? AND t3.type IN (?, ?) + WHERE t1.store_id = ? AND t1.deleted_at = ?` + sqlParams = []interface{}{ + skuBindInfo.NameID, + utils.DefaultTimeValue, + model.RequestTypeChangePrice, + model.RequestTypeFocusSkuName, + storeID, + utils.DefaultTimeValue, + } } - dao.WrapAddIDCULDEntity(changeReq, ctx.GetUserName()) - if err = dao.CreateOrUpdate(db, changeReq); err != nil { + if err = dao.GetRows(db, &opInfoList, sql, sqlParams...); err != nil { return nil, nil, err } - + if len(opInfoList) > 1 { + panic(fmt.Sprintf("filterStorePriceChange more than one row, storeID:%d, skuBindInfo:%s, result:%s", storeID, utils.Format4Output(skuBindInfo, false), utils.Format4Output(opInfoList, false))) + } + existRow := len(opInfoList) == 1 + existRequestOp := existRow && opInfoList[0].ID != 0 + var changeReq *model.StoreOpRequest + if existRequestOp { + if opInfoList[0].Type != opType { + return nil, nil, fmt.Errorf("filterStorePriceChange,关注与修改价格只应该存在一个待审核请求,已存在的:%s,新来的,storeID:%d, skuBindInfo:%s", utils.Format4Output(opInfoList[0], false), storeID, utils.Format4Output(skuBindInfo, false)) + } + changeReq = &opInfoList[0].StoreOpRequest + } else { + changeReq = &model.StoreOpRequest{} + } + if existRequestOp && opInfoList[0].UnitPrice == skuBindInfo.UnitPrice { + changeReq.Status = model.RequestStatusCanceled + changeReq.DeletedAt = time.Now() + } else { + changeReq.Status = model.RequestStatusNew + changeReq.Type = opType + changeReq.StoreID = storeID + changeReq.ItemID = skuBindInfo.NameID + changeReq.UserID = ctx.GetUserName() + changeReq.IntParam1 = skuBindInfo.UnitPrice + changeReq.IntParam2 = skuBindInfo.IsSale + if len(skuBindInfo.Skus) > 0 { + changeReq.JsonParam = string(utils.MustMarshal(skuBindInfo.Skus)) + } + } + if existRequestOp { + dao.WrapUpdateULEntity(changeReq, ctx.GetUserName()) + if _, err = dao.UpdateEntity(db, changeReq); err != nil { + return nil, nil, err + } + } else { + if !existRow || opInfoList[0].UnitPrice != skuBindInfo.UnitPrice { + dao.WrapAddIDCULDEntity(changeReq, ctx.GetUserName()) + if err = dao.CreateEntity(db, changeReq); err != nil { + return nil, nil, err + } + } + } // 去除价格相关的部分 if skuBindInfo.IsFocus == 1 { skuBindInfo.IsFocus = 0 diff --git a/business/model/store_sku.go b/business/model/store_sku.go index 97c408c27..b051e98aa 100644 --- a/business/model/store_sku.go +++ b/business/model/store_sku.go @@ -20,6 +20,7 @@ const ( RequestStatusNew = 0 RequestStatusRejected = 1 RequestStatusAccepted = 2 + RequestStatusCanceled = 3 ) var (