package controllers

import (
	"git.rosy.net.cn/jx-callback/business/partner/purchase/ebai"
	"strings"
	"time"

	"git.rosy.net.cn/jx-callback/business/partner/purchase/mtwm"

	"git.rosy.net.cn/baseapi/platformapi/mtwmapi"
	"git.rosy.net.cn/baseapi/utils"
	"git.rosy.net.cn/jx-callback/business/jxstore/cms"
	"git.rosy.net.cn/jx-callback/business/jxstore/misc"
	"git.rosy.net.cn/jx-callback/business/jxutils"
	"git.rosy.net.cn/jx-callback/business/model"
	"git.rosy.net.cn/jx-callback/business/model/dao"
	"git.rosy.net.cn/jx-callback/business/partner/purchase/tiktok_store"
	"git.rosy.net.cn/jx-callback/globals"
	"github.com/astaxie/beego/server/web"
)

type SkuController struct {
	web.Controller
}

// @Title 得到厂商商品类别
// @Description 得到厂商商品类别（区别于商家SKU类别）
// @Param	token			header		string	true	"认证token"
// @Param	vendorID		query		int		true	"厂商ID"
// @Param	parentID		query		string	false	"父ID，-1表示所有，缺省为空"
// @Success 200 {object} controllers.CallResult
// @Failure 200 {object} controllers.CallResult
// @router /GetVendorCategories [get]
func (c *SkuController) GetVendorCategories() {
	c.callGetVendorCategories(func(params *tSkuGetVendorCategoriesParams) (retVal interface{}, errCode string, err error) {
		retVal, err = cms.GetVendorCategories(params.Ctx, params.VendorID, params.ParentID)
		return retVal, "", err
	})
}

// @Title 得到厂商商品类别2
// @Description 得到厂商商品类别2（区别于商家SKU类别）
// @Param	token			header		string	true	"认证token"
// @Param	vendorID		query		int		true	"厂商ID"
// @Success 200 {object} controllers.CallResult
// @Failure 200 {object} controllers.CallResult
// @router /GetVendorCategoriesWithMap [get]
func (c *SkuController) GetVendorCategoriesWithMap() {
	c.callGetVendorCategoriesWithMap(func(params *tSkuGetVendorCategoriesWithMapParams) (retVal interface{}, errCode string, err error) {
		retVal, err = cms.GetVendorCategoriesWithMap(params.Ctx, params.VendorID)
		return retVal, "", err
	})
}

// @Title 得到商品类别
// @Description 得到商品类别（区别于厂商家SKU类别）
// @Param	token			header		string	false	"认证token"
// @Param	parentID		query		int		false	"父ID，-1表示所有，缺省为-1"
// @Param	isExd			query		bool	false	"是否要查饿鲜达分类"
// @Success 200 {object} controllers.CallResult
// @Failure 200 {object} controllers.CallResult
// @router /GetCategories [get]
func (c *SkuController) GetCategories() {
	c.callGetCategories(func(params *tSkuGetCategoriesParams) (retVal interface{}, errCode string, err error) {
		if c.GetString("parentID") == "" {
			params.ParentID = -1
		}
		retVal, err = cms.GetCategories(params.Ctx, params.ParentID, params.IsExd)
		return retVal, "", err
	})
}

// @Title 新增商品类别
// @Description 新增商品类别（区别于厂商家SKU类别）
// @Param	token			header		string	true	"认证token"
// @Param	payload			formData	string	true	"json数据，skuCategory对象()"
// @Success 200 {object} controllers.CallResult
// @Failure 200 {object} controllers.CallResult
// @router /AddCategory [post]
func (c *SkuController) AddCategory() {
	c.callAddCategory(func(params *tSkuAddCategoryParams) (retVal interface{}, errCode string, err error) {
		cat := &model.SkuCategory{}
		if err = utils.UnmarshalUseNumber([]byte(params.Payload), cat); err == nil {
			retVal, err = cms.AddCategory(params.Ctx, cat, params.Ctx.GetUserName())
		}
		return retVal, "", err
	})
}

// @Title 修改商品类别
// @Description 修改商品类别（区别于厂商家SKU类别）
// @Param	token			header		string	true	"认证token"
// @Param	categoryID		formData	int		true	"类别ID，payload中的相应字段会被忽略"
// @Param	payload			formData	string	true	"json数据，skuCategory对象()"
// @Success 200 {object} controllers.CallResult
// @Failure 200 {object} controllers.CallResult
// @router /UpdateCategory [put]
func (c *SkuController) UpdateCategory() {
	c.callUpdateCategory(func(params *tSkuUpdateCategoryParams) (retVal interface{}, errCode string, err error) {
		payload := make(map[string]interface{})
		if err = utils.UnmarshalUseNumber([]byte(params.Payload), &payload); err == nil {
			retVal, err = cms.UpdateCategory(params.Ctx, params.CategoryID, payload, params.Ctx.GetUserName())
		}
		return retVal, "", err
	})
}

// @Title 商品类别重排序
// @Description 商品类别重排序（区别于厂商家SKU类别）
// @Param	token			header		string	true	"认证token"
// @Param	categoryID		formData	int		true	"父ID"
// @Param	categoryIDs		formData	string	true	"同一父类别下的所有子类别ID列表([1,2,3,4])"
// @Param	isExd			query		bool	false	"是否要查饿鲜达分类"
// @Param	onlySort		query		int		false	"1-仅仅排序/其他就是排序加同步分类"
// @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.CategoryIDs), &idList); err == nil {
			err = cms.ReorderCategories(params.Ctx, params.CategoryID, idList, params.Ctx.GetUserName(), params.IsExd, params.OnlySort)
		}
		return retVal, "", err
	})
}

// @Title 删除商品类别
// @Description 删除商品类别，只有无商品且无子类别的才能删除
// @Param	token			header		string	true	"认证token"
// @Param	categoryID		query		int		true	"商品类别ID"
// @Success 200 {object} controllers.CallResult
// @Failure 200 {object} controllers.CallResult
// @router /DeleteCategory [delete]
func (c *SkuController) DeleteCategory() {
	c.callDeleteCategory(func(params *tSkuDeleteCategoryParams) (retVal interface{}, errCode string, err error) {
		retVal, err = cms.DeleteCategory(params.Ctx, params.CategoryID, params.Ctx.GetUserName())
		return retVal, "", err
	})
}

