根据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个数
@@ -2753,22 +2764,20 @@ 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) db = dao.GetDB()
skuBindInfos []*StoreSkuBindInfo skuIDs []int
db = dao.GetDB() result1 []interface{}
storeIDs []int
skuIDs []int
) )
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,43 +2794,72 @@ 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
} }
for _, v := range skuList { taskFunc := func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
store := batchItemList[0].(*model.Store)
var ( var (
price int skuBindInfos []*StoreSkuBindInfo
specQuality float64 skuNameMap = make(map[int]int)
skuInfoMap = make(map[int][]*StoreSkuBindSkuInfo)
) )
if v.Unit == model.SpecialUnit { for _, v := range skuList {
if v.SpecUnit == model.SpecUnitNames[1] || v.SpecUnit == model.SpecUnitNames[2] { var (
specQuality = float64(v.SpecQuality) * 1000 price int
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 { } else {
specQuality = float64(v.SpecQuality) if v.Unit == model.SpecialUnit {
if v.SpecUnit == model.SpecUnitNames[1] || v.SpecUnit == model.SpecUnitNames[2] {
specQuality = float64(v.SpecQuality) * 1000
} else {
specQuality = float64(v.SpecQuality)
}
price = int(utils.Float64TwoInt64(utils.Int2Float64(model.SpecialSpecQuality) / specQuality * utils.Int2Float64(skuMap[v.ID])))
} else {
price = skuMap[v.ID]
}
if skuNameMap[v.NameID] < price {
skuNameMap[v.NameID] = price
}
} }
price = int(utils.Float64TwoInt64(utils.Int2Float64(model.SpecialSpecQuality) / specQuality * utils.Int2Float64(skuMap[v.ID])))
} else {
price = skuMap[v.ID]
} }
if skuNameMap[v.NameID] < price { for k, v := range skuNameMap {
skuNameMap[v.NameID] = price skuBindInfo := &StoreSkuBindInfo{
NameID: k,
UnitPrice: v,
IsFocus: 1,
IsSale: 1,
Skus: skuInfoMap[k],
}
skuBindInfos = append(skuBindInfos, skuBindInfo)
} }
} tUpdate := &tUpdateStoresSkus{
for k, v := range skuNameMap { StoreID: store.ID,
skuBindInfo := &StoreSkuBindInfo{ SkuBindInfos: skuBindInfos,
NameID: k,
UnitPrice: v,
IsFocus: 1,
IsSale: 1,
} }
skuBindInfos = append(skuBindInfos, skuBindInfo) retVal = []*tUpdateStoresSkus{tUpdate}
} return retVal, err
storeList, err := dao.GetStoreList(db, nil, nil, "")
for _, v := range storeList {
storeIDs = append(storeIDs, v.ID)
} }
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 {
midPrice, _ := dao.GetMidPriceByNameID(db, store.CityCode, k, utils.Time2Date(time.Now().AddDate(0, 0, -1))) 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)))
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"},
} }
} }