From 3cac9bfa32fcf28fbd0329983299112741cdc2ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8B=8F=E5=B0=B9=E5=B2=9A?= <770236076@qq.com> Date: Wed, 11 Dec 2019 10:49:29 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=B7=E6=96=B0=E8=B0=83=E4=BB=B7=E5=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/jxstore/cms/store.go | 6 ++ business/jxstore/cms/store_sku.go | 144 +++++++++++++++++++----------- business/model/dao/store_sku.go | 6 +- controllers/cms_store_sku.go | 6 +- 4 files changed, 107 insertions(+), 55 deletions(-) diff --git a/business/jxstore/cms/store.go b/business/jxstore/cms/store.go index 1b6cbdbc1..185cc4f17 100644 --- a/business/jxstore/cms/store.go +++ b/business/jxstore/cms/store.go @@ -1051,6 +1051,8 @@ func AddStoreVendorMap(ctx *jxcontext.Context, db *dao.DaoDB, vendorID int, vend } else { err = ErrCanNotFindVendor } + } else { + ReCalculateJxPrice(ctx, []int{storeID}) } dao.WrapAddIDCULDEntity(storeMap, userName) if err == nil { @@ -1148,6 +1150,7 @@ func UpdateStoreVendorMap(ctx *jxcontext.Context, db *dao.DaoDB, storeID, vendor } err = nil // todo 忽略读不到DeliveryType的错误 } + if err == nil { // globals.SugarLogger.Debug(utils.Format4Output(valid, false)) if len(valid) > 0 { @@ -1168,6 +1171,9 @@ func UpdateStoreVendorMap(ctx *jxcontext.Context, db *dao.DaoDB, storeID, vendor } if err == nil && num > 0 { if valid["pricePercentage"] != nil || valid["pricePercentagePack"] != nil { + if vendorID == model.VendorIDJX { + ReCalculateJxPrice(ctx, []int{storeID}) + } storeSkuBind := &model.StoreSkuBind{} if num, err = dao.UpdateEntityLogicallyAndUpdateSyncStatus(db, storeSkuBind, nil, userName, map[string]interface{}{ model.FieldStoreID: storeID, diff --git a/business/jxstore/cms/store_sku.go b/business/jxstore/cms/store_sku.go index 9506e94c0..8167988a8 100644 --- a/business/jxstore/cms/store_sku.go +++ b/business/jxstore/cms/store_sku.go @@ -3,9 +3,7 @@ package cms import ( "errors" "fmt" - "io" "math" - "mime/multipart" "sort" "strconv" "strings" @@ -114,7 +112,7 @@ type SheetParam struct { } type DataSuccess struct { - NameID string `json:"商品编码"` + NameID int `json:"商品编码"` Name string `json:"商品名称"` OrgPrice float64 `json:"原价"` NowPrice float64 `json:"现价"` @@ -2109,22 +2107,27 @@ func RefershStoreSkusMidPrice(ctx *jxcontext.Context, storeIDs []int) (err error return err } -func RefreshJxPriceByExcel(ctx *jxcontext.Context, storeIDs []int, files []*multipart.FileHeader, isAsync, isContinueWhenError bool) (hint string, err error) { - if len(files) == 0 { - return "", errors.New("没有文件上传!") - } +func RefreshJxPriceByExcel(ctx *jxcontext.Context, storeIDs []int, files string, isAsync, isContinueWhenError bool) (hint string, err error) { + // if len(files) == 0 { + // return "", errors.New("没有文件上传!") + // } if len(storeIDs) == 0 { return "", errors.New("请选择至少一个门店!") } - fileHeader := files[0] - file, err := fileHeader.Open() - hint, err = RefreshJxPriceByExcelBin(ctx, storeIDs, file, true, true) - file.Close() + // fileHeader := files[0] + // file, err := fileHeader.Open() + hint, err = RefreshJxPriceByExcelBin(ctx, storeIDs, files, true, true) + // file.Close() return hint, err } -func RefreshJxPriceByExcelBin(ctx *jxcontext.Context, storeIDs []int, reader io.Reader, isAsync, isContinueWhenError bool) (hint string, err error) { - var storeSkuNamePriceList []*model.StoreSkuNamePrice +func RefreshJxPriceByExcelBin(ctx *jxcontext.Context, storeIDs []int, reader string, isAsync, isContinueWhenError bool) (hint string, err error) { + var ( + storeSkuNamePriceList []*model.StoreSkuNamePrice + storeSkuNamePriceListUpdate []*model.StoreSkuNamePrice + skuBindInfosInter []interface{} + skuBindInfoList []*StoreSkuBindInfo + ) dataLock.dataFailedList = dataLock.dataFailedList[0:0] dataLock.dataSuccessList = dataLock.dataSuccessList[0:0] sheetParam := &SheetParam{ @@ -2135,40 +2138,78 @@ func RefreshJxPriceByExcelBin(ctx *jxcontext.Context, storeIDs []int, reader io. SkuUnitCol: 2, OutSkuIDCol: 0, } - xlsx, err := excelize.OpenReader(reader) - if err != nil { - return "", err - } - rows, _ := xlsx.GetRows(xlsx.GetSheetName(1)) - for rowNum, row := range rows { - if rowNum < sheetParam.SkuRow { - continue + taskSeqFunc := func(task *tasksch.SeqTask, step int, params ...interface{}) (result interface{}, err error) { + switch step { + case 0: + xlsx, err := excelize.OpenFile("111.xlsx") + // xlsx, err := excelize.OpenReader(reader) + if err != nil { + return "", err + } + rows, _ := xlsx.GetRows(xlsx.GetSheetName(1)) + for rowNum, row := range rows { + if rowNum < sheetParam.SkuRow { + continue + } + storeSkuNamePrice := &model.StoreSkuNamePrice{} + GetCellIntoStruct(rowNum, row, sheetParam, storeSkuNamePrice) + storeSkuNamePriceList = append(storeSkuNamePriceList, storeSkuNamePrice) + } + case 1: + db := dao.GetDB() + storeSkuNamePriceListOrg, _ := dao.GetStoreSkuNamePrice(db) + CreateOrUpdateStoreSkuNamePriceByExcel(db, ctx, storeSkuNamePriceList, storeSkuNamePriceListOrg) + storeSkuNamePriceListNew, _ := dao.GetStoreSkuNamePrice(db) + storeSkuNamePriceMapNew := StoreSkuNamePriceList2Map(ctx, storeSkuNamePriceListNew) + for _, v := range storeSkuNamePriceList { + if storeSkuNamePriceMapNew[v.OutSkuID] != nil { + storeSkuNamePriceListUpdate = append(storeSkuNamePriceListUpdate, storeSkuNamePriceMapNew[v.OutSkuID]) + } + } + taskFunc := func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { + storeSkuNamePrice := batchItemList[0].(*model.StoreSkuNamePrice) + var skuBindInfos []*StoreSkuBindInfo + nameIDGroup := strings.Split(storeSkuNamePrice.NameIDGroup, ",") + for _, v := range nameIDGroup { + if v != "" { + nameID := int(utils.Str2Int64(v)) + storeSkuBindInfo := &StoreSkuBindInfo{ + NameID: nameID, + UnitPrice: storeSkuNamePrice.Price, + } + skuBindInfos = append(skuBindInfos, storeSkuBindInfo) + for _, vv := range storeIDs { + skuList, err2 := dao.GetStoreSkusByNameIDs(db, []int{vv}, nameID) + err = err2 + if len(skuList) > 0 { + outSuccess := DataSuccess{NameID: nameID} + dataLock.AppendDataSuccess(outSuccess) + } + } + } + } + retVal = skuBindInfos + return retVal, err + } + taskParallel := tasksch.NewParallelTask("刷新京西价", tasksch.NewParallelConfig().SetIsContinueWhenError(isContinueWhenError), ctx, taskFunc, storeSkuNamePriceListUpdate) + tasksch.HandleTask(taskParallel, task, true).Run() + skuBindInfosInter, err = taskParallel.GetResult(0) + case 2: + for _, v := range skuBindInfosInter { + skuBindInfoList = append(skuBindInfoList, v.(*StoreSkuBindInfo)) + } + // UpdateStoresSkus(ctx, storeIDs, skuBindInfoList, false, isAsync, isContinueWhenError) } - storeSkuNamePrice := &model.StoreSkuNamePrice{} - GetCellIntoStruct(rowNum, row, sheetParam, storeSkuNamePrice) - storeSkuNamePriceList = append(storeSkuNamePriceList, storeSkuNamePrice) + return result, err + } + taskSeq := tasksch.NewSeqTask2("根据Excel刷新京西价", ctx, isContinueWhenError, taskSeqFunc, 3) + tasksch.HandleTask(taskSeq, nil, true).Run() + if !isAsync { + _, err = taskSeq.GetResult(0) + hint = "1" + } else { + hint = taskSeq.GetID() } - db := dao.GetDB() - storeSkuNamePriceListOrg, err := dao.GetStoreSkuNamePrice(db) - CreateOrUpdateStoreSkuNamePriceByExcel(db, ctx, storeSkuNamePriceList, storeSkuNamePriceListOrg) - hint, err = RefershJxPrice(db) - return hint, err -} - -func RefershJxPrice(db *dao.DaoDB) (hint string, err error) { - // storeSkuNamePriceList, err := dao.GetStoreSkuNamePrice(db) - // task := tasksch.NewParallelTask("根据Excel刷新京西价", tasksch.NewParallelConfig().SetIsContinueWhenError(isContinueWhenError), ctx, - // func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { - - // return retVal, err - // }, orderList) - // tasksch.HandleTask(task, nil, true).Run() - // if !isAsync { - // _, err = task.GetResult(0) - // hint = "1" - // } else { - // hint = task.GetID() - // } return hint, err } @@ -2184,9 +2225,11 @@ func CreateOrUpdateStoreSkuNamePriceByExcel(db *dao.DaoDB, ctx *jxcontext.Contex } }() for _, v := range storeSkuNamePriceList { + dao.WrapAddIDCULDEntity(v, ctx.GetUserName()) if storeSkuNamePriceMap[v.OutSkuID] != nil { - dao.WrapAddIDCULDEntity(v, ctx.GetUserName()) - dao.UpdateEntity(db, storeSkuNamePriceMap[v.OutSkuID], "Price", "NameIDGroup", "Unit", "CreatedAt", "UpdatedAt", "LastOperator", "DeletedAt") + v.ID = storeSkuNamePriceMap[v.OutSkuID].ID + v.UpdatedAt = time.Now() + dao.UpdateEntity(db, v) } else { dao.CreateEntity(db, v) } @@ -2198,7 +2241,6 @@ func CreateOrUpdateStoreSkuNamePriceByExcel(db *dao.DaoDB, ctx *jxcontext.Contex func StoreSkuNamePriceList2Map(ctx *jxcontext.Context, storeSkuNamePriceList []*model.StoreSkuNamePrice) (result map[string]*model.StoreSkuNamePrice) { result = make(map[string]*model.StoreSkuNamePrice, len(storeSkuNamePriceList)) for _, v := range storeSkuNamePriceList { - dao.WrapAddIDCULDEntity(v, ctx.GetUserName()) result[v.OutSkuID] = v } return result @@ -2214,8 +2256,10 @@ func GetCellIntoStruct(rowNum int, row []string, sheetParam *SheetParam, storeSk } if k == sheetParam.SkuNameIDCol { cellReplace := strings.ReplaceAll(cell, ",", ",") - if cellReplace[len(cellReplace)-1:len(cellReplace)] == "," { - cellReplace = cellReplace[0 : len(cellReplace)-1] + if cellReplace != "" { + if cellReplace[len(cellReplace)-1:len(cellReplace)] == "," { + cellReplace = cellReplace[0 : len(cellReplace)-1] + } } storeSkuNamePrice.NameIDGroup = cellReplace } diff --git a/business/model/dao/store_sku.go b/business/model/dao/store_sku.go index 2005fca28..fccae362e 100644 --- a/business/model/dao/store_sku.go +++ b/business/model/dao/store_sku.go @@ -895,13 +895,15 @@ func UpdateStoreSkuBindSyncStatus(db *DaoDB, vendorIDs []int, storeID int) (num func GetStoreSkusByNameIDs(db *DaoDB, storeIDs []int, nameID int) (skuList []*StoreSkuSyncInfo, err error) { sql := ` SELECT a.*,c.unit,c.name - FROM store_sku_bind a + FROM store_sku_bind a JOIN sku b ON a.sku_id = b.id JOIN sku_name c ON b.name_id = c.id WHERE b.name_id = ? + AND a.deleted_at = ? ` sqlParams := []interface{}{ nameID, + utils.DefaultTimeValue, } if len(storeIDs) > 0 { sql += " AND a.store_id in (" + GenQuestionMarks(len(storeIDs)) + ")" @@ -1061,7 +1063,7 @@ func GetStoreSkuNamePrice(db *DaoDB) (storeSkuNamePriceList []*model.StoreSkuNam } err = GetRows(db, &storeSkuNamePriceList, sql, sqlParams...) if err != nil { - return nil,err + return nil, err } return storeSkuNamePriceList, err } diff --git a/controllers/cms_store_sku.go b/controllers/cms_store_sku.go index 8378b7e49..aa788a6f6 100644 --- a/controllers/cms_store_sku.go +++ b/controllers/cms_store_sku.go @@ -512,9 +512,9 @@ func (c *StoreSkuController) RefreshJxPriceByExcel() { var storeIDList []int c.callRefreshJxPriceByExcel(func(params *tStoreSkuRefreshJxPriceByExcelParams) (retVal interface{}, errCode string, err error) { if jxutils.Strings2Objs(params.StoreIDs, &storeIDList); err == nil { - r := c.Ctx.Request - files := r.MultipartForm.File["userfiles"] - retVal, err = cms.RefreshJxPriceByExcel(params.Ctx, storeIDList, files, params.IsAsync, params.IsContinueWhenError) + // r := c.Ctx.Request + // files := r.MultipartForm.File["userfiles"] + retVal, err = cms.RefreshJxPriceByExcel(params.Ctx, storeIDList, "files", params.IsAsync, params.IsContinueWhenError) } return retVal, "", err })