// @Title 同步商家SKU类别
// @Description 同步商家SKU类别
// @Param	token			header		string	true	"认证token"
// @Param	categoryID		query		int		true	"SKU类别ID, -1表示所有"
// @Param	isAsync			query		bool	false	"是否异步"
// @Success 200 {object} controllers.CallResult
// @Failure 200 {object} controllers.CallResult
// @router /SyncCategory [put]
func (c *SkuController) SyncCategory() {
	c.callSyncCategory(func(params *tSkuSyncCategoryParams) (retVal interface{}, errCode string, err error) {
		db := dao.GetDB()
		retVal, err = cms.CurVendorSync.SyncCategory(params.Ctx, db, params.CategoryID, params.IsAsync, params.Ctx.GetUserName())
		return retVal, "", err
	})
}

// @Title 得到商品信息
// @Description 得到商品信息，如下条件之间是与的关系
// @Param	token			  header	string	true	"认证token"
// @Param	keyword			  query		string	false	"查询关键字（可以为空，为空表示不限制）"
// @Param	nameIDs			  query		string	false	"SkuName IDs列表"
// @Param	skuIDs			  query		string	false	"Sku ID列表"
// @Param	vendorSkuIDs	  query		string	false	"厂商SKU ID列表"
// @Param	name			  query		string	false	"商品名称（不要求完全一致）"
// @Param	prefix			  query		string	false	"商品前缀（不要求完全一致）"
// @Param	placeCond		  query		string	false	"查询地点的条件（如果此字段没有设置，placeCode与isGlobal无效），and：与，or：或，指的是placeCode，isGlobal这两个条件间的关系，这组条件与其它条件都是与的关系"
// @Param	placeCode		  query		int		false	"可售地点Code"
// @Param	isGlobal		  query		bool	false	"是否全球可售"
// @Param	categoryID		  query		int		false	"商品名所属类别ID"
// @Param	skuCategoryID	  query		int		false	"商品所属类别ID"
// @Param	unit			  query		string	false	"商品单位"
// @Param	isSpu			  query		bool	false	"是否是SPU"
// @Param	isExd			  query		bool	false	"是否是饿鲜达商品"
// @Param	fromStatus		  query		int		false	"查询起始状态（0：下架，1：正常）"
// @Param	toStatus		  query		int		false	"查询起始状态（0：下架，1：正常）"
// @Param	offset			  query		int		false	"门店列表起始序号（以0开始，缺省为0）"
// @Param	pageSize		  query		int		false	"门店列表页大小（缺省为50，-1表示全部）"
// @Param	isBySku			  query		bool	false	"是否将sku拆开，缺省为false"
// @Param	isQueryMidPrice	  query		bool	false	"是否查询中位价缺省为false"
// @Success 200 {object} controllers.CallResult
// @Failure 200 {object} controllers.CallResult
// @router /GetSkuNames [get,post]
func (c *SkuController) GetSkuNames() {
	c.callGetSkuNames(func(params *tSkuGetSkuNamesParams) (retVal interface{}, errCode string, err error) {
		retVal, err = cms.GetSkuNames(params.Ctx, params.Keyword, params.IsBySku, params.IsQueryMidPrice, params.MapData, params.Offset, params.PageSize)
		return retVal, "", err
	})
}

// @Title 新增商品名（及商品）信息
// @Description 新增商品名（及商品）信息
// @Param	token			header		string	true	"认证token"
// @Param	payload			formData	string	true	"json数据，SkuNameExt对象()，可传Skus及Places"
// @Success 200 {object} controllers.CallResult
// @Failure 200 {object} controllers.CallResult
// @router /AddSkuName [post]
func (c *SkuController) AddSkuName() {
	c.callAddSkuName(func(params *tSkuAddSkuNameParams) (retVal interface{}, errCode string, err error) {
		skuName := &model.SkuNameExt{}
		if err = utils.UnmarshalUseNumber([]byte(params.Payload), skuName); err == nil {
			retVal, err = cms.AddSkuName(params.Ctx, skuName, params.Ctx.GetUserName())
		}
		return retVal, "", err
	})
}

// @Title 获取美团商品信息添加到本地
// @Description 获取美团商品信息添加到本地
// @Param	token			header		string	true	"认证token"
// @Param	vendorSkuName	formData	string	true	"平台商品名称"
// @Param	vendorOrderID	formData	string	true	"订单id"
// @Success 200 {object} controllers.CallResult
// @Failure 200 {object} controllers.CallResult
// @router /MTSku2Local [post]
func (c *SkuController) MTSku2Local() {
	c.callMTSku2Local(func(params *tSkuMTSku2LocalParams) (retVal interface{}, errCode string, err error) {
		retVal, err = cms.GetMtSkuDetailInfo(params.Ctx, params.VendorOrderID, params.VendorSkuName)
		return retVal, "", err
	})
}

// @Title 修改商品名信息
// @Description 修改商品名信息，注意：如果Places没有变动，不要传此字段，否则会导致不必要的删除与新增
// @Param	token			header		string	true	"认证token"
// @Param	nameID			formData	int		true	"需要修改的商品名ID，payload中的相应数据会被忽略"
// @Param	payload			formData	string	true	"json数据，SkuNameExt对象()，Skus无效, Places有效"
// @Param	isExd			formData	bool	fasle	"是否要修改饿鲜达商品"
// @Success 200 {object} controllers.CallResult
// @Failure 200 {object} controllers.CallResult
// @router /UpdateSkuName [put]
func (c *SkuController) UpdateSkuName() {
	c.callUpdateSkuName(func(params *tSkuUpdateSkuNameParams) (retVal interface{}, errCode string, err error) {
		// var payload map[string]interface{}
		// dummySkuName := &model.SkuName{}
		payload := make(map[string]interface{})
		if err = utils.UnmarshalUseNumber([]byte(params.Payload), &payload); err == nil {
			delete(payload, "exPrefix")
			delete(payload, "exPrefixBegin")
			delete(payload, "exPrefixEnd")
			delete(payload, "imgWaterMark")
			delete(payload, "exVendorID")
			retVal, err = cms.UpdateSkuName(params.Ctx, params.NameID, payload, params.IsExd)
		}
		return retVal, "", err
	})
}

// @Title 仅修改商品图片
// @Description 仅在本地数据库修改商品图片
// @Param	token			header		string	true	"认证token"`
// @Param	skuID			formData	int		true	"商品名ID"
// @Param	payload			formData	string	true	"商品图片"
// @Success 200 {object} controllers.CallResult
// @Failure 200 {object} controllers.CallResult
// @router /UpdateSkuImg [put]
func (c *SkuController) UpdateSkuImg() {
	c.callUpdateSkuImg(func(params *tSkuUpdateSkuImgParams) (retVal interface{}, errCode string, err error) {
		payload := make(map[string]interface{})
		if err = utils.UnmarshalUseNumber([]byte(params.Payload), &payload); err == nil {
			retVal, err = cms.UpdateSkuImg(params.Ctx, params.SkuID, payload)
		}
		return retVal, "", nil
	})
}

