From b31adda4d5c5fe336c0cc68aa30e130b2417c993 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8B=8F=E5=B0=B9=E5=B2=9A?= <770236076@qq.com> Date: Mon, 18 Nov 2019 09:37:52 +0800 Subject: [PATCH] =?UTF-8?q?=E5=95=86=E5=93=81=E5=8F=AF=E5=94=AE=E6=97=B6?= =?UTF-8?q?=E9=97=B4=E8=AE=BE=E7=BD=AE=E6=A0=A1=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/jxstore/cms/store.go | 17 ++++++++++++++++- business/jxstore/cms/store_sku.go | 11 +++-------- business/jxstore/cms/validation.go | 15 +++++++++++++++ business/model/store.go | 16 ++++++++-------- globals/refutil/refutil.go | 2 ++ 5 files changed, 44 insertions(+), 17 deletions(-) diff --git a/business/jxstore/cms/store.go b/business/jxstore/cms/store.go index 1bdc89d63..44205af0a 100644 --- a/business/jxstore/cms/store.go +++ b/business/jxstore/cms/store.go @@ -617,7 +617,6 @@ func UpdateStore(ctx *jxcontext.Context, storeID int, payload map[string]interfa if err = dao.GetEntity(db, store); err != nil { return 0, err } - valid := dao.StrictMakeMapByStructObject(payload, store, userName) if err = checkStoreDeliveryRange(utils.Interface2String(valid["deliveryRange"])); err != nil { return 0, err @@ -733,6 +732,22 @@ func UpdateStore(ctx *jxcontext.Context, storeID int, payload map[string]interfa if valid["deliveryRange"] != nil { valid["deliveryRange"] = strings.Trim(valid["deliveryRange"].(string), ";") } + + //时间校验 + if store.OpenTime1 != 0 && store.CloseTime1 != 0 { + if err := ValidateStructPartial(store, "OpenTime1", "CloseTime1"); err != nil { + return 0, errors.New(fmt.Sprintf("门店营业时间1设置不合法!时间范围1 :[%v] 至 [%v]", store.OpenTime1, store.CloseTime1)) + } + } + if store.OpenTime2 != 0 && store.CloseTime2 != 0 { + if err := ValidateStructPartial(store, "OpenTime2", "CloseTime2"); err != nil { + return 0, errors.New(fmt.Sprintf("门店营业时间2设置不合法!时间范围2 :[%v] 至 [%v]", store.OpenTime2, store.CloseTime2)) + } + } + if beginAt, endAt := GetTimeMixByInt(store.OpenTime1, store.CloseTime1, store.OpenTime2, store.CloseTime2); beginAt != 0 && endAt != 0 { + return 0, errors.New(fmt.Sprintf("两段门店营业时间不可交叉!时间范围1 :[%v] 至 [%v], 时间范围2 :[%v] 至 [%v]", store.OpenTime1, store.CloseTime1, store.OpenTime2, store.CloseTime2)) + } + // districtCode := 0 // if valid["districtCode"] != nil { // districtCode = int(utils.MustInterface2Int64(valid["districtCode"])) diff --git a/business/jxstore/cms/store_sku.go b/business/jxstore/cms/store_sku.go index 6bdf996ad..f771ea684 100644 --- a/business/jxstore/cms/store_sku.go +++ b/business/jxstore/cms/store_sku.go @@ -122,8 +122,8 @@ type StoreSkuBindInfo struct { IsFocus int `json:"isFocus"` // -1:不关注,0:忽略,1:关注 IsSale int `json:"isSale"` // -1:不可售,0:忽略,1:可售 SubStoreID int `json:"subStoreID,omitempty"` - StatusSaleBegin int16 `json:"statusSaleBegin"` //商品可售时间范围 - StatusSaleEnd int16 `json:"statusSaleEnd"` + StatusSaleBegin int16 `json:"statusSaleBegin" validate:"max=2359,min=1,ltfield=StatusSaleEnd"` //商品可售时间范围 + StatusSaleEnd int16 `json:"statusSaleEnd" validate:"max=2359,min=1"` Skus []*StoreSkuBindSkuInfo `json:"skus,omitempty"` } @@ -1079,15 +1079,10 @@ func updateStoresSkusWithoutSync(ctx *jxcontext.Context, db *dao.DaoDB, storeIDs updateFieldMap["JxPrice"] = 1 } if skuBindInfo.StatusSaleBegin != 0 && skuBindInfo.StatusSaleEnd != 0 { - if skuBindInfo.StatusSaleBegin < 0 || skuBindInfo.StatusSaleBegin > 2359 || - skuBindInfo.StatusSaleEnd < 0 || skuBindInfo.StatusSaleEnd > 2359 { + if err := ValidateStruct(skuBindInfo); err != nil { dao.Rollback(db) return nil, fmt.Errorf("更改商品:%s, 可售时间不合法!时间范围:[%v] 至 [%v]", allBinds[0].Name, skuBindInfo.StatusSaleBegin, skuBindInfo.StatusSaleEnd) } - if skuBindInfo.StatusSaleBegin >= skuBindInfo.StatusSaleEnd { - dao.Rollback(db) - return nil, fmt.Errorf("更改商品:%s, 可售时间不允许交叉!时间范围:[%v] 至 [%v]", allBinds[0].Name, skuBindInfo.StatusSaleBegin, skuBindInfo.StatusSaleEnd) - } updateFieldMap["StatusSaleBegin"] = int(skuBindInfo.StatusSaleBegin) updateFieldMap["StatusSaleEnd"] = int(skuBindInfo.StatusSaleEnd) skuBind.StatusSaleBegin = skuBindInfo.StatusSaleBegin diff --git a/business/jxstore/cms/validation.go b/business/jxstore/cms/validation.go index fc6045e38..4797f8d39 100644 --- a/business/jxstore/cms/validation.go +++ b/business/jxstore/cms/validation.go @@ -3,6 +3,8 @@ package cms import ( "fmt" + "gopkg.in/go-playground/validator.v9" + "git.rosy.net.cn/jx-callback/business/jxutils" "git.rosy.net.cn/jx-callback/business/model" ) @@ -10,6 +12,7 @@ import ( var ( unitNamesMap map[string]int specUnitNamesMap map[string]int + validate = validator.New() ) func init() { @@ -33,3 +36,15 @@ func ValidateUnit(value interface{}) (err error) { func ValidateSpecUnit(value interface{}) (err error) { return validateStringInMap("SpecUnit", value, specUnitNamesMap) } + +func ValidateStruct(value interface{}) (err error) { + return validate.Struct(value) +} + +func ValidateVar(value interface{}, tag string) (err error) { + return validate.Var(value, tag) +} + +func ValidateStructPartial(value interface{}, fields ...string) (err error) { + return validate.StructPartial(value, fields...) +} diff --git a/business/model/store.go b/business/model/store.go index 6319b6cad..8b549576a 100644 --- a/business/model/store.go +++ b/business/model/store.go @@ -252,14 +252,14 @@ type Store struct { Address string `orm:"size(255)" json:"address"` Tel1 string `orm:"size(32);index" json:"tel1"` Tel2 string `orm:"size(32);index" json:"tel2"` - OpenTime1 int16 `json:"openTime1"` // 930就表示9点半,用两个的原因是为了支持中午休息,1与2的时间段不能交叉,为0表示没有 - CloseTime1 int16 `json:"closeTime1"` // 格式同上 - OpenTime2 int16 `json:"openTime2"` // 格式同上 - CloseTime2 int16 `json:"closeTime2"` // 格式同上 - Lng int `json:"-"` // 乘了10的6次方 - Lat int `json:"-"` // 乘了10的6次方 - DeliveryRangeType int8 `json:"deliveryRangeType"` // 参见相关常量定义 - DeliveryRange string `orm:"type(text)" json:"deliveryRange"` // 如果DeliveryRangeType为DeliveryRangeTypePolygon,则为逗号分隔坐标,分号分隔的坐标点(坐标与Lng和Lat一样,都是整数),比如 121361504,31189308;121420555,31150238。否则为半径,单位为米 + OpenTime1 int16 `json:"openTime1" validate:"max=2359,min=1,ltfield=CloseTime1"` // 930就表示9点半,用两个的原因是为了支持中午休息,1与2的时间段不能交叉,为0表示没有 + CloseTime1 int16 `json:"closeTime1" validate:"max=2359,min=1` // 格式同上 + OpenTime2 int16 `json:"openTime2" validate:"max=2359,min=1,ltfield=CloseTime2"` // 格式同上 + CloseTime2 int16 `json:"closeTime2" validate:"max=2359,min=1` // 格式同上 + Lng int `json:"-"` // 乘了10的6次方 + Lat int `json:"-"` // 乘了10的6次方 + DeliveryRangeType int8 `json:"deliveryRangeType"` // 参见相关常量定义 + DeliveryRange string `orm:"type(text)" json:"deliveryRange"` // 如果DeliveryRangeType为DeliveryRangeTypePolygon,则为逗号分隔坐标,分号分隔的坐标点(坐标与Lng和Lat一样,都是整数),比如 121361504,31189308;121420555,31150238。否则为半径,单位为米 Status int `json:"status"` AutoEnableAt *time.Time `orm:"type(datetime);null" json:"autoEnableAt"` // 自动营业时间(临时休息用) ChangePriceType int8 `json:"changePriceType"` // 修改价格类型,即是否需要审核 diff --git a/globals/refutil/refutil.go b/globals/refutil/refutil.go index 70ed494ff..11be3ad19 100644 --- a/globals/refutil/refutil.go +++ b/globals/refutil/refutil.go @@ -64,10 +64,12 @@ func FilterMapByStructObject(mapData map[string]interface{}, obj interface{}, ex for k, v := range mapData { if m[k] != nil && excludedMap[k] == 0 && v != nil && (!isCheckValue || !IsValueEqual(m[k], v)) { valid[k] = v + m[k] = v } else { invalid[k] = v } } + utils.Map2Struct(m, obj, true, "") return valid, invalid }