package initdata import ( "crypto/md5" "fmt" "io/ioutil" "net/http" "git.rosy.net.cn/baseapi/platformapi/autonavi" "git.rosy.net.cn/baseapi/utils" "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/partner" "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" ) func TruncateTable(db *dao.DaoDB, tableName string) (err error) { _, err = dao.ExecuteSQL(db, "TRUNCATE TABLE "+tableName) return err } func insertPlace(ctx *jxcontext.Context, db *dao.DaoDB, parent *autonavi.District, placeList []*autonavi.District) (err error) { for _, v := range placeList { if v.Level <= autonavi.DistrictLevelDistrict { place := &model.Place{ Code: int(utils.Str2Int64(v.Adcode)), Name: v.Name, Level: int8(v.Level), TelCode: v.CityCode, Enabled: 1, } if parent != nil { place.ParentCode = int(utils.Str2Int64(parent.Adcode)) } dao.WrapAddIDCULEntity(place, ctx.GetUserName()) if err = dao.CreateEntity(db, place); err != nil { return err } if err = insertPlace(ctx, db, v, v.Districts); err != nil { return err } } } return nil } func InitPlace(ctx *jxcontext.Context) (err error) { db := dao.GetDB() if err = TruncateTable(db, "place"); err == nil { placeList, err2 := api.AutonaviAPI.GetDistricts(autonavi.DistrictLevelDistrict, "") if err = err2; err != nil { return err } placeList = placeList[0].Districts dao.Begin(db) defer func() { dao.Rollback(db) }() if err = insertPlace(ctx, db, nil, placeList); err != nil { return err } updateSqls := []string{ ` UPDATE place t1 JOIN jde_city t2 ON t1.code = t2.col_tencentAddressCode SET t1.jd_code = t2.col_areaCode; `, ` UPDATE place t1 JOIN place t2 ON t1.parent_code = t2.code AND t2.jd_code != 0 JOIN jde_district t3 ON t1.name = t3.col_areaName AND t2.jd_code = t3.col_cityCode SET t1.jd_code = t3.col_areaCode WHERE t1.level = 3; `, ` UPDATE place t1 JOIN ebde_places t2 ON t1.name = t2.col_city_name SET t1.ebai_code = t2.col_city_id WHERE t1.level = 1 OR t1.level = 2; `, ` UPDATE place t1 JOIN place t1p ON t1.parent_code = t1p.code JOIN ebde_places t2 ON t1.name = t2.col_city_name JOIN ebde_places t2p ON t2.col_parent_id = t2p.col_city_id AND t1p.ebai_code = t2p.col_city_id SET t1.ebai_code = t2.col_city_id WHERE t1.level = 3; `, ` UPDATE place t1 JOIN mtpsdeliveryprice t2 ON t1.code = t2.citycode SET t1.mtps_price = t2.price; `, ` UPDATE place t1 JOIN mtpsdeliveryprice t2 ON t1.name LIKE CONCAT(t2.cityname, '%') SET t1.mtps_price = t2.price WHERE t1.level = 2 AND t1.mtps_price = 0; `, ` UPDATE place t1 LEFT JOIN ( SELECT DISTINCT city_code FROM store UNION DISTINCT SELECT DISTINCT place_code city_code FROM sku_name_place_bind ) t2 ON t1.code = t2.city_code SET t1.enabled = 0 WHERE t1.level = 2 AND t2.city_code IS NULL; `, } for _, v := range updateSqls { if _, err = dao.ExecuteSQL(db, v); err != nil { return err } } dao.Commit(db) } return err } func InitSkuName(ctx *jxcontext.Context, isForce, isAsync, isContinueWhenError bool) (hint string, err error) { db := dao.GetDB() var skuNameList []*model.SkuName if err = dao.GetRows(db, &skuNameList, ` SELECT * FROM sku_name WHERE deleted_at = ? AND img <> '' ORDER BY id `, utils.DefaultTimeValue); err != nil { return "", err } task := tasksch.NewParallelTask("InitSkuName calculate md5", tasksch.NewParallelConfig().SetIsContinueWhenError(isContinueWhenError), ctx.GetUserName(), func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { skuName := batchItemList[0].(*model.SkuName) if skuName.ImgHashCode == "" || isForce { response, err := http.Get(skuName.Img) if err == nil { defer response.Body.Close() data, err2 := ioutil.ReadAll(response.Body) if err = err2; err == nil { skuName.ImgHashCode = fmt.Sprintf("%X", md5.Sum(data)) db := dao.GetDB() _, err = dao.UpdateEntity(db, skuName, "ImgHashCode") } } } return nil, err }, skuNameList) tasksch.ManageTask(task).Run() if !isAsync { _, err = task.GetResult(0) } else { hint = task.ID } return hint, err } func InitVendorCategory(ctx *jxcontext.Context, vendorID int) (num int64, err error) { if handler, ok := partner.PurchasePlatformHandlers[vendorID].(*mtwm.PurchaseHandler); ok { cats, err2 := handler.GetVendorCategories() if err2 != nil { return num, err2 } db := dao.GetDB() dao.Begin(db) defer dao.Rollback(db) sql := ` DELETE FROM sku_vendor_category WHERE vendor_id = ? ` if _, err = dao.ExecuteSQL(db, sql, vendorID); err != nil { return num, err } for _, cat := range cats { dao.WrapAddIDCULEntity(cat, ctx.GetUserName()) if err = dao.CreateEntity(db, cat); err != nil { return num, err } } dao.Commit(db) num = int64(len(cats)) } return num, err } 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 = jxutils.GenFakeID() 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.GetUserName(), 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, 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, isAsync, isContinueWhenError) return hint, err } func UploadWeimobImg4SkuName(ctx *jxcontext.Context, isAsync, isContinueWhenError bool) (hint string, err error) { db := dao.GetDB() skuNameList, err := dao.GetSkuNames(db) if err != nil { return "", err } rootTask := tasksch.NewParallelTask("UploadWeimobImg4SkuName", tasksch.NewParallelConfig().SetIsContinueWhenError(isContinueWhenError).SetParallelCount(5), ctx.GetUserName(), func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { skuName := batchItemList[0].(*model.SkuName) if skuName.Img != "" && skuName.ImgWeimob == "" { if skuName.ImgWeimob, err = api.WeimobAPI.UploadImgByURL(skuName.Img, ""); err == nil { _, err = dao.UpdateEntity(db, skuName) } } return nil, err }, skuNameList) tasksch.ManageTask(rootTask).Run() if !isAsync { _, err = rootTask.GetResult(0) } else { hint = rootTask.ID } return hint, err }