// @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.Ctx, params.NameID, params.Ctx.GetUserName())
		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.Ctx, params.NameID, sku, params.Ctx.GetUserName())
		}
		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.Ctx, params.SkuID, payload)
		}
		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.Ctx, params.SkuID, params.Ctx.GetUserName())
		return retVal, "", err
	})
}

// @Title 新增商品名可售地点绑定（不推荐使用）
// @Description 新增商品名可售地点绑定（不推荐使用）
// @Param	token			header		string	true	"认证token"
// @Param	nameID			formData	int		true	"商品名ID"
// @Param	placeCode		formData	int		true	"地点代码"
// @Success 200 {object} controllers.CallResult
// @Failure 200 {object} controllers.CallResult
// @router /AddSkuNamePlace [post]
func (c *SkuController) AddSkuNamePlace() {
	c.callAddSkuNamePlace(func(params *tSkuAddSkuNamePlaceParams) (retVal interface{}, errCode string, err error) {
		retVal, err = cms.AddSkuNamePlace(params.Ctx, params.NameID, params.PlaceCode, params.Ctx.GetUserName())
		return retVal, "", err
	})
}

// @Title 删除商品名可售地点绑定（不推荐使用）
// @Description 删除商品名可售地点绑定（不推荐使用）
// @Param	token			header		string	true	"认证token"
// @Param	nameID			query		int		true	"商品名ID"
// @Param	placeCode		query		int		true	"地点代码"
// @Success 200 {object} controllers.CallResult
// @Failure 200 {object} controllers.CallResult
// @router /DeleteSkuNamePlace [delete]
func (c *SkuController) DeleteSkuNamePlace() {
	c.callDeleteSkuNamePlace(func(params *tSkuDeleteSkuNamePlaceParams) (retVal interface{}, errCode string, err error) {
		retVal, err = cms.DeleteSkuNamePlace(params.Ctx, params.NameID, params.PlaceCode, params.Ctx.GetUserName())
		return retVal, "", err
	})
}

// // @Title 远程查询厂商SKU信息
// // @Description 远程查询厂商SKU信息，这个是实时调用API远程查询（不推荐使用）
// // @Param	token			header		string	true	"认证token"
// // @Param	vendorSkuID		query		string	true	"sku ID"
// // @Param	vendorID		query		int		true	"门店所属的厂商ID"
// // @Param	vendorOrgCode	query		string	false	"厂商内组织代码"
// // @Success 200 {object} controllers.CallResult
// // @Failure 200 {object} controllers.CallResult
// // @router /GetVendorSku [get]
// func (c *SkuController) GetVendorSku() {
// 	c.callGetVendorSku(func(params *tSkuGetVendorSkuParams) (retVal interface{}, errCode string, err error) {
// 		retVal, err = cms.GetVendorSku(params.Ctx, params.VendorID, params.VendorOrgCode, params.VendorSkuID)
// 		return retVal, "", err
// 	})
// }

// @Title 同步商家SKU
// @Description 同步商家SKU
// @Param	token			header		string	true	"认证token"
// @Param	nameID			formData		int		true	"name ID, -1表示所有"
// @Param	skuID			formData		int		true	"sku ID, -1表示所有"
// @Param	isAsync			formData		bool	false	"是否异步"
// @Param	isContinueWhenError	formData	bool	false	"单个同步失败是否继续，缺省false"
// @Success 200 {object} controllers.CallResult
// @Failure 200 {object} controllers.CallResult
// @router /SyncSku [put]
func (c *SkuController) SyncSku() {
	c.callSyncSku(func(params *tSkuSyncSkuParams) (retVal interface{}, errCode string, err error) {
		db := dao.GetDB()
		retVal, err = cms.CurVendorSync.SyncSku(params.Ctx, db, params.NameID, params.SkuID, params.IsAsync, params.IsContinueWhenError, params.Ctx.GetUserName())
		return retVal, "", err
	})
}

// @Title 获取敏感词列表
// @Description 获取敏感词列表
// @Param	token			header		string	true	"认证token"
// @Param	vendorID		query		int		false	"VendorID"
// @Success 200 {object} controllers.CallResult
// @Failure 200 {object} controllers.CallResult
// @router /GetSensitiveWordList [get]
func (c *SkuController) GetSensitiveWordList() {
	c.callGetSensitiveWordList(func(params *tSkuGetSensitiveWordListParams) (retVal interface{}, errCode string, err error) {
		sensitiveWordList, err := dao.GetSensitiveWordList(params.VendorID)
		var wordList []string
		for _, value := range sensitiveWordList {
			wordList = append(wordList, value.Word)
		}
		retVal = wordList
		return retVal, "", err
	})
}

// @Title 插入敏感词列表
// @Description 插入敏感词列表
// @Param	token			header		string	true	"认证token"
// @Param	word			formData	string	true	"关键词名字"
// @Param	vendorID		formData	int		false	"VendorID"
// @Success 200 {object} controllers.CallResult
// @Failure 200 {object} controllers.CallResult
// @router /InsertSensitiveWord [post]
func (c *SkuController) InsertSensitiveWord() {
	c.callInsertSensitiveWord(func(params *tSkuInsertSensitiveWordParams) (retVal interface{}, errCode string, err error) {
		err = dao.InsertSensitiveWord(params.Word, params.VendorID, params.Ctx.GetUserName())
		return retVal, "", err
	})
}

// @Title 修改敏感词列表
// @Description 修改敏感词列表
// @Param	token			header		string	true	"认证token"
// @Param	word			formData	string	true	"关键词名字"
// @Param	vendorID		formData	int		false	"VendorID"
// @Param	ID				formData	int		false	"关键词ID"
// @Param	Status			formData	int		false	"状态，0为修改默认，1为删除"
// @Success 200 {object} controllers.CallResult
// @Failure 200 {object} controllers.CallResult
// @router /UpdateSensitiveWord [put]
func (c *SkuController) UpdateSensitiveWord() {
	c.callUpdateSensitiveWord(func(params *tSkuUpdateSensitiveWordParams) (retVal interface{}, errCode string, err error) {
		//word := &model.SensitiveWord{
		//	VendorID: params.VendorID,
		//	Word:     params.Word,
		//}
		words, err := dao.GetSensitiveWordList(params.VendorID)
		word := words[0]
		word.Word = params.Word
		if params.ID != 0 {
			word.ModelIDCULD.ID = params.ID
		}
		if params.Status == 1 {
			retVal, err = dao.DeleteSensitiveWord(word, params.ID, params.Ctx.GetUserName(), params.VendorID)
		} else {
			retVal, err = dao.UpdateSensitiveWord(word, params.VendorID, params.ID, params.Ctx.GetUserName())
		}
		return retVal, "", err
	})
}

