package task import ( "errors" "fmt" "log" "recook/internal/v2/lib/jcook" "recook/internal/v2/lib/shama" "recook/internal/v2/model/recook/goods" "recook/tools" "regexp" "strconv" "strings" mysql2 "git.oa00.com/go/mysql" "github.com/golangkit/formatime" "github.com/shopspring/decimal" "gorm.io/gorm" ) var empty = errors.New("entries is empty") type RecookJCookCategory struct { ID uint JCookCategory string `gorm:"column:jcook_category"` RecookCategory string `gorm:"column:recook_category"` } func (o RecookJCookCategory) TableName() string { return "recook_jcook_category" } type RecookShaMaCategory struct { ID uint ShaMaCategory string `gorm:"column:shama_category"` RecookCategory string `gorm:"column:recook_category"` } func (o RecookShaMaCategory) TableName() string { return "recook_shama_category" } func SyncTax() { fmt.Println("start") c := jcook.GetClient() fmt.Println("start") var OutputReg, _ = regexp.Compile("outputVAT:(?s:(\\d+))") page := 0 for { fmt.Println("start") var gs []goods.RecookGoodsInfoModel err := mysql2.Db.Preload("SkuPath").Limit(1000).Offset(page*1000).Find(&gs, "third_party_type = 3").Error fmt.Println(err) if len(gs) == 0 { fmt.Println("end") break } for _, v := range gs { for _, j := range v.SkuPath { skuID, _ := strconv.Atoi(j.ThirdPartySkuId) rq := jcook.SkuDetailReq{ SkuIDSet: []uint{uint(skuID)}, } var m goods.RecookSkuInvoiceModel mysql2.Db.First(&m, "sku_id = ?", v.SkuPath[0].Id) if m.Id > 0 { continue } var res []jcook.SkuDetailResp if err := c.Exec(rq, &res); err != nil { return } data := res[0] r1 := OutputReg.FindAllStringSubmatch(data.SkuDetailBase.Tax, -1) tax := r1[0][1] tax1, _ := decimal.NewFromString(tax) mysql2.Db.Create(&goods.RecookSkuInvoiceModel{ SkuId: v.SkuPath[0].Id, GoodsId: v.SkuPath[0].GoodsId, GoodsName: "jcook商品", TaxSn: "", TaxName: "", Unit: "", TaxRate: tax1, PlatformRate: tax1, DeductionRate: tax1, }) } } page += 1 } } func AttrSync() { var sk []goods.RecookGoodsSkuModel mysql2.Db.Find(&sk, "third_party_type = 3") client := jcook.GetClient() for _, v := range sk { id, _ := strconv.Atoi(v.ThirdPartySkuId) r := jcook.SkuDetailReq{ SkuIDSet: []uint{uint(id)}, } var detail []jcook.SkuDetailResp if err := client.Exec(r, &detail); err != nil { log.Println(err.Error()) continue } if len(detail) == 0 { continue } res := detail[0] r1 := strings.TrimSpace(res.SkuDetailBase.Color) if r1 == "" { continue } mysql2.Db.Model(v).Update("name", r1) mysql2.Db.Table((&goods.RecookGoodsAttributeModel{}).TableName()). Where("id = ?", v.CombineId).Update("value", r1) } } func ShaMaPriceSync() { client := shama.GetClient() var sl []goods.RecookGoodsSkuModel mysql2.Db.Find(&sl, "third_party_type = 4") //fmt.Println(len(sl)) for _, v := range sl { id, _ := strconv.Atoi(v.ThirdPartySkuId) r := shama.SkuDetailReq{SkuIDSet: []uint{uint(id)}} var resp []shama.SkuDetailResp if err := client.Exec(r, &resp); err != nil { fmt.Println(err.Error()) continue } else { // j.SkuDetailBase.SupplyPrice mysql2.Db.Model(v).Updates(map[string]interface{}{ "sale_purchase_price": resp[0].SkuDetailBase.SupplyPrice, }) } } } func ShaMaSyncAllSku() { defer func() { if err := recover(); err != nil { log.Println(err) } }() var cate []RecookShaMaCategory mysql2.Db.Find(&cate) temp := make([]RecookShaMaCategory, 0) for _, v := range cate { temp = append(temp, RecookShaMaCategory{ ShaMaCategory: strings.TrimSpace(v.ShaMaCategory), RecookCategory: strings.TrimSpace(v.RecookCategory), }) } var page uint = 1 var size uint = 20 for { if err := ShaMaSyncPageData(page, size, temp); err != nil { if err == empty { break } } page += 1 } } func ShaMaSyncPageData(page, size uint, categories []RecookShaMaCategory) error { c := shama.GetClient() r := jcook.SkuListReq{ Page: page, PageSize: size, } var skuEntries shama.SkuListResp if err := c.Exec(r, &skuEntries); err != nil { log.Println(err.Error()) return err } if len(skuEntries.Entries) == 0 { return empty } ids := make([]uint, 0) if e := mysql2.Db.Transaction(func(tx *gorm.DB) error { for _, v := range skuEntries.Entries { var t goods.RecookGoodsSkuModel rCate := "" for _, cate := range categories { if v.CategoryThirdName == cate.ShaMaCategory { rCate = cate.RecookCategory break } } if rCate == "" { fmt.Println("分类错误:", v.CategoryThirdName, v.SkuID) continue } tx.First(&t, "third_party_sku_id = ? AND third_party_type = 4", strconv.Itoa(int(v.SkuID))) if t.Id > 0 { continue } var second goods.RecookGoodsCategoryModel tx.Where("name = ? AND parent_id <> 0", rCate).First(&second) if second.Id == 0 { continue } var first goods.RecookGoodsCategoryModel tx.Where("id = ?", second.ParentId).First(&first) if first.Id == 0 { continue } ids = append(ids, v.SkuID) var bt goods.RecookGoodsBrandModel tx.First(&bt, "name = ?", v.BrandName) if bt.Id == 0 { bt.Name = v.BrandName if err := tx.Create(&bt).Error; err != nil { log.Println(err.Error()) return err } } } if len(ids) == 0 { return nil } rq := shama.SkuBrotherReq{ SkuIDSet: ids, } var bes []shama.SkuBrotherResp if err := c.Exec(rq, &bes); err != nil { return err } for index := range bes { bes[index].BrotherSkuIDs = append(bes[index].BrotherSkuIDs, ids[index]) } for _, v := range bes { var res []jcook.SkuDetailResp rq2 := jcook.SkuDetailReq{ SkuIDSet: v.BrotherSkuIDs, } if err := c.Exec(rq2, &res); err != nil { return err } if len(res) == 0 { fmt.Println("detail err:", v.BrotherSkuIDs) continue } var gs1 goods.RecookGoodsInfoModel VendorID := 3000 rCate := "" for _, cate := range categories { if res[0].SkuDetailBase.CategoryThirdName == cate.ShaMaCategory { rCate = cate.RecookCategory break } } var second goods.RecookGoodsCategoryModel tx.First(&second, "name = ? AND parent_id <> 0", rCate) var first goods.RecookGoodsCategoryModel tx.First(&first, "id = ?", second.ParentId) name := res[0].SkuDetailBase.SkuName name = strings.Replace(name, res[0].SkuDetailBase.Color, "", -1) name = strings.Replace(name, res[0].SkuDetailBase.Size, "", -1) weight := res[0].SkuDetailBase.Weight var bt goods.RecookGoodsBrandModel tx.First(&bt, "name = ?", res[0].SkuDetailBase.BrandName) gsk1 := make(map[uint]goods.RecookGoodsSkuModel) skuAttrMap := make(map[uint][]string) for _, j := range res { var t1 goods.RecookGoodsSkuModel tx.First(&t1, "third_party_sku_id = ? AND third_party_type = 4", strconv.Itoa(int(j.SkuDetailBase.SkuID))) if t1.Id > 0 { mysql2.Db.First(&gs1, "id = ?", t1.GoodsId) } else { name1 := strings.Trim(strings.Join([]string{j.SkuDetailBase.Color, j.SkuDetailBase.Size}, "+"), "+") if j.SkuDetailBase.Color != "" { skuAttrMap[j.SkuDetailBase.SkuID] = append(skuAttrMap[j.SkuDetailBase.SkuID], j.SkuDetailBase.Color) } if j.SkuDetailBase.Size != "" { skuAttrMap[j.SkuDetailBase.SkuID] = append(skuAttrMap[j.SkuDetailBase.SkuID], j.SkuDetailBase.Size) } if len(skuAttrMap[j.SkuDetailBase.SkuID]) == 0 { skuAttrMap[j.SkuDetailBase.SkuID] = append(skuAttrMap[j.SkuDetailBase.SkuID], "") } if len(name1) == 0 { name1 = "标准" } num := 500 if !j.SkuDetailBase.Status || !j.SkuDetailBase.Yn { num = 0 } ojb := goods.RecookGoodsSkuModel{ GoodsId: 0, Name: name1, CombineId: "", PicURL: j.SkuDetailBase.MainPhoto, Code: j.SkuDetailBase.UpcCode, // PurchasePrice: j.SkuDetailBase.SupplyPrice, OriginalPrice: j.SkuDetailBase.GuidePrice, DiscountPrice: decimal.Zero, CommissionRate: decimal.Zero, Commission: decimal.Zero, ControlPrice: j.SkuDetailBase.SupplyPrice, SalesVolume: 0, Inventory: uint(num), SalesVolumeInc: 0, Coupon: decimal.Decimal{}, GoodsNum: "", BmSkuId: "", BmShopId: "", ThirdPartySkuId: strconv.Itoa(int(j.SkuDetailBase.SkuID)), ThirdPartyType: 4, TMallPrice: "", TMallUrl: "", JdPrice: j.SkuDetailBase.GuidePrice.String(), JdUrl: "", // SalePurchasePrice: j.SkuDetailBase.SupplyPrice, GysSkuID: 0, } if j.SkuDetailBase.Kind == 1 { ojb.PurchasePrice = j.SkuDetailBase.SupplyPrice } else { ojb.SalePurchasePrice = j.SkuDetailBase.SupplyPrice } gsk1[j.SkuDetailBase.SkuID] = ojb } } if len(gsk1) == 0 { continue } if gs1.Id == 0 { gs1 = goods.RecookGoodsInfoModel{ BrandID: bt.Id, VendorID: uint(VendorID), GoodsName: name, Description: "", Material: "", FirstCategoryID: first.Id, SecondCategoryID: second.Id, PublishStatus: 0, FreightID: 0, Weight: decimal.NewFromFloat(weight), Hash: tools.GenerateGoodsHashSign(), IsJoinTeamPerformance: 0, CreatedAt: formatime.NewSecondNow(), UpdatedAt: formatime.NewSecondNow(), JCookPublishStatus: 1, ThirdPartyType: 4, } if err := tx.Create(&gs1).Error; err != nil { return err } image := make([]goods.RecookGoodsMainPhotoModel, 00) dp := make([]goods.RecookGoodsDetailPhotoModel, 00) for index, img := range res[0].Images { master := 0 if img.IsPrimer { master = 1 } image = append(image, goods.RecookGoodsMainPhotoModel{ GoodsId: gs1.Id, Url: img.Url, IsMaster: master, Name: "api", OrderNo: index, Width: 0, Height: 0, }) if img.IsPrimer { master = 1 image = append(image, goods.RecookGoodsMainPhotoModel{ GoodsId: gs1.Id, Url: img.Url, IsMaster: 0, Name: "api", OrderNo: index, Width: 0, Height: 0, }) } } if len(image) != 0 { if err := tx.Create(&image).Error; err != nil { return err } } reg := regexp.MustCompile("background-image:url\\((?s:(.*?))\\)|src=\"(?s:(.*?))\"") result := reg.FindAllStringSubmatch(res[0].BigInfo.PcWDis, -1) for ki, k := range result { kt := k[1] if len(strings.TrimSpace(kt)) == 0 { if len(k) > 2 { kt = k[2] } } if len(strings.TrimSpace(kt)) == 0 { continue } kt = strings.Trim(kt, "\\") if !strings.HasPrefix(kt, "http") && !strings.HasPrefix(kt, "https") { kt = "http:" + kt } dp = append(dp, goods.RecookGoodsDetailPhotoModel{ GoodsID: gs1.Id, Url: kt, Name: "api", OrderNo: ki, Width: 0, Height: 0, }) } if len(dp) != 0 { if err := tx.Create(&dp).Error; err != nil { return err } } } attrMap := make(map[uint][]goods.RecookGoodsAttributeModel) for k, attr := range skuAttrMap { data1 := make([]goods.RecookGoodsAttributeModel, 0) for index, a := range attr { aName := "规格" if index == 1 { aName = "尺寸" } aValue := a if aValue == "" { aValue = "标准" } data1 = append(data1, goods.RecookGoodsAttributeModel{ GoodsId: gs1.Id, Name: aName, Value: aValue, }) attrMap[k] = data1 } if err := tx.Create(&data1).Error; err != nil { return err } } data := make([]goods.RecookGoodsSkuModel, 0) for _, value := range gsk1 { idStr := make([]string, 0) id, _ := strconv.Atoi(value.ThirdPartySkuId) for _, a1 := range attrMap[uint(id)] { idStr = append(idStr, strconv.Itoa(int(a1.Id))) } value.GoodsId = gs1.Id value.CombineId = strings.Join(idStr, ",") data = append(data, value) } if err := tx.Create(&data).Error; err != nil { return err } } return nil }); e != nil { return e } return nil } func SyncAllSku(brand string) { defer func() { if err := recover(); err != nil { log.Println(err) } }() var cate []RecookJCookCategory mysql2.Db.Find(&cate) temp := make([]RecookJCookCategory, 0) for _, v := range cate { temp = append(temp, RecookJCookCategory{ JCookCategory: strings.TrimSpace(v.JCookCategory), RecookCategory: strings.TrimSpace(v.RecookCategory), }) } var page uint = 1 var size uint = 20 //if err := SyncPageData(page, size, cate); err != nil { // fmt.Println(err) //} for { if err := SyncPageData(page, size, brand, temp); err != nil { if err == empty { break } } page += 1 } } func SyncPageData(page, size uint, brand string, categories []RecookJCookCategory) error { c := jcook.GetClient() r := jcook.SkuListReq{ Page: page, PageSize: size, Brand: brand, } var skuEntries jcook.SkuListResp if err := c.Exec(r, &skuEntries); err != nil { log.Println(err.Error()) return err } if len(skuEntries.Entries) == 0 { return empty } ids := make([]uint, 0) if e := mysql2.Db.Transaction(func(tx *gorm.DB) error { for _, v := range skuEntries.Entries { var t goods.RecookGoodsSkuModel if v.BrandName == "" { v.BrandName = "京东优选" } rCate := "" for _, cate := range categories { if v.CategoryThirdName == cate.JCookCategory { rCate = cate.RecookCategory break } } if rCate == "" { continue } tx.First(&t, "third_party_sku_id = ? AND third_party_type = 3", strconv.Itoa(int(v.SkuID))) if t.Id > 0 { continue } var second goods.RecookGoodsCategoryModel tx.Where("name = ? AND parent_id <> 0", rCate).First(&second) if second.Id == 0 { continue } var first goods.RecookGoodsCategoryModel tx.Where("id = ?", second.ParentId).First(&first) if first.Id == 0 { continue } ids = append(ids, v.SkuID) var bt goods.RecookGoodsBrandModel tx.First(&bt, "name = ?", v.BrandName) if bt.Id == 0 { bt.Name = v.BrandName if err := tx.Create(&bt).Error; err != nil { log.Println(err.Error()) return err } } } rq := jcook.SkuBrotherReq{ SkuIDSet: ids, } var bes []jcook.SkuBrotherResp if err := c.Exec(rq, &bes); err != nil { return err } for index, v := range bes { if len(v.BrotherSkuIDs) == 0 { bes[index].BrotherSkuIDs = append(bes[index].BrotherSkuIDs, ids[index]) } } for _, v := range bes { if len(v.BrotherSkuIDs) == 0 { continue } start := 0 step := 20 total := len(v.BrotherSkuIDs) after2 := make([][]uint, 0) for { if start >= total { break } if total-start < step { step = total - start } after2 = append(after2, v.BrotherSkuIDs[start:start+step]) start = start + step } var res []jcook.SkuDetailResp for _, j := range after2 { var r1 []jcook.SkuDetailResp rq2 := jcook.SkuDetailReq{ SkuIDSet: j, } if err := c.Exec(rq2, &r1); err != nil { return err } res = append(res, r1...) } var gs1 goods.RecookGoodsInfoModel VendorID := 1800 rCate := "" for _, cate := range categories { if res[0].SkuDetailBase.CategoryThirdName == cate.JCookCategory { rCate = cate.RecookCategory break } } var second goods.RecookGoodsCategoryModel tx.First(&second, "name = ? AND parent_id <> 0", rCate) var first goods.RecookGoodsCategoryModel tx.First(&first, "id = ?", second.ParentId) name := res[0].SkuDetailBase.SkuName name = strings.Replace(name, res[0].SkuDetailBase.Color, "", -1) name = strings.Replace(name, res[0].SkuDetailBase.Size, "", -1) weight := res[0].SkuDetailBase.Weight var bt goods.RecookGoodsBrandModel tx.First(&bt, "name = ?", res[0].SkuDetailBase.BrandName) gsk1 := make(map[uint]goods.RecookGoodsSkuModel) skuAttrMap := make(map[uint][]string) for _, j := range res { if j.SkuDetailBase.Kind == 2 { VendorID = 2000 } var t1 goods.RecookGoodsSkuModel tx.First(&t1, "third_party_sku_id = ? AND third_party_type = 3", strconv.Itoa(int(j.SkuDetailBase.SkuID))) if t1.Id > 0 { mysql2.Db.First(&gs1, "id = ?", t1.GoodsId) } else { name1 := strings.Trim(strings.Join([]string{j.SkuDetailBase.Color, j.SkuDetailBase.Size}, "+"), "+") if j.SkuDetailBase.Color != "" { skuAttrMap[j.SkuDetailBase.SkuID] = append(skuAttrMap[j.SkuDetailBase.SkuID], j.SkuDetailBase.Color) } if j.SkuDetailBase.Size != "" { skuAttrMap[j.SkuDetailBase.SkuID] = append(skuAttrMap[j.SkuDetailBase.SkuID], j.SkuDetailBase.Size) } if len(skuAttrMap[j.SkuDetailBase.SkuID]) == 0 { skuAttrMap[j.SkuDetailBase.SkuID] = append(skuAttrMap[j.SkuDetailBase.SkuID], "") } if len(name1) == 0 { name1 = "标准" } num := 500 if !j.SkuDetailBase.Status || !j.SkuDetailBase.Yn { num = 0 } gsk1[j.SkuDetailBase.SkuID] = goods.RecookGoodsSkuModel{ GoodsId: 0, Name: name1, CombineId: "", PicURL: j.SkuDetailBase.MainPhoto, Code: j.SkuDetailBase.UpcCode, PurchasePrice: j.SkuDetailBase.SupplyPrice, OriginalPrice: j.SkuDetailBase.GuidePrice, DiscountPrice: decimal.Zero, CommissionRate: decimal.Zero, Commission: decimal.Zero, ControlPrice: j.SkuDetailBase.SupplyPrice, SalesVolume: 0, Inventory: uint(num), SalesVolumeInc: 0, Coupon: decimal.Decimal{}, GoodsNum: "", BmSkuId: "", BmShopId: "", ThirdPartySkuId: strconv.Itoa(int(j.SkuDetailBase.SkuID)), ThirdPartyType: 3, TMallPrice: "", TMallUrl: "", JdPrice: "", JdUrl: "", GysSkuID: 0, } } } if len(gsk1) == 0 { continue } if gs1.Id == 0 { gs1 = goods.RecookGoodsInfoModel{ BrandID: bt.Id, VendorID: uint(VendorID), GoodsName: name, Description: "", Material: "", FirstCategoryID: first.Id, SecondCategoryID: second.Id, PublishStatus: 0, FreightID: 0, Weight: decimal.NewFromFloat(weight), Hash: tools.GenerateGoodsHashSign(), IsJoinTeamPerformance: 0, CreatedAt: formatime.NewSecondNow(), UpdatedAt: formatime.NewSecondNow(), JCookPublishStatus: 1, ThirdPartyType: 3, } if err := tx.Create(&gs1).Error; err != nil { return err } image := make([]goods.RecookGoodsMainPhotoModel, 00) dp := make([]goods.RecookGoodsDetailPhotoModel, 00) for index, img := range res[0].Images { master := 0 if img.IsPrimer { master = 1 } image = append(image, goods.RecookGoodsMainPhotoModel{ GoodsId: gs1.Id, Url: img.Url, IsMaster: master, Name: "api", OrderNo: index, Width: 0, Height: 0, }) if img.IsPrimer { master = 1 image = append(image, goods.RecookGoodsMainPhotoModel{ GoodsId: gs1.Id, Url: img.Url, IsMaster: 0, Name: "api", OrderNo: index, Width: 0, Height: 0, }) } } if len(image) != 0 { if err := tx.Create(&image).Error; err != nil { return err } } reg := regexp.MustCompile("background-image:url\\((?s:(.*?))\\)|src=\"(?s:(.*?))\"") result := reg.FindAllStringSubmatch(res[0].BigInfo.PcWDis, -1) for ki, k := range result { kt := k[1] if len(strings.TrimSpace(kt)) == 0 { if len(k) > 2 { kt = k[2] } } if len(strings.TrimSpace(kt)) == 0 { continue } kt = strings.Trim(kt, "\\") if !strings.HasPrefix(kt, "http") && !strings.HasPrefix(kt, "https") { kt = "http:" + kt } dp = append(dp, goods.RecookGoodsDetailPhotoModel{ GoodsID: gs1.Id, Url: kt, Name: "api", OrderNo: ki, Width: 0, Height: 0, }) } if len(dp) != 0 { if err := tx.Create(&dp).Error; err != nil { return err } } } attrMap := make(map[uint][]goods.RecookGoodsAttributeModel) for k, attr := range skuAttrMap { data1 := make([]goods.RecookGoodsAttributeModel, 0) for index, a := range attr { aName := "规格" if index == 1 { aName = "尺寸" } aValue := a if aValue == "" { aValue = "标准" } data1 = append(data1, goods.RecookGoodsAttributeModel{ GoodsId: gs1.Id, Name: aName, Value: aValue, }) attrMap[k] = data1 } if err := tx.Create(&data1).Error; err != nil { return err } } data := make([]goods.RecookGoodsSkuModel, 0) for _, value := range gsk1 { idStr := make([]string, 0) id, _ := strconv.Atoi(value.ThirdPartySkuId) for _, a1 := range attrMap[uint(id)] { idStr = append(idStr, strconv.Itoa(int(a1.Id))) } value.GoodsId = gs1.Id value.CombineId = strings.Join(idStr, ",") data = append(data, value) } if err := tx.Create(&data).Error; err != nil { return err } } return nil }); e != nil { return e } return nil } func SyncJDImage() { var gs []goods.RecookGoodsInfoModel mysql2.Db.Find(&gs, "third_party_type = 3") for _, vi := range gs { var gsk []goods.RecookGoodsSkuModel mysql2.Db.Find(&gsk, "goods_id = ?", vi.Id) client := jcook.GetClient() if len(gsk) == 0 { continue } s1 := gsk[0] skuId, _ := strconv.Atoi(s1.ThirdPartySkuId) if skuId == 0 { continue } rq := jcook.SkuDetailReq{ SkuIDSet: []uint{uint(skuId)}, } var res []jcook.SkuDetailResp if err := client.Exec(rq, &res); err != nil { continue } mysql2.Db.Transaction(func(tx *gorm.DB) error { d1 := res[0] if len(d1.Images) == 0 { return nil } tx.Delete(&goods.RecookGoodsDetailPhotoModel{}, "goods_id = ?", s1.GoodsId) tx.Delete(&goods.RecookGoodsMainPhotoModel{}, "goods_id = ?", s1.GoodsId) temp := make([]goods.RecookGoodsMainPhotoModel, 0) if len(d1.Images) == 1 { d1.Images = append(d1.Images, jcook.SkuImage{ Url: d1.Images[0].Url, IsPrimer: false, OrderSort: 1, }) } for index, v := range d1.Images { isMaster := 0 if v.IsPrimer { isMaster = 1 } temp = append(temp, goods.RecookGoodsMainPhotoModel{ GoodsId: s1.GoodsId, Url: v.Url, Name: "", IsMaster: isMaster, OrderNo: index, Width: 0, Height: 0, Hash: "", }) } tx.Create(&temp) reg := regexp.MustCompile("background-image:url\\((?s:(.*?))\\)|src=\"(?s:(.*?))\"") result := reg.FindAllStringSubmatch(d1.BigInfo.PcWDis, -1) dp := make([]goods.RecookGoodsDetailPhotoModel, 0) for ki, k := range result { kt := k[1] if len(strings.TrimSpace(kt)) == 0 { if len(k) > 2 { kt = k[2] } } if len(strings.TrimSpace(kt)) == 0 { continue } kt = strings.Trim(kt, "\\") if !strings.HasPrefix(kt, "http") && !strings.HasPrefix(kt, "https") { kt = "http:" + kt } dp = append(dp, goods.RecookGoodsDetailPhotoModel{ GoodsID: s1.GoodsId, Url: kt, Name: "api", OrderNo: ki, Width: 0, Height: 0, }) } tx.Create(dp) return nil }) } }