337 lines
9.9 KiB
Go
337 lines
9.9 KiB
Go
package dao
|
||
|
||
import (
|
||
"git.rosy.net.cn/baseapi/utils"
|
||
"git.rosy.net.cn/jx-callback/business/model"
|
||
)
|
||
|
||
type SkuCategoryWithVendor struct {
|
||
*model.SkuCategory
|
||
MapList []*model.ThingMap `json:"mapList"`
|
||
}
|
||
|
||
type SkuNamePlace struct {
|
||
model.Place
|
||
NameID int `orm:"column(name_id)" json:"nameID"`
|
||
SkuID int `orm:"column(sku_id)" json:"skuID"`
|
||
}
|
||
|
||
func GetSellCities(db *DaoDB, nameID int, vendorID int) (cities []*model.Place, err error) {
|
||
cities = []*model.Place{}
|
||
sql := `
|
||
SELECT DISTINCT t3.*
|
||
FROM sku_name_place_bind t1
|
||
JOIN place t2 ON t1.place_code = t2.code
|
||
JOIN place t3 ON (t2.level = 2 AND t2.code = t3.code) OR (t2.level = 1 AND t2.code = t3.parent_code)
|
||
WHERE t1.name_id = ?
|
||
`
|
||
if vendorID == model.VendorIDJD {
|
||
sql += "AND t3.jd_code <> 0\n"
|
||
}
|
||
return cities, GetRows(db, &cities, sql, nameID)
|
||
}
|
||
|
||
func DeleteSkuNamePlace(db *DaoDB, nameID int, placeCodes []int) (num int64, err error) {
|
||
sql := `
|
||
DELETE
|
||
FROM sku_name_place_bind
|
||
WHERE name_id = ?
|
||
`
|
||
sqlParams := []interface{}{
|
||
nameID,
|
||
}
|
||
if len(placeCodes) > 0 {
|
||
sql += " AND place_code IN (" + GenQuestionMarks(len(placeCodes)) + ")"
|
||
sqlParams = append(sqlParams, placeCodes)
|
||
}
|
||
return ExecuteSQL(db, sql, sqlParams...)
|
||
}
|
||
|
||
func GetCategories(db *DaoDB, parentID, level int, catIDs []int, isExd bool) (cats []*model.SkuCategory, err error) {
|
||
sql := `
|
||
SELECT t1.*
|
||
FROM sku_category t1
|
||
WHERE t1.deleted_at = ?`
|
||
params := []interface{}{
|
||
utils.DefaultTimeValue,
|
||
}
|
||
if parentID != -1 {
|
||
sql += " AND t1.parent_id = ?"
|
||
params = append(params, parentID)
|
||
}
|
||
if len(catIDs) > 0 {
|
||
sql += " AND t1.id IN (" + GenQuestionMarks(len(catIDs)) + ")"
|
||
params = append(params, catIDs)
|
||
}
|
||
if level > 0 {
|
||
sql += " AND t1.level = ?"
|
||
params = append(params, level)
|
||
}
|
||
if isExd {
|
||
sql += " ORDER BY t1.level, t1.exd_seq"
|
||
} else {
|
||
sql += ` AND t1.is_exd_spec = 0
|
||
ORDER BY t1.level, t1.seq`
|
||
}
|
||
return cats, GetRows(db, &cats, sql, params)
|
||
}
|
||
|
||
func GetSkus(db *DaoDB, skuIDs, nameIDs, statuss, catIDs []int, eclpIDs []string) (skuList []*model.SkuAndName, err error) {
|
||
sql := `
|
||
SELECT t1.*, t2.name, t2.unit, t2.prefix, t2.is_spu, t2.ex_prefix, t2.ex_prefix_begin, t2.ex_prefix_end
|
||
FROM sku t1
|
||
JOIN sku_name t2 ON t2.id = t1.name_id AND t2.deleted_at = ?
|
||
`
|
||
sqlWhere := `
|
||
WHERE t1.deleted_at = ?
|
||
`
|
||
sqlParams := []interface{}{
|
||
utils.DefaultTimeValue,
|
||
utils.DefaultTimeValue,
|
||
}
|
||
if len(skuIDs) > 0 {
|
||
sqlWhere += " AND t1.id IN (" + GenQuestionMarks(len(skuIDs)) + ")"
|
||
sqlParams = append(sqlParams, skuIDs)
|
||
}
|
||
if len(nameIDs) > 0 {
|
||
sqlWhere += " AND t1.name_id IN (" + GenQuestionMarks(len(nameIDs)) + ")"
|
||
sqlParams = append(sqlParams, nameIDs)
|
||
}
|
||
if len(statuss) > 0 {
|
||
sqlWhere += " AND t1.status IN (" + GenQuestionMarks(len(statuss)) + ") AND t2.status IN (" + GenQuestionMarks(len(statuss)) + ")"
|
||
sqlParams = append(sqlParams, statuss, statuss)
|
||
}
|
||
if len(catIDs) > 0 {
|
||
sql += `
|
||
JOIN sku_category t3 ON t3.id = t2.category_id
|
||
LEFT JOIN sku_category t3p ON t3p.id = t3.parent_id
|
||
`
|
||
sqlWhere += " AND (t3.id IN (" + GenQuestionMarks(len(catIDs)) + ")"
|
||
sqlWhere += " OR t3p.id IN (" + GenQuestionMarks(len(catIDs)) + ") )"
|
||
sqlParams = append(sqlParams, catIDs, catIDs)
|
||
}
|
||
if len(eclpIDs) > 0 {
|
||
sqlWhere += " AND t1.eclp_id IN (" + GenQuestionMarks(len(eclpIDs)) + ") AND t2.status IN (" + GenQuestionMarks(len(statuss)) + ")"
|
||
sqlParams = append(sqlParams, eclpIDs)
|
||
}
|
||
sql += sqlWhere
|
||
if err = GetRows(db, &skuList, sql, sqlParams...); err == nil {
|
||
return skuList, nil
|
||
}
|
||
return nil, err
|
||
}
|
||
|
||
func GetSkuNames(db *DaoDB, nameIDs []int) (skuNameList []*model.SkuName, err error) {
|
||
sql := `
|
||
SELECT *
|
||
FROM sku_name t1
|
||
WHERE t1.deleted_at = ?
|
||
`
|
||
sqlParams := []interface{}{
|
||
utils.DefaultTimeValue,
|
||
}
|
||
if len(nameIDs) > 0 {
|
||
sql += " AND t1.id IN (" + GenQuestionMarks(len(nameIDs)) + ")"
|
||
sqlParams = append(sqlParams, nameIDs)
|
||
}
|
||
if err = GetRows(db, &skuNameList, sql, sqlParams...); err == nil {
|
||
return skuNameList, nil
|
||
}
|
||
return nil, err
|
||
}
|
||
|
||
func GetSkuIDByNames(db *DaoDB, nameIDs []int) (skuIDs []int, err error) {
|
||
skuList, err := GetSkus(db, nil, nameIDs, nil, nil, nil)
|
||
if err == nil {
|
||
for _, sku := range skuList {
|
||
skuIDs = append(skuIDs, sku.ID)
|
||
}
|
||
}
|
||
return skuIDs, err
|
||
}
|
||
|
||
func GetSkuByCats(db *DaoDB, catIDs []int) (skuList []*model.Sku, err error) {
|
||
skuExList, err := GetSkus(db, nil, nil, nil, catIDs, nil)
|
||
if err == nil {
|
||
for _, v := range skuExList {
|
||
skuList = append(skuList, &v.Sku)
|
||
}
|
||
}
|
||
return skuList, err
|
||
}
|
||
|
||
// todo, GetSkuCategoryWithVendor与GetSkusWithVendor,
|
||
// 如果mustDirty为true,应该是要thing_map为基表,LEFT JOIN原始实体表,否则当原始实体记录在未同步前被物理删除后,无法真正同步
|
||
|
||
// 多门店平台使用,当前只有京东
|
||
func GetSkuCategoryWithVendor(db *DaoDB, vendorIDs []int, appOrgCodes []string, parentCatID int, catIDs []int, mustDirty bool) (catList []*SkuStoreCatInfo, err error) {
|
||
sql := `
|
||
SELECT
|
||
t1m.vendor_id, t1m.vendor_org_code,
|
||
|
||
t1m.id map_id,
|
||
t1.*,
|
||
t1m.vendor_thing_id vendor_cat_id,
|
||
t1m.sync_status cat_sync_status,
|
||
|
||
t1pm.id parent_map_id,
|
||
t1p.name parent_cat_name,
|
||
t1pm.vendor_thing_id parent_vendor_cat_id,
|
||
t1pm.sync_status parent_cat_sync_status
|
||
FROM sku_category t1
|
||
LEFT JOIN thing_map t1m ON t1m.thing_id = t1.id AND t1m.thing_type = ? AND t1m.deleted_at = ?`
|
||
sqlParams := []interface{}{
|
||
model.ThingTypeCategory,
|
||
utils.DefaultTimeValue,
|
||
}
|
||
if len(vendorIDs) > 0 {
|
||
sql += " AND t1m.vendor_id IN (" + GenQuestionMarks(len(vendorIDs)) + ")"
|
||
sqlParams = append(sqlParams, vendorIDs)
|
||
}
|
||
if len(appOrgCodes) > 0 {
|
||
sql += " AND t1m.vendor_org_code IN (" + GenQuestionMarks(len(appOrgCodes)) + ")"
|
||
sqlParams = append(sqlParams, appOrgCodes)
|
||
}
|
||
sql += `
|
||
LEFT JOIN sku_category t1p ON t1p.id = t1.parent_id
|
||
LEFT JOIN thing_map t1pm ON t1pm.thing_id = t1p.id AND t1pm.thing_type = ? AND t1m.deleted_at = ?
|
||
AND t1pm.vendor_id = t1m.vendor_id AND t1pm.vendor_org_code = t1m.vendor_org_code
|
||
WHERE 1 = 1
|
||
`
|
||
sqlParams = append(sqlParams, model.ThingTypeCategory, utils.DefaultTimeValue)
|
||
if mustDirty {
|
||
sql += " AND t1m.sync_status IS NOT NULL AND t1m.sync_status <> 0"
|
||
} else {
|
||
sql += " AND t1.deleted_at = ?"
|
||
sqlParams = append(sqlParams, utils.DefaultTimeValue)
|
||
}
|
||
if len(catIDs) > 0 {
|
||
sql += " AND t1.id IN (" + GenQuestionMarks(len(catIDs)) + ")"
|
||
sqlParams = append(sqlParams, catIDs)
|
||
}
|
||
if parentCatID >= 0 {
|
||
sql += " AND t1.parent_id = ?"
|
||
sqlParams = append(sqlParams, parentCatID)
|
||
}
|
||
sql += " ORDER BY t1.seq"
|
||
err = GetRows(db, &catList, sql, sqlParams...)
|
||
return catList, err
|
||
}
|
||
|
||
// 多门店平台使用,当前只有京东
|
||
func GetSkusWithVendor(db *DaoDB, vendorIDs []int, appOrgCodes []string, nameIDs, skuIDs []int, mustDirty bool) (skuList []*StoreSkuSyncInfo, err error) {
|
||
sql := `
|
||
SELECT
|
||
t1m.vendor_id, t1m.vendor_org_code,
|
||
|
||
t1m.id bind_id,
|
||
t1.*,
|
||
t1.id sku_id,
|
||
t1m.vendor_thing_id vendor_sku_id,
|
||
t1m.sync_status sku_sync_status,
|
||
|
||
t2.price,
|
||
t2.price unit_price,
|
||
t2.prefix,
|
||
t2.name,
|
||
t2.unit,
|
||
t2.upc,
|
||
t2.is_global,
|
||
t2.status name_status,
|
||
IF(t11.resource_type IS NULL OR t11.resource_type <> ?, t2.img, '') img,
|
||
IF(t12.resource_type IS NULL OR t12.resource_type <> ?, t2.img2, '') img2,
|
||
t2.desc_img,
|
||
t2.ex_prefix,
|
||
t2.ex_prefix_begin,
|
||
t2.ex_prefix_end,
|
||
t3.jd_category_id vendor_vendor_cat_id,
|
||
|
||
t3m.sync_status cat_sync_status,
|
||
t3m.vendor_thing_id vendor_cat_id
|
||
|
||
FROM sku t1
|
||
LEFT JOIN thing_map t1m ON t1m.thing_id = t1.id AND t1m.thing_type = ? AND t1m.deleted_at = ?`
|
||
sqlParams := []interface{}{
|
||
model.MimeTypeGif,
|
||
model.MimeTypeGif,
|
||
model.ThingTypeSku,
|
||
utils.DefaultTimeValue,
|
||
}
|
||
if len(vendorIDs) > 0 {
|
||
sql += " AND t1m.vendor_id IN (" + GenQuestionMarks(len(vendorIDs)) + ")"
|
||
sqlParams = append(sqlParams, vendorIDs)
|
||
}
|
||
if len(appOrgCodes) > 0 {
|
||
sql += " AND t1m.vendor_org_code IN (" + GenQuestionMarks(len(appOrgCodes)) + ")"
|
||
sqlParams = append(sqlParams, appOrgCodes)
|
||
}
|
||
sql += `
|
||
JOIN sku_name t2 ON t2.id = t1.name_id
|
||
LEFT JOIN sku_category t3 ON t3.id = t2.category_id
|
||
LEFT JOIN thing_map t3m ON t3m.thing_id = t3.id AND t3m.thing_type = ? AND t3m.deleted_at = ?
|
||
AND t3m.vendor_id = t1m.vendor_id AND t3m.vendor_org_code = t1m.vendor_org_code
|
||
LEFT JOIN data_resource t11 ON t11.main_url = t2.img
|
||
LEFT JOIN data_resource t12 ON t12.main_url = t2.img2
|
||
WHERE 1 = 1
|
||
`
|
||
sqlParams = append(sqlParams, model.ThingTypeCategory, utils.DefaultTimeValue)
|
||
if mustDirty {
|
||
sql += " AND t1m.sync_status IS NOT NULL AND t1m.sync_status <> 0"
|
||
} else {
|
||
sql += " AND t1.deleted_at = ?"
|
||
sqlParams = append(sqlParams, utils.DefaultTimeValue)
|
||
}
|
||
if len(nameIDs) > 0 {
|
||
sql += " AND t1.name_id IN (" + GenQuestionMarks(len(nameIDs)) + ")"
|
||
sqlParams = append(sqlParams, nameIDs)
|
||
}
|
||
if len(skuIDs) > 0 {
|
||
sql += " AND t1.id IN (" + GenQuestionMarks(len(skuIDs)) + ")"
|
||
sqlParams = append(sqlParams, skuIDs)
|
||
}
|
||
sql += " ORDER BY t1.seq"
|
||
if err = GetRows(db, &skuList, sql, sqlParams...); err == nil {
|
||
skuPlaceList, err2 := GetSkuNamePlaces(db, nameIDs, skuIDs)
|
||
if err = err2; err == nil {
|
||
skuPlaceMap := make(map[int][]*SkuNamePlace)
|
||
for _, v := range skuPlaceList {
|
||
skuPlaceMap[v.SkuID] = append(skuPlaceMap[v.SkuID], v)
|
||
}
|
||
for _, v := range skuList {
|
||
if v.IsGlobal == 0 {
|
||
for _, v2 := range skuPlaceMap[v.SkuID] {
|
||
// 京东到家
|
||
if v2.JdCode > 0 {
|
||
v.SellCities = append(v.SellCities, utils.Int2Str(v2.JdCode))
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
return skuList, err
|
||
}
|
||
|
||
func GetSkuNamePlaces(db *DaoDB, nameIDs, skuIDs []int) (skuPlaceList []*SkuNamePlace, err error) {
|
||
sql := `
|
||
SELECT
|
||
t4.*,
|
||
t2.id sku_id, t2.name_id
|
||
FROM sku t2
|
||
JOIN sku_name_place_bind t3 ON t3.name_id = t2.name_id
|
||
JOIN place t4 ON t4.code = t3.place_code
|
||
WHERE t2.deleted_at = ?
|
||
`
|
||
sqlParams := []interface{}{utils.DefaultTimeValue}
|
||
if len(nameIDs) > 0 {
|
||
sql += " AND t2.name_id IN (" + GenQuestionMarks(len(nameIDs)) + ")"
|
||
sqlParams = append(sqlParams, nameIDs)
|
||
}
|
||
if len(skuIDs) > 0 {
|
||
sql += " AND t2.id IN (" + GenQuestionMarks(len(skuIDs)) + ")"
|
||
sqlParams = append(sqlParams, skuIDs)
|
||
}
|
||
err = GetRows(db, &skuPlaceList, sql, sqlParams...)
|
||
return skuPlaceList, err
|
||
}
|