// @Title 子分类下商品的重排序
// @Description 子分类下商品的重排序
// @Param	token			header		string	true	"认证token"
// @Param	catID			formData	int		true	"商品子分类"
// @Param	skuIDs			formData	string	true	"商品子分类下商品列表"
// @Success 200 {object} controllers.CallResult
// @Failure 200 {object} controllers.CallResult
// @router /SortCategorySkus [post]
func (c *SkuController) SortCategorySkus() {
	c.callSortCategorySkus(func(params *tSkuSortCategorySkusParams) (retVal interface{}, errCode string, err error) {
		var skuIDList []int
		if err = jxutils.Strings2Objs(params.SkuIDs, &skuIDList); err == nil {
			err = cms.SortCategorySkus(params.Ctx, params.CatID, skuIDList)
		}

		return retVal, "", err
	})
}

// @Title 按照当前城市近30天销量排序，显示本店价格，附近5公里平均价格，差评数量，本店销量情况，本市总销量，
// @Description 按照当前城市近30天销量排序，显示本店价格，附近5公里平均价格，差评数量，本店销量情况，本市总销量，
// @Param	token			header		string	true	"认证token"
// @Param	storeID			query		int		true	"京西门店ID"
// @Success 200 {object} controllers.CallResult
// @Failure 200 {object} controllers.CallResult
// @router /GetStoreSkuSalesInfo [get]
func (c *SkuController) GetStoreSkuSalesInfo() {
	c.callGetStoreSkuSalesInfo(func(params *tSkuGetStoreSkuSalesInfoParams) (retVal interface{}, errCode string, err error) {
		retVal, err = misc.GetStoreSkuSalesInfo(params.Ctx, params.StoreID)
		return retVal, "", err
	})
}

// @Title 根据名字查询京东商品UPC信息
// @Description 根据名字查询京东商品UPC信息
// @Param	token			header		string	true	"认证token"
// @Param	name			query		string	false	"商品名"
// @Param	upcCode			query		string	false	"upcCode,不支持模糊"
// @Success 200 {object} controllers.CallResult
// @Failure 200 {object} controllers.CallResult
// @router /GetJdUpcCodeByName [get]
func (c *SkuController) GetJdUpcCodeByName() {
	c.callGetJdUpcCodeByName(func(params *tSkuGetJdUpcCodeByNameParams) (retVal interface{}, errCode string, err error) {
		retVal, err = cms.GetJdUpcCodeByName(params.Ctx, params.Name, params.UpcCode)
		return retVal, "", err
	})
}

// @Title 批量设置商品额外前缀
// @Description 批量设置商品额外前缀
// @Param	token				header			string	true	"认证token"
// @Param	nameIDs				formData		string	true	"商品nameIDs"
// @Param	exPrefix			formData		string	false	"商品额外前缀"
// @Param	fromDate			formData		string	true	"生效开始时间,格式 2006-01-01 "
// @Param	toDate				formData		string	true	"生效结束时间,格式 2006-01-01 "
// @Param	imgWaterMark		formData		string	false	"商品水印图"
// @Param	vendorID			formData		int		true	"平台ID"
// @Param	isAsync				formData		bool	false	"是否异步"
// @Param	isContinueWhenError	formData		bool	false	"单个同步失败是否继续，缺省false"
// @Success 200 {object} controllers.CallResult
// @Failure 200 {object} controllers.CallResult
// @router /UpdateSkuNamesExPrefix [put]
func (c *SkuController) UpdateSkuNamesExPrefix() {
	c.callUpdateSkuNamesExPrefix(func(params *tSkuUpdateSkuNamesExPrefixParams) (retVal interface{}, errCode string, err error) {
		var skuIDList []int
		if err = jxutils.Strings2Objs(params.NameIDs, &skuIDList); err == nil {
			retVal, err = cms.UpdateSkuNamesExPrefix(params.Ctx, skuIDList, params.ImgWaterMark, params.VendorID, params.ExPrefix, params.FromDate, params.ToDate, params.IsAsync, params.IsContinueWhenError)
		}
		return retVal, "", err
	})
}

// @Title 合并饿鲜达商品库(必须要在饿鲜达系统中先导入商品)
// @Description 合并饿鲜达商品库(必须要在饿鲜达系统中先导入商品)
// @Param	token				header			string	true	"认证token"
// @Param	isAsync				formData		bool	false	"是否异步"
// @Param	isContinueWhenError	formData		bool	false	"单个同步失败是否继续，缺省false"
// @Success 200 {object} controllers.CallResult
// @Failure 200 {object} controllers.CallResult
// @router /SumExianDaDepot [put]
func (c *SkuController) SumExianDaDepot() {
	c.callSumExianDaDepot(func(params *tSkuSumExianDaDepotParams) (retVal interface{}, errCode string, err error) {
		retVal, err = cms.SumExianDaDepot(params.Ctx, params.IsAsync, params.IsContinueWhenError)
		return retVal, "", err
	})
}

// @Title 根据饿百上已经分类的商品刷新京西库中饿鲜达商品分类
// @Description 根据饿百上已经分类的商品刷新京西库中饿鲜达商品分类
// @Param	token				header			string	true	"认证token"
// @Param	isAsync				formData		bool	false	"是否异步"
// @Param	isContinueWhenError	formData		bool	false	"单个同步失败是否继续，缺省false"
// @Success 200 {object} controllers.CallResult
// @Failure 200 {object} controllers.CallResult
// @router /UpdateExianDaSkuCategory [put]
func (c *SkuController) UpdateExianDaSkuCategory() {
	c.callUpdateExianDaSkuCategory(func(params *tSkuUpdateExianDaSkuCategoryParams) (retVal interface{}, errCode string, err error) {
		retVal, err = cms.UpdateExianDaSkuCategory(params.Ctx, params.IsAsync, params.IsContinueWhenError)
		return retVal, "", err
	})
}

