Files
jx-callback/business/jxstore/tempop/tempop.go
2020-06-02 17:16:40 +08:00

1620 lines
59 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package tempop
import (
"bytes"
"context"
"fmt"
"regexp"
"strings"
"time"
"git.rosy.net.cn/baseapi/platformapi/jdshopapi"
"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)
}
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) {
// db := dao.GetDB()
// result1, _ := api.JdShopAPI.GetProvince()
// for _, v := range result1 {
// place1, _ := dao.GetPlaceByName(db, v.AreaName, 1, 0)
// place1.JdsCode = v.AreaID
// dao.UpdateEntity(db, place1, "JdsCode")
// result2, _ := api.JdShopAPI.GetCity(v.AreaID)
// for _, vv := range result2 {
// place2, _ := dao.GetPlaceByName(db, vv.AreaName, 2, 0)
// place2.JdsCode = vv.AreaID
// dao.UpdateEntity(db, place2, "JdsCode")
// place22, _ := dao.GetPlaceByName(db, vv.AreaName, 3, 0)
// if place22 != nil {
// place22.JdsCode = vv.AreaID
// dao.UpdateEntity(db, place22, "JdsCode")
// }
// result3, _ := api.JdShopAPI.GetCounty(vv.AreaID)
// for _, vvv := range result3 {
// place3, _ := dao.GetPlaceByName(db, vvv.AreaName, 3, 0)
// place3.JdsCode = vvv.AreaID
// dao.UpdateEntity(db, place3, "JdsCode")
// }
// }
// }
///建店
// beginTime := utils.Str2Time("2020-05-18")
// endTime := utils.Str2Time("2020-05-24")
// result, _ := misc.GetStoreTotalScoreList(nil, 0, "", beginTime, endTime, true, 50, 100, 1, 700)
// for _, v := range result.StoreTotalScoreList {
// storeMaps, _ := dao.GetStoresMapList(db, []int{model.VendorIDJX}, []int{v.StoreID}, nil, model.StoreStatusAll, model.StoreIsSyncAll, "")
// if len(storeMaps) == 0 {
// stores, _ := dao.GetStoreList(db, []int{v.StoreID}, nil, nil, nil, "")
// store := stores[0]
// if store.Status != model.StoreStatusDisabled && !strings.Contains(store.Name, "不做") {
// pricePercentagePack := ""
// if store.PayPercentage >= 90 {
// pricePercentagePack = "京西100"
// } else if store.PayPercentage >= 80 {
// pricePercentagePack = "京西80"
// } else {
// pricePercentagePack = "京西70"
// }
// storeMap := &model.StoreMap{
// Status: 1,
// VendorID: model.VendorIDJX,
// AutoPickup: 1,
// DeliveryCompetition: 1,
// PricePercentage: 100,
// IsSync: 1,
// VendorStoreID: utils.Int2Str(v.StoreID),
// PricePercentagePack: pricePercentagePack,
// }
// _, err = cms.AddStoreVendorMap(ctx, db, model.VendorIDJX, "", v.StoreID, storeMap)
// if err != nil {
// continue
// }
// }
// }
// }
//京东商城街道name
// var stores []*model.Store
// sql := `
// SELECT b.*
// FROM store_map a, store b
// WHERE a.store_id = b.id
// AND a.vendor_store_id = '' AND a.vendor_id = 5 AND a.deleted_at = ?
// AND b.deleted_at = ?
// `
// sqlParams := []interface{}{utils.DefaultTimeValue, utils.DefaultTimeValue}
// err = dao.GetRows(db, &stores, sql, sqlParams)
// for _, v := range stores {
// result, _ := api.AutonaviAPI.GetCoordinateAreaInfo(jxutils.IntCoordinate2Standard(v.Lng), jxutils.IntCoordinate2Standard(v.Lat))
// if result["regeocode"] != nil {
// street := result["regeocode"].(map[string]interface{})["addressComponent"].(map[string]interface{})["township"].(string)
// if street != "" {
// storeMaps, _ := dao.GetStoresMapList(db, []int{model.VendorIDJDShop}, []int{v.ID}, nil, model.StoreStatusAll, model.StoreIsSyncAll, "")
// storeMap := storeMaps[0]
// storeMap.JdsStreetName = street
// dao.UpdateEntity(db, storeMap, "JdsStreetName")
// }
// }
// }
// var stores []*model.Store
// sql := `
// SELECT a.*
// FROM store a
// LEFT JOIN store_map b ON a.id = b.store_id AND b.vendor_id = 5 AND b.deleted_at = '1970-01-01 00:00:00'
// WHERE 1=1
// AND (a.status = 1 OR a.status = 0)
// AND b.id IS NULL
// AND a.deleted_at = '1970-01-01 00:00:00'
// `
// err = dao.GetRows(db, &stores, sql, nil)
// for _, v := range stores {
// storeMap := &model.StoreMap{
// Status: 1,
// VendorID: model.VendorIDJDShop,
// AutoPickup: 1,
// DeliveryCompetition: 1,
// PricePercentage: 100,
// IsSync: 1,
// SyncRule: 1,
// }
// _, err = cms.AddStoreVendorMap(ctx, db, model.VendorIDJDShop, "", v.ID, storeMap)
// if err != nil {
// continue
// }
// }
_, err = api.JdShopAPI.AllOrders(&jdshopapi.AllOrdersParam{
Current: 1,
PageSize: 10,
})
return err
}