From ecd19c55b3387b7258adc5e5d0370a31d755c76f Mon Sep 17 00:00:00 2001 From: gazebo Date: Wed, 12 Sep 2018 19:04:19 +0800 Subject: [PATCH] - sku almost ok. --- business/jxstore/cms/sku.go | 116 +++++++++++++++++++++++--- business/jxstore/cms/store.go | 4 +- business/jxstore/cms/sync.go | 13 ++- business/model/sku.go | 3 +- controllers/cms_sku.go | 76 +++++++++++++++-- controllers/cms_store.go | 2 +- routers/commentsRouter_controllers.go | 32 +++++++ 7 files changed, 221 insertions(+), 25 deletions(-) diff --git a/business/jxstore/cms/sku.go b/business/jxstore/cms/sku.go index 618ada743..7266fa0f4 100644 --- a/business/jxstore/cms/sku.go +++ b/business/jxstore/cms/sku.go @@ -3,6 +3,8 @@ package cms import ( "errors" "strconv" + "strings" + "time" "git.rosy.net.cn/baseapi/utils" "git.rosy.net.cn/jx-callback/business/model" @@ -148,9 +150,9 @@ func GetSkuNames(keyword string, params map[string]interface{}, offset, pageSize sql += ")" } - if params["id"] != nil { + if params["nameID"] != nil { sql += " AND t1.id = ?" - sqlParams = append(sqlParams, params["id"].(int)) + sqlParams = append(sqlParams, params["nameID"].(int)) } if params["categoryID"] != nil { sql += " AND t1.category_id = ?" @@ -172,16 +174,28 @@ func GetSkuNames(keyword string, params map[string]interface{}, offset, pageSize sql += " AND t1.unit = ?" sqlParams = append(sqlParams, params["unit"].(string)) } - if params["placeCode"] != nil { - sql += " AND (SELECT COUNT(*) FROM sku_name_place_bind bind WHERE bind.sku_name_id = t1.id AND bind.place_code = ?) > 0" - sqlParams = append(sqlParams, params["placeCode"].(int)) - } - if params["isGlobal"] != nil { - if params["isGlobal"].(bool) { - sql += " AND t1.is_global = 1" + if placeCond := strings.ToUpper(utils.Interface2String(params["placeCond"])); placeCond == "AND" || placeCond == "OR" { + if placeCond == "AND" { + sql += " AND ( 1 = 1" } else { - sql += " AND t1.is_global = 0" + sql += " AND ( 1 = 0" } + if params["placeCode"] != nil { + sql += " " + placeCond + " (SELECT COUNT(*) FROM sku_name_place_bind bind WHERE bind.sku_name_id = t1.id AND bind.place_code = ?) > 0" + sqlParams = append(sqlParams, params["placeCode"].(int)) + } + if params["isGlobal"] != nil { + if params["isGlobal"].(bool) { + sql += " " + placeCond + " t1.is_global = 1" + } else { + sql += " " + placeCond + " t1.is_global = 0" + } + } + sql += ")" + } + if params["skuID"] != nil { + sql += " AND t2.id = ?" + sqlParams = append(sqlParams, params["skuID"].(int)) } if params["fromStatus"] != nil { fromStatus := params["fromStatus"].(int) @@ -284,7 +298,7 @@ func AddSkuName(skuNameExt *SkuNameExt, userName string) (outSkuNameExt *SkuName return nil, ErrEntityNotExist } outSkuNameExt = tmpInfo.SkuNames[0] - err = CurVendorSync.SyncSku(db, &outSkuNameExt.SkuName, -1, false, userName) + err = CurVendorSync.SyncSku(db, outSkuNameExt.SkuName.ID, -1, false, userName) return outSkuNameExt, err } @@ -296,13 +310,89 @@ func UpdateSkuName(nameID int, payload map[string]interface{}, userName string) db := dao.GetDB() if num, err = dao.UpdateEntityByKV(db, skuName, valid, nil); err == nil && num == 1 { sku := &model.Sku{} - _, err2 := dao.UpdateEntityByKV(db, sku, utils.Params2Map(model.FieldSyncStatus, model.SyncFlagModifiedMask), utils.Params2Map(model.FieldNameID, skuName.ID)) + _, err2 := dao.UpdateEntityByKV(db, sku, utils.Params2Map(model.FieldJdSyncStatus, model.SyncFlagModifiedMask), utils.Params2Map(model.FieldNameID, skuName.ID)) if err = err2; err == nil { if err = dao.GetEntity(db, skuName); err == nil { - err = CurVendorSync.SyncSku(db, skuName, -1, false, userName) + err = CurVendorSync.SyncSku(db, skuName.ID, -1, false, userName) } } } } return num, err } + +func DeleteSkuName(nameID int, userName string) (num int64, err error) { + db := dao.GetDB() + dao.Begin(db) + skuName := &model.SkuName{} + skuName.ID = nameID + if num, err = dao.DeleteEntity(db, skuName, nil, userName, nil); err == nil && num == 1 { + dummy := &model.Sku{} + num2, err2 := dao.UpdateEntityByKV(db, dummy, map[string]interface{}{ + model.FieldDeletedAt: time.Now(), + model.FieldLastOperator: userName, + model.FieldJdSyncStatus: model.SyncFlagDeletedMask, + "Status": model.SkuStatusDeleted, + }, utils.Params2Map(model.FieldNameID, skuName.ID)) + if err2 == nil { + dao.Commit(db) + if num2 > 0 { + err = CurVendorSync.SyncSku(db, skuName.ID, -1, false, userName) + } + return num, err + } + } + dao.Rollback(db) + return num, err +} + +func AddSku(nameID int, sku *model.Sku, userName string) (outSkuNameExt *SkuNameExt, err error) { + db := dao.GetDB() + dao.WrapAddIDCULDEntity(sku, userName) + sku.JdSyncStatus = model.SyncFlagNewMask + sku.NameID = nameID + if err = dao.CreateEntity(db, sku); err == nil { + result, err2 := GetSkuNames("", utils.Params2Map("skuID", sku.ID), 0, 0) + if err = err2; err == nil { + if result.TotalCount == 1 { + outSkuNameExt = result.SkuNames[0] + err = CurVendorSync.SyncSku(db, outSkuNameExt.SkuName.ID, sku.ID, false, userName) + } else { + err = ErrEntityNotExist + } + } + } + return outSkuNameExt, err +} + +func UpdateSku(skuID int, payload map[string]interface{}, userName string) (num int64, err error) { + sku := &model.Sku{} + sku.ID = skuID + valid := dao.NormalMakeMapByStructObject(payload, sku, userName) + if len(valid) > 0 { + valid[model.FieldJdSyncStatus] = model.SyncFlagModifiedMask + db := dao.GetDB() + if num, err = dao.UpdateEntityByKV(db, sku, valid, nil); err == nil { + if num == 1 { + err = CurVendorSync.SyncSku(db, -1, sku.ID, false, userName) + } else { + err = ErrEntityNotExist + } + } + } + return num, err +} + +func DeleteSku(skuID int, userName string) (num int64, err error) { + db := dao.GetDB() + sku := &model.Sku{} + sku.ID = skuID + if num, err = dao.DeleteEntity(db, sku, nil, userName, nil); err == nil { + if num == 1 { + err = CurVendorSync.SyncSku(db, -1, sku.ID, false, userName) + } else { + err = ErrEntityNotExist + } + } + return num, err +} diff --git a/business/jxstore/cms/store.go b/business/jxstore/cms/store.go index 155cdc6d8..bc1fcc036 100644 --- a/business/jxstore/cms/store.go +++ b/business/jxstore/cms/store.go @@ -95,9 +95,9 @@ func GetStores(keyword string, params map[string]interface{}, offset, pageSize i sqlWhere += " 1 = 1" } - if params["id"] != nil { + if params["storeID"] != nil { sqlWhere += " AND t1.id = ?" - sqlParams = append(sqlParams, params["id"].(int)) + sqlParams = append(sqlParams, params["storeID"].(int)) } if params["name"] != nil { sqlWhere += " AND t1.name LIKE ?" diff --git a/business/jxstore/cms/sync.go b/business/jxstore/cms/sync.go index 376c1552a..bc87fdb72 100644 --- a/business/jxstore/cms/sync.go +++ b/business/jxstore/cms/sync.go @@ -66,12 +66,19 @@ func (v *VendorSync) SyncStore(db *dao.DaoDB, vendorID int, store *model.Store, return err } -func (v *VendorSync) SyncSku(db *dao.DaoDB, skuName *model.SkuName, skuID int, isForce bool, userName string) (err error) { +func (v *VendorSync) SyncSku(db *dao.DaoDB, nameID, skuID int, isForce bool, userName string) (err error) { if db == nil { db = dao.GetDB() } var skuList []*model.Sku - if err = dao.GetEntities(db, &skuList, utils.Params2Map(model.FieldNameID, skuName.ID), true); err == nil { + cond := make(map[string]interface{}) + if nameID != -1 { + cond[model.FieldNameID] = nameID + } + if skuID != -1 { + cond[model.FieldID] = skuID + } + if err = dao.GetEntities(db, &skuList, cond, true); err == nil { for _, sku := range skuList { if (skuID == -1 || skuID == sku.ID) && (isForce || sku.JdSyncStatus != 0) { if sku.JdSyncStatus&model.SyncFlagDeletedMask != 0 { // 删除 @@ -83,7 +90,7 @@ func (v *VendorSync) SyncSku(db *dao.DaoDB, skuName *model.SkuName, skuID int, i } if err == nil { sku.JdSyncStatus = 0 - dao.UpdateEntity(db, sku, model.FieldSyncStatus) + dao.UpdateEntity(db, sku, model.FieldJdSyncStatus) } } } diff --git a/business/model/sku.go b/business/model/sku.go index 634afc9c9..1c94422b6 100644 --- a/business/model/sku.go +++ b/business/model/sku.go @@ -151,7 +151,8 @@ type Sku struct { func (*Sku) TableUnique() [][]string { return [][]string{ - []string{"NameID", "SpecQuality", "SpecUnit"}, + []string{"NameID", "SpecQuality", "SpecUnit", "DeletedAt"}, + []string{"JdID", "DeletedAt"}, } } diff --git a/controllers/cms_sku.go b/controllers/cms_sku.go index d88f6b044..925323c08 100644 --- a/controllers/cms_sku.go +++ b/controllers/cms_sku.go @@ -85,14 +85,14 @@ func (c *SkuController) UpdateCategory() { // @Description 商品类别重排序(区别于厂商家SKU类别) // @Param token header string true "认证token" // @Param categoryID formData int true "父ID" -// @Param ids formData string true "同一父类别下的所有子类别ID列表([1,2,3,4])" +// @Param categoryIDs formData string true "同一父类别下的所有子类别ID列表([1,2,3,4])" // @Success 200 {object} controllers.CallResult // @Failure 200 {object} controllers.CallResult // @router /ReorderCategories [put] func (c *SkuController) ReorderCategories() { c.callReorderCategories(func(params *tSkuReorderCategoriesParams) (retVal interface{}, errCode string, err error) { var idList []int - if err = utils.UnmarshalUseNumber([]byte(params.Ids), &idList); err == nil { + if err = utils.UnmarshalUseNumber([]byte(params.CategoryIDs), &idList); err == nil { err = cms.ReorderCategories(params.CategoryID, idList, GetUserNameFromToken(params.Token)) } return retVal, "", err @@ -117,9 +117,11 @@ func (c *SkuController) DeleteCategory() { // @Description 得到商品信息,如下条件之间是与的关系 // @Param token header string true "认证token" // @Param keyword query string false "查询关键字(可以为空,为空表示不限制)" -// @Param id query int false "SkuName ID" +// @Param nameID query int false "SkuName ID" +// @Param skuID query int false "Sku ID" // @Param name query string false "商品名称(不要求完全一致)" // @Param prefix query string false "商品前缀(不要求完全一致)" +// @Param placeCond query string false "查询地点的条件,and:与,or:或,指的是placeCode,isGlobal这两个条件间的关系,这组条件与其它条件都是与的关系" // @Param placeCode query int false "可售地点Code" // @Param isGlobal query bool false "是否全球可售" // @Param categoryID query int false "商品所属类别ID" @@ -139,8 +141,8 @@ func (c *SkuController) GetSkuNames() { }) } -// @Title 新增商品信息 -// @Description 新增商品信息 +// @Title 新增商品名(及商品)信息 +// @Description 新增商品名(及商品)信息 // @Param token header string true "认证token" // @Param payload formData string true "json数据,SkuNameExt对象(),可传Skus" // @Success 200 {object} controllers.CallResult @@ -173,3 +175,67 @@ func (c *SkuController) UpdateSkuName() { return retVal, "", err }) } + +// @Title 删除商品名 +// @Description 此前商品名下的所有商品也会被级连删除 +// @Param token header string true "认证token" +// @Param nameID query int true "商品名ID" +// @Success 200 {object} controllers.CallResult +// @Failure 200 {object} controllers.CallResult +// @router /DeleteSkuName [delete] +func (c *SkuController) DeleteSkuName() { + c.callDeleteSkuName(func(params *tSkuDeleteSkuNameParams) (retVal interface{}, errCode string, err error) { + retVal, err = cms.DeleteSkuName(params.NameID, GetUserNameFromToken(params.Token)) + return retVal, "", err + }) +} + +// @Title 新增商品 +// @Description 新增商品 +// @Param token header string true "认证token" +// @Param nameID formData int true "商品名ID, playload中的相应字段会被忽略" +// @Param payload formData string true "json数据,Sku对象()" +// @Success 200 {object} controllers.CallResult +// @Failure 200 {object} controllers.CallResult +// @router /AddSku [post] +func (c *SkuController) AddSku() { + c.callAddSku(func(params *tSkuAddSkuParams) (retVal interface{}, errCode string, err error) { + sku := &model.Sku{} + if err = utils.UnmarshalUseNumber([]byte(params.Payload), sku); err == nil { + retVal, err = cms.AddSku(params.NameID, sku, GetUserNameFromToken(params.Token)) + } + return retVal, "", err + }) +} + +// @Title 修改商品信息 +// @Description 修改商品信息 +// @Param token header string true "认证token" +// @Param skuID formData int true "需要修改的商品名ID,payload中的相应数据会被忽略" +// @Param payload formData string true "json数据,Sku对象" +// @Success 200 {object} controllers.CallResult +// @Failure 200 {object} controllers.CallResult +// @router /UpdateSku [put] +func (c *SkuController) UpdateSku() { + c.callUpdateSku(func(params *tSkuUpdateSkuParams) (retVal interface{}, errCode string, err error) { + payload := make(map[string]interface{}) + if err = utils.UnmarshalUseNumber([]byte(params.Payload), &payload); err == nil { + retVal, err = cms.UpdateSku(params.SkuID, payload, GetUserNameFromToken(params.Token)) + } + return retVal, "", err + }) +} + +// @Title 删除商品 +// @Description 删除商品 +// @Param token header string true "认证token" +// @Param skuID query int true "商品ID" +// @Success 200 {object} controllers.CallResult +// @Failure 200 {object} controllers.CallResult +// @router /DeleteSku [delete] +func (c *SkuController) DeleteSku() { + c.callDeleteSku(func(params *tSkuDeleteSkuParams) (retVal interface{}, errCode string, err error) { + retVal, err = cms.DeleteSku(params.SkuID, GetUserNameFromToken(params.Token)) + return retVal, "", err + }) +} diff --git a/controllers/cms_store.go b/controllers/cms_store.go index 5d634792d..a0613f249 100644 --- a/controllers/cms_store.go +++ b/controllers/cms_store.go @@ -74,7 +74,7 @@ func (c *StoreController) UpdatePlace() { // @Description 得到京西门店信息,如下条件之间是与的关系 // @Param token header string true "认证token" // @Param keyword query string false "查询关键字(可以为空,为空表示不限制)" -// @Param id query int false "门店ID" +// @Param storeID query int false "门店ID" // @Param name query string false "门店名称(不要求完全一致)" // @Param placeID query int false "所属地点ID" // @Param placeLevel query int false "所属地点级别" diff --git a/routers/commentsRouter_controllers.go b/routers/commentsRouter_controllers.go index b4b96c0e0..91b1944eb 100644 --- a/routers/commentsRouter_controllers.go +++ b/routers/commentsRouter_controllers.go @@ -143,6 +143,14 @@ func init() { MethodParams: param.Make(), Params: nil}) + beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:SkuController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:SkuController"], + beego.ControllerComments{ + Method: "AddSku", + Router: `/AddSku`, + AllowHTTPMethods: []string{"post"}, + MethodParams: param.Make(), + Params: nil}) + beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:SkuController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:SkuController"], beego.ControllerComments{ Method: "AddSkuName", @@ -159,6 +167,22 @@ func init() { MethodParams: param.Make(), Params: nil}) + beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:SkuController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:SkuController"], + beego.ControllerComments{ + Method: "DeleteSku", + Router: `/DeleteSku`, + AllowHTTPMethods: []string{"delete"}, + MethodParams: param.Make(), + Params: nil}) + + beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:SkuController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:SkuController"], + beego.ControllerComments{ + Method: "DeleteSkuName", + Router: `/DeleteSkuName`, + AllowHTTPMethods: []string{"delete"}, + MethodParams: param.Make(), + Params: nil}) + beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:SkuController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:SkuController"], beego.ControllerComments{ Method: "GetCategories", @@ -199,6 +223,14 @@ func init() { MethodParams: param.Make(), Params: nil}) + beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:SkuController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:SkuController"], + beego.ControllerComments{ + Method: "UpdateSku", + Router: `/UpdateSku`, + AllowHTTPMethods: []string{"put"}, + MethodParams: param.Make(), + Params: nil}) + beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:SkuController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:SkuController"], beego.ControllerComments{ Method: "UpdateSkuName",