// @Title 根据Excel创建标品
// @Description 根据Excel创建标品
// @Param	token				header		string	true	"认证token"
// @Param	categroyID			formData	int		true	"分类ID"
// @Success 200 {object} controllers.CallResult
// @Failure 200 {object} controllers.CallResult
// @router /CreateUpcSkuByExcel [post]
func (c *SkuController) CreateUpcSkuByExcel() {
	c.callCreateUpcSkuByExcel(func(params *tSkuCreateUpcSkuByExcelParams) (retVal interface{}, errCode string, err error) {
		r := c.Ctx.Request
		files := r.MultipartForm.File["userfiles"]
		retVal, err = cms.CreateUpcSkuByExcel(params.Ctx, files, params.CategroyID)
		return retVal, "", err
	})
}

// @Title 恢复被删除的京东商品库
// @Description
// @Param	token				header		string	true	"认证token"
// @Success 200 {object} controllers.CallResult
// @Failure 200 {object} controllers.CallResult
// @router /RefreshJdDepot [post]
func (c *SkuController) RefreshJdDepot() {
	c.callRefreshJdDepot(func(params *tSkuRefreshJdDepotParams) (retVal interface{}, errCode string, err error) {
		err = cms.RefreshJdDepot(params.Ctx)
		return retVal, "", err
	})
}

// @Title 批量设置商品额外信息
// @Description 批量设置商品额外信息
// @Param	token				header			string	true	"认证token"
// @Param	nameIDs				formData		string	true	"商品nameIDs"
// @Param	exPrefix			formData		string	false	"商品额外前缀"
// @Param	fromDate			formData		string	true	"生效开始时间,格式 2006-01-01 "
// @Param	toDate				formData		string	true	"生效结束时间,格式 2006-01-01 "
// @Param	imgWaterMark		formData		string	false	"商品水印图"
// @Param	brandID				formData		int		false	"品牌ID"
// @Param	vendorID			formData		int		true	"平台ID"
// @Param	storeId				formData		string	false	"门店ID"
// @Param	vendorOrgCode		formData		string	true	"平台账号"
// @Param	isAsync				formData		bool	false	"是否异步"
// @Param	isContinueWhenError	formData		bool	false	"单个同步失败是否继续，缺省false"
// @Success 200 {object} controllers.CallResult
// @Failure 200 {object} controllers.CallResult
// @router /UpdateSkuExinfoMap [put]
func (c *SkuController) UpdateSkuExinfoMap() {
	c.callUpdateSkuExinfoMap(func(params *tSkuUpdateSkuExinfoMapParams) (retVal interface{}, errCode string, err error) {
		var skuIDList, storeIds []int
		if err = jxutils.Strings2Objs(params.NameIDs, &skuIDList, params.StoreId, &storeIds); err == nil {
			retVal, err = cms.UpdateSkuExinfoMap(params.Ctx, skuIDList, params.ImgWaterMark, params.BrandID, params.VendorID, params.VendorOrgCode, params.ExPrefix, params.FromDate, params.ToDate, params.IsAsync, params.IsContinueWhenError, storeIds)
		}
		return retVal, "", err
	})
}

// @Title 批量设置商品额外信息
// @Description 批量设置商品额外信息
// @Param	token				header			string	true	"认证token"
// @Param	exPrefix			formData		string	false	"商品额外前缀"
// @Param	fromDate			formData		string	true	"生效开始时间,格式 2006-01-01 "
// @Param	toDate				formData		string	true	"生效结束时间,格式 2006-01-01 "
// @Param	imgWaterMark		formData		string	false	"商品水印图"
// @Param	vendorID			formData		int		true	"平台ID"
// @Param	storeId				formData		int		true	"京西门店ID"
// @Param	isAsync				formData		bool	false	"是否异步"
// @Param	isContinueWhenError	formData		bool	false	"单个同步失败是否继续，缺省false"
// @Success 200 {object} controllers.CallResult
// @Failure 200 {object} controllers.CallResult
// @router /UpdateVendorSkuImg [put]
func (c *SkuController) UpdateVendorSkuImg() {
	c.callUpdateVendorSkuImg(func(params *tSkuUpdateVendorSkuImgParams) (retVal interface{}, errCode string, err error) {
		retVal, err = cms.UpdateVendorImg(params.Ctx, params.StoreId, params.ImgWaterMark, params.VendorID, params.ExPrefix, params.FromDate, params.ToDate, params.IsAsync, params.IsContinueWhenError)
		return retVal, "", err
	})
}

// @Title 删除已经存在文件
// @Description 删除已经存在文件
// @Param	token				header			string	true	"认证token"
// @Param	name				formData		string	true	"文件名称"
// @Success 200 {object} controllers.CallResult
// @Failure 200 {object} controllers.CallResult
// @router /DeleteVendorSkuImg [post]
func (c *SkuController) DeleteVendorSkuImg() {
	c.callDeleteVendorSkuImg(func(params *tSkuDeleteVendorSkuImgParams) (retVal interface{}, errCode string, err error) {
		err = jxutils.DeleteExportContent(params.Name)
		return retVal, "", err
	})

}

// @Title 得到平台类别
// @Description 得到平台类别
// @Param	token			header		string	true	"认证token"
// @Param	parentID		query		int		false	"父ID"
// @Param	level			query		int		false	"分类等级"
// @Param	vendorOrgCode	query		string	true	"账号ID"
// @Param	vendorID		query		int		true	"平台ID"
// @Success 200 {object} controllers.CallResult
// @Failure 200 {object} controllers.CallResult
// @router /GetVendorCategoryMap [get]
func (c *SkuController) GetVendorCategoryMap() {
	c.callGetVendorCategoryMap(func(params *tSkuGetVendorCategoryMapParams) (retVal interface{}, errCode string, err error) {
		retVal, err = cms.GetVendorCategoryMap(params.Ctx, params.ParentID, params.Level, params.VendorID, params.VendorOrgCode)
		return retVal, "", err
	})
}

