package dao import ( "errors" "fmt" "strings" "time" "git.rosy.net.cn/baseapi/utils" "git.rosy.net.cn/jx-callback/business/model" "git.rosy.net.cn/jx-callback/globals" ) var ( // imgFieldMap = map[int]string{ // model.VendorIDEBAI: "img_ebai", // } dataResFieldMap = map[int]string{ model.VendorIDMTWM: "mtwm_url", model.VendorIDEBAI: "ebai_url", } // descImgFieldMap = map[int]string{ // model.VendorIDEBAI: "desc_img_ebai", // } ) type SkuStoreCatInfo struct { model.SkuCategory MapID int `orm:"column(map_id)"` // 这个主要用于判断是否有store_sku_category_map VendorCatID string `orm:"column(vendor_cat_id)"` StoreCatSyncStatus int8 ParentCatName string ParentMapID int `orm:"column(parent_map_id)"` // 这个主要用于判断是否有父store_sku_category_map ParentVendorCatID string `orm:"column(parent_vendor_cat_id)"` ParentCatSyncStatus int8 } type StoreSkuSyncInfo struct { // 平台无关的store sku信息 BindID int `orm:"column(bind_id)"` // 换名的原因是与Sku.ID同名区别 StoreID int `orm:"column(store_id)"` SkuID int `orm:"column(sku_id)"` // 这个与Sku.ID的区别是SkuID是必然存在的 Price int64 UnitPrice int64 // 平台相关的store sku信息 StoreSkuStatus int StoreSkuSyncStatus int8 VendorSkuID string `orm:"column(vendor_sku_id)"` BindDeletedAt time.Time `orm:"type(datetime)" json:"bindDeletedAt"` model.Sku // sku_name Prefix string NameID int `orm:"column(name_id)"` VendorNameID string `orm:"column(vendor_name_id)"` Name string Unit string Upc string // 平台相关的图片信息 Img string Img2 string DescImg string // 饿百是SkuName中的DescImgEbai VendorVendorCatID int64 `orm:"column(vendor_vendor_cat_id)"` // 平台商品分类(叶子结点) // 饿百也只需要给出叶子结点了 // https://open-be.ele.me/dev/notice?id=275 // VendorVendorCatID2 int64 `orm:"column(vendor_vendor_cat_id2)"` // 平台商品分类上一级 // VendorVendorCatID3 int64 `orm:"column(vendor_vendor_cat_id3)"` // 平台商品分类再上一级 // sku的商家分类信息 SkuStoreCatSyncStatus int8 SkuVendorCatID string `orm:"column(sku_vendor_cat_id)"` // sku_name的商家分类信息 StoreCatSyncStatus int8 VendorCatID string `orm:"column(vendor_cat_id)"` VendorPrice int64 MergedStatus int SkuName string StatusSaleBegin int16 `json:"statusSaleBegin"` //商品可售时间范围 StatusSaleEnd int16 `json:"statusSaleEnd"` } type MissingStoreSkuInfo struct { StoreID int `orm:"column(store_id)"` NameID int `orm:"column(name_id)"` SkuID int `orm:"column(sku_id)"` SpecQuality float32 SpecUnit string Unit string RefPrice int } type StoreSkuBindWithVendorInfo struct { model.StoreSkuBind VendorStoreID string `orm:"column(vendor_store_id)"` VendorSkuID string `orm:"column(vendor_sku_id)"` } type StoreSkuNameInfo struct { StoreID int `orm:"column(store_id)"` NameID int `orm:"column(name_id)"` UnitPrice int64 } // todo 应该通过需要同步的skuid来驱动同步分类,而不是当前这种分开的逻辑 // 单门店模式厂商适用 // 从store_sku_bind中,得到所有依赖的商家分类信息 func GetSkusCategories(db *DaoDB, vendorID, storeID int, skuIDs []int, level int) (cats []*SkuStoreCatInfo, err error) { sql := ` SELECT DISTINCT t4.*, t5.id map_id, t5.%s_id vendor_cat_id, t5.%s_sync_status store_cat_sync_status, t4p.name parent_cat_name, t5p.id parent_map_id, t5p.%s_id parent_vendor_cat_id, t5p.%s_sync_status parent_cat_sync_status FROM store_sku_bind t1 JOIN sku t2 ON t1.sku_id = t2.id AND t2.deleted_at = ? JOIN sku_name t3 ON t2.name_id = t3.id AND t3.deleted_at = ? ` if level == 2 { sql += ` JOIN sku_category t4 ON (t3.category_id = t4.id OR t2.category_id = t4.id) AND t4.level = 2 AND t4.deleted_at = ? ` } else { sql += ` LEFT JOIN sku_category t4c ON (t3.category_id = t4c.id OR t2.category_id = t4c.id) JOIN sku_category t4 ON (t4.id = t4c.parent_id OR (t3.category_id = t4.id OR t2.category_id = t4.id)) AND t4.level = 1 AND t4.deleted_at = ? ` } sql += ` LEFT JOIN store_sku_category_map t5 ON t4.id = t5.category_id AND t5.store_id = t1.store_id AND t5.deleted_at = ? LEFT JOIN sku_category t4p ON t4.parent_id = t4p.id LEFT JOIN store_sku_category_map t5p ON t4p.id = t5p.category_id AND t5p.store_id = t1.store_id AND t5p.deleted_at = ? WHERE t1.deleted_at = ? AND t1.%s_sync_status & ? = 0 AND t1.store_id = ? AND ((t1.status = ? AND t2.status = ? AND t3.status = ?) OR (t1.%s_sync_status & ? = 0)) ` sqlParams := []interface{}{ utils.DefaultTimeValue, utils.DefaultTimeValue, utils.DefaultTimeValue, utils.DefaultTimeValue, utils.DefaultTimeValue, utils.DefaultTimeValue, model.SyncFlagDeletedMask, storeID, model.SkuStatusNormal, model.SkuStatusNormal, model.SkuStatusNormal, model.SyncFlagNewMask, } if len(skuIDs) > 0 { sql += " AND t1.sku_id IN (" + GenQuestionMarks(len(skuIDs)) + ")" sqlParams = append(sqlParams, skuIDs) } fieldPrefix := ConvertDBFieldPrefix(model.VendorNames[vendorID]) sql = fmt.Sprintf(sql, fieldPrefix, fieldPrefix, fieldPrefix, fieldPrefix, fieldPrefix, fieldPrefix) if err = GetRows(db, &cats, sql, sqlParams...); err != nil { return nil, err } return cats, err } // 单门店模式厂商适用 // 单纯的从已经创建的store_sku_category_map中,得到相关的同步信息 func GetStoreCategories(db *DaoDB, vendorID, storeID int, level int, mustDirty bool) (cats []*SkuStoreCatInfo, err error) { fieldPrefix := ConvertDBFieldPrefix(model.VendorNames[vendorID]) sql := ` SELECT t4.*, t5.id map_id, t5.%s_id vendor_cat_id, t5.%s_sync_status store_cat_sync_status, t4p.name parent_cat_name, t5p.id parent_map_id, t5p.%s_id parent_vendor_cat_id, t5p.%s_sync_status parent_cat_sync_status FROM store_sku_category_map t5 JOIN sku_category t4 ON t5.category_id = t4.id AND t4.deleted_at = ? LEFT JOIN sku_category t4p ON t4.parent_id = t4p.id LEFT JOIN store_sku_category_map t5p ON t4p.id = t5p.category_id AND t5.store_id = t5p.store_id AND t5p.deleted_at = ? WHERE t5.store_id = ? AND t5.deleted_at = ?` fieldPrefixParams := []interface{}{fieldPrefix, fieldPrefix, fieldPrefix, fieldPrefix} sqlParams := []interface{}{ utils.DefaultTimeValue, utils.DefaultTimeValue, storeID, utils.DefaultTimeValue, } if mustDirty { sql += " AND t5.%s_sync_status <> 0" fieldPrefixParams = append(fieldPrefixParams, fieldPrefix) } if level > 0 { sql += " AND t4.level = ?" sqlParams = append(sqlParams, level) } if err = GetRows(db, &cats, fmt.Sprintf(sql, fieldPrefixParams...), sqlParams...); err != nil { return nil, err } return cats, err } func GetDirtyStoreCategories(db *DaoDB, vendorID, storeID int, level int) (cats []*SkuStoreCatInfo, err error) { return GetStoreCategories(db, vendorID, storeID, level, true) } // 以store_sku_bind为基础来做同步,正常情况下使用 // !!! 此函数不要将store_sku_bind中的vendor_price取出来放到StoreSkuSyncInfo.VendorPrice中,因为之后会依赖这个VendorPrice进行重算 // 单多门店模式厂商通用 func GetStoreSkus2(db *DaoDB, vendorID, storeID int, skuIDs []int, mustDirty bool) (skus []*StoreSkuSyncInfo, err error) { if vendorID < 0 { panic("vendorID<0") } isSingleStorePF := model.MultiStoresVendorMap[vendorID] != 1 tableName := "t1" if !isSingleStorePF { tableName = "t2" } fieldPrefix := ConvertDBFieldPrefix(model.VendorNames[vendorID]) sql := ` SELECT t1.id bind_id, t1.sku_id, t1.price, t1.unit_price, t1.status store_sku_status, %s.%s_id vendor_sku_id, t1.%s_sync_status store_sku_sync_status, t1.%s_price vendor_price, t1.store_id, t1.deleted_at bind_deleted_at,t1.status_sale_begin,t1.status_sale_end, t2.*, t3.id name_id, t3.prefix, t3.name, t3.unit, t3.upc, IF(t11.%s <> '', t11.%s, t3.img) img, IF(t12.%s <> '', t12.%s, t3.img2) img2, t13.%s desc_img, t4.%s_category_id vendor_vendor_cat_id` fmtParams := []interface{}{ tableName, fieldPrefix, fieldPrefix, fieldPrefix, GetDataResFieldName(vendorID), GetDataResFieldName(vendorID), GetDataResFieldName(vendorID), GetDataResFieldName(vendorID), GetDataResFieldName(vendorID), fieldPrefix, } if isSingleStorePF { sql += `, t5.%s_sync_status store_cat_sync_status, t5.%s_id vendor_cat_id, t5sku.%s_sync_status sku_store_cat_sync_status, t5sku.%s_id sku_vendor_cat_id` fmtParams = append(fmtParams, fieldPrefix, fieldPrefix, fieldPrefix, fieldPrefix) } else { sql += `, t4.%s_id vendor_cat_id, t5sku.%s_id sku_vendor_cat_id` fmtParams = append(fmtParams, fieldPrefix, fieldPrefix) } sql += ` FROM store_sku_bind t1 LEFT JOIN sku t2 ON t1.sku_id = t2.id AND t2.deleted_at = ? AND t2.status = ? LEFT JOIN sku_name t3 ON t2.name_id = t3.id AND t3.deleted_at = ? AND t3.status = ? LEFT JOIN sku_category t4 ON t3.category_id = t4.id AND t4.deleted_at = ? LEFT JOIN data_resource t11 ON t11.main_url = t3.img LEFT JOIN data_resource t12 ON t12.main_url = t3.img2 LEFT JOIN data_resource t13 ON t13.main_url = t3.desc_img ` sqlParams := []interface{}{ utils.DefaultTimeValue, model.SkuStatusNormal, utils.DefaultTimeValue, model.SkuStatusNormal, utils.DefaultTimeValue, } if isSingleStorePF { sql += ` LEFT JOIN store_sku_category_map t5 ON t4.id = t5.category_id AND t5.store_id = t1.store_id AND t5.deleted_at = ? LEFT JOIN store_sku_category_map t5sku ON t2.category_id = t5sku.category_id AND t5sku.store_id = t1.store_id AND t5sku.deleted_at = ?` sqlParams = append(sqlParams, utils.DefaultTimeValue, utils.DefaultTimeValue) } else { sql += ` LEFT JOIN sku_category t5sku ON t5sku.id = t2.category_id` } sql += " WHERE 1 = 1" if storeID > 0 { sql += " AND t1.store_id = ?" sqlParams = append(sqlParams, storeID) } if mustDirty { sql += " AND (t1.%s_sync_status <> 0 OR (%s.%s_id <> 0 AND t3.id IS NULL))" fmtParams = append(fmtParams, fieldPrefix, tableName, fieldPrefix) } else { sql += " AND t1.deleted_at = ?" sqlParams = append(sqlParams, utils.DefaultTimeValue) } if len(skuIDs) > 0 { sql += " AND t1.sku_id IN (" + GenQuestionMarks(len(skuIDs)) + ")" sqlParams = append(sqlParams, skuIDs) } // 多门店平台没有成功创建的商品,不直接过滤,让上层同步时报错 // if !isSingleStorePF { // sql += " AND t2.%s_id <> 0" // fmtParams = append(fmtParams, fieldPrefix) // } sql = fmt.Sprintf(sql, fmtParams...) sql += " ORDER BY t1.price" // globals.SugarLogger.Debug(sql) if err = GetRows(db, &skus, sql, sqlParams...); err != nil { return nil, err } return skus, err } func GetStoreSkus(db *DaoDB, vendorID, storeID int, skuIDs []int) (skus []*StoreSkuSyncInfo, err error) { return GetStoreSkus2(db, vendorID, storeID, skuIDs, true) } // 以sku为基础来做全同步, // 多门店模式厂商适用 func GetFullStoreSkus(db *DaoDB, vendorID, storeID int) (skus []*StoreSkuSyncInfo, err error) { globals.SugarLogger.Debugf("GetFullStoreSkus, storeID:%d, vendorID:%d", storeID, vendorID) sql := ` SELECT t1.id bind_id, t1.price, t1.unit_price, t1.status store_sku_status, t2.%s_id vendor_sku_id, t1.%s_sync_status store_sku_sync_status, t1.store_id, t1.deleted_at bind_deleted_at, t2.*, t2.id sku_id, t3.id name_id, t3.prefix, t3.name, t3.unit, t3.upc, IF(t11.%s <> '', t11.%s, t3.img) img, IF(t12.%s <> '', t12.%s, t3.img2) img2, t13.%s desc_img, t4.%s_category_id vendor_vendor_cat_id, t4.%s_sync_status store_cat_sync_status, t4.%s_id vendor_cat_id, t5sku.%s_sync_status sku_store_cat_sync_status, t5sku.%s_id sku_vendor_cat_id FROM sku t2 LEFT JOIN store_sku_bind t1 ON t1.sku_id = t2.id AND t1.store_id = ? AND t1.deleted_at = ? JOIN sku_name t3 ON t2.name_id = t3.id AND t3.deleted_at = ? AND t3.status = ? JOIN sku_category t4 ON t3.category_id = t4.id AND t4.deleted_at = ? LEFT JOIN sku_category t5sku ON t2.category_id = t5sku.id LEFT JOIN data_resource t11 ON t11.main_url = t3.img LEFT JOIN data_resource t12 ON t12.main_url = t3.img2 LEFT JOIN data_resource t13 ON t13.main_url = t3.desc_img WHERE t2.deleted_at = ? AND t2.status = ? AND t2.%s_id <> 0 ORDER BY t1.price DESC` sqlParams := []interface{}{ storeID, utils.DefaultTimeValue, utils.DefaultTimeValue, model.SkuStatusNormal, utils.DefaultTimeValue, utils.DefaultTimeValue, model.SkuStatusNormal, } fieldPrefix := ConvertDBFieldPrefix(model.VendorNames[vendorID]) sql = fmt.Sprintf(sql, fieldPrefix, fieldPrefix, GetDataResFieldName(vendorID), GetDataResFieldName(vendorID), GetDataResFieldName(vendorID), GetDataResFieldName(vendorID), GetDataResFieldName(vendorID), fieldPrefix, fieldPrefix, fieldPrefix, fieldPrefix, fieldPrefix, fieldPrefix) // globals.SugarLogger.Debug(sql) // globals.SugarLogger.Debug(utils.Format4Output(sqlParams, false)) if err = GetRows(db, &skus, sql, sqlParams...); err != nil { return nil, err } return skus, err } // 这个函数之前是要设置没有删除或同步标志不为0的,会导致将同步标志不为0且删除了的把标志去掉,现在改为只设置没有删除的 func SetStoreSkuSyncStatus(db *DaoDB, vendorID int, storeIDs []int, skuIDs []int, syncStatus int) (num int64, err error) { globals.SugarLogger.Debugf("SetStoreSkuSyncStatus, storeIDs:%v, vendorID:%d", storeIDs, vendorID) isSingleStorePF := model.MultiStoresVendorMap[vendorID] != 1 fieldPrefix := ConvertDBFieldPrefix(model.VendorNames[vendorID]) sql := ` UPDATE store_sku_bind t1 SET t1.%s_sync_status = t1.%s_sync_status | ? ` fmtParams := []interface{}{ fieldPrefix, fieldPrefix, } sqlParams := []interface{}{ syncStatus, } if isSingleStorePF && (syncStatus&model.SyncFlagNewMask) != 0 { sql += `, t1.%s_id = 0 ` fmtParams = append(fmtParams, fieldPrefix) } sql += " WHERE t1.deleted_at = ? AND t1.%s_sync_status & ? = 0" fmtParams = append(fmtParams, fieldPrefix) sqlParams = append(sqlParams, utils.DefaultTimeValue, model.SyncFlagDeletedMask) if len(storeIDs) > 0 { sql += " AND t1.store_id IN (" + GenQuestionMarks(len(storeIDs)) + ")" sqlParams = append(sqlParams, storeIDs) } if len(skuIDs) > 0 { sql += " AND t1.sku_id IN (" + GenQuestionMarks(len(skuIDs)) + ")" sqlParams = append(sqlParams, skuIDs) } sql = fmt.Sprintf(sql, fmtParams...) return ExecuteSQL(db, sql, sqlParams...) } func SetStoreCategorySyncStatus(db *DaoDB, vendorID int, storeIDs []int, catIDs []int, syncStatus int) (num int64, err error) { globals.SugarLogger.Debugf("SetStoreCategorySyncStatus, storeIDs:%v, vendorID:%d", storeIDs, vendorID) isSingleStorePF := model.MultiStoresVendorMap[vendorID] != 1 fieldPrefix := ConvertDBFieldPrefix(model.VendorNames[vendorID]) sql := ` UPDATE store_sku_category_map t1 SET t1.%s_sync_status = IF(t1.deleted_at = ?, t1.%s_sync_status | ?, 0) ` fmtParams := []interface{}{ fieldPrefix, fieldPrefix, } sqlParams := []interface{}{ utils.DefaultTimeValue, syncStatus, } if isSingleStorePF && (syncStatus&model.SyncFlagNewMask) != 0 { sql += `, t1.%s_id = 0 ` fmtParams = append(fmtParams, fieldPrefix) } sql += " WHERE (t1.deleted_at = ? OR t1.%s_sync_status <> 0)" fmtParams = append(fmtParams, fieldPrefix) sqlParams = append(sqlParams, utils.DefaultTimeValue) if len(storeIDs) > 0 { sql += " AND t1.store_id IN (" + GenQuestionMarks(len(storeIDs)) + ")" sqlParams = append(sqlParams, storeIDs) } if len(catIDs) > 0 { sql += " AND t1.category_id IN (" + GenQuestionMarks(len(catIDs)) + ")" sqlParams = append(sqlParams, catIDs) } sql = fmt.Sprintf(sql, fmtParams...) return ExecuteSQL(db, sql, sqlParams...) } // func GetImgFieldName(vendorID int) (fieldName string) { // fieldName = imgFieldMap[vendorID] // if fieldName == "" { // fieldName = "img" // } // return fieldName // } func GetDataResFieldName(vendorID int) (fieldName string) { fieldName = dataResFieldMap[vendorID] if fieldName == "" { fieldName = "main_url" } return fieldName } // func GetDescImgFieldName(vendorID int) (fieldName string) { // fieldName = descImgFieldMap[vendorID] // if fieldName == "" { // fieldName = "desc_img" // } // return fieldName // } func GetStoresSkusInfo(db *DaoDB, storeIDs, skuIDs []int) (storeSkuList []*model.StoreSkuBind, err error) { sql := ` SELECT * FROM store_sku_bind t1 WHERE t1.deleted_at = ? ` sqlParams := []interface{}{ utils.DefaultTimeValue, } if len(storeIDs) > 0 { sql += " AND t1.store_id IN (" + GenQuestionMarks(len(storeIDs)) + ")" sqlParams = append(sqlParams, storeIDs) } if len(skuIDs) > 0 { sql += " AND t1.sku_id IN (" + GenQuestionMarks(len(skuIDs)) + ")" sqlParams = append(sqlParams, skuIDs) } err = GetRows(db, &storeSkuList, sql, sqlParams...) return storeSkuList, err } // vendorID, vendorStoreIDs和vendorSkuIDs都是必须参数 func GetStoresSkusInfoByVendorInfo(db *DaoDB, vendorID int, vendorStoreIDs, vendorSkuIDs []string) (storeSkuList []*StoreSkuBindWithVendorInfo, err error) { if len(vendorStoreIDs) == 0 || len(vendorSkuIDs) == 0 { return nil, nil } sql := ` SELECT t1.*, %s.%s_id vendor_sku_id, t2.vendor_store_id FROM store_sku_bind t1 JOIN store_map t2 ON t2.store_id = t1.store_id AND t2.vendor_id = ? AND t2.deleted_at = ? JOIN sku t3 ON t3.id = t1.sku_id WHERE t1.deleted_at = ? AND t2.vendor_store_id IN (` + GenQuestionMarks(len(vendorStoreIDs)) + `) AND %s.%s_id IN (` + GenQuestionMarks(len(vendorSkuIDs)) + `)` sqlParams := []interface{}{ vendorID, utils.DefaultTimeValue, utils.DefaultTimeValue, vendorStoreIDs, vendorSkuIDs, } isSingleStorePF := model.MultiStoresVendorMap[vendorID] != 1 tableName := "t1" if !isSingleStorePF { tableName = "t3" } fieldPrefix := ConvertDBFieldPrefix(model.VendorNames[vendorID]) sql = fmt.Sprintf(sql, tableName, fieldPrefix, tableName, fieldPrefix) err = GetRows(db, &storeSkuList, sql, sqlParams...) return storeSkuList, err } func GetMissingStoreSkuFromOrder(db *DaoDB, storeIDs []int, fromTime time.Time) (storeSkuList []*MissingStoreSkuInfo, err error) { if time.Now().Sub(fromTime) > 24*time.Hour*60 { return nil, fmt.Errorf("GetMissingStoreSkuFromOrder,时间超过60天") } sql := ` SELECT IF(t2.jx_store_id <> 0, t2.jx_store_id, t2.store_id) store_id, t4.name_id, t1.sku_id, t4.spec_quality, t4.spec_unit, t5.unit, COUNT(*) ct, CAST(AVG(IF(t1.vendor_price <> 0, t1.vendor_price, t1.sale_price)) AS SIGNED) ref_price FROM order_sku t1 JOIN goods_order t2 ON t2.vendor_order_id = t1.vendor_order_id LEFT JOIN store_sku_bind t3 ON t3.store_id = IF(t2.jx_store_id <> 0, t2.jx_store_id, t2.store_id) AND t3.sku_id = t1.sku_id AND t3.deleted_at = ? JOIN sku t4 ON t4.id = t1.sku_id JOIN sku_name t5 ON t5.id = t4.name_id WHERE t2.status = ? AND IF(t2.jx_store_id <> 0, t2.jx_store_id, t2.store_id) > 0 AND t1.sku_id > 0 AND t1.shop_price = 0 AND t1.order_created_at > ? AND t3.id IS NULL ` sqlParams := []interface{}{ utils.DefaultTimeValue, model.OrderStatusFinished, fromTime, } if len(storeIDs) > 0 { sql += " AND IF(t2.jx_store_id <> 0, t2.jx_store_id, t2.store_id) IN (" + GenQuestionMarks(len(storeIDs)) + ")" sqlParams = append(sqlParams, storeIDs) } sql += ` GROUP BY 1,2,3,4,5,6 ORDER BY 1,2,3,4,5,6 ` err = GetRows(db, &storeSkuList, sql, sqlParams...) return storeSkuList, err } func GetAutoSaleStoreSku(db *DaoDB, storeIDs []int) (storeSkuList []*model.StoreSkuBind, err error) { sql := ` SELECT * FROM store_sku_bind t1 WHERE t1.deleted_at = ? AND t1.auto_sale_at <> ?` sqlParams := []interface{}{ utils.DefaultTimeValue, utils.DefaultTimeValue, } if len(storeIDs) > 0 { sql += " AND t1.store_id IN (" + GenQuestionMarks(len(storeIDs)) + ")" sqlParams = append(sqlParams, storeIDs) } err = GetRows(db, &storeSkuList, sql, sqlParams...) return storeSkuList, err } func GetExistingStoreSkuNameInfo(db *DaoDB, storeIDs, skuNameIDs []int) (storeSkuNameList []*StoreSkuNameInfo, err error) { if len(storeIDs) == 0 || len(skuNameIDs) == 0 { return nil, nil } sql := ` SELECT t1.store_id, t2.name_id, MAX(t1.unit_price) unit_price FROM store_sku_bind t1 JOIN sku t2 ON t2.id = t1.sku_id WHERE t1.deleted_at = ? AND t1.store_id IN (` + GenQuestionMarks(len(storeIDs)) + `) AND t2.name_id IN (` + GenQuestionMarks(len(skuNameIDs)) + `) GROUP BY 1, 2` sqlParams := []interface{}{ utils.DefaultTimeValue, storeIDs, skuNameIDs, } err = GetRows(db, &storeSkuNameList, sql, sqlParams...) return storeSkuNameList, err } func (s *StoreSkuSyncInfo) GetSeq() int { if s.Seq > 0 { return s.Seq } return int(s.VendorPrice) } func GetStoresSkusInfoBySaleTime(db *DaoDB, storeID int) (storeSkuBindList []*model.StoreSkuBind, err error) { sql := ` SELECT t1.* FROM store_sku_bind t1 WHERE t1.status_sale_begin <> 0 AND t1.status_sale_end <> 0 AND t1.status = ? AND t1.deleted_at = ? ` sqlParams := []interface{}{ model.SkuStatusNormal, utils.DefaultTimeValue, } if storeID > 0 { sql += ` AND t1.store_id = ?` sqlParams = append(sqlParams, storeID) } err = GetRows(db, &storeSkuBindList, sql, sqlParams...) return storeSkuBindList, err } func UpdateStoreSkuBindSyncStatus(db *DaoDB, vendorIDs []int, storeID int) (num int64, err error) { sql := ` UPDATE store_sku_bind SET ` fmtParams := []interface{}{} sqlParams := []interface{}{} if len(vendorIDs) > 0 { for _, v := range vendorIDs { fieldPrefix := ConvertDBFieldPrefix(model.VendorNames[v]) sql += ` %s_sync_status = ?,` fmtParams = append(fmtParams, fieldPrefix) sqlParams = append(sqlParams, model.SyncFlagSaleMask) } } else { return 0, errors.New("取平台ID名有错误!partner.GetPurchasePlatformVendorIDs()") } sql = sql[0:strings.LastIndex(sql, ",")] sql = fmt.Sprintf(sql, fmtParams...) sql += ` WHERE status = ? AND deleted_at = ? AND status_sale_begin <> 0 AND status_sale_end <> 0 ` sqlParams = append(sqlParams, model.StoreSkuBindStatusNormal, utils.DefaultTimeValue) if storeID > 0 { sql += ` AND store_id = ?` sqlParams = append(sqlParams, storeID) } return ExecuteSQL(db, sql, sqlParams...) } func GetStoreSkusByNameIDs(db *DaoDB, storeIDs []int, nameID int) (skuList []*StoreSkuSyncInfo, err error) { sql := ` SELECT a.*,c.unit,c.name FROM store_sku_bind a JOIN sku b ON a.sku_id = b.id JOIN sku_name c ON b.name_id = c.id WHERE b.name_id = ? ` sqlParams := []interface{}{ nameID, } if len(storeIDs) > 0 { sql += " AND a.store_id in (" + GenQuestionMarks(len(storeIDs)) + ")" sqlParams = append(sqlParams, storeIDs) } sql += " AND a.status != ?" sqlParams = append(sqlParams, model.SkuStatusDeleted) err = GetRows(db, &skuList, sql, sqlParams...) return skuList, err } func SetStoreSkuBindVendorPrice(storeSkuBind *model.StoreSkuBind, vendorID int, vendorPrice int) { switch vendorID { case model.VendorIDJD: storeSkuBind.JdPrice = vendorPrice case model.VendorIDMTWM: storeSkuBind.MtwmPrice = vendorPrice case model.VendorIDEBAI: storeSkuBind.EbaiPrice = vendorPrice case model.VendorIDJX: storeSkuBind.JxPrice = vendorPrice } } func GetStoreSkuBindVendorPrice(storeSkuBind *model.StoreSkuBind, vendorID int) (vendorPrice int) { switch vendorID { case model.VendorIDJD: vendorPrice = storeSkuBind.JdPrice case model.VendorIDMTWM: vendorPrice = storeSkuBind.MtwmPrice case model.VendorIDEBAI: vendorPrice = storeSkuBind.EbaiPrice case model.VendorIDJX: vendorPrice = storeSkuBind.JxPrice } return vendorPrice } func SetStoreSkuBindSyncStatus(storeSkuBind *model.StoreSkuBind, vendorID int, syncStatus int8) { switch vendorID { case model.VendorIDJD: storeSkuBind.JdSyncStatus = syncStatus case model.VendorIDMTWM: storeSkuBind.MtwmSyncStatus = syncStatus case model.VendorIDEBAI: storeSkuBind.EbaiSyncStatus = syncStatus } } func GetStoreSkuBindSyncStatus(storeSkuBind *model.StoreSkuBind, vendorID int) (syncStatus int8) { switch vendorID { case model.VendorIDJD: syncStatus = storeSkuBind.JdSyncStatus case model.VendorIDMTWM: syncStatus = storeSkuBind.MtwmSyncStatus case model.VendorIDEBAI: syncStatus = storeSkuBind.EbaiSyncStatus } return syncStatus }