diff --git a/business/jxstore/cms/sku.go b/business/jxstore/cms/sku.go index a1821b0d6..d73093411 100644 --- a/business/jxstore/cms/sku.go +++ b/business/jxstore/cms/sku.go @@ -313,7 +313,7 @@ func GetSkuNames(ctx *jxcontext.Context, keyword string, params map[string]inter CONCAT("[", GROUP_CONCAT(DISTINCT CONCAT('{"id":', t2.id, ',"comment":"', t2.comment, '","status":', t2.status, ',"createdAt":"', CONCAT(REPLACE(t2.created_at," ","T"),"+08:00"), '","updatedAt":"', CONCAT(REPLACE(t2.updated_at," ","T"),"+08:00"), '","lastOperator":"', t2.last_operator, '","specQuality":', t2.spec_quality, ',"specUnit":"', t2.spec_unit, '","weight":', t2.weight, ',"jdID":', t2.jd_id, ',"categoryID":', t2.category_id, ',"nameID":', t2.name_id, "}")), "]") skus_str, CONCAT("[", GROUP_CONCAT(DISTINCT t3.place_code), "]") places_str ` + sql + ` - ORDER BY t1.id + ORDER BY t1.id DESC LIMIT ? OFFSET ?` pageSize = jxutils.FormalizePageSize(pageSize) if offset < 0 { @@ -354,6 +354,14 @@ func AddSkuName(ctx *jxcontext.Context, skuNameExt *model.SkuNameExt, userName s if skuNameExt.CategoryID == 0 { return nil, errors.New("CategoryID不能为空") } + if len(skuNameExt.Skus) == 0 { + return nil, errors.New("创建SKU NAME时必须至少创建一个SKU") + } else if skuNameExt.Unit != model.SpecialUnit { + if len(skuNameExt.Skus) != 1 { + return nil, errors.New("不为份的SKU NAME只能有一个SKU") + } + } + db := dao.GetDB() dao.Begin(db) defer func() { @@ -363,6 +371,13 @@ func AddSkuName(ctx *jxcontext.Context, skuNameExt *model.SkuNameExt, userName s } }() dao.WrapAddIDCULDEntity(&skuNameExt.SkuName, userName) + if skuNameExt.Unit == model.SpecialUnit { + skuNameExt.SpecQuality = float32(model.SpecialSpecQuality) + skuNameExt.SpecUnit = model.SpecialSpecUnit + } else { + skuNameExt.SpecQuality = skuNameExt.Skus[0].SpecQuality + skuNameExt.SpecUnit = skuNameExt.Skus[0].SpecUnit + } if err = dao.CreateEntity(db, &skuNameExt.SkuName); err != nil { dao.Rollback(db) return nil, err @@ -407,6 +422,7 @@ func UpdateSkuName(ctx *jxcontext.Context, nameID int, payload map[string]interf skuName := &model.SkuName{} skuName.ID = nameID valid := dao.NormalMakeMapByStructObject(payload, skuName, userName) + valid = utils.RemoveGeneralMapKeys(valid, model.FieldSpecQuality, model.FieldSpecUnit) if len(valid) > 0 { db := dao.GetDB() dao.Begin(db) @@ -488,6 +504,15 @@ func DeleteSkuName(ctx *jxcontext.Context, nameID int, userName string) (num int func AddSku(ctx *jxcontext.Context, nameID int, sku *model.Sku, userName string) (outSkuNameExt *model.SkuNameExt, err error) { db := dao.GetDB() + skuName := &model.SkuName{} + skuName.ID = nameID + if err = dao.GetEntity(db, skuName); err != nil { + return nil, err + } + if skuName.Unit != model.SpecialUnit { + return nil, errors.New("不为份的SKU NAME只能有一个SKU") + } + dao.WrapAddIDCULDEntity(sku, userName) sku.JdSyncStatus = model.SyncFlagNewMask sku.NameID = nameID @@ -512,8 +537,22 @@ func UpdateSku(ctx *jxcontext.Context, skuID int, payload map[string]interface{} valid := dao.NormalMakeMapByStructObject(payload, sku, userName) if len(valid) > 0 { db := dao.GetDB() + dao.Begin(db) + defer func() { + dao.Rollback(db) + }() if num, err = dao.UpdateEntityLogicallyAndUpdateSyncStatus(db, sku, valid, userName, nil, model.FieldJdSyncStatus); err == nil { if num == 1 { + if num, err = dao.ExecuteSQL(db, ` + UPDATE sku_name t1 + JOIN sku t2 ON t1.id = t2.name_id + 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 + } + dao.Commit(db) _, err = CurVendorSync.SyncSku(ctx, db, -1, sku.ID, false, userName) } else { err = ErrEntityNotExist diff --git a/business/jxstore/cms/store.go b/business/jxstore/cms/store.go index 462b1fa66..3ca28c6df 100644 --- a/business/jxstore/cms/store.go +++ b/business/jxstore/cms/store.go @@ -175,7 +175,7 @@ func GetStores(ctx *jxcontext.Context, keyword string, params map[string]interfa sql += sqlWhere + ` GROUP BY 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22 - ORDER BY t1.id + ORDER BY t1.id DESC LIMIT ? OFFSET ?` pageSize = jxutils.FormalizePageSize(pageSize) if offset < 0 { diff --git a/business/jxstore/cms/store_sku.go b/business/jxstore/cms/store_sku.go index afa825a46..548ff4856 100644 --- a/business/jxstore/cms/store_sku.go +++ b/business/jxstore/cms/store_sku.go @@ -46,8 +46,8 @@ type StoreSkuBindSkuInfo struct { // UpdateStoreSku用,API调用时 type StoreSkuBindInfo struct { NameID int `json:"nameID"` - UnitPrice int `json:"unitPrice"` - IsFocus int `json:"isFocus"` // -1:不关注,0:忽略,1:关注 + UnitPrice int `json:"unitPrice"` // 对于是份的SKU就是单价(每斤价格),其它则为总价 + IsFocus int `json:"isFocus"` // -1:不关注,0:忽略,1:关注 SubStoreID int `json:"subStoreID"` Skus []*StoreSkuBindSkuInfo `json:"skus"` } @@ -193,7 +193,7 @@ func GetStoreSkus(ctx *jxcontext.Context, storeID int, isFocus bool, keyword str ',"price":', IF(t4.price IS NULL, 0, t4.price), ',"unitPrice":', IF(t4.unit_price IS NULL, t1.price, t4.unit_price), ',"storeSkuStatus":', IF(t4.status IS NULL, 0, t4.status), "}")), "]") skus_str ` + sql + ` - ORDER BY t1.id + ORDER BY t1.id DESC LIMIT ? OFFSET ?` pageSize = jxutils.FormalizePageSize(pageSize) sqlParams = append(sqlParams, pageSize, offset) diff --git a/business/model/model.go b/business/model/model.go index bb09b11b8..f3a121566 100644 --- a/business/model/model.go +++ b/business/model/model.go @@ -32,7 +32,9 @@ const ( FieldSkuID = "SkuID" FieldLevel = "Level" - FieldEnabled = "Enabled" + FieldEnabled = "Enabled" + FieldSpecQuality = "SpecQuality" + FieldSpecUnit = "SpecUnit" ) type ModelIDCUL struct { diff --git a/business/model/sku.go b/business/model/sku.go index 30598238d..fa9090618 100644 --- a/business/model/sku.go +++ b/business/model/sku.go @@ -85,6 +85,10 @@ var ( "虾仁", "鲜活现宰", } + + SpecialUnit = "份" + SpecialSpecQuality = 500 + SpecialSpecUnit = "g" ) var ( @@ -156,18 +160,20 @@ type SkuName struct { BrandID int `orm:"column(brand_id);default(0)" json:"brandID"` // todo,此属性暂时没有使用,且有问题,应该是不同平台都有一个brandid CategoryID int `orm:"column(category_id);index" json:"categoryID"` // 标准类别 - IsGlobal int8 `orm:"default(1)" json:"isGlobal"` // 是否是全部(全国)可见,如果否的话,可见性由SkuPlace决定 - Unit string `orm:"size(8)" json:"unit"` - Price int `json:"price"` // 单位为分,标准价,不为份的就为实际标准价,为份的为每市斤价,实际还要乘质量。todo 为份的确定必须有质量 - Img string `orm:"size(255)" json:"img"` - ElmImgHashCode string `orm:"size(255)" json:"-"` // 长度255的原因是从京东初始化数据时临时需要 + IsGlobal int8 `orm:"default(1)" json:"isGlobal"` // 是否是全部(全国)可见,如果否的话,可见性由SkuPlace决定 + Unit string `orm:"size(8)" json:"unit"` + SpecQuality float32 `json:"-"` // 为份必然为500,这个主要作用只是用于确保SkuName的唯一性 + SpecUnit string `orm:"size(8)" json:"-"` // 为份必然为克,这个主要作用只是用于确保SkuName的唯一性 + Price int `json:"price"` // 单位为分,标准价,不为份的就为实际标准价,为份的为每市斤价,实际还要乘质量。todo 为份的确定必须有质量 + Img string `orm:"size(255)" json:"img"` + ElmImgHashCode string `orm:"size(255)" json:"-"` // 长度255的原因是从京东初始化数据时临时需要 } -// func (*SkuName) TableUnique() [][]string { -// return [][]string{ -// []string{"Name", "Prefix", "Unit"}, -// } -// } +func (*SkuName) TableUnique() [][]string { + return [][]string{ + []string{"Name", "Prefix", "SpecQuality", "SpecUnit", "Unit"}, + } +} type Sku struct { ModelIDCULD