// @Title 新增平台类别
// @Description 新增平台类别
// @Param	token				header		string	true	"认证token"
// @Param	vendorID			formData	int		true	"平台ID"
// @Param	vendorOrgCode		formData	string	true	"账号ID"
// @Param	categroyID			formData	int		false	"京西分类id"
// @Param	level				formData	int		true	"分类级别"
// @Param	parentID			formData	int		true	"分类父ID"
// @Param	vendorCategoryName	formData	string	true	"类别name"
// @Param	vendorCategorySeq	formData	int		true	"类别序号"
// @Success 200 {object} controllers.CallResult
// @Failure 200 {object} controllers.CallResult
// @router /AddVendorCategoryMap [post]
func (c *SkuController) AddVendorCategoryMap() {
	c.callAddVendorCategoryMap(func(params *tSkuAddVendorCategoryMapParams) (retVal interface{}, errCode string, err error) {
		vendorCategoryMap := &model.VendorCategoryMap{
			VendorID:           params.VendorID,
			VendorOrgCode:      params.VendorOrgCode,
			CategoryID:         params.CategroyID,
			VendorCategoryName: params.VendorCategoryName,
			VendorCategorySeq:  params.VendorCategorySeq,
			Level:              params.Level,
			ParentID:           params.ParentID,
		}
		retVal, err = cms.AddVendorCategoryMap(params.Ctx, vendorCategoryMap)
		return retVal, "", err
	})
}

// @Title 修改平台类别
// @Description 修改平台类别
// @Param	token				header		string	true	"认证token"
// @Param	ID					formData	int		true	"记录ID"
// @Param	categoryID			formData	int		false	"京西分类id"
// @Param	vendorCategoryName	formData	string	false	"类别name"
// @Param	level				formData	int		true	"分类级别"
// @Param	parentID			formData	int		true	"分类父ID"
// @Param	isDelete			formData	bool	false	"是否是删除操作，默认false"
// @Success 200 {object} controllers.CallResult
// @Failure 200 {object} controllers.CallResult
// @router /UpdateVendorCategoryMap [put]
func (c *SkuController) UpdateVendorCategoryMap() {
	c.callUpdateVendorCategoryMap(func(params *tSkuUpdateVendorCategoryMapParams) (retVal interface{}, errCode string, err error) {
		vendorCategoryMap := &model.VendorCategoryMap{
			CategoryID:         params.CategoryID,
			VendorCategoryName: params.VendorCategoryName,
			Level:              params.Level,
			ParentID:           params.ParentID,
		}
		retVal, err = cms.UpdateVendorCategoryMap(params.Ctx, params.ID, vendorCategoryMap, params.IsDelete)
		return retVal, "", err
	})
}

// @Title 平台类别重排序
// @Description 平台类别重排序
// @Param	token			header		string	true	"认证token"
// @Param	categoryID		formData	int		true	"父ID"
// @Param	vendorID		formData	int		true	"平台ID"
// @Param	vendorOrgCode	formData	string	true	"账号ID"
// @Param	categoryIDs		formData	string	true	"同一父类别下的所有子类别ID列表([1,2,3,4])"
// @Success 200 {object} controllers.CallResult
// @Failure 200 {object} controllers.CallResult
// @router /ReorderVendorCategories [put]
func (c *SkuController) ReorderVendorCategories() {
	c.callReorderVendorCategories(func(params *tSkuReorderVendorCategoriesParams) (retVal interface{}, errCode string, err error) {
		var idList []int
		if err = utils.UnmarshalUseNumber([]byte(params.CategoryIDs), &idList); err == nil {
			err = cms.ReorderVendorCategories(params.Ctx, params.CategoryID, params.VendorID, params.VendorOrgCode, idList)
		}
		return retVal, "", err
	})
}

// @Title 复制平台类别
// @Description 复制平台类别
// @Param	token				header		string	true	"认证token"
// @Param	fromVendorOrgCode	formData	int		true	"源平台ID"
// @Param	vendorID			formData	int		true	"平台ID"
// @Param	toVendorOrgCodes	formData	string	true	"目标平台的IDs"
// @Param	categoryIDs			formData	string	false	"原平台的分类IDs,不传代表整个复制"
// @Param	isAsync				formData	bool	false	"是否异步操作"
// @Param	isContinueWhenError	formData	bool	false	"单个同步失败是否继续，缺省false"
// @Success 200 {object} controllers.CallResult
// @Failure 200 {object} controllers.CallResult
// @router /CopyVendorCategories [put]
func (c *SkuController) CopyVendorCategories() {
	c.callCopyVendorCategories(func(params *tSkuCopyVendorCategoriesParams) (retVal interface{}, errCode string, err error) {
		return retVal, "", err
	})
}

// @Title 平台分类读取门店分类
// @Description 平台分类读取门店分类
// @Param	token				header		string	true	"认证token"
// @Param	vendorOrgCode		formData	string	true	"账号ID"
// @Param	vendorID			formData	int		true	"平台ID"
// @Param	storeID				formData	int		true	"门店ID"
// @Success 200 {object} controllers.CallResult
// @Failure 200 {object} controllers.CallResult
// @router /LoadStoreVendorCategories [post]
func (c *SkuController) LoadStoreVendorCategories() {
	c.callLoadStoreVendorCategories(func(params *tSkuLoadStoreVendorCategoriesParams) (retVal interface{}, errCode string, err error) {
		err = cms.LoadStoreVendorCategories(params.Ctx, params.VendorOrgCode, params.VendorID, params.StoreID)
		return retVal, "", err
	})
}

// @Title 刷新没图的商品
// @Description 刷新没图的商品
// @Param	token				header		string	true	"认证token"
// @Param	skuNameID			formData	int	    false	"门店ID"
// @Success 200 {object} controllers.CallResult
// @Failure 200 {object} controllers.CallResult
// @router /RefreshNoImgSku [post]
func (c *SkuController) RefreshNoImgSku() {
	c.callRefreshNoImgSku(func(params *tSkuRefreshNoImgSkuParams) (retVal interface{}, errCode string, err error) {
		err = cms.RefreshNoImgSku(params.Ctx, params.SkuNameID)
		return retVal, "", err
	})
}

// @Title 得到商品信息2
// @Description 得到商品信息2
// @Param	token			  header	string	true	"认证token"
// @Param	keyword			  query		string	false	"查询关键字（可以为空，为空表示不限制）"
// @Param	nameIDs			  query		string	false	"SkuName IDs列表"
// @Param	skuIDs			  query		string	false	"Sku ID列表"
// @Param	categoryID		  query		int		false	"商品名所属类别ID"
// @Param	status		  	  query		int		false	"查询起始状态（0：下架，1：正常, -1全部）"
// @Param	isBySku			  query		bool	false	"是否将sku拆开，缺省为false"
// @Param	bestSeller		  query		int		false	"是否为畅销品[0-不是/1-是]"
// @Param	minPrice		  query		int		false	"最低价"
// @Param	maxPrice		  query		int		false	"最高价"
// @Param	offset			  query		int		false	"门店列表起始序号（以0开始，缺省为0）"
// @Param	pageSize		  query		int		false	"门店列表页大小（缺省为50，-1表示全部）"
// @Success 200 {object} controllers.CallResult
// @Failure 200 {object} controllers.CallResult
// @router /GetSkuNamesNew [get]
func (c *SkuController) GetSkuNamesNew() {
	c.callGetSkuNamesNew(func(params *tSkuGetSkuNamesNewParams) (retVal interface{}, errCode string, err error) {
		var skuIDs, skuNameIDs []int
		if err = jxutils.Strings2Objs(params.SkuIDs, &skuIDs, params.NameIDs, &skuNameIDs); err == nil {
			retVal, err = cms.GetSkuNamesNew(params.Ctx, params.Keyword, skuIDs, skuNameIDs, params.CategoryID, params.Status, params.IsBySku, params.Offset, params.PageSize, params.BestSeller, params.MaxPrice, params.MinPrice)
		}
		return retVal, "", err
	})
}

// @Title 设置商品为热销/取消热销商品
// @Description 设置商品为热销/取消热销商品
// @Param	token			  header	string	true	"认证token"
// @Param	skuNameId		  query		string	true	"商品nameId,多个用逗号分割"
// @Param	bestSeller		  query		int		true	"是否为热销[0不是/1是]"
// @Success 200 {object} controllers.CallResult
// @Failure 200 {object} controllers.CallResult
// @router /SetSkuBestSeller [post]
func (c *SkuController) SetSkuBestSeller() {
	c.callSetSkuBestSeller(func(params *tSkuSetSkuBestSellerParams) (retVal interface{}, errCode string, err error) {
		nameIds := strings.Split(params.SkuNameId, ",")
		err = cms.SetSkuNameSeller(utils.StringSlice2Int64(nameIds), params.BestSeller)
		return nil, "", err
	})
}

// @Title 根据分类id获取平台属性值
// @Description 根据分类id获取平台属性值
// @Param	token			  header	string	true	"认证token"
// @Param	categoryId		  query		int64	false	"抖音分类id"
// @Param	vendorOrgCode	  query		string	false	"默认的平台id(现在是测试门店id/后面改成京西的id)"
// @Success 200 {object} controllers.CallResult
// @Failure 200 {object} controllers.CallResult
// @router /GetTiktokCategoryValue [get]
func (c *SkuController) GetTiktokCategoryValue() {
	c.callGetTiktokCategoryValue(func(params *tSkuGetTiktokCategoryValueParams) (interface{}, string, error) {
		data, err := tiktok_store.GetProductFormatNew(int64(params.CategoryId), params.VendorOrgCode)
		return data, "", err
	})
}

// @Title 更新最新的分类树
// @Description 更新最新的分类树
// @Param	token			  header	string	true	"认证token"
// @Success 200 {object} controllers.CallResult
// @Failure 200 {object} controllers.CallResult
// @router /BatchGetChannelCategoryMapping [get]
func (c *SkuController) BatchGetChannelCategoryMapping() {
	c.callGetTiktokCategoryValue(func(params *tSkuGetTiktokCategoryValueParams) (interface{}, string, error) {
		err := tiktok_store.BatchGetChannelCategoryMapping()
		return nil, "", err
	})
}

// @Title 根据美团分类id获取平台扩展规则
// @Description 根据美团分类id获取平台扩展规则
// @Param	token			  header	string	true	"认证token"
// @Param	categoryId	 	 query		int64	true	"类目id"
// @Param	vendorId	  	  query		int64	true	"平台分类ID"
// @Success 200 {object} controllers.CallResult
// @Failure 200 {object} controllers.CallResult
// @router /GetMTProductRule [get]
func (c *SkuController) GetMTProductRule() {
	c.callGetMTProductRule(func(params *tSkuGetMTProductRuleParams) (retVal interface{}, errCode string, err error) {
		switch params.VendorId {
		case model.VendorIDMTWM:
			retVal, err = mtwm.GetMTProductRule(params.CategoryId)
		case model.VendorIDEBAI:
			retVal, err = ebai.GetCategoryAttrValueList(int64(params.CategoryId))
		}
		return retVal, "", err
	})

}

// @Title 根据美团分类id获取平台属性值
// @Description 根据美团分类id获取平台属性值
// @Param	token			  header	string	true	"认证token"
// @Param	appOrgCode		  query		string	true	"美团app"
// @Param	categoryId		  query		int64	true	"美团类目id"
// @Success 200 {object} controllers.CallResult
// @Failure 200 {object} controllers.CallResult
// @router /GetMTCategoryAttrList [get]
func (c *SkuController) GetMTCategoryAttrList() {
	c.callGetMTCategoryAttrList(func(params *tSkuGetMTCategoryAttrListParams) (interface{}, string, error) {
		data, err := mtwm.GetCategoryAttrList(params.AppOrgCode, params.CategoryId)
		return data, "", err
	})
}

// @Title 根据美团属性id 查询特殊属性（品牌、产地）
// @Description 根据美团属性id 查询特殊属性（品牌、产地）
// @Param	token			  header	string	true	"认证token"
// @Param	appOrgCode		  query		string	true	"平台code"
// @Param	attrId		      query		int64	true	"属性id"
// @Param	keyword		      query		string	true	"属性值的关键词"
// @Success 200 {object} controllers.CallResult
// @Failure 200 {object} controllers.CallResult
// @router /GetMTCategoryAttrValueList [get]
func (c *SkuController) GetMTCategoryAttrValueList() {
	c.callGetMTCategoryAttrValueList(func(params *tSkuGetMTCategoryAttrValueListParams) (retVal interface{}, code string, err error) {
		retVal, err = mtwm.GetCategoryAttrValueList(params.AppOrgCode, params.Keyword, params.AttrId)
		return retVal, "", err
	})
}

// @Title 更新美团到京东分类映射
// @Description 更新美团到京东分类映射
// @Param	token				header		string	true	"认证token"
// @Param	mtCatID				formData	string	true	"美团分类ID"
// @Param	jdCatID				formData	string	true	"京东分类ID"
// @Success 200 {object} controllers.CallResult
// @Failure 200 {object} controllers.CallResult
// @router /UpdateMtCatToJd [post]
func (c *SkuController) UpdateMtCatToJd() {
	c.callUpdateMtCatToJd(func(params *tSkuUpdateMtCatToJdParams) (retVal interface{}, errCode string, err error) {
		err = cms.UpdateMtCatToJd(params.Ctx, params.MtCatID, params.JdCatID)
		return retVal, "", err
	})
}

// SyncTiktokMainSkuToLocalSku 同步抖店商品主商品id和本地商品id映射关系
// @Title 同步抖店商品主商品id和本地商品id映射关系
// @Description 同步抖店商品主商品id和本地商品id映射关系
// @Param	token				header		string		true	"认证token"
// @Param	startTime			query		int64		true	"同步商品开始时间戳"
// @Param	endTime				query		int64		true	"同步商品结束时间戳"
// @Success 200 {object} controllers.CallResult
// @Failure 200 {object} controllers.CallResult
// @router /SyncTiktokMainSkuToLocalSku [post]
func (c *SkuController) SyncTiktokMainSkuToLocalSku() {
	c.callSyncTiktokMainSkuToLocalSku(func(params *tSkuSyncTiktokMainSkuToLocalSkuParams) (interface{}, string, error) {
		var checkStatus = []int64{2, 3, 7}
		var errs = make([]error, 0)
		for _, v := range checkStatus {
			err := cms.SyncTiktokMainIdToLocal(params.Ctx, &tiktok_store.MainSku{
				AppOrgCode:  "",
				CheckStatus: v,
				StartTime:   int64(params.StartTime),
				EndTime:     int64(params.EndTime),
				Page:        0,
				PageSize:    0,
			})
			errs = append(errs, err)
		}

		return errs, "", errs[0]
	})
}

// @Title 批量设置美团商品进货价
// @Description 批量设置美团商品进货价
// @Param	token			header			string	true	"认证token"
// @Param	payload			formData	    string	true	"json数据，SpuData对象()"
// @Success 200 {object} controllers.CallResult
// @Failure 200 {object} controllers.CallResult
// @router /BatchSetRestockingPrice [post]
func (c *SkuController) BatchSetRestockingPrice() {
	c.callBatchSetRestockingPrice(func(params *tSkuBatchSetRestockingPriceParams) (interface{}, string, error) {
		payload := make(map[string][]mtwmapi.SpuData)
		if err := utils.UnmarshalUseNumber([]byte(params.Payload), &payload); err == nil {
			err = cms.BatchSetRestockingPrice(params.Ctx, payload)
		}
		return nil, "", nil
	})
}

// @Title 批量设置美团商品打包费为零
// @Description 批量设置美团商品打包费为零
// @Param	storeIDs		query			string	false	"门店ID列表"
// @Success 200 {object} controllers.CallResult
// @Failure 200 {object} controllers.CallResult
// @router /BatchSetBoxPrice [post]
func (c *SkuController) BatchSetBoxPrice() {
	c.callBatchSetBoxPrice(func(params *tSkuBatchSetBoxPriceParams) (retVal interface{}, errCode string, err error) {
		var storeIDs []int
		err = jxutils.Strings2Objs(params.StoreIDs, &storeIDs)

		err = cms.BatchSetMTBoxPrice(params.Ctx, storeIDs)
		return retVal, "", err
	})
}

type CategoryList struct {
	DdId    string `json:"dd_id"`
	Id      int    `json:"id"`
	NameId  int    `json:"name_id"`
	StoreId int    `json:"store_id"`
}

// @Title 抖店商品类目修改
// @Description 抖店商品类目修改
// @Success 200 {object} controllers.CallResult
// @Failure 200 {object} controllers.CallResult
// @router /UpdateTiktokCategory [post]
func (c *SkuController) UpdateTiktokCategory() {
	c.callUpdateTiktokCategory(func(params *tSkuUpdateTiktokCategoryParams) (interface{}, string, error) {
		var page int64 = 50
		var pageSize int64 = 100
		var count int64 = 0
		for {
			data1, total := tiktok_store.GetProductAuditList("57939570", page, pageSize)
			ddIDList := make([]string, 0, 0)
			skuList := make([]CategoryList, 0, 0)
			data2 := make(map[string]string, 0)
			db := dao.GetDB()

			for k, v := range data1 {
				vendorCatgory, _ := cms.GetVendorCategoriesByName(14, v)
				if vendorCatgory == nil || vendorCatgory.VendorCategoryID == "" {
					continue
				}
				ddIDList = append(ddIDList, k)
				data2[k] = vendorCatgory.VendorCategoryID
			}

			sql := " SELECT b.dd_id,b.store_id,s.id,s.name_id FROM store_sku_bind b INNER JOIN sku s ON b.sku_id = s.id AND s.deleted_at = ? WHERE b.dd_id IN (" + dao.GenQuestionMarks(len(ddIDList)) + ") AND b.deleted_at = ?"
			param := []interface{}{utils.DefaultTimeValue, ddIDList, utils.DefaultTimeValue}
			if err := dao.GetRows(db, &skuList, sql, param...); err != nil {
				return nil, "", err
			}
			for _, v := range skuList {
				count++
				item := &model.SkuVendorCategoryMap{
					ModelIDCULD: model.ModelIDCULD{
						CreatedAt:    time.Now(),
						UpdatedAt:    time.Now(),
						DeletedAt:    utils.DefaultTimeValue,
						LastOperator: "18981810340",
					},
					NameID:   v.NameId,
					VendorID: model.VendorIDDD,
				}

				item.VendorCategoryID = data2[v.DdId]
				skuVendorCategoryMap := &model.SkuVendorCategoryMap{}
				if err := dao.GetRow(db, skuVendorCategoryMap, `SELECT * FROM sku_vendor_category_map WHERE name_id = ? AND vendor_id = ? AND deleted_at = ?`, []interface{}{v.NameId, model.VendorIDDD, utils.DefaultTimeValue}); err != nil {
					globals.SugarLogger.Errorf("get row err : %v", err)
				}
				if skuVendorCategoryMap != nil && skuVendorCategoryMap.ID > 0 {
					if _, err := dao.UpdateEntity(db, skuVendorCategoryMap, "VendorCategoryID"); err != nil {
						globals.SugarLogger.Errorf("update err : %v", err)
					}
				} else {
					if err := dao.CreateEntity(db, item); err != nil {
						globals.SugarLogger.Errorf("create err : %v", err)
					}
				}
				go func() {
					time.Sleep(500 * time.Millisecond)
					hit, err := cms.CurVendorSync.SyncStoresSkus(params.Ctx, nil, 0, db, []int{14}, []int{v.StoreId}, []int{v.Id}, true, false, true)
					globals.SugarLogger.Debugf("hit:%s err: %v", hit, err)
				}()
			}
			if page*pageSize < total {
				page++
			} else {
				break
			}
		}
		return count, "", nil
	})
}
