根据skuid批量关注

This commit is contained in:
苏尹岚
2019-12-27 17:51:33 +08:00
parent 78238c806e
commit ed8627c58a
3 changed files with 118 additions and 44 deletions

View File

@@ -72,6 +72,12 @@ type StoreSkuBindInfo struct {
Skus []*StoreSkuBindSkuInfo `json:"skus,omitempty"` Skus []*StoreSkuBindSkuInfo `json:"skus,omitempty"`
} }
type tStoreSkuBindInfo struct {
NameID int `json:"nameID"`
UnitPrice int `json:"unitPrice"` // 对于是份的SKU就是单价每斤价格其它则为总价
IsFocused bool `json:"isFocused"` //是否关注过
}
type tStoreSkuBindAndSpec struct { type tStoreSkuBindAndSpec struct {
model.StoreSkuBind model.StoreSkuBind
SkuStatus int SkuStatus int
@@ -154,6 +160,11 @@ type DataLock struct {
locker sync.RWMutex locker sync.RWMutex
} }
type tUpdateStoresSkus struct {
StoreID int
SkuBindInfos []*StoreSkuBindInfo
}
const ( const (
maxStoreNameBind = 10000 // 最大门店SkuName bind个数 maxStoreNameBind = 10000 // 最大门店SkuName bind个数
maxStoreNameBind2 = 10000 // 最大门店乘SkuName个数 maxStoreNameBind2 = 10000 // 最大门店乘SkuName个数
@@ -2754,21 +2765,19 @@ func FocusStoreSkusByExcel(ctx *jxcontext.Context, files []*multipart.FileHeader
func FocusStoreSkusByExcelBin(ctx *jxcontext.Context, reader io.Reader, isAsync, isContinueWhenError bool) (hint string, err error) { func FocusStoreSkusByExcelBin(ctx *jxcontext.Context, reader io.Reader, isAsync, isContinueWhenError bool) (hint string, err error) {
var ( var (
skuMap = make(map[int]int) skuMap = make(map[int]int)
skuNameMap = make(map[int]int)
skuBindInfos []*StoreSkuBindInfo
db = dao.GetDB() db = dao.GetDB()
storeIDs []int
skuIDs []int skuIDs []int
result1 []interface{}
) )
sheetParam := &SheetParam{ sheetParam := &SheetParam{
OutSkuIDCol: 1, OutSkuIDCol: 1,
SkuPriceCol: 3, SkuPriceCol: 3,
SkuRow: 1, SkuRow: 1,
} }
// xlsx, err := excelize.OpenFile("111.xlsx")
taskSeqFunc := func(task *tasksch.SeqTask, step int, params ...interface{}) (result interface{}, err error) { taskSeqFunc := func(task *tasksch.SeqTask, step int, params ...interface{}) (result interface{}, err error) {
switch step { switch step {
case 0: case 0:
// xlsx, err := excelize.OpenFile("111.xlsx")
xlsx, err := excelize.OpenReader(reader) xlsx, err := excelize.OpenReader(reader)
if err != nil { if err != nil {
return result, err return result, err
@@ -2785,14 +2794,32 @@ func FocusStoreSkusByExcelBin(ctx *jxcontext.Context, reader io.Reader, isAsync,
skuIDs = append(skuIDs, k) skuIDs = append(skuIDs, k)
} }
skuList, err := dao.GetSkus(db, skuIDs, nil, nil, nil) skuList, err := dao.GetSkus(db, skuIDs, nil, nil, nil)
storeList, err := dao.GetStoreList(db, nil, nil, "")
if err != nil && len(skuList) == 0 { if err != nil && len(skuList) == 0 {
return result, err return result, err
} }
taskFunc := func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
store := batchItemList[0].(*model.Store)
var (
skuBindInfos []*StoreSkuBindInfo
skuNameMap = make(map[int]int)
skuInfoMap = make(map[int][]*StoreSkuBindSkuInfo)
)
for _, v := range skuList { for _, v := range skuList {
var ( var (
price int price int
specQuality float64 specQuality float64
) )
focusList, _ := dao.GetStoreSkuBindByNameID(db, store.ID, v.NameID, model.StoreSkuBindStatusNormal)
//有关注过
if len(focusList) > 0 {
price = 0
skuInfoMap[v.NameID] = append(skuInfoMap[v.NameID], &StoreSkuBindSkuInfo{
SkuID: v.ID,
IsSale: 1,
})
skuNameMap[v.NameID] = price
} else {
if v.Unit == model.SpecialUnit { if v.Unit == model.SpecialUnit {
if v.SpecUnit == model.SpecUnitNames[1] || v.SpecUnit == model.SpecUnitNames[2] { if v.SpecUnit == model.SpecUnitNames[1] || v.SpecUnit == model.SpecUnitNames[2] {
specQuality = float64(v.SpecQuality) * 1000 specQuality = float64(v.SpecQuality) * 1000
@@ -2807,21 +2834,32 @@ func FocusStoreSkusByExcelBin(ctx *jxcontext.Context, reader io.Reader, isAsync,
skuNameMap[v.NameID] = price skuNameMap[v.NameID] = price
} }
} }
}
for k, v := range skuNameMap { for k, v := range skuNameMap {
skuBindInfo := &StoreSkuBindInfo{ skuBindInfo := &StoreSkuBindInfo{
NameID: k, NameID: k,
UnitPrice: v, UnitPrice: v,
IsFocus: 1, IsFocus: 1,
IsSale: 1, IsSale: 1,
Skus: skuInfoMap[k],
} }
skuBindInfos = append(skuBindInfos, skuBindInfo) skuBindInfos = append(skuBindInfos, skuBindInfo)
} }
storeList, err := dao.GetStoreList(db, nil, nil, "") tUpdate := &tUpdateStoresSkus{
for _, v := range storeList { StoreID: store.ID,
storeIDs = append(storeIDs, v.ID) SkuBindInfos: skuBindInfos,
} }
retVal = []*tUpdateStoresSkus{tUpdate}
return retVal, err
}
taskParallel := tasksch.NewParallelTask("根据skuID关注商品", tasksch.NewParallelConfig().SetIsContinueWhenError(isContinueWhenError), ctx, taskFunc, storeList)
tasksch.HandleTask(taskParallel, task, true).Run()
result1, _ = taskParallel.GetResult(0)
case 2: case 2:
UpdateStoresSkus(ctx, storeIDs, skuBindInfos, false, isAsync, isContinueWhenError) for _, v := range result1 {
tUpdate := v.(*tUpdateStoresSkus)
UpdateStoresSkus(ctx, []int{tUpdate.StoreID}, tUpdate.SkuBindInfos, false, isAsync, isContinueWhenError)
}
} }
return result, err return result, err
} }
@@ -2854,9 +2892,9 @@ func GetCellForFocusStoreSkus(db *dao.DaoDB, rowNum int, row []string, sheetPara
func FocusStoreSkusBySku(ctx *jxcontext.Context, skuIDs []int, isAsync, isContinueWhenError bool) (hint string, err error) { func FocusStoreSkusBySku(ctx *jxcontext.Context, skuIDs []int, isAsync, isContinueWhenError bool) (hint string, err error) {
var ( var (
skuBindInfos []*StoreSkuBindInfo
skuNameMap = make(map[int][]*StoreSkuBindSkuInfo) skuNameMap = make(map[int][]*StoreSkuBindSkuInfo)
storeIDs []int storeIDs []int
result1 []interface{}
) )
db := dao.GetDB() db := dao.GetDB()
skuList, err := dao.GetSkus(db, skuIDs, nil, nil, nil) skuList, err := dao.GetSkus(db, skuIDs, nil, nil, nil)
@@ -2876,26 +2914,40 @@ func FocusStoreSkusBySku(ctx *jxcontext.Context, skuIDs []int, isAsync, isContin
case 1: case 1:
taskFunc := func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { taskFunc := func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
store := batchItemList[0].(*model.Store) store := batchItemList[0].(*model.Store)
var skuBindInfos []*StoreSkuBindInfo
for k, v := range skuNameMap { for k, v := range skuNameMap {
var price int
focusList, _ := dao.GetStoreSkuBindByNameID(db, store.ID, k, model.StoreSkuBindStatusNormal)
//有关注过
if len(focusList) > 0 {
price = 0
} else {
midPrice, _ := dao.GetMidPriceByNameID(db, store.CityCode, k, utils.Time2Date(time.Now().AddDate(0, 0, -1))) midPrice, _ := dao.GetMidPriceByNameID(db, store.CityCode, k, utils.Time2Date(time.Now().AddDate(0, 0, -1)))
price = midPrice
}
skuBindInfo := &StoreSkuBindInfo{ skuBindInfo := &StoreSkuBindInfo{
NameID: k, NameID: k,
UnitPrice: midPrice, UnitPrice: price,
IsFocus: 1, IsFocus: 1,
Skus: v, Skus: v,
} }
retVal = []*StoreSkuBindInfo{skuBindInfo} skuBindInfos = append(skuBindInfos, skuBindInfo)
} }
tUpdate := &tUpdateStoresSkus{
StoreID: store.ID,
SkuBindInfos: skuBindInfos,
}
retVal = []*tUpdateStoresSkus{tUpdate}
return retVal, err return retVal, err
} }
taskParallel := tasksch.NewParallelTask("根据skuID部分关注商品", tasksch.NewParallelConfig().SetIsContinueWhenError(isContinueWhenError), ctx, taskFunc, storeList) taskParallel := tasksch.NewParallelTask("根据skuID部分关注商品", tasksch.NewParallelConfig().SetIsContinueWhenError(isContinueWhenError), ctx, taskFunc, storeList)
tasksch.HandleTask(taskParallel, task, true).Run() tasksch.HandleTask(taskParallel, task, true).Run()
result1, _ := taskParallel.GetResult(0) result1, _ = taskParallel.GetResult(0)
for _, v := range result1 {
skuBindInfos = append(skuBindInfos, v.(*StoreSkuBindInfo))
}
case 2: case 2:
UpdateStoresSkus(ctx, storeIDs, skuBindInfos, false, isAsync, isContinueWhenError) for _, v := range result1 {
tUpdate := v.(*tUpdateStoresSkus)
UpdateStoresSkus(ctx, []int{tUpdate.StoreID}, tUpdate.SkuBindInfos, false, isAsync, isContinueWhenError)
}
} }
return result, err return result, err
} }

View File

@@ -1345,6 +1345,28 @@ func GetDeletedStoreSkuBind(db *DaoDB, storeID, skuID int) (storeSkuBind *model.
return storeSkuBind return storeSkuBind
} }
func GetStoreSkuBindByNameID(db *DaoDB, storeID, nameID, status int) (storeSkuBind []*model.StoreSkuBind, err error) {
sql := `
SELECT c.*
FROM sku a
JOIN store_sku_bind c ON c.sku_id = a.id
WHERE c.store_id = ?
AND a.name_id = ?
AND c.deleted_at = ?
AND a.deleted_at = ?
AND c.status = ?
`
sqlParams := []interface{}{
storeID,
nameID,
utils.DefaultTimeValue,
utils.DefaultTimeValue,
status,
}
err = GetRows(db, &storeSkuBind, sql, sqlParams...)
return storeSkuBind, err
}
func GetMidPriceByNameID(db *DaoDB, cityCode, skuNameID int, snapDate time.Time) (midPrice int, err error) { func GetMidPriceByNameID(db *DaoDB, cityCode, skuNameID int, snapDate time.Time) (midPrice int, err error) {
var ( var (
sku []*model.SkuAndName sku []*model.SkuAndName

View File

@@ -359,7 +359,7 @@ type OrderSupplementFee struct {
func (v *OrderSupplementFee) TableIndex() [][]string { func (v *OrderSupplementFee) TableIndex() [][]string {
return [][]string{ return [][]string{
[]string{"StoreID", "VendorOrderID", "SupplementTime", "VendorID", "BillID"}, []string{"StoreID", "VendorOrderID", "SupplementTime"},
} }
} }