1169 lines
41 KiB
Go
1169 lines
41 KiB
Go
package dao
|
||
|
||
import (
|
||
"errors"
|
||
"fmt"
|
||
"strings"
|
||
"time"
|
||
|
||
"git.rosy.net.cn/jx-callback/business/jxutils"
|
||
"git.rosy.net.cn/jx-callback/business/model"
|
||
|
||
"git.rosy.net.cn/baseapi/utils"
|
||
"git.rosy.net.cn/jx-callback/globals"
|
||
)
|
||
|
||
var (
|
||
dataResFieldMap = map[int]string{
|
||
model.VendorIDMTWM: "mtwm_url",
|
||
model.VendorIDEBAI: "ebai_url",
|
||
}
|
||
)
|
||
|
||
type SkuStoreCatInfo struct {
|
||
VendorID int `orm:"column(vendor_id)" json:"vendorID"`
|
||
VendorOrgCode string `orm:"size(32)" json:"vendorOrgCode"` // 同一平台下不同的商户代码,如果只有一个,可以为空
|
||
|
||
MapID int `orm:"column(map_id)"` // 这个主要用于判断是否有store_sku_category_map
|
||
model.SkuCategory
|
||
VendorCatID string `orm:"column(vendor_cat_id)"`
|
||
CatSyncStatus int8
|
||
|
||
ParentMapID int `orm:"column(parent_map_id)"` // 这个主要用于判断是否有父store_sku_category_map
|
||
ParentCatName string
|
||
ParentVendorCatID string `orm:"column(parent_vendor_cat_id)"`
|
||
ParentCatSyncStatus int8
|
||
}
|
||
|
||
type StoreSkuSyncInfo struct {
|
||
VendorID int `orm:"column(vendor_id)" json:"vendorID"`
|
||
VendorOrgCode string `orm:"size(32)" json:"vendorOrgCode"` // 同一平台下不同的商户代码,如果只有一个,可以为空
|
||
|
||
// 平台无关的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
|
||
SkuSyncStatus 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
|
||
IsGlobal int8 `orm:"default(1)" json:"isGlobal"` // 是否是全部(全国)可见,如果否的话,可见性由SkuPlace决定
|
||
NameStatus int
|
||
SellCities []string
|
||
|
||
// 平台相关的图片信息
|
||
Img string
|
||
Img2 string
|
||
DescImg string // 饿百是SkuName中的DescImgEbai
|
||
|
||
VendorVendorCatID int64 `orm:"column(vendor_vendor_cat_id)"` // 平台商品分类(叶子结点)
|
||
|
||
// sku的商家分类信息
|
||
SkuCatSyncStatus int8
|
||
SkuVendorCatID string `orm:"column(sku_vendor_cat_id)"`
|
||
|
||
// sku_name的商家分类信息
|
||
CatSyncStatus 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
|
||
}
|
||
|
||
// GetStoreSkus用
|
||
type StoreSkuNameExt struct {
|
||
StoreID int `orm:"column(store_id)" json:"storeID"`
|
||
StoreName string `json:"storeName"`
|
||
SkuID int `orm:"column(sku_id)" json:"skuID"`
|
||
model.SkuName
|
||
PayPercentage int `json:"-"`
|
||
UnitPrice int `json:"unitPrice"`
|
||
Skus []*StoreSkuExt `orm:"-" json:"skus,omitempty"`
|
||
SkusStr string `json:"-"`
|
||
|
||
PendingOpType int8 `json:"pendingOpType"` // 取值同 StoreOpRequest.Type
|
||
PendingUnitPrice int `json:"pendingUnitPrice"` // 这个是待审核的价格申请
|
||
}
|
||
|
||
// GetStoreSkus用
|
||
type StoreSkuNamesInfo struct {
|
||
TotalCount int `json:"totalCount"`
|
||
SkuNames []*StoreSkuNameExt `json:"skuNames"`
|
||
}
|
||
|
||
type StoreSkuExt struct {
|
||
NameID int `orm:"column(name_id)" json:"nameID"`
|
||
SkuID int `orm:"column(sku_id)" json:"id"`
|
||
Comment string `orm:"size(255)" json:"comment"`
|
||
SkuCategoryID int `orm:"column(sku_category_id)" json:"categoryID"`
|
||
SkuSpecQuality float32 `json:"specQuality"`
|
||
SkuSpecUnit string `orm:"size(8)" json:"specUnit"` // 质量或容量
|
||
Weight int `json:"weight"` // 重量/质量,单位为克,当相应的SkuName的SpecUnit为g或kg时,必须等于SpecQuality
|
||
JdID string `orm:"column(sku_jd_id);null;index" json:"jdID"`
|
||
SkuStatus int `json:"status"`
|
||
|
||
BindCreatedAt time.Time `orm:"auto_now_add;type(datetime)" json:"createdAt"`
|
||
BindUpdatedAt time.Time `orm:"auto_now;type(datetime)" json:"updatedAt"`
|
||
BindLastOperator string `orm:"size(32)" json:"lastOperator"` // 最后操作员
|
||
BindDeletedAt time.Time `orm:"type(datetime)" json:"deletedAt"`
|
||
SubStoreID int `orm:"column(sub_store_id)" json:"subStoreID"`
|
||
BindPrice int `json:"price"` // 单位为分,不用int64的原因是这里不需要累加
|
||
UnitPrice int `json:"unitPrice"` // 这个是一斤的门店商品价,放在这里的原因是避免额外增加一张store sku_name表,逻辑上要保证同一SKU NAME中的所有SKU这个字段的数据一致
|
||
StoreSkuStatus int `json:"storeSkuStatus"`
|
||
|
||
EbaiID string `orm:"column(ebai_id);index" json:"ebaiID"`
|
||
MtwmID string `orm:"column(mtwm_id)" json:"mtwmID"` // 这个也不是必须的,只是为了DAO取数据语句一致
|
||
// WscID string `orm:"column(wsc_id);index" json:"wscID"` // 表示微盟skuId
|
||
// WscID2 string `orm:"column(wsc_id2);index" json:"wscID2"` // 表示微盟goodsId
|
||
|
||
JdSyncStatus int8 `orm:"default(2)" json:"jdSyncStatus"`
|
||
EbaiSyncStatus int8 `orm:"default(2)" json:"ebaiSyncStatus"`
|
||
MtwmSyncStatus int8 `orm:"default(2)" json:"mtwmSyncStatus"`
|
||
// WscSyncStatus int8 `orm:"default(2)" json:"wscSyncStatus"`
|
||
|
||
JdPrice int `json:"jdPrice"`
|
||
EbaiPrice int `json:"ebaiPrice"`
|
||
MtwmPrice int `json:"mtwmPrice"`
|
||
JxPrice int `json:"jxPrice"`
|
||
|
||
AutoSaleAt time.Time `orm:"type(datetime);null" json:"autoSaleAt"`
|
||
|
||
ActPrice int `json:"actPrice"`
|
||
ActID int `orm:"column(act_id)" json:"actID"`
|
||
ActType int `orm:"column(act_type)" json:"actType"`
|
||
|
||
EarningPrice int `json:"earningPrice"`
|
||
EarningActID int `orm:"column(earning_act_id)" json:"earningActID"`
|
||
|
||
RealEarningPrice int `json:"realEarningPrice"`
|
||
|
||
StatusSaleBegin int16 `json:"statusSaleBegin"` //商品可售时间范围
|
||
StatusSaleEnd int16 `json:"statusSaleEnd"`
|
||
|
||
Count int `json:"count"`
|
||
Times int `json:"times"`
|
||
}
|
||
|
||
// 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 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 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为基础来做同步,正常情况下使用
|
||
// 单多门店模式厂商通用
|
||
func GetStoreSkus2(db *DaoDB, vendorID, storeID int, skuIDs []int, mustDirty bool) (skus []*StoreSkuSyncInfo, err error) {
|
||
if !globals.IsUseThingMap {
|
||
return oldGetStoreSkus2(db, vendorID, storeID, skuIDs, mustDirty)
|
||
}
|
||
return newGetStoreSkus2(db, vendorID, storeID, skuIDs, mustDirty)
|
||
}
|
||
|
||
func newGetStoreSkus2(db *DaoDB, vendorID, storeID int, skuIDs []int, mustDirty bool) (skus []*StoreSkuSyncInfo, err error) {
|
||
if vendorID < 0 {
|
||
panic("vendorID<0")
|
||
}
|
||
isSingleStorePF := model.MultiStoresVendorMap[vendorID] != 1
|
||
fieldPrefix := ConvertDBFieldPrefix(model.VendorNames[vendorID])
|
||
skuVendorIDField := fmt.Sprintf("t1.%s_id", fieldPrefix)
|
||
if !isSingleStorePF {
|
||
skuVendorIDField = "t2m.vendor_thing_id"
|
||
}
|
||
sql := `
|
||
SELECT
|
||
t14.vendor_id, t14.vendor_org_code,
|
||
t1.id bind_id, t1.sku_id, t1.price, t1.unit_price, t1.status store_sku_status,
|
||
%s vendor_sku_id, t1.%s_sync_status 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{}{
|
||
skuVendorIDField, fieldPrefix, fieldPrefix,
|
||
GetDataResFieldName(vendorID), GetDataResFieldName(vendorID),
|
||
GetDataResFieldName(vendorID), GetDataResFieldName(vendorID),
|
||
GetDataResFieldName(vendorID),
|
||
fieldPrefix,
|
||
}
|
||
if isSingleStorePF {
|
||
sql += `,
|
||
t5.%s_sync_status cat_sync_status, t5.%s_id vendor_cat_id,
|
||
t5sku.%s_sync_status sku_cat_sync_status, t5sku.%s_id sku_vendor_cat_id`
|
||
fmtParams = append(fmtParams, fieldPrefix, fieldPrefix, fieldPrefix, fieldPrefix)
|
||
} else {
|
||
sql += `,
|
||
t4m.vendor_thing_id vendor_cat_id,
|
||
t5skum.vendor_thing_id sku_vendor_cat_id`
|
||
}
|
||
sql += `
|
||
FROM store_sku_bind t1
|
||
LEFT JOIN store_map t14 ON t14.store_id = t1.store_id AND t14.vendor_id = ? AND t14.deleted_at = ?
|
||
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{}{
|
||
vendorID, utils.DefaultTimeValue,
|
||
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
|
||
LEFT JOIN thing_map t2m ON t2m.thing_id = t1.sku_id AND t2m.vendor_org_code = t14.vendor_org_code AND t2m.thing_type = ? AND t2m.vendor_id = ? AND t2m.deleted_at = ?
|
||
LEFT JOIN thing_map t4m ON t4m.thing_id = t3.category_id AND t4m.vendor_org_code = t14.vendor_org_code AND t4m.thing_type = ? AND t4m.vendor_id = ? AND t4m.deleted_at = ?
|
||
LEFT JOIN thing_map t5skum ON t5skum.thing_id = t5sku.id AND t5skum.vendor_org_code = t14.vendor_org_code AND t5skum.thing_type = ? AND t5skum.vendor_id = ? AND t5skum.deleted_at = ?
|
||
`
|
||
sqlParams = append(sqlParams,
|
||
model.ThingTypeSku, vendorID, utils.DefaultTimeValue,
|
||
model.ThingTypeCategory, vendorID, utils.DefaultTimeValue,
|
||
model.ThingTypeCategory, vendorID, utils.DefaultTimeValue)
|
||
}
|
||
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 AND t3.id IS NULL))"
|
||
fmtParams = append(fmtParams, fieldPrefix, skuVendorIDField)
|
||
if isSingleStorePF {
|
||
fmtParams = append(fmtParams, "0")
|
||
} else {
|
||
fmtParams = append(fmtParams, "''")
|
||
}
|
||
} 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 oldGetStoreSkus2(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 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 cat_sync_status, t5.%s_id vendor_cat_id,
|
||
t5sku.%s_sync_status sku_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) {
|
||
if !globals.IsUseThingMap {
|
||
return oldGetFullStoreSkus(db, vendorID, storeID)
|
||
}
|
||
return newGetFullStoreSkus(db, vendorID, storeID)
|
||
}
|
||
|
||
func newGetFullStoreSkus(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,
|
||
t1.%s_sync_status sku_sync_status, t1.store_id, t1.deleted_at bind_deleted_at,
|
||
t2.*, t2.id sku_id, t2m.vendor_thing_id vendor_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,
|
||
t4m.sync_status cat_sync_status, t4m.vendor_thing_id vendor_cat_id,
|
||
t5skum.sync_status sku_cat_sync_status, t5skum.vendor_thing_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 = ?
|
||
LEFT JOIN store_map sm ON sm.store_id = t1.store_id AND sm.vendor_id = ? AND sm.deleted_at = ?
|
||
LEFT JOIN thing_map t2m ON t2m.thing_id = t2.id AND t2m.vendor_org_code = sm.vendor_org_code AND t2m.thing_type = ? AND t2m.vendor_id = ? AND t2m.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 thing_map t4m ON t4m.thing_id = t3.category_id AND t4m.vendor_org_code = sm.vendor_org_code AND t4m.thing_type = ? AND t4m.vendor_id = ? AND t4m.deleted_at = ?
|
||
LEFT JOIN sku_category t5sku ON t2.category_id = t5sku.id
|
||
LEFT JOIN thing_map t5skum ON t5skum.thing_id = t2.category_id AND t5skum.vendor_org_code = sm.vendor_org_code AND t5skum.thing_type = ? AND t5skum.vendor_id = ? AND t5skum.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
|
||
WHERE t2.deleted_at = ? AND t2.status = ? AND t2m.vendor_thing_id <> ''
|
||
ORDER BY t1.price DESC`
|
||
sqlParams := []interface{}{
|
||
storeID,
|
||
utils.DefaultTimeValue,
|
||
vendorID, utils.DefaultTimeValue,
|
||
model.ThingTypeSku, vendorID, utils.DefaultTimeValue,
|
||
utils.DefaultTimeValue,
|
||
model.SkuStatusNormal,
|
||
utils.DefaultTimeValue,
|
||
model.ThingTypeCategory, vendorID, utils.DefaultTimeValue,
|
||
model.ThingTypeCategory, vendorID, utils.DefaultTimeValue,
|
||
utils.DefaultTimeValue,
|
||
model.SkuStatusNormal,
|
||
}
|
||
fieldPrefix := ConvertDBFieldPrefix(model.VendorNames[vendorID])
|
||
sql = fmt.Sprintf(sql,
|
||
fieldPrefix,
|
||
GetDataResFieldName(vendorID), GetDataResFieldName(vendorID),
|
||
GetDataResFieldName(vendorID), GetDataResFieldName(vendorID),
|
||
GetDataResFieldName(vendorID),
|
||
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
|
||
}
|
||
|
||
func oldGetFullStoreSkus(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,
|
||
t1.%s_sync_status sku_sync_status, t1.store_id, t1.deleted_at bind_deleted_at,
|
||
t2.*, t2.id sku_id, t2.%s_id vendor_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 cat_sync_status, t4.%s_id vendor_cat_id,
|
||
t5sku.%s_sync_status sku_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 GetTopSkusByStoreIDs(db *DaoDB, storeIDs []int) (storeSkuNameExt []*StoreSkuNameExt, err error) {
|
||
sql := `
|
||
SELECT t2.id sku_id,t3.*,t1.store_id,t1.store_name
|
||
FROM(
|
||
SELECT SUM(b.count) count,c.id,a.store_id,d.name store_name
|
||
FROM goods_order a
|
||
JOIN order_sku b ON a.vendor_order_id = b.vendor_order_id AND a.vendor_id = b.vendor_id
|
||
JOIN sku c ON b.sku_id = c.id AND c.deleted_at = ?
|
||
JOIN sku_name t1 ON t1.id = c.name_id AND t1.deleted_at = ?
|
||
STRAIGHT_JOIN store_sku_bind t4 ON t4.store_id = IF(a.store_id = 0,a.jx_store_id,a.store_id) AND t4.sku_id = b.sku_id AND t4.status = ? AND t4.deleted_at = ?
|
||
JOIN store d ON d.id = a.store_id
|
||
WHERE 1=1
|
||
AND a.order_created_at BETWEEN ? and NOW()
|
||
`
|
||
sqlParams := []interface{}{
|
||
utils.DefaultTimeValue,
|
||
utils.DefaultTimeValue,
|
||
model.SkuStatusNormal,
|
||
utils.DefaultTimeValue,
|
||
time.Now().AddDate(0, -1, 0),
|
||
}
|
||
if len(storeIDs) > 0 {
|
||
sql += " AND a.store_id IN(" + GenQuestionMarks(len(storeIDs)) + ")"
|
||
sqlParams = append(sqlParams, storeIDs)
|
||
}
|
||
sql += `
|
||
AND b.sale_price > ?
|
||
GROUP BY 2,3,4)t1
|
||
JOIN sku t2 ON t2.id = t1.id
|
||
JOIN sku_name t3 ON t3.id = t2.name_id
|
||
ORDER BY t1.count DESC
|
||
LIMIT ?
|
||
`
|
||
sqlParams = append(sqlParams, 100, 30)
|
||
err = GetRows(db, &storeSkuNameExt, sql, sqlParams...)
|
||
var skuNamesInfo = &StoreSkuNamesInfo{
|
||
SkuNames: storeSkuNameExt,
|
||
}
|
||
for _, v := range storeSkuNameExt {
|
||
var skus []*StoreSkuExt
|
||
sql2 := `
|
||
SELECT a.id sku_id,a.*,t4.created_at bind_created_at, t4.updated_at bind_updated_at, t4.last_operator bind_last_operator, t4.deleted_at bind_deleted_at,
|
||
t4.sub_store_id, t4.price bind_price, IF(t4.unit_price IS NOT NULL, t4.unit_price, t1.price) unit_price, t4.status store_sku_status, t4.auto_sale_at,
|
||
t4.ebai_id, t4.mtwm_id,
|
||
t4.ebai_sync_status, t4.mtwm_sync_status,
|
||
t4.jd_price, t4.ebai_price, t4.mtwm_price, t4.jx_price
|
||
FROM sku a
|
||
JOIN sku_name t1 ON a.name_id = t1.id AND t1.deleted_at = ?
|
||
JOIN store_sku_bind t4 ON t4.sku_id = a.id AND t4.deleted_at = ?
|
||
WHERE a.id = ?
|
||
AND a.deleted_at = ?
|
||
`
|
||
sqlParams2 := []interface{}{
|
||
utils.DefaultTimeValue,
|
||
utils.DefaultTimeValue,
|
||
v.SkuID,
|
||
utils.DefaultTimeValue,
|
||
}
|
||
if len(storeIDs) > 0 {
|
||
sql2 += " AND t4.store_id IN(" + GenQuestionMarks(len(storeIDs)) + ")"
|
||
sqlParams2 = append(sqlParams2, storeIDs)
|
||
}
|
||
err = GetRows(db, &skus, sql2, sqlParams2...)
|
||
v.Skus = skus
|
||
err = UpdateActPrice4StoreSkuNameNew(db, storeIDs, []int{v.SkuID}, skuNamesInfo, -1)
|
||
}
|
||
return storeSkuNameExt, err
|
||
}
|
||
|
||
func GetTopCategorysByStoreIDs(db *DaoDB, storeIDs []int) (skuCategory []*model.SkuCategory, err error) {
|
||
sql := `
|
||
SELECT DISTINCT t5.* FROM(
|
||
SELECT d.*
|
||
FROM (
|
||
SELECT t3.*,t1.count
|
||
FROM(
|
||
SELECT SUM(b.count) count,d.category_id
|
||
FROM goods_order a
|
||
JOIN order_sku b ON a.vendor_order_id = b.vendor_order_id
|
||
JOIN sku c ON b.sku_id = c.id AND c.deleted_at = ?
|
||
JOIN sku_name d ON d.id = c.name_id AND d.deleted_at = ?
|
||
JOIN store e ON e.id = a.store_id
|
||
JOIN (SELECT city_code FROM store WHERE 1=1
|
||
`
|
||
sqlParams := []interface{}{
|
||
utils.DefaultTimeValue,
|
||
utils.DefaultTimeValue,
|
||
}
|
||
if len(storeIDs) > 0 {
|
||
sql += " AND id IN(" + GenQuestionMarks(len(storeIDs)) + ")"
|
||
sqlParams = append(sqlParams, storeIDs)
|
||
}
|
||
|
||
sql += `
|
||
)t6 ON t6.city_code = e.city_code
|
||
WHERE 1=1
|
||
AND a.order_created_at BETWEEN ? and NOW()
|
||
AND b.sale_price > ?
|
||
GROUP BY d.category_id)t1
|
||
JOIN sku_category t3 ON t1.category_id = t3.id
|
||
AND t3.level = ?
|
||
AND t3.deleted_at = ?
|
||
ORDER BY t1.count DESC)t4
|
||
JOIN sku_category d ON d.id = t4.parent_id
|
||
AND d.level = ?
|
||
Order by t4.count DESC)t5
|
||
LIMIT ?
|
||
`
|
||
sqlParams = append(sqlParams, time.Now().AddDate(0, -1, 0), 100, 2, utils.DefaultTimeValue, 1, 10)
|
||
err = GetRows(db, &skuCategory, sql, sqlParams...)
|
||
return skuCategory, err
|
||
}
|
||
|
||
func RefershStoreSkusMidPrice(db *DaoDB, storeIDs []int) (count int64, err error) {
|
||
sql := `
|
||
UPDATE store_sku_bind a
|
||
JOIN store d ON d.id = a.store_id
|
||
JOIN price_refer_snapshot b ON a.sku_id = b.sku_id AND b.snapshot_at = ? AND d.city_code = b.city_code
|
||
SET a.price = b.mid_price*100
|
||
WHERE 1=1
|
||
`
|
||
sqlParams := []interface{}{
|
||
utils.DefaultTimeValue,
|
||
}
|
||
if len(storeIDs) > 0 {
|
||
sql += " AND a.store_id IN (" + GenQuestionMarks(len(storeIDs)) + ")"
|
||
sqlParams = append(sqlParams, storeIDs)
|
||
}
|
||
sql += `
|
||
AND a.price > b.mid_price*100
|
||
AND a.deleted_at = ?
|
||
AND a.status = ?
|
||
`
|
||
sqlParams = append(sqlParams, utils.DefaultTimeValue, model.SkuStatusNormal)
|
||
return ExecuteSQL(db, sql, sqlParams)
|
||
}
|
||
|
||
func GetStoreSkuNamePrice(db *DaoDB) (storeSkuNamePriceList []*model.StoreSkuNamePrice, err error) {
|
||
sql := `
|
||
SELECT *
|
||
FROM store_sku_name_price
|
||
WHERE deleted_at = ?
|
||
`
|
||
sqlParams := []interface{}{
|
||
utils.DefaultTimeValue,
|
||
}
|
||
err = GetRows(db, &storeSkuNamePriceList, sql, sqlParams...)
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
return storeSkuNamePriceList, 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
|
||
}
|
||
|
||
func SetStoreCatMapSyncStatus(storeCatMap *model.StoreSkuCategoryMap, vendorID int, syncStatus int8) {
|
||
switch vendorID {
|
||
case model.VendorIDMTWM:
|
||
storeCatMap.MtwmSyncStatus = syncStatus
|
||
case model.VendorIDEBAI:
|
||
storeCatMap.EbaiSyncStatus = syncStatus
|
||
}
|
||
}
|
||
|
||
// skuIDs为空,会导致性能极低,所以要skuIDs必须有值
|
||
func UpdateActPrice4StoreSkuNameNew(db *DaoDB, storeIDs, skuIDs []int, skuNamesInfo *StoreSkuNamesInfo, actVendorID int) (err error) {
|
||
if len(skuIDs) == 0 {
|
||
return nil
|
||
}
|
||
var vendorIDs []int
|
||
if actVendorID >= 0 {
|
||
vendorIDs = []int{actVendorID}
|
||
}
|
||
actStoreSkuList, err := GetEffectiveActStoreSkuInfo(db, 0, vendorIDs, storeIDs, skuIDs, time.Now(), time.Now())
|
||
if err != nil {
|
||
globals.SugarLogger.Errorf("updateActPrice4StoreSkuNameNew can not get sku promotion info for error:%v", err)
|
||
return err
|
||
}
|
||
actStoreSkuMap4Act := jxutils.NewActStoreSkuMap(actStoreSkuList, true)
|
||
actStoreSkuMap4EarningPrice := jxutils.NewActStoreSkuMap(actStoreSkuList, false)
|
||
|
||
for _, skuName := range skuNamesInfo.SkuNames {
|
||
if len(skuName.Skus) > 0 {
|
||
for _, v := range skuName.Skus {
|
||
if actStoreSku := actStoreSkuMap4Act.GetActStoreSku(skuName.StoreID, v.SkuID, -1); actStoreSku != nil {
|
||
v.ActPrice = int(actStoreSku.ActualActPrice)
|
||
v.ActID = actStoreSku.ActID
|
||
v.ActType = actStoreSku.Type
|
||
}
|
||
if actStoreSku := actStoreSkuMap4EarningPrice.GetActStoreSku(skuName.StoreID, v.SkuID, -1); actStoreSku != nil {
|
||
v.EarningPrice = int(actStoreSku.EarningPrice)
|
||
v.EarningActID = actStoreSku.ActID
|
||
}
|
||
|
||
v.RealEarningPrice = v.EarningPrice
|
||
if v.RealEarningPrice == 0 {
|
||
v.RealEarningPrice = int(jxutils.CaculateSkuEarningPrice(int64(v.BindPrice), int64(v.BindPrice), skuName.PayPercentage))
|
||
}
|
||
}
|
||
} else {
|
||
skuName.UnitPrice = skuName.Price
|
||
}
|
||
}
|
||
return err
|
||
}
|