package tempop import ( "bytes" "context" "fmt" "regexp" "strings" "time" "git.rosy.net.cn/jx-callback/business/auth2/authprovider/weixin" "git.rosy.net.cn/jx-callback/business/partner/delivery" "github.com/360EntSecGroup-Skylar/excelize" "github.com/qiniu/api.v7/storage" "git.rosy.net.cn/baseapi/platformapi/jdapi" "git.rosy.net.cn/baseapi/platformapi/mtwmapi" "git.rosy.net.cn/baseapi/utils" "git.rosy.net.cn/baseapi/utils/errlist" "git.rosy.net.cn/jx-callback/business/jxstore/cms" "git.rosy.net.cn/jx-callback/business/jxutils" "git.rosy.net.cn/jx-callback/business/jxutils/jxcontext" "git.rosy.net.cn/jx-callback/business/jxutils/tasksch" "git.rosy.net.cn/jx-callback/business/model" "git.rosy.net.cn/jx-callback/business/model/dao" "git.rosy.net.cn/jx-callback/business/model/legacymodel" "git.rosy.net.cn/jx-callback/business/partner" "git.rosy.net.cn/jx-callback/business/partner/purchase/ebai" "git.rosy.net.cn/jx-callback/business/partner/purchase/jd" "git.rosy.net.cn/jx-callback/business/partner/purchase/mtwm" "git.rosy.net.cn/jx-callback/globals" "git.rosy.net.cn/jx-callback/globals/api" ) var innerDataPat *regexp.Regexp func init() { innerDataPat = regexp.MustCompile(`"result":(.*),"code":200`) } func Convert2JDSPU(ctx *jxcontext.Context, count int, isAsync, isContinueWhenError bool) (hint string, err error) { // sql := ` // SELECT t1.* // FROM sku_name t1 // LEFT JOIN sku_name t2 ON t2.link_id = t1.id AND t2.deleted_at = ? // WHERE t1.deleted_at = ? AND t1.status <> ? AND t1.is_spu = 0/* AND t1.unit = '份'*/ // AND t2.id IS NULL // ORDER BY t1.id // ` // if count > 0 { // sql += " LIMIT " + utils.Int2Str(count) // } // sqlParams := []interface{}{ // utils.DefaultTimeValue, // utils.DefaultTimeValue, // model.SkuStatusDeleted, // } // db := dao.GetDB() // var skuNameList []*model.SkuName // if err = dao.GetRows(db, &skuNameList, sql, sqlParams...); err != nil { // return "", err // } // for _, skuName := range skuNameList { // sql = ` // SELECT * // FROM sku // WHERE name_id = ? AND deleted_at = ? AND status = ?; // ` // sqlParams := []interface{}{ // skuName.ID, // utils.DefaultTimeValue, // model.SkuStatusNormal, // } // var skuList []*model.Sku // if err = dao.GetRows(db, &skuList, sql, sqlParams...); err != nil { // return "", err // } // sql = ` // SELECT t1.* // FROM sku_name_place_bind t1 // WHERE t1.name_id = ? // ` // sqlParams = []interface{}{ // skuName.ID, // } // var skuNamePlaceBindList []*model.SkuNamePlaceBind // if err = dao.GetRows(db, &skuNamePlaceBindList, sql, sqlParams...); err != nil { // return "", err // } // globals.SugarLogger.Debugf("Convert2JDSPU, skuName:%s, skuCount:%d", skuName.Name, len(skuList)) // dao.Begin(db) // skuNameNew2 := *skuName // skuNameNew := &skuNameNew2 // dao.WrapAddIDCULEntity(skuNameNew, ctx.GetUserName()) // skuNameNew.JdID = 0 // skuNameNew.LinkID = skuName.ID // skuNameNew.IsSpu = 1 // skuNameNew.JdSyncStatus = model.SyncFlagNewMask // // skuNameNew.Status = model.SkuStatusDontSale // if err = dao.CreateEntity(db, skuNameNew); err != nil { // dao.Rollback(db) // return "", err // } // if len(skuList) > 0 { // for _, sku := range skuList { // skuNew2 := *sku // skuNew := &skuNew2 // dao.WrapAddIDCULEntity(skuNew, ctx.GetUserName()) // skuNew.JdID = 0 // skuNew.LinkID = sku.ID // skuNew.NameID = skuNameNew.ID // skuNew.JdSyncStatus = model.SyncFlagNewMask // if skuNameNew.Status == model.SkuStatusDontSale { // skuNew.Status = model.SkuStatusDontSale // } // globals.SugarLogger.Debugf("Convert2JDSPU, sku:%s", utils.Format4Output(skuNew, false)) // if err = dao.CreateEntity(db, skuNew); err != nil { // dao.Rollback(db) // return "", err // } // } // for _, placeBind := range skuNamePlaceBindList { // dao.WrapAddIDCULEntity(placeBind, ctx.GetUserName()) // placeBind.NameID = skuNameNew.ID // globals.SugarLogger.Debugf("Convert2JDSPU, placeBind:%s", utils.Format4Output(placeBind, false)) // if err = dao.CreateEntity(db, placeBind); err != nil { // dao.Rollback(db) // return "", err // } // } // } // dao.Commit(db) // } // sql = ` // SELECT DISTINCT t1.* // FROM sku_name t1 // JOIN sku t2 ON t1.id = t2.name_id AND t2.jd_sync_status <> 0 AND t2.deleted_at = ? // WHERE t1.link_id > 0; // ` // skuNameList = []*model.SkuName{} // if err = dao.GetRows(db, &skuNameList, sql, utils.DefaultTimeValue); err != nil { // return "", err // } // rootTask := tasksch.NewParallelTask("Convert2JDSPU", tasksch.NewParallelConfig().SetIsContinueWhenError(isContinueWhenError), ctx, // func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { // skuName := batchItemList[0].(*model.SkuName) // _, err = cms.CurVendorSync.SyncSku(ctx, db, skuName.ID, -1, false, isContinueWhenError, ctx.GetUserName()) // return nil, err // }, skuNameList) // tasksch.ManageTask(rootTask).Run() // if !isAsync { // _, err = rootTask.GetResult(0) // } else { // hint = rootTask.ID // } return hint, err } func Change2JDSPU4Store(ctx *jxcontext.Context, storeIDs []int, step int, isAsync, isContinueWhenError bool) (hint string, err error) { // db := dao.GetDB() // if len(storeIDs) == 0 { // if err = dao.GetRows(db, &storeIDs, ` // SELECT t1.id // FROM store t1 // JOIN store_map t2 ON t2.store_id = t1.id AND t2.vendor_id = 0 AND t2.deleted_at = ? AND t2.status <> ? // WHERE t1.deleted_at = ? AND t1.status <> ? /* AND t1.city_code IN (110100, 120100, 440100, 440300, 510100)*/ // `, utils.DefaultTimeValue, model.StoreStatusDisabled, utils.DefaultTimeValue, model.StoreStatusDisabled); err != nil { // return "", err // } // } // var sql string // var sqlParams []interface{} // dao.Begin(db) // defer dao.Rollback(db) // if step == 1 { // sql = ` // DELETE t1 // FROM store_sku_bind t1 // JOIN sku t2 ON t2.id = t1.sku_id AND t2.link_id > 0 // WHERE 1 = 1 // ` // sqlParams = []interface{}{} // if len(storeIDs) > 0 { // sql += " AND store_id IN (" + dao.GenQuestionMarks(len(storeIDs)) + ")" // sqlParams = append(sqlParams, storeIDs) // } // if _, err = dao.ExecuteSQL(db, sql, sqlParams...); err != nil { // return "", err // } // sql = ` // INSERT INTO store_sku_bind(created_at, updated_at, last_operator, deleted_at, store_id, sku_id, price, unit_price, status, ebai_id, mtwm_id, jd_sync_status, ebai_sync_status, mtwm_sync_status) // SELECT NOW(), NOW(), ?, ?, t1.store_id, t2.id, t1.price, t1.unit_price, t1.status , 0, 0, ?, ?, ? // FROM store_sku_bind t1 // JOIN sku t2 ON t2.link_id = t1.sku_id AND t2.deleted_at = ? // JOIN store t3 ON t3.id = t1.store_id // JOIN sku_name t4 ON t4.id = t2.name_id // LEFT JOIN sku_name_place_bind t5 ON t5.place_code = t3.city_code AND t5.name_id = t4.id // WHERE t1.deleted_at = ? AND (t4.is_global = 1 OR t5.id IS NOT NULL) AND t1.price > 0 // ` // sqlParams = []interface{}{ // ctx.GetUserName(), // utils.DefaultTimeValue, // // model.SkuStatusDontSale, // model.SyncFlagNewMask, // 0, //model.SyncFlagNewMask, // 0, //model.SyncFlagNewMask, // utils.DefaultTimeValue, // utils.DefaultTimeValue, // } // } else if step == 2 { // sql = ` // SELECT COUNT(*) ct // FROM store_sku_bind t1 // JOIN sku t2 ON t2.id = t1.sku_id AND t2.link_id > 0 // WHERE 1 = 1 // ` // sqlParams = []interface{}{} // if len(storeIDs) > 0 { // sql += " AND store_id IN (" + dao.GenQuestionMarks(len(storeIDs)) + ")" // sqlParams = append(sqlParams, storeIDs) // } // ct := 0 // if err = dao.GetRow(db, &ct, sql, sqlParams...); err != nil { // return "", err // } // if ct == 0 { // return "", fmt.Errorf("%s看起来还没有执行《将转化的SPU在门店上架》", utils.Format4Output(storeIDs, true)) // } // sql = ` // UPDATE store_sku_bind t1 // JOIN sku t2 ON t2.link_id = t1.sku_id // SET t1.status = 0, // t1.jd_sync_status = ? // WHERE t1.deleted_at = ? // ` // sqlParams = []interface{}{ // model.SyncFlagSaleMask | model.SyncFlagModifiedMask, // utils.DefaultTimeValue, // } // } else { // return "", fmt.Errorf("非法的step") // } // if len(storeIDs) > 0 { // sql += " AND t1.store_id IN (" + dao.GenQuestionMarks(len(storeIDs)) + ")" // sqlParams = append(sqlParams, storeIDs) // } // globals.SugarLogger.Debug(sql) // globals.SugarLogger.Debug(utils.Format4Output(sqlParams, false)) // var num int64 // if num, err = dao.ExecuteSQL(db, sql, sqlParams...); err != nil { // return "", err // } // globals.SugarLogger.Debug(num) // dao.Commit(db) // var skuIDs []int // if step == 1 { // sql = ` // SELECT id // FROM sku t1 // WHERE t1.link_id > 0 AND t1.deleted_at = ? // ` // sqlParams = []interface{}{ // utils.DefaultTimeValue, // } // } else if step == 2 { // sql = ` // SELECT t1.link_id // FROM sku t1 // WHERE t1.link_id > 0 AND t1.deleted_at = ? // ` // sqlParams = []interface{}{ // utils.DefaultTimeValue, // } // } // if err = dao.GetRows(db, &skuIDs, sql, sqlParams...); err != nil { // return "", err // } // hint, err = cms.CurVendorSync.SyncStoresSkus(ctx, db, []int{model.VendorIDJD}, storeIDs, skuIDs, false, isAsync, isContinueWhenError) return hint, err } // func TransferLegacyJdOrder(ctx *jxcontext.Context, isAsync, isContinueWhenError bool) (hint string, err error) { // sqlBatchCount := 1000 // rootTask := tasksch.NewSeqTask("TransferLegacyJdOrder", ctx, // func(rootTask *tasksch.SeqTask, step int, params ...interface{}) (result interface{}, err error) { // sql := ` // SELECT t1.* // FROM jdorder t1 // LEFT JOIN goods_order_original t2 ON t2.vendor_order_id = t1.vendor_order_id // WHERE t2.id IS NULL AND LENGTH(t1.data) > 10 AND t1.cityname = 'all' // ORDER BY t1.orderstatustime // LIMIT ? // ` // db := dao.GetDB() // var jdOrderList []*legacymodel2.Jdorder // if err = dao.GetRows(db, &jdOrderList, sql, sqlBatchCount); err != nil { // return nil, err // } // if len(jdOrderList) > 0 { // task := tasksch.NewParallelTask("TransferLegacyJdOrder2", tasksch.NewParallelConfig().SetIsContinueWhenError(isContinueWhenError).SetBatchSize(40), ctx, // func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { // var orderDetailList []*model.GoodsOrderOriginal // for _, v := range batchItemList { // jdOrder := v.(*legacymodel2.Jdorder) // var detail map[string]interface{} // if err = utils.UnmarshalUseNumber([]byte(strings.Replace(strings.Replace(jdOrder.Data, "\n", "", -1), "\r", "", -1)), &detail); err != nil { // return nil, err // } // resultList := detail["result"].(map[string]interface{})["resultList"].([]interface{}) // if len(resultList) > 0 { // originalData := resultList[0].(map[string]interface{}) // orgCode := originalData["orgCode"].(string) // if orgCode == "320406" { // orderPurchaseTime := utils.Interface2String(originalData["orderPurchaseTime"]) // if orderPurchaseTime == "" { // globals.SugarLogger.Debugf("TransferLegacyJdOrder abnormal order:%s", jdOrder.VendorOrderID) // orderPurchaseTime = utils.Interface2String(originalData["orderStartTime"]) // } // if orderPurchaseTime != "" { // orderDetail := &model.GoodsOrderOriginal{ // VendorOrderID: jdOrder.VendorOrderID, // VendorID: model.VendorIDJD, // AccountNo: orgCode, // OrderCreatedAt: utils.Str2Time(orderPurchaseTime), // OriginalData: string(utils.MustMarshal(originalData)), // } // orderDetailList = append(orderDetailList, orderDetail) // } else { // globals.SugarLogger.Debugf("TransferLegacyJdOrder abnormal2 order:%s", jdOrder.VendorOrderID) // } // } // } // } // if len(orderDetailList) > 0 { // err = dao.CreateMultiEntities(db, orderDetailList) // } // return nil, err // }, jdOrderList) // // rootTask.AddChild(task).Run() // task.Run() // _, err = task.GetResult(0) // } else { // rootTask.Cancel() // } // return nil, err // }, math.MaxInt32) // tasksch.ManageTask(rootTask).Run() // if !isAsync { // _, err = rootTask.GetResult(0) // } else { // hint = rootTask.ID // } // return hint, err // } func TransferLegacyElmOrder(ctx *jxcontext.Context, isAsync, isContinueWhenError bool) (hint string, err error) { // sqlBatchCount := 1000 // rootTask := tasksch.NewSeqTask("TransferLegacyElmOrder", ctx.GetUserName(), func(rootTask *tasksch.SeqTask, step int, params ...interface{}) (result interface{}, err error) { // sql := ` // SELECT t1.* // FROM elemeorder t1 // LEFT JOIN goods_order_original t2 ON t2.vendor_order_id = t1.orderid // WHERE t2.id IS NULL AND LENGTH(t1.data) > 10 // ORDER BY t1.order_created_at // LIMIT ? // ` // db := dao.GetDB() // var elmOrderList []*legacymodel2.Elemeorder // if err = dao.GetRows(db, &elmOrderList, sql, sqlBatchCount); err != nil { // return "", err // } // if len(elmOrderList) > 0 { // task := tasksch.NewParallelTask("TransferLegacyElmOrder2", tasksch.NewParallelConfig().SetIsContinueWhenError(isContinueWhenError).SetBatchSize(40), ctx.GetUserName(), func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { // var orderDetailList []*model.GoodsOrderOriginal // for _, v := range batchItemList { // elmOrder := v.(*legacymodel2.Elemeorder) // if len(elmOrder.Data) > 10 { // var detail map[string]interface{} // if err = utils.UnmarshalUseNumber([]byte(strings.Replace(strings.Replace(elmOrder.Data, "\n", "", -1), "\r", "", -1)), &detail); err != nil { // return nil, err // } // orderDetail := &model.GoodsOrderOriginal{ // VendorOrderID: elmOrder.Orderid, // VendorID: model.VendorIDELM, // AccountNo: "fakeelm", // OrderCreatedAt: utils.Str2Time(detail["activeAt"].(string)), // OriginalData: elmOrder.Data, // } // orderDetailList = append(orderDetailList, orderDetail) // } // } // if len(orderDetailList) > 0 { // err = dao.CreateMultiEntities(db, orderDetailList) // } // return nil, err // }, elmOrderList) // // rootTask.AddChild(task).Run() // task.Run() // _, err = task.GetResult(0) // } else { // rootTask.Cancel() // } // return nil, err // }, math.MaxInt32) // tasksch.ManageTask(rootTask).Run() // if !isAsync { // _, err = rootTask.GetResult(0) // } else { // hint = rootTask.ID // } return hint, err } func saveJdOrderList(existJdIDMap map[string]int, jdOrderList []interface{}, jdStoreOrderList []map[string]interface{}) (err error) { var storeOrderList []*model.TempGoodsOrderMobile for _, v := range jdStoreOrderList { order := &model.TempGoodsOrderMobile{ VendorOrderID: v["orderId"].(string), VendorID: model.VendorIDJD, AccountNo: v["venderId"].(string), OrderCreatedAt: utils.Timestamp2Time(utils.MustInterface2Int64(v["orderPaidTime"]) / 1000), Mobile: v["mobile"].(string), } storeOrderList = append(storeOrderList, order) } var orderDetailList []*model.GoodsOrderOriginal for _, v := range jdOrderList { orderMap := v.(map[string]interface{}) orderID := utils.Int64ToStr(utils.MustInterface2Int64(orderMap["orderId"])) if existJdIDMap[orderID] == 0 { orgCode := orderMap["orgCode"].(string) orderDetail := &model.GoodsOrderOriginal{ VendorOrderID: orderID, VendorID: model.VendorIDJD, AccountNo: orgCode, OrderCreatedAt: utils.Str2Time(orderMap["orderPurchaseTime"].(string)), OriginalData: string(utils.MustMarshal(orderMap)), } orderDetailList = append(orderDetailList, orderDetail) } } if len(orderDetailList) > 0 || len(storeOrderList) > 0 { db := dao.GetDB() if len(orderDetailList) > 0 { // err = dao.CreateMultiEntities(db, orderDetailList) for _, v := range orderDetailList { dao.CreateEntity(db, v) } } if len(storeOrderList) > 0 { // err = dao.CreateMultiEntities(db, storeOrderList) for _, v := range storeOrderList { dao.CreateEntity(db, v) } } } return err } func PullJdOrder(ctx *jxcontext.Context, fromTime, toTime time.Time, isAsync, isContinueWhenError bool) (hint string, err error) { var existJdIDs []string db := dao.GetDB() if err = dao.GetRows(db, &existJdIDs, ` SELECT vendor_order_id FROM goods_order_original WHERE vendor_id = ?`, model.VendorIDJD); err != nil { return "", err } existJdIDMap := make(map[string]int) for _, v := range existJdIDs { existJdIDMap[v] = 1 } pageSize := 100 hourGap := 1 gapCount := int((toTime.Sub(fromTime)-time.Hour*time.Duration(hourGap))/(time.Hour*time.Duration(hourGap)) + 1) if gapCount <= 0 { gapCount = 1 } gapList := make([]int, gapCount) for k := range gapList { gapList[k] = k } rootTask := tasksch.NewParallelTask("PullJdOrder", tasksch.NewParallelConfig().SetIsContinueWhenError(isContinueWhenError).SetParallelCount(20), ctx, func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { gapIndex := batchItemList[0].(int) hourIndex := gapIndex * hourGap subFromTime := fromTime.Add(time.Duration(hourIndex) * time.Hour) subToTime := fromTime.Add(time.Duration(hourIndex+hourGap) * time.Hour) if subToTime.Sub(toTime) > 0 { subToTime = toTime } if true { //gapIndex < gapCount-1 { subToTime = subToTime.Add(-1 * time.Second) // 减一秒 } commonParams := map[string]interface{}{ jdapi.KeyPageSize: pageSize, "orderPurchaseTime_begin": utils.Time2Str(subFromTime), "orderPurchaseTime_end": utils.Time2Str(subToTime), } // globals.SugarLogger.Debugf("PullJdOrder, commonParams=%s", utils.Format4Output(commonParams, false)) orderList, totalCount, err := api.JdAPI.OrderQuery(commonParams) if err != nil { return "", err } storeOrderList, err := api.JdAPI.GetStoreOrderInfoList(utils.Time2Str(subFromTime), utils.Time2Str(subToTime)) if err != nil { } if err = saveJdOrderList(existJdIDMap, orderList, storeOrderList); err != nil { return "", err } if false { globals.SugarLogger.Debugf("subFromTime:%s, subToTime:%s, totalCount:%d, len(orderList):%d", utils.Time2Str(subFromTime), utils.Time2Str(subToTime), totalCount, len(orderList)) } return nil, err }, gapList) tasksch.ManageTask(rootTask).Run() if !isAsync { _, err = rootTask.GetResult(0) } else { hint = rootTask.ID } return hint, err } func UpdateJdOrderRealMobile(ctx *jxcontext.Context, fromTime, toTime time.Time, isAsync, isContinueWhenError bool) (hint string, err error) { return hint, err } func DeleteWrongSpu(ctx *jxcontext.Context, isAsync, isContinueWhenError bool) (hint string, err error) { // sql := ` // SELECT t1.* // FROM sku_name t1 // JOIN sku_name t2 ON t2.link_id = t1.id AND t2.deleted_at = ? // WHERE t1.deleted_at = ?; // ` // db := dao.GetDB() // var skuNameList []*model.SkuName // if err = dao.GetRows(db, &skuNameList, sql, utils.DefaultTimeValue, utils.DefaultTimeValue); err != nil { // return "", err // } // rootTask := tasksch.NewSeqTask("DeleteWrongSpu", ctx.GetUserName(), func(task *tasksch.SeqTask, step int, params ...interface{}) (result interface{}, err error) { // _, err = cms.DeleteSkuName(ctx, skuNameList[step].ID, ctx.GetUserName()) // if err != nil { // globals.SugarLogger.Debugf("DeleteWrongSpu failed nameid:%d, name:%s, with error:%v", skuNameList[step].ID, skuNameList[step].Name, err) // err = nil // 强制忽略错误 // } // return nil, err // }, len(skuNameList)) sql := ` SELECT t1.* FROM sku_name t1 WHERE t1.deleted_at = ? AND t1.is_spu = 1 AND t1.jd_id > 0 ORDER BY t1.id ` db := dao.GetDB() var skuNameList []*model.SkuName if err = dao.GetRows(db, &skuNameList, sql, utils.DefaultTimeValue); err != nil { return "", err } rootTask := tasksch.NewSeqTask2("DeleteWrongSpu", ctx, true, func(task *tasksch.SeqTask, step int, params ...interface{}) (result interface{}, err error) { mapData := map[string]interface{}{ "name": skuNameList[step].Name, } _, err = cms.UpdateSkuName(ctx, skuNameList[step].ID, mapData, false) if err != nil { globals.SugarLogger.Debugf("DeleteWrongSpu failed nameid:%d, name:%s, with error:%v", skuNameList[step].ID, skuNameList[step].Name, err) } return nil, err }, len(skuNameList)) tasksch.ManageTask(rootTask).Run() if !isAsync { _, err = rootTask.GetResult(0) } else { hint = rootTask.ID } return hint, err } type GoodsOrderOriginalEx struct { model.GoodsOrderOriginal OrderStatus int } func TransformJdSpu2Sku(ctx *jxcontext.Context, skuNameIDs []int, count int, isAsync, isContinueWhenError bool) (hint string, err error) { // sql := ` // SELECT t1.* // FROM sku_name t1 // WHERE t1.deleted_at = ? AND t1.status <> ? AND t1.is_spu = 1 AND jd_id <> 0 // ` // sqlParams := []interface{}{ // utils.DefaultTimeValue, // model.SkuStatusDeleted, // } // if len(skuNameIDs) > 0 { // sql += " AND t1.id IN (" + dao.GenQuestionMarks(len(skuNameIDs)) + ")" // sqlParams = append(sqlParams, skuNameIDs) // } // sql += " ORDER BY t1.id" // if count > 0 { // sql += " LIMIT ?" // sqlParams = append(sqlParams, count) // } // db := dao.GetDB() // var skuNameList []*model.SkuName // if err = dao.GetRows(db, &skuNameList, sql, sqlParams...); err != nil { // return "", err // } // if len(skuNameList) == 0 { // return "", fmt.Errorf("待转换的skuName为空") // } // batchSize := 40 // rootTask := tasksch.NewSeqTask2("TransformJdSpu2Sku", ctx, isContinueWhenError, // func(rootTask *tasksch.SeqTask, step int, params ...interface{}) (result interface{}, err error) { // var ( // locker sync.Mutex // skuIDs []int // ) // lastIndex := (step + 1) * batchSize // if lastIndex > len(skuNameList) { // lastIndex = len(skuNameList) // } // batchSkNameList := skuNameList[step*batchSize : lastIndex] // subTask := tasksch.NewParallelTask(fmt.Sprintf("TransformJdSpu2Sku:%d", step), tasksch.NewParallelConfig().SetIsContinueWhenError(isContinueWhenError), ctx, // func(subTask *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { // skuName := batchItemList[0].(*model.SkuName) // if !jxutils.IsEmptyID(skuName.JdID) { // sql = ` // SELECT * // FROM sku // WHERE name_id = ? AND deleted_at = ? AND status <> ?; // ` // sqlParams := []interface{}{ // skuName.ID, // utils.DefaultTimeValue, // model.SkuStatusDeleted, // } // var skuList []*model.Sku // if err = dao.GetRows(db, &skuList, sql, sqlParams...); err != nil { // return "", err // } // globals.SugarLogger.Debugf("TransformJdSpu2Sku skuList:%s", utils.Format4Output(skuList, false)) // if len(skuList) > 0 { // for _, sku := range skuList { // locker.Lock() // skuIDs = append(skuIDs, sku.ID) // locker.Unlock() // if !jxutils.IsEmptyID(sku.JdID) { // if globals.EnableJdStoreWrite { // if err = api.JdAPI.UpdateSkuBaseInfo(utils.Int2Str(skuName.ID), utils.Int2Str(sku.ID), utils.Params2Map(jdapi.KeyFixedStatus, jdapi.SkuFixedStatusDeleted)); err != nil { // if errExt, ok := err.(*utils.ErrorWithCode); ok && errExt.IntCode() == 11004 { // err = nil // } else { // break // } // } // } // } // } // } // if err == nil && globals.EnableJdStoreWrite { // if err = api.JdAPI.UpdateSpu(utils.Int2Str(skuName.ID), utils.Params2Map(jdapi.KeyFixedStatus, jdapi.SkuFixedStatusOffline)); err == nil { // err = api.JdAPI.UpdateSpu(utils.Int2Str(skuName.ID), utils.Params2Map(jdapi.KeyFixedStatus, jdapi.SkuFixedStatusDeleted)) // } else if errExt, ok := err.(*utils.ErrorWithCode); ok && errExt.IntCode() == 11035 { // err = nil // } // } // if err == nil { // skuName.IsSpu = 0 // skuName.JdID = 0 // if _, err = dao.UpdateEntity(db, skuName, "IsSpu", "JdID"); err == nil { // sql := ` // UPDATE sku t1 // SET // t1.jd_sync_status = ?, // t1.jd_id = 0 // WHERE t1.name_id = ? AND t1.deleted_at = ? AND t1.status <> ? // ` // sqlParams := []interface{}{ // model.SyncFlagNewMask, // skuName.ID, // utils.DefaultTimeValue, // model.SkuStatusDeleted, // } // if _, err = dao.ExecuteSQL(db, sql, sqlParams...); err == nil { // _, err = cms.CurVendorSync.SyncSku(ctx, db, skuName.ID, -1, false, isContinueWhenError, ctx.GetUserName()) // } // } // } // } else { // globals.SugarLogger.Debugf("TransformJdSpu2Sku skuName:%d is fake", skuName.ID) // } // return nil, err // }, batchSkNameList) // rootTask.AddChild(subTask).Run() // if _, err = subTask.GetResult(0); err == nil { // if len(skuIDs) > 0 { // if _, err = dao.SetStoreSkuSyncStatus(db, model.VendorIDJD, nil, skuIDs, model.SyncFlagStoreSkuModifiedMask); err == nil { // // time.Sleep(20 * time.Second) // // _, err = cms.CurVendorSync.SyncStoresSkus(ctx, db, []int{model.VendorIDJD}, nil, skuIDs, false, isContinueWhenError) // } // } // } // return nil, err // }, (len(skuNameList)-1)/batchSize+1) // tasksch.ManageTask(rootTask).Run() // if !isAsync { // _, err = rootTask.GetResult(0) // } else { // hint = rootTask.ID // } return hint, err } func ReProcessJdBadComment(ctx *jxcontext.Context, isForce, isAsync, isContinueWhenError bool) (hint string, err error) { sql := ` SELECT * FROM jx_bad_comments ` if !isForce { sql += " WHERE (createtime IS NULL OR createtime = '') OR (updatetime IS NULL OR updatetime = '')" } // sql += " LIMIT 1" db := dao.GetDB() var commentList []*legacymodel.JxBadComments if err = dao.GetRows(db, &commentList, sql); err == nil { if len(commentList) > 0 { rootTask := tasksch.NewParallelTask("ReProcessJdBadComment", nil, ctx, func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { badComment := batchItemList[0].(*legacymodel.JxBadComments) comment1, _ := unmarshalCommentText(badComment.Msg) comment2, _ := unmarshalCommentText(badComment.UpdatedMsg) if len(comment1) > 0 { badComment.Createtime = utils.Timestamp2Str(utils.MustInterface2Int64(comment1["createTime"].(map[string]interface{})["time"]) / 1000) badComment.Msg = string(utils.MustMarshal(comment1)) if len(comment2) > 0 { badComment.Updatetime = utils.Timestamp2Str(utils.MustInterface2Int64(comment2["createTime"].(map[string]interface{})["time"]) / 1000) badComment.UpdatedMsg = string(utils.MustMarshal(comment2)) } _, err = dao.UpdateEntity(db, badComment) } return nil, err }, commentList) tasksch.ManageTask(rootTask).Run() if !isAsync { _, err = rootTask.GetResult(0) } else { hint = rootTask.ID } } } return hint, err } func unmarshalCommentText(commentStr string) (retVal map[string]interface{}, isNeedUpdate bool) { var err error for { var retVal map[string]interface{} // 必须要用局部变量 if commentStr == "" { return nil, false } if err = jxutils.Strings2Objs(commentStr, &retVal); err == nil { if retVal["data"] != nil { commentStr = retVal["data"].(string) } else if retVal["result"] != nil { return retVal["result"].(map[string]interface{}), true } else { return retVal, false } } else { strList := innerDataPat.FindStringSubmatch(commentStr) if strList[1] != "" { commentStr = strList[1] } else { return nil, false } } } } func RefreshEbaiBadComment(ctx *jxcontext.Context, fromTime, toTime time.Time, isAsync, isContinueWhenError bool) (hint string, err error) { if utils.IsTimeZero(fromTime) { fromTime = utils.Str2Time("2018-05-03 00:00:00") } if utils.IsTimeZero(toTime) { toTime = time.Now().Add(-3 * time.Hour) } days := int(toTime.Sub(fromTime)/(24*time.Hour) + 1) globals.SugarLogger.Debugf("RefreshEbaiBadComment fromTime:%s, toTime:%s, days:%d", utils.Time2Str(fromTime), utils.Time2Str(toTime), days) rootTask := tasksch.NewSeqTask("RefreshEbaiBadComment", ctx, func(task *tasksch.SeqTask, step int, params ...interface{}) (result interface{}, err error) { batchFromTime := fromTime.Add(time.Duration(step) * 24 * time.Hour) batchToTime := batchFromTime.Add(24*time.Hour - time.Second) if batchToTime.Sub(toTime) > 0 { batchToTime = toTime } err = ebai.CurPurchaseHandler.RefreshComment(batchFromTime, batchToTime) return nil, err }, days) tasksch.ManageTask(rootTask).Run() if !isAsync { _, err = rootTask.GetResult(0) } else { hint = rootTask.ID } return hint, err } func PrintMsg(ctx *jxcontext.Context, vendorID int, id1, id2, msgTitle, msgContent string) (printerStatus *partner.PrinterStatus, err error) { handler := partner.GetPrinterPlatformFromVendorID(vendorID) if handler == nil { return nil, fmt.Errorf("打印机厂商:%d当前不被支持,请检查vendorID", vendorID) } return handler.PrintMsg(ctx, id1, id2, msgTitle, msgContent) } func UpdateAllWeiXinRemark(ctx *jxcontext.Context, isAsync, isContinueWhenError bool) (hint string, err error) { var mobileList []string sql := ` SELECT tel FROM weixins WHERE openid <> '' AND tel <> ''` sqlParams := []interface{}{} if globals.EnableWXAuth2 { sql = ` SELECT t1.mobile FROM user t1 JOIN auth_bind t2 ON t2.user_id = t1.user_id AND t2.deleted_at = ? and t2.type = ? WHERE t1.deleted_at = ? AND t1.type & ? <> 0` sqlParams = []interface{}{ utils.DefaultTimeValue, weixin.AuthTypeMP, utils.DefaultTimeValue, model.UserTypeStoreBoss, } } if err = dao.GetRows(dao.GetDB(), &mobileList, sql, sqlParams...); err == nil { rootTask := tasksch.NewParallelTask("刷新微信备注", tasksch.NewParallelConfig().SetIsContinueWhenError(isContinueWhenError), ctx, func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { tel := batchItemList[0].(string) err = cms.HandleUserWXRemark(dao.GetDB(), tel, false) return nil, err }, mobileList) tasksch.ManageTask(rootTask).Run() if !isAsync { _, err = rootTask.GetResult(0) } else { hint = rootTask.ID } } return hint, err } // 从饿百得到执照信息 func RetrieveEbaiShopLicence(ctx *jxcontext.Context, isAsync, isContinueWhenError bool) (hint string, err error) { var ebaiStoreList []*model.StoreMap db := dao.GetDB() if err = dao.GetRows(db, &ebaiStoreList, ` SELECT * FROM store_map WHERE vendor_id = ? AND deleted_at = ? `, model.VendorIDEBAI, utils.DefaultTimeValue); err == nil { globals.SugarLogger.Debugf("RetrieveEbaiShopLicence, count:%d", len(ebaiStoreList)) rootTask := tasksch.NewParallelTask("XXXX", tasksch.NewParallelConfig().SetIsContinueWhenError(isContinueWhenError), ctx, func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { ebaiStore := batchItemList[0].(*model.StoreMap) xxList, err := api.EbaiAPI.ShopAptitudeGet("", utils.Str2Int64(ebaiStore.VendorStoreID)) if err == nil && ebaiStore != nil { if len(xxList) > 1 { ebaiStore2, err2 := api.EbaiAPI.ShopGet("", utils.Str2Int64(ebaiStore.VendorStoreID)) if err = err2; err == nil { shop := &legacymodel.EbaiShopLicence{ ShopName: utils.Interface2String(ebaiStore2["name"]), Licence: utils.Interface2String(xxList[1]["license_number"]), Address: utils.Interface2String(ebaiStore2["address"]), Owner: utils.Interface2String(xxList[1]["legal_representative_name"]), Tel: utils.Interface2String(ebaiStore2["service_phone"]), LicenceName: utils.Interface2String(xxList[1]["license_name"]), } err = dao.CreateEntity(db, shop) } } } return nil, err }, ebaiStoreList) tasksch.ManageTask(rootTask).Run() if !isAsync { _, err = rootTask.GetResult(0) } else { hint = rootTask.ID } } return hint, err } func RefreshMtpsWaybillFee(ctx *jxcontext.Context, isAsync, isContinueWhenError bool) (hint string, err error) { var waybillList []*model.Waybill db := dao.GetDB() if err = dao.GetRows(db, &waybillList, ` SELECT * FROM waybill WHERE status_time > '2019-04-01' AND waybill_vendor_id = 102 AND desired_fee = 0 `); err == nil { globals.SugarLogger.Debugf("RefreshMtpsWaybillFee, count:%d", len(waybillList)) rootTask := tasksch.NewParallelTask("RefreshMtpsWaybillFee", tasksch.NewParallelConfig().SetIsContinueWhenError(isContinueWhenError), ctx, func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { bill := batchItemList[0].(*model.Waybill) bill.DesiredFee, _ = delivery.CalculateBillDeliveryFee(bill) _, err = dao.UpdateEntity(db, bill, "DesiredFee") return nil, err }, waybillList) tasksch.ManageTask(rootTask).Run() if !isAsync { _, err = rootTask.GetResult(0) } else { hint = rootTask.ID } } return hint, err } func CreateConsumerFromOrders(ctx *jxcontext.Context, vendorIDs []int, fromDate, toDate time.Time, isForce, isAsync, isContinueWhenError bool) (hint string, err error) { if utils.IsTimeZero(fromDate) { return "", fmt.Errorf("fromDate必须指定") } if utils.IsTimeZero(toDate) { toDate = time.Now() } fromDate = utils.Time2Date(fromDate) toDate = utils.Time2Date(toDate) if len(vendorIDs) == 0 { vendorIDs = partner.GetPurchasePlatformVendorIDs() } var dateList []time.Time curDate := fromDate for { if toDate.Sub(curDate) < 0 { break } dateList = append(dateList, curDate) curDate = curDate.Add(24 * time.Hour) } type GoodsOrderWithOriginal struct { model.GoodsOrder OriginalData string `orm:"type(text)" json:"-"` } db := dao.GetDB() rootTask := tasksch.NewParallelTask("从订单中创建消费者账户", tasksch.NewParallelConfig().SetParallelCount(1).SetIsContinueWhenError(isContinueWhenError), ctx, func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { curDate := batchItemList[0].(time.Time) sql := ` SELECT t1.*, t2.original_data FROM goods_order t1 LEFT JOIN goods_order_original t2 ON t2.vendor_order_id = t1.vendor_order_id AND t2.vendor_id = t1.vendor_id WHERE t1.order_created_at >= ? AND t1.order_created_at < ?` sqlParams := []interface{}{ curDate, curDate.Add(24 * time.Hour), } if len(vendorIDs) > 0 { sql += " AND t1.vendor_id IN (" + dao.GenQuestionMarks(len(vendorIDs)) + ")" sqlParams = append(sqlParams, vendorIDs) } if !isForce { sql += " AND t1.user_id = ''" } var orderList []*GoodsOrderWithOriginal if err = dao.GetRows(db, &orderList, sql, sqlParams...); err == nil { if len(orderList) > 0 { // 并发必须是1,否则在HandleOrder4Consignee中可能导致主键重,错误 subTask := tasksch.NewParallelTask(fmt.Sprintf("处理日期:%s的订单", utils.Time2DateStr(curDate)), tasksch.NewParallelConfig().SetParallelCount(1).SetIsContinueWhenError(isContinueWhenError), ctx, func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { order := batchItemList[0].(*GoodsOrderWithOriginal) if isForce || order.UserID == "" { if handler := partner.GetPurchaseOrderHandlerFromVendorID(order.VendorID); handler != nil { var updateFields []string if isForce || order.VendorUserID == "" { var order2 *model.GoodsOrder if order.OriginalData != "" { var orderData map[string]interface{} if utils.UnmarshalUseNumber([]byte(order.OriginalData), &orderData) == nil { order2 = handler.Map2Order(orderData) if order2.VendorUserID == "" { order2 = nil } } } if order2 == nil && order.VendorID == model.VendorIDMTWM && time.Now().Sub(curDate) < 60*24*time.Hour { order2, err = handler.GetOrder(order.VendorOrgCode, order.VendorOrderID, order.VendorStoreID) } if order2 != nil { if order2.VendorUserID != "" && order.VendorUserID != order2.VendorUserID { updateFields = append(updateFields, "VendorUserID") order.VendorUserID = order2.VendorUserID } } } /* if err = cms.HandleOrder4Consignee(&order.GoodsOrder); err == nil { updateFields = append(updateFields, "UserID") } */ if len(updateFields) > 0 { dao.UpdateEntity(db, &order.GoodsOrder, updateFields...) } } } return nil, err }, orderList) tasksch.HandleTask(subTask, task, true).Run() _, err = subTask.GetResult(0) } } return nil, err }, dateList) tasksch.HandleTask(rootTask, nil, true).Run() if !isAsync { _, err = rootTask.GetResult(0) } else { hint = rootTask.ID } return hint, err } func CheckImages(ctx *jxcontext.Context, isAsync, isContinueWhenError bool) (hint string, err error) { // db := dao.GetDB() // rootTask := tasksch.NewSeqTask("检查图片的有效性", ctx, // func(task *tasksch.SeqTask, step int, params ...interface{}) (result interface{}, err error) { // switch step { // case 0: // 检查图片的格式与大小 // var imgList []*model.DataResource // if err = dao.GetRows(db, &imgList, ` // SELECT t1.* // FROM data_resource t1 // WHERE t1.use_type = 1 // `); err == nil && len(imgList) > 0 { // calcTask := tasksch.NewParallelTask("检查京西图片的有效性", // tasksch.NewParallelConfig().SetIsContinueWhenError(isContinueWhenError).SetParallelCount(5), ctx, // func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { // dataRes := batchItemList[0].(*model.DataResource) // binaryData, hashCode, err2 := jxutils.DownloadFileByURL(dataRes.MainURL) // if err = err2; err == nil { // errMsg := "" // if hashCode != dataRes.HashCode { // errMsg = fmt.Sprintf("hashcode:%s", hashCode) // dataRes.HashCode = hashCode // } // resType := http.DetectContentType(binaryData) // if resType != dataRes.ResourceType { // errMsg += "," + resType // dataRes.ResourceType = resType // } // var img image.Image // if dataRes.ResourceType == "image/png" { // img, err = png.Decode(bytes.NewReader(binaryData)) // } else if dataRes.ResourceType == "image/jpeg" { // img, err = jpeg.Decode(bytes.NewReader(binaryData)) // } // if err == nil { // if img != nil { // if img.Bounds().Dx() != 800 || img.Bounds().Dy() != 800 { // errMsg += fmt.Sprintf(",size:%dx%d", img.Bounds().Dx(), img.Bounds().Dy()) // } // } // } else { // errMsg += "," + err.Error() // } // if errMsg != "" { // dataRes.Remark = errMsg // dao.UpdateEntity(dao.GetDB(), dataRes, "Remark", "ResourceType", "HashCode") // } // } // return retVal, err // }, imgList) // tasksch.HandleTask(calcTask, task, false).Run() // _, err = calcTask.GetResult(0) // } // case 1: // 检查京东商品图片 // skuNameInfo, err2 := cms.GetSkuNames(ctx, "", false, map[string]interface{}{}, 0, -1) // if err = err2; err == nil && len(skuNameInfo.SkuNames) > 0 { // calcTask := tasksch.NewParallelTask("检查京东图片的有效性", // tasksch.NewParallelConfig().SetIsContinueWhenError(isContinueWhenError).SetParallelCount(5), ctx, // func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { // skuName := batchItemList[0].(*model.SkuNameExt) // for _, sku := range skuName.Skus { // if sku.JdID != 0 { // skuPageInfo, err2 := api.JdAPI.GetSkuPageInfo(sku.JdID) // if err = err2; err == nil && skuPageInfo.FixedStatus && len(skuPageInfo.Image) == 0 { // err = fmt.Errorf("skuName:%d, sku:%d, jdid:%d, 没有图片", skuName.ID, sku.ID, sku.JdID) // skuName.ImgHashCode = "np" // dao.UpdateEntity(dao.GetDB(), &skuName.SkuName, "ImgHashCode") // } // break // } // } // return retVal, err // }, skuNameInfo.SkuNames) // tasksch.HandleTask(calcTask, task, false).Run() // _, err = calcTask.GetResult(0) // } // } // return result, err // }, 2) // tasksch.HandleTask(rootTask, nil, true).Run() // if !isAsync { // if _, err = rootTask.GetResult(0); err == nil { // hint = "1" // } // } else { // hint = rootTask.ID // } return hint, err } func fixMtwmCategoryList(cats []*partner.BareCategoryInfo, vendorStoreID string, name2CatMap map[string]*model.SkuCategory, id2CatMap map[int]*model.SkuCategory) (err error) { errList := errlist.New() for _, v := range cats { // 深度优先,先处理底层次的分类 errList.AddErr(fixMtwmCategoryList(v.Children, vendorStoreID, name2CatMap, id2CatMap)) var cat *model.SkuCategory var catCodeStr string rFilterCatName := utils.FilterEmoji(v.Name) if rCatCode := int(utils.Str2Int64WithDefault(v.VendorCatID, 0)); rCatCode > 0 { catCodeStr = utils.Int2Str(rCatCode) if catCodeStr == v.VendorCatID { // 防止带有数字分类名误被认为是catCode cat = id2CatMap[rCatCode] } else { catCodeStr = "" } } if cat == nil { cat = name2CatMap[rFilterCatName] } if cat != nil { if v.Name != cat.Name || v.VendorCatID != utils.Int2Str(cat.ID) { errList.AddErr(api.MtwmAPI.RetailCatUpdate(vendorStoreID, cat.Name, &mtwmapi.Param4UpdateCat{ CategoryCodeOrigin: catCodeStr, CategoryNameOrigin: v.Name, CategoryCode: utils.Int2Str(cat.ID), Sequence: v.Seq, })) } } else if rFilterCatName != v.Name { errList.AddErr(api.MtwmAPI.RetailCatUpdate(vendorStoreID, rFilterCatName[:len(rFilterCatName)-2], &mtwmapi.Param4UpdateCat{ CategoryCodeOrigin: catCodeStr, CategoryNameOrigin: v.Name, Sequence: v.Seq, })) } } return errList.GetErrListAsOne() } func FixMtwmCategory(ctx *jxcontext.Context, mtwmStoreIDs []int, isAsync, isContinueWhenError bool) (hint string, err error) { id2CatMap := make(map[int]*model.SkuCategory) name2CatMap := make(map[string]*model.SkuCategory) var mtwmIDMap map[string]int if len(mtwmStoreIDs) > 0 { mtwmIDMap = make(map[string]int) for _, v := range mtwmStoreIDs { mtwmIDMap[utils.Int2Str(v)] = 1 } } task := tasksch.NewParallelTask("修复美团分类信息", tasksch.NewParallelConfig().SetParallelCount(1), ctx, func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { step := batchItemList[0].(int) switch step { case 0: var catList []*model.SkuCategory sql := ` SELECT * FROM sku_category t1 WHERE t1.deleted_at = ? ` db := dao.GetDB() if err = dao.GetRows(db, &catList, sql, utils.DefaultTimeValue); err != nil { return nil, err } for _, v := range catList { v.Name = utils.FilterEmoji(v.Name) id2CatMap[v.ID] = v name2CatMap[v.Name] = v } case 1: storeIDs, err := mtwm.CurPurchaseHandler.GetAllStoresVendorID(ctx, "") if err != nil { return nil, err } subTask := tasksch.NewParallelTask("修复美团分类信息2", tasksch.NewParallelConfig().SetParallelCount(5).SetIsContinueWhenError(true), ctx, func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { storeID := batchItemList[0].(string) if mtwmIDMap == nil || mtwmIDMap[storeID] == 1 { catList, err := mtwm.CurPurchaseHandler.GetStoreAllCategories(ctx, 0, storeID) if err == nil { err = fixMtwmCategoryList(catList, storeID, name2CatMap, id2CatMap) } } return retVal, err }, storeIDs) tasksch.HandleTask(subTask, task, true).Run() _, err = subTask.GetResult(0) } return retVal, err }, []int{0, 1}) tasksch.HandleTask(task, nil, true).Run() if !isAsync { _, err = task.GetResult(0) hint = "1" } else { hint = task.GetID() } return hint, err } func JdStoreInfo1125() (hint string, err error) { fileName := "老格恢复拓店进度.xlsx" db := dao.GetDB() storeList, err := dao.GetStoresMapList(db, []int{model.VendorIDJD}, nil, nil, model.StoreStatusAll, model.StoreIsSyncYes, "", "", "") if err == nil { var validStoreList []*dao.StoreDetail for _, v := range storeList { if v.Status != model.StoreStatusDisabled && v.CreatedAt.Sub(utils.Str2Time("2019-10-01")) > 0 { storeInfo, err := api.JdAPI.GetStoreInfoByStationNo2(v.VendorStoreID) if err == nil && storeInfo.CreateTime.GoTime().Sub(utils.Str2Time("2019-10-25")) > 0 { if storeDetail, err := dao.GetStoreDetail(db, v.StoreID, v.VendorID, ""); err == nil { validStoreList = append(validStoreList, storeDetail) } } } } getStoreList := func(lng, lat, lng2, lat2 int) (vendorStoreIDs []string) { for _, v := range validStoreList { if v.Lng >= lng && v.Lng <= lng2 && v.Lat >= lat && v.Lat <= lat2 { vendorStoreIDs = append(vendorStoreIDs, v.VendorStoreID) } } return vendorStoreIDs } sheetName := "老格明细" file, err2 := excelize.OpenFile(fileName) if err = err2; err == nil { // globals.SugarLogger.Debug(err, file) rows, err2 := file.GetRows(sheetName) if err = err2; err == nil { str2Coords := func(str string) (lng, lat int) { list := strings.Split(str, ",") if len(list) >= 2 { lng, lat = jxutils.StandardCoordinate2Int(utils.Str2Float64WithDefault(list[1], 0)), jxutils.StandardCoordinate2Int(utils.Str2Float64WithDefault(list[0], 0)) } return lng, lat } for i := 1; i < len(rows); i++ { lng, lat := str2Coords(rows[i][8]) lng2, lat2 := str2Coords(rows[i][7]) vendorStoreIDs := getStoreList(lng, lat, lng2, lat2) // fmt.Printf("%d,%v", i, vendorStoreIDs) countInfo := fmt.Sprintf("京西已拓%d", len(vendorStoreIDs)) axis, _ := excelize.CoordinatesToCellName(5, i+1) file.SetCellStr(sheetName, axis, countInfo) axis2, _ := excelize.CoordinatesToCellName(6, i+1) file.SetCellStr(sheetName, axis2, strings.Join(vendorStoreIDs, ",")) } file.SaveAs("ffff.xlsx") } } } return hint, err } func BuildSkuFromEbaiStore(ctx *jxcontext.Context, baiduShopID int64, isAsync, isContinueWhenError bool) (hint string, err error) { ebaiCatIDKey := "ebaiCatID" catList, err := api.EbaiAPI.PageGetCustomCatList(baiduShopID) if err != nil { return hint, err } catMap := make(map[string]map[string]interface{}) allSkuInfo := make(map[string]map[string]map[string]map[string]interface{}) for _, cat := range catList { catName := utils.Interface2String(cat["cat_name"]) if catName == "限时特惠" || catName == "应季热销" { catName = "应季水果" } skuNameMap := allSkuInfo[catName] if skuNameMap == nil { skuNameMap = make(map[string]map[string]map[string]interface{}) allSkuInfo[catName] = skuNameMap } if catMap[catName] == nil { catMap[catName] = cat } skuList, err2 := api.EbaiAPI.PageGetCustomSkuList(baiduShopID, utils.Str2Int64(utils.Interface2String(cat["cat_id"]))) if err = err2; err != nil { return hint, err } for _, sku := range skuList { _, _, _, specUnit, _, specQuality := jxutils.SplitSkuName(sku["upc_name"].(string)) if specQuality > 0 { if catMap[catName][ebaiCatIDKey] == nil { catMap[catName][ebaiCatIDKey] = utils.Interface2String(sku["cat3_id"]) } skuNameKey := sku["photos"].([]interface{})[0].(map[string]interface{})["url"].(string) if skuNameMap[skuNameKey] == nil { skuNameMap[skuNameKey] = make(map[string]map[string]interface{}) } skuNameMap[skuNameKey][fmt.Sprintf("%f.%s", specQuality, specUnit)] = sku } } } allSkuInfo2 := make(map[*model.SkuCategory][]*model.SkuNameExt) catSeq := 0 for catName, catSkuNameMap := range allSkuInfo { if len(catSkuNameMap) > 0 { skuCat := &model.SkuCategory{ Name: catName, ParentID: 0, Level: 1, Type: model.SkuCategoryNormal, Seq: catSeq, EbaiCategoryID: utils.Str2Int64(utils.Interface2String(catMap[catName][ebaiCatIDKey])), } catSeq++ for _, skuList := range catSkuNameMap { var skuNameExt *model.SkuNameExt for _, sku := range skuList { prefix, name, comment, specUnit, unit, specQuality := jxutils.SplitSkuName(sku["upc_name"].(string)) if skuNameExt == nil { skuNameExt = &model.SkuNameExt{ SkuName: model.SkuName{ Prefix: prefix, Name: name, // CategoryID: IsGlobal: 1, Unit: unit, SpecQuality: specQuality, SpecUnit: specUnit, Price: int(jxutils.StandardPrice2Int(utils.MustInterface2Float64(sku["sale_price"]))), Img: sku["photos"].([]interface{})[0].(map[string]interface{})["url"].(string), Status: model.SkuStatusNormal, IsSpu: 0, }, } if len(skuList) > 1 { skuNameExt.Unit = "份" skuNameExt.SpecQuality = 500 skuNameExt.SpecUnit = "g" } if skuNameExt.Unit == "份" { tmpSpecQuality := specQuality if specUnit == "kg" || specUnit == "l" { tmpSpecQuality *= 1000 } skuNameExt.Price = int(float32(skuNameExt.Price) * 500 / tmpSpecQuality) } } mySku := &model.SkuWithVendor{ Sku: &model.Sku{ // CategoryID: // NameID: Comment: comment, SpecQuality: specQuality, SpecUnit: specUnit, Weight: int(utils.Str2Int64(utils.Interface2String(sku["weight"]))), Status: model.SkuStatusNormal, SkuIndex: int(jxutils.StandardPrice2Int(utils.MustInterface2Float64(sku["sale_price"]))), // 临时传递价格用 }, } if sku["enabled"].(string) == "0" { mySku.Status = model.SkuStatusDontSale } skuNameExt.Skus = append(skuNameExt.Skus, mySku) } allSkuInfo2[skuCat] = append(allSkuInfo2[skuCat], skuNameExt) } } } startOutSkuID := 1000 var skuCatList []*model.SkuCategory for cat := range allSkuInfo2 { skuCatList = append(skuCatList, cat) } putPolicy := storage.PutPolicy{ Scope: globals.QiniuBucket, // Expires: 10 * 60, } cfg := &storage.Config{} upToken := putPolicy.UploadToken(api.QiniuAPI) rootTask := tasksch.NewSeqTask("BuildSkuFromEbaiStore", ctx, func(rootTask *tasksch.SeqTask, step int, params ...interface{}) (result interface{}, err error) { var catID string cat := skuCatList[step] skuNameExtList := allSkuInfo2[cat] catID, err = addShopCategory(0, cat.Name, int(cat.Level), cat.Seq, ctx.GetUserName()) if err == nil { shopCategories := []int64{utils.Str2Int64(catID)} for _, skuNameExt := range skuNameExtList { var imgContent []byte skuNameExt.CategoryID = cat.ID skuNameExt.Img = strings.Replace(skuNameExt.Img, "https://", "http://", 1) if imgContent, _, err = jxutils.DownloadFileByURL(skuNameExt.Img); err != nil { globals.SugarLogger.Infof("download pic %s failed with error:%v", skuNameExt.Img, err) if !isContinueWhenError { return nil, err } err = nil continue } formUploader := storage.NewFormUploader(cfg) ret := storage.PutRet{} key := jxutils.GenPicFileName(".jpeg") for i := 0; i < 3; i++ { if err = formUploader.Put(context.Background(), &ret, upToken, key, bytes.NewReader(imgContent), int64(len(imgContent)), &storage.PutExtra{}); err == nil { break } } if err != nil { globals.SugarLogger.Infof("upload pic %s failed with error:%v", skuNameExt.Img, err) if !isContinueWhenError { return nil, err } err = nil continue } qiniuImgURL := jxutils.ComposeQiniuResURL(key) + "?imageMogr2/thumbnail/x800/gravity/Center/crop/800x800" for _, sku := range skuNameExt.Skus { jdCatID := 22410 // 其他国产水果 if cat.Name == "进口水果" { jdCatID = 20342 // 其他进口水果 } price := sku.SkuIndex skuName := jxutils.ComposeSkuNameOriginal(skuNameExt.Prefix, skuNameExt.Name, sku.Comment, skuNameExt.Unit, sku.SpecQuality, sku.SpecUnit, jdapi.MaxSkuNameCharCount) fixedStatus := 1 if sku.Status != model.SkuStatusNormal { fixedStatus = 2 } var vendorSkuID string vendorSkuID, err = addSku(utils.Int2Str(startOutSkuID), jdCatID, shopCategories, jd.DefBrandID, skuName, price, jxutils.IntWeight2Float(sku.Weight), []string{qiniuImgURL}, fixedStatus, true, nil) if err == nil { globals.SugarLogger.Debugf("vendorSkuID=%s", vendorSkuID) } else { globals.SugarLogger.Infof("create %s failed with error:%v", skuName, err) if !isContinueWhenError { return nil, err } err = nil } // fmt.Printf("%s,[%s]%s-%f-%s, %s, %s\n", cat.Name, skuNameExt.Prefix, skuNameExt.Name, skuNameExt.SpecQuality, skuNameExt.SpecUnit, qiniuImgURL, skuName) startOutSkuID++ // rootTask.Cancel() // return nil, nil } } } else { return nil, err } return nil, err }, len(skuCatList)) tasksch.ManageTask(rootTask).Run() if !isAsync { _, err = rootTask.GetResult(0) } else { hint = rootTask.ID } return hint, err } func addShopCategory(pid int64, shopCategoryName string, shopCategoryLevel, sort int, userName string) (catId string, err error) { // globals.SugarLogger.Debug(pid, shopCategoryName, shopCategoryLevel, sort, userName) // return "123", err return api.JdAPI.AddShopCategory(pid, shopCategoryName, shopCategoryLevel, sort, userName) } func addSku(outSkuId string, cagtegoryId int, shopCategories []int64, brandId int, skuName string, skuPrice int, weight float32, images []string, fixedStatus int, isSale bool, addParams map[string]interface{}) (skuId string, err error) { // globals.SugarLogger.Debug(outSkuId, cagtegoryId, shopCategories, brandId, skuName, skuPrice, weight, images, fixedStatus, isSale, addParams) // return "456", err return api.JdAPI.AddSku(outSkuId, cagtegoryId, shopCategories, brandId, skuName, skuPrice, weight, images, fixedStatus, isSale, addParams) } func UploadJdsImage(ctx *jxcontext.Context) (err error) { // var ( // jdStoreIDs = []string{"12007046"} // jdStoreIDxipu = "12005417" // skuMap = make(map[string]partner.StoreSkuInfo) // priceList = make(map[string][]*partner.StoreSkuInfo) // statusList1 = make(map[string][]*partner.StoreSkuInfo) // statusList2 = make(map[string][]*partner.StoreSkuInfo) // stockList = make(map[string][]*partner.StoreSkuInfo) // vendorOrgCode = "320406" // vendorOrgCode = "82029" // ) // handler := partner.GetPurchasePlatformFromVendorID(model.VendorIDJD).(partner.IPurchasePlatformStoreSkuHandler) // multiHandler := partner.GetPurchasePlatformFromVendorID(model.VendorIDJD).(partner.IMultipleStoresHandler) // allSkuNameInfoList, err := multiHandler.GetSkus(ctx, vendorOrgCode, 0, "") // skuInfos := storeSkuFullList2BareFilter(allSkuNameInfoList) // outStoreSkuList, err := handler.GetStoreSkusBareInfo(ctx, vendorOrgCode, nil, 0, jdStoreIDxipu, skuInfos) // for _, vv := range outStoreSkuList { // skuMap[vv.VendorSkuID] = *vv // } // for _, jdStoreID := range jdStoreIDs { // skuInfos2 := storeSkuFullList2BareFilter(allSkuNameInfoList) // outStoreSkuList2, _ := handler.GetStoreSkusBareInfo(ctx, vendorOrgCode, nil, 0, jdStoreID, skuInfos2) // for _, v := range outStoreSkuList2 { // v.VendorPrice = utils.Float64TwoInt64(float64(v.VendorPrice) * 1.05) // priceList[jdStoreID] = append(priceList[jdStoreID], v) // a := skuMap[v.VendorSkuID] // if &a == nil { // continue // } // if a.VendorPrice != v.VendorPrice { // v.VendorPrice = a.VendorPrice // priceList[jdStoreID] = append(priceList[jdStoreID], v) // } // if a.Status != v.Status { // v.Status = a.Status // if v.Status == model.SkuStatusNormal { // statusList1[jdStoreID] = append(statusList1[jdStoreID], v) // } else { // statusList2[jdStoreID] = append(statusList2[jdStoreID], v) // } // } // if a.Stock != v.Stock { // v.Stock = a.Stock // stockList[jdStoreID] = append(stockList[jdStoreID], v) // } // } // } // task := tasksch.NewParallelTask("syncStoreSkuNew", tasksch.NewParallelConfig().SetParallelCount(1).SetIsContinueWhenError(true), ctx, // func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { // step := batchItemList[0].(int) // switch step { // case 0: // if len(priceList) > 0 { // for k, v := range priceList { // _, err = putils.FreeBatchStoreSkuInfo("更新门店商品价格", func(task tasksch.ITask, batchedStoreSkuList []*partner.StoreSkuInfo) (result interface{}, successCount int, err error) { // failedList, err := handler.UpdateStoreSkusPrice(ctx, vendorOrgCode, 0, k, batchedStoreSkuList) // if len(failedList) > 0 { // task.AddFailedList(failedList) // } // return nil, 1, err // }, ctx, task, v, 50, true) // } // } // case 1: // if len(statusList1) > 0 { // for k, v := range statusList1 { // _, err = putils.FreeBatchStoreSkuInfo("更新门店商品状态", func(task tasksch.ITask, batchedStoreSkuList []*partner.StoreSkuInfo) (result interface{}, successCount int, err error) { // failedList, err := handler.UpdateStoreSkusStatus(ctx, vendorOrgCode, 0, k, batchedStoreSkuList, batchedStoreSkuList[0].Status) // if len(failedList) > 0 { // task.AddFailedList(failedList) // } // return nil, 1, err // }, ctx, task, v, 50, true) // } // } // case 2: // case 3: // if len(stockList) > 0 { // for k, v := range stockList { // _, err = putils.FreeBatchStoreSkuInfo("更新门店商品库存", func(task tasksch.ITask, batchedStoreSkuList []*partner.StoreSkuInfo) (result interface{}, successCount int, err error) { // failedList, err := handler.UpdateStoreSkusStock(ctx, vendorOrgCode, 0, k, batchedStoreSkuList) // if len(failedList) > 0 { // task.AddFailedList(failedList) // } // return nil, 1, err // }, ctx, task, v, 50, true) // } // } // } // return retVal, err // }, []int{0}) // tasksch.HandleTask(task, nil, true).Run() // _, err = task.GetResult(0) //建店 // var ( // storeMaps []*model.StoreMap // db = dao.GetDB() // ) // if configs, err := dao.QueryConfigs(dao.GetDB(), "jdsCookie2", model.ConfigTypeCookie, ""); err == nil { // api.JdShop2API.SetCookieWithStr(configs[0].Value) // } // sql := ` // SELECT * from store_map where vendor_id = 5 and deleted_at = '1970-01-01 00:00:00' and vendor_org_code = 2 and store_id <> 667281 // AND store_id <> 100000 // AND store_id <> 102919 // AND LENGTH(vendor_store_id) < 9 // ` // err = dao.GetRows(db, &storeMaps, sql, nil) // for _, v := range storeMaps { // store, _ := dao.GetStoreDetail(db, v.StoreID, model.VendorIDJDShop, "2") // err = api.JdShop2API.DeleteStoresByID(utils.Str2Int64(store.VendorStoreID)) // time.Sleep(time.Second) // data, _, _ := jxutils.DownloadFileByURL(jdshopapi.JdsStoreImg) // url, _ := api.JdShop2API.UploadImageNew(data, "2659335b16e3880e367759b8fc675933.tem.png") // ex := store.LicenceExpire // if ex == "" { // ex = utils.Time2Str(utils.Str2Time(store.LicenceValid).AddDate(0, 6, 0)) // } // if !strings.Contains(ex, "00:00:00") { // ex += " 00:00:00" // } // var url2 string // if store.Licence != "" { // data2, _, _ := jxutils.DownloadFileByURL(store.Licence) // fileName := store.Licence[strings.LastIndex(store.Licence, "/")+1 : len(store.Licence)] // url2, _ = api.JdShop2API.UploadImageNew(data2, fileName) // } // storeName := store.Name // if strings.Contains(storeName, "(") { // storeName = storeName[0:strings.Index(storeName, "(")] + storeName[strings.Index(storeName, ")")+3:len(storeName)] // } // if strings.Contains(storeName, "(") { // storeName = storeName[0:strings.Index(storeName, "(")] + storeName[strings.Index(storeName, ")")+3:len(storeName)] // } // if strings.Contains(storeName, ".") { // storeName = strings.ReplaceAll(storeName, ".", "") // } // if strings.Contains(storeName, "-") { // storeName = strings.ReplaceAll(storeName, "-", "") // } // if strings.Contains(storeName, " ") { // storeName = strings.ReplaceAll(storeName, " ", "") // } // storeName = "京西菜市" + strings.ReplaceAll(storeName, "店", "") + "生鲜店" // if len(storeName) > 30 { // storeName = utils.LimitUTF8StringLen2(storeName, 30) // } // param := &jdshopapi.UpdateBasicParam{ // StoreName: storeName, // CategoryID2: 4, // Coordinate: utils.Float64ToStr(jxutils.IntCoordinate2Standard(store.Lat)) + "," + utils.Float64ToStr(jxutils.IntCoordinate2Standard(store.Lng)), // BussinessBeginTime: int2TimeStr(int(store.OpenTime1)), // BussinessEndTime: int2TimeStr(int(store.CloseTime1)), // ImgURL: url, // StorePhone: store.Tel1, // AddName: store.Address, // AddCode3: store.JdsCode, // CategoryID1: 3, // } // if url2 != "" { // param.CategoryID1 = 34 // param.CategoryID2 = 62 // param.QualificationRequests = []*jdshopapi.QualificationRequests{ // &jdshopapi.QualificationRequests{ // QualificationID: 41, // QualificationName: "营业执照", // QualificationNo: store.LicenceCode, // QualificationURL: url2, // StartTime: utils.Time2Str(utils.Str2Time(store.LicenceValid)), // EndingTime: ex, // Time: []string{utils.Time2Str(utils.Str2Time(store.LicenceValid)), ex}, // }, // } // } // if store.JdsStreetCode != 0 { // param.AddCode3 = store.JdsStreetCode // } // if param.AddCode3 == 0 { // param.AddCode3 = store.JdCode // } // //证明这个店可能隶属直辖市或者东莞 // if model.ZXCityCodeMap[store.CityCode] != "" { // result, _ := api.AutonaviAPI.GetCoordinateAreaInfo(jxutils.IntCoordinate2Standard(store.Lng), jxutils.IntCoordinate2Standard(store.Lat)) // if result["regeocode"] != nil { // street := result["regeocode"].(map[string]interface{})["addressComponent"].(map[string]interface{})["township"].(string) // if street != "" { // result1, _ := api.JdShopAPI.GetProvince() // for _, v := range result1 { // if strings.Contains(store.CityName, v.AreaName) { // result2, _ := api.JdShopAPI.GetCity(v.AreaID) // for _, vv := range result2 { // if strings.Contains(store.DistrictName, vv.AreaName) { // result3, _ := api.JdShopAPI.GetCounty(vv.AreaID) // for _, vvv := range result3 { // if street == vvv.AreaName { // param.AddCode3 = vvv.AreaID // break // } // } // } // } // } // } // } // } // } // if vendorStroeID, err := api.JdShop2API.SubmitBasic(param); err == nil { // v.VendorStoreID = utils.Int64ToStr(vendorStroeID) // dao.UpdateEntity(db, v, "VendorStoreID") // time.Sleep(time.Second) // err = api.JdShop2API.UpdateExpand(int(vendorStroeID)) // } // } //分类 // var ( // db = dao.GetDB() // ) // catResult, _ := api.JdShop2API.FindShopCategories() // for _, v := range catResult { // var skuCat *model.SkuCategory // sql := ` // SELECT * // FROM sku_category // WHERE deleted_at = ? // AND name = ? // AND is_exd_spec = 0 // ` // sqlParams := []interface{}{utils.DefaultTimeValue, v.Name} // err = dao.GetRow(db, &skuCat, sql, sqlParams) // if skuCat != nil { // var storeSkuCat *model.StoreSkuCategoryMap // sql2 := ` // SELECT * // FROM store_sku_category_map // WHERE store_id = ? // AND deleted_at = ? // AND category_id = ? // ` // sqlParams2 := []interface{}{100000, utils.DefaultTimeValue, skuCat.ID} // err = dao.GetRow(db, &storeSkuCat, sql2, sqlParams2) // if storeSkuCat != nil { // storeSkuCat.JdsID = v.CID // dao.UpdateEntity(db, storeSkuCat, "JdsID") // } // } // } //京东商城补身份证 // var ( // storeMaps []*model.StoreMap // db = dao.GetDB() // ) // sql := ` // SELECT * from store_map where vendor_id = 5 and deleted_at = '1970-01-01 00:00:00' and vendor_org_code = 2 // and store_id <> 100206 // ` // dao.GetRows(db, &storeMaps, sql, nil) // for _, v := range storeMaps { // detail, _ := api.JdShop2API.ShopDetail(utils.Str2Int(v.VendorStoreID)) // storeDetail, _ := dao.GetStoreDetail(db, v.StoreID, model.VendorIDJDShop, "2") // var ( // url2 string // idCode string // startTime string // ) // if storeDetail.IDCardFront != "" { // data2, _, _ := jxutils.DownloadFileByURL(storeDetail.IDCardFront) // fileName := storeDetail.IDCardFront[strings.LastIndex(storeDetail.IDCardFront, "/")+1 : len(storeDetail.IDCardFront)] // url2, _ = api.JdShop2API.UploadImageNew(data2, fileName) // } else { // data2, _, _ := jxutils.DownloadFileByURL("http://image.jxc4.com/image/a9bfc170a950ab9a4c76bd10b48b222b.tem.jpg") // fileName := "a9bfc170a950ab9a4c76bd10b48b222b.tem.jpg" // url2, _ = api.JdShop2API.UploadImageNew(data2, fileName) // } // if storeDetail.IDCode == "" { // idCode = "610126198012230014" // } else { // idCode = storeDetail.IDCode // } // if storeDetail.IDValid == "" { // startTime = "2013-01-25 00:00:00" // } else { // startTime = utils.Time2Str(utils.Str2Time(storeDetail.IDValid)) // } // ex := storeDetail.IDExpire // if ex == "" { // ex = utils.Time2Str(utils.Str2Time(storeDetail.IDValid).AddDate(20, 0, 0)) // } // if !strings.Contains(ex, "00:00:00") { // ex += " 00:00:00" // } // api.JdShop2API.UpdateBasic(&jdshopapi.UpdateBasicParam{ // StoreID: detail.StoreID, // StoreName: detail.StoreName, // CategoryID2: detail.CategoryID2, // Coordinate: detail.Coordinate, // BussinessBeginTime: detail.BussinessBeginTime, // BussinessEndTime: detail.BussinessEndTime, // ImgURL: detail.ImgURL, // StorePhone: detail.StorePhone, // AddName: storeDetail.Address, // AddCode1: detail.AddCode1, // AddCode2: detail.AddCode2, // AddCode3: detail.AddCode3, // CategoryID1: detail.CategoryID1, // QualificationRequests: []*jdshopapi.QualificationRequests{ // &jdshopapi.QualificationRequests{ // QualificationID: 41, // QualificationName: "营业执照", // QualificationNo: detail.QualificationInfoTOList[0].QualificationNo, // QualificationURL: detail.QualificationInfoTOList[0].QualificationURL, // StartTime: detail.QualificationInfoTOList[0].StartTime, // EndingTime: detail.QualificationInfoTOList[0].EndingTime, // Time: []string{detail.QualificationInfoTOList[0].StartTime, detail.QualificationInfoTOList[0].EndingTime}, // }, // &jdshopapi.QualificationRequests{ // QualificationID: 42, // QualificationName: "身份证件", // QualificationNo: idCode, // QualificationURL: url2, // StartTime: startTime, // EndingTime: ex, // Time: []string{startTime, ex}, // }, // }, // }) // } // var ( // db = dao.GetDB() // vendorThingIDs []int64 // ) // storeMaps, _ := dao.GetStoresMapList(db, []int{model.VendorIDJD}, nil, []int{model.StoreStatusOpened, model.StoreStatusHaveRest, model.StoreStatusClosed}, model.StoreStatusAll, model.StoreIsSyncAll, "", "", "320406") // things, _ := dao.GetThingMapList(db, model.ThingTypeSku, []int{model.VendorIDJD}, nil, []string{"320406"}) // thingIDmap := make(map[int64]string) // for _, v := range things { // if v.VendorThingID != "" { // // lists = append(lists, &jdapi.SkuIdEntity{ // // OutSkuId: utils.Int64ToStr(v.ThingID), // // }) // vendorThingIDs = append(vendorThingIDs, utils.Str2Int64(v.VendorThingID)) // thingIDmap[utils.Str2Int64(v.VendorThingID)] = utils.Int64ToStr(v.ThingID) // } // } // task := tasksch.NewParallelTask("uuuuu", tasksch.NewParallelConfig().SetParallelCount(1).SetIsContinueWhenError(true), ctx, // func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { // storeMap := batchItemList[0].(*model.StoreMap) // FreeBatchInfo("uuuuu2", func(task tasksch.ITask, batchedStoreSkuList []int64) (result interface{}, successCount int, err error) { // priceInfo, _ := api.JdAPI.GetStationInfoList(storeMap.VendorStoreID, batchedStoreSkuList) // var list []*jdapi.SkuIdEntity // for _, vv := range priceInfo { // if vv.VipPrice != 0 { // fmt.Println("vipPrice uuu", vv.SkuID) // list = append(list, &jdapi.SkuIdEntity{ // OutSkuId: thingIDmap[vv.SkuID], // }) // } // } // err = api.JdAPI.DelVipPrice(utils.Int2Str(storeMap.StoreID), list) // return result, 0, err // }, ctx, task, vendorThingIDs, 50, true) // return retVal, err // }, storeMaps) // tasksch.HandleTask(task, nil, true).Run() // _, err = task.GetResult(0) var ( storeMaps []*model.StoreMap db = dao.GetDB() stores []int ) sql := ` SELECT * FROM store_map WHERE deleted_at = ? AND vendor_org_code = ? AND vendor_id = ? AND store_id IN ( 103075, 100129, 100117, 102726, 666677, 666997, 100156, 666987, 100118, 103113, 100144, 101039, 100153, 100881, 667142, 102630, 101897, 102613, 666799, 103177, 100766, 103035, 103090, 102167, 100326, 100454, 102416, 102789, 103037, 101176, 102713, 667057, 102482, 102938, 100920, 102614, 102624, 102675, 102902, 102956, 666748, 666876, 100115, 100141, 100524, 100670, 102671, 102987, 103022, 100206, 100274, 101780, 102138, 102206, 102255, 102785, 102951, 102996, 103111, 667058, 100610, 101099, 102293, 102819, 102824, 102857, 102865, 666751, 100654, 101111, 101945, 101960, 102795, 667093, 100121, 100193, 100230, 102481, 102772, 102969, 103063, 103094, 100126, 100175, 100210, 100270, 102706, 102930, 103116, 666672, 666712, 101840, 102241, 102595, 102686, 102736, 102973, 666735, 666790, 666792, 100205, 100453, 100905, 102147, 102320, 102767, 102925, 102937, 102962, 102994, 103002, 100409, 101956, 102353, 102475, 102794, 102852, 102921, 102928, 102980, 103183, 666669, 666733, 666861, 100204, 100225, 100476, 100699, 102354, 102915, 102923, 102929, 102952, 103069, 100215, 100279, 100458, 100517, 100664, 101013, 101666, 103093, 103191, 103425, 666996, 100132, 100278, 100328, 101032, 102022, 102355, 102364, 102436, 102763, 102776, 102893, 102924, 102966, 666779, 666906, 667110, 100290, 100455, 100471, 101875, 102126, 102479, 103103, 103199, 666767, 666992, 103003, 103088, 666667, 666711, 666930, 101979, 102046, 103201, 666819, 666879, 100116, 100157, 100712, 101061, 101736, 101755, 102561, 102960, 103193, 666905, 666993, 100299, 100334, 100987, 101112, 102264, 102278, 102704, 102752, 102771, 102997, 666828, 666863, 100501, 100681, 101012, 102002, 666746, 666853, 666898, 666985, 667109, 100336, 100543, 102426, 102933, 103194, 100366, 101942, 102186, 102533, 103151, 103200, 666729, 666820, 666854, 666954, 667033, 667064, 100361, 101750, 102374, 102977, 102991, 103015, 103170, 666864, 666890, 666933, 100840, 101983, 102648, 102932, 103018, 103050, 103065, 103171, 666932, 667091, 100002, 100140, 100150, 100828, 100853, 100867, 101000, 102488, 102782, 102807, 102995, 103029, 100124, 102172, 102637, 102705, 102934, 103098, 666855, 667014, 667076, 100714, 102480, 102519, 102594, 102600, 103089, 103189, 667113, 667136, 100134, 100451, 101078, 102047, 103033, 103085, 103127, 666739, 666784, 666891, 666975, 100167, 100782, 101042, 102424, 102723, 102741, 102793, 102883, 102888, 666852, 667003, 100433, 102742, 102836, 103112, 666740, 666835, 666887, 667007, 100130, 100487, 100546, 100982, 102181, 666782, 666961, 666973, 667005, 667038, 667075, 100145, 100369, 100444, 100720, 100741, 101028, 102853, 102953, 103057, 103082, 100032, 100041, 100396, 100837, 102371, 102473, 102718, 102998, 103361, 103408, 666788, 666800, 666948, 666980, 667001, 667006, 100650, 102498, 102676, 666812, 666826, 666929, 666955, 667028, 667094, 667125, 100529, 102720, 102749, 102882, 103032, 666775, 666803, 666927, 666944, 100065, 100162, 100296, 103036, 103055, 103184, 666707, 666839, 666964, 667067, 100470, 102068, 102358, 102733, 103181, 100015, 100549, 100849, 101732, 101763, 102074, 102780, 102821, 102859, 103083, 103118, 103416, 666771, 666802, 102562, 102856, 103160, 666811, 666818, 666850, 666984, 666988, 667071, 100267, 100309, 101916, 103051, 103165, 666783, 666889, 666900, 101008, 102300, 102750, 102958, 103161, 666756, 666786, 666836, 666840, 666880, 666977, 666983, 100123, 100165, 100351, 100548, 100767, 102670, 102711, 102876, 103009, 666823, 666834, 666917, 667051, 100217, 100883, 100971, 102483, 102981, 666793, 666858, 666940, 666945, 667112, 667133, 100935, 101031, 103179, 100024, 100190, 102955, 103143, 103176, 103198, 666825, 666869, 667135, 103074, 100221, 100325, 100463, 100477, 100600, 100661, 100827, 100945, 100946, 101712, 101722, 101815, 101834, 101887, 101896, 101935, 101948, 101997, 102012, 102016, 102023, 102063, 102092, 102180, 102245, 102267, 102275, 102280, 102383, 102405, 102411, 102443, 102444, 102531, 102557, 102652, 102661, 102691, 102721, 102735, 102740, 102759, 102808, 102815, 102858, 102896, 102901, 102906, 102911, 102926, 102946, 102954, 102971, 102974, 102976, 103001, 103008, 103028, 103095, 103106, 103115, 103119, 103145, 103168, 103178, 103188, 103414, 103433, 666705, 666738, 666745, 666747, 666772, 666776, 666785, 666791, 666821, 666822, 666873, 666885, 666888, 666919, 666942, 667010, 667055, 667059, 667117, 667157, 667158, 667176, 667145, 100022, 667234, 667206, 667273, 102788, 102150, 101097, 102379, 100943, 666916, 100273, 666884, 667114, 667205, 667202, 667370, 667366, 667365, 667359, 667356, 667352, 667351, 667349, 667339, 667338, 667336, 667335, 667334, 667332, 667331, 667329, 667324, 667321, 667315, 667312, 667310, 667309, 667308, 667307, 667305, 667304, 667303, 667302, 667296, 667297, 667294, 667292, 667291, 667288, 667284, 667280, 667278, 667277, 667266, 667264, 667263, 667257, 667245, 667242, 667240, 667236, 667223, 667220, 667211, 667208, 667204, 667201, 667200, 667177, 667166, 667159, 667155, 667154, 667147, 667139, 667134, 667129, 667128, 667080, 667029, 667016, 666907, 666862, 666842, 666838, 666770, 666765, 666715, 103136, 100601, 667333, 667381, 667363, 667340, 667386, 667423, 667040, 667419, 667395, 667388, 667443, 667355, 667394, 667390, 667420, 667364, 667389, 667383, 667361, 103182, 667414, 667476, 667465, 667481, 667510, 102377, 101088, 102642, 667469, 666921 ) ` sqlParams := []interface{}{ utils.DefaultTimeValue, "2", model.VendorIDJDShop, } dao.GetRows(db, &storeMaps, sql, sqlParams) for _, v := range storeMaps { err = api.JdShop2API.CreateGisFence(utils.Str2Int(v.VendorStoreID), "2") if err != nil { api.JdShop2API.CreateGisFence(utils.Str2Int(err.Error()), "2") err2 := api.JdShop2API.CreateGisFence(utils.Str2Int(v.VendorStoreID), "2") if err2 != nil { api.JdShop2API.CreateGisFence(utils.Str2Int(err.Error()), "1") err3 := api.JdShop2API.CreateGisFence(utils.Str2Int(v.VendorStoreID), "2") if err3 != nil { err4 := api.JdShop2API.CreateGisFence(utils.Str2Int(v.VendorStoreID), "1") if err4 != nil { stores = append(stores, v.StoreID) } } } } } fmt.Println("resultstore3", stores) return err } func FreeBatchInfo2(name string, handler func(tasksch.ITask, []*jdapi.SkuIdEntity) (interface{}, int, error), ctx *jxcontext.Context, parentTask tasksch.ITask, storeSkuList []*jdapi.SkuIdEntity, batchSize int, isContinueWhenError bool) (resultList []interface{}, err error) { task := tasksch.NewParallelTask2(fmt.Sprintf("FreeBatchInfo:%s", name), tasksch.NewParallelConfig().SetParallelCount(1).SetBatchSize(batchSize).SetIsContinueWhenError(isContinueWhenError), ctx, func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, successCount int, err error) { batchStoreSkuList := make([]*jdapi.SkuIdEntity, len(batchItemList)) for k, v := range batchItemList { batchStoreSkuList[k] = v.(*jdapi.SkuIdEntity) } retVal, successCount, err = handler(task, batchStoreSkuList) if err != nil { retVal = nil } return retVal, successCount, err }, storeSkuList) tasksch.HandleTask(task, parentTask, false).Run() resultList, err = task.GetResult(0) return resultList, err } func FreeBatchInfo(name string, handler func(tasksch.ITask, []int64) (interface{}, int, error), ctx *jxcontext.Context, parentTask tasksch.ITask, storeSkuList []int64, batchSize int, isContinueWhenError bool) (resultList []interface{}, err error) { task := tasksch.NewParallelTask2(fmt.Sprintf("FreeBatchInfo:%s", name), tasksch.NewParallelConfig().SetParallelCount(1).SetBatchSize(batchSize).SetIsContinueWhenError(isContinueWhenError), ctx, func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, successCount int, err error) { batchStoreSkuList := make([]int64, len(batchItemList)) for k, v := range batchItemList { batchStoreSkuList[k] = v.(int64) } retVal, successCount, err = handler(task, batchStoreSkuList) if err != nil { retVal = nil } return retVal, successCount, err }, storeSkuList) tasksch.HandleTask(task, parentTask, false).Run() resultList, err = task.GetResult(0) return resultList, err } func int2TimeStr(time int) (str string) { str += utils.Int2Str(time / 1000) str += utils.Int2Str(time % 1000 / 100) str += ":" str += utils.Int2Str(time % 100 / 10) str += utils.Int2Str(time % 10) return str } func storeSkuFullList2BareFilter(storeSkuFull []*partner.SkuNameInfo) (bareStoreSkuList []*partner.StoreSkuInfo) { for _, v := range storeSkuFull { for _, v2 := range v.SkuList { // if v2.Status > model.SkuStatusDontSale { bareStoreSkuList = append(bareStoreSkuList, &v2.StoreSkuInfo) // } } } return bareStoreSkuList } func RefreshJXPriceChange(ctx *jxcontext.Context, storeID int) (hint string, err error) { db := dao.GetDB() var ( stores []*model.Store vendorIDs = []int{0, 1, 3, 5, 9} isAsync = true isContinueWhenError = true ) sql := ` SELECT * FROM store WHERE deleted_at = ? AND pay_percentage > 50 ` sqlParams := []interface{}{utils.DefaultTimeValue} if storeID != 0 { sql += " AND id = ?" sqlParams = append(sqlParams, storeID) } err = dao.GetRows(db, &stores, sql, sqlParams) task := tasksch.NewParallelTask("刷新门店价格", tasksch.NewParallelConfig().SetIsContinueWhenError(isContinueWhenError), ctx, func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { store := batchItemList[0].(*model.Store) var skuBindInfos []*cms.StoreSkuBindInfo for _, v := range vendorIDs { storeMaps, _ := dao.GetStoresMapList(db, []int{v}, []int{store.ID}, nil, model.StoreStatusAll, model.StoreIsSyncAll, "", "", "") if len(storeMaps) > 0 { storeMap := storeMaps[0] switch v { case model.VendorIDJD: storeMap.PricePercentagePack = "京东测试报价=结算价" dao.UpdateEntity(db, storeMap, "PricePercentagePack") case model.VendorIDEBAI: storeMap.PricePercentagePack = "美团测试报价=结算价" dao.UpdateEntity(db, storeMap, "PricePercentagePack") case model.VendorIDMTWM: storeMap.PricePercentagePack = "饿百测试报价=结算价" dao.UpdateEntity(db, storeMap, "PricePercentagePack") case model.VendorIDJDShop: storeMap.PricePercentagePack = "京西100-100" dao.UpdateEntity(db, storeMap, "PricePercentagePack") case model.VendorIDJX: storeMap.PricePercentagePack = "京西100-100" dao.UpdateEntity(db, storeMap, "PricePercentagePack") } } } storeSkus, err := dao.GetStoresSkusInfo(db, []int{store.ID}, nil) for _, v := range storeSkus { skuAndName, _ := dao.GetSkus(db, []int{v.SkuID}, nil, nil, nil, nil) skuBindInfo := &cms.StoreSkuBindInfo{ // StoreID: store.ID, NameID: skuAndName[0].NameID, UnitPrice: v.UnitPrice * store.PayPercentage / 100, } skuBindInfos = append(skuBindInfos, skuBindInfo) } // cms.UpdateStoresSkusByBind(ctx, task, skuBindInfos, isAsync, isContinueWhenError, false) cms.UpdateStoresSkusWithoutSync(ctx, []int{store.ID}, skuBindInfos, false) store.PayPercentage = 100 dao.UpdateEntity(db, store, "PayPercentage") return retVal, err }, stores) tasksch.HandleTask(task, nil, true).Run() if isAsync { hint = task.GetID() } else { _, err = task.GetResult(0) hint = "1" } return hint, err }