Files
jx-callback/business/model/dao/sku.go
2020-07-28 10:14:03 +08:00

443 lines
13 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package dao
import (
"fmt"
"time"
"git.rosy.net.cn/baseapi/platformapi/aliupcapi"
"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, t2.upc
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)) + ")"
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, upcs []string, name string, isExd bool) (skuNameList []*model.SkuName, err error) {
sql := `
SELECT t1.*
FROM sku_name t1
LEFT JOIN sku t2 ON t2.name_id = t1.id
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 len(upcs) > 0 {
sql += " AND t1.upc IN (" + GenQuestionMarks(len(upcs)) + ")"
sqlParams = append(sqlParams, upcs)
}
if name != "" {
sql += " AND t1.name LIKE ?"
sqlParams = append(sqlParams, "%"+name+"%")
}
if isExd {
sql += " AND t2.exd_sku_id <> ''"
}
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
AND t1.is_sync <> ?
`
sqlParams = append(sqlParams, model.ThingTypeCategory, utils.DefaultTimeValue, model.YES)
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"
fmt.Println(sql)
fmt.Println(sqlParams)
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,
t3.jd_category_id vendor_vendor_cat_id,
tsu.ex_prefix, tsu.begin_at ex_prefix_begin, tsu.end_at ex_prefix_end, tsu.img_watermark,
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
LEFT JOIN sku_exinfo_map tsu ON tsu.name_id = t2.id AND tsu.deleted_at = ? AND tsu.vendor_id = t1m.vendor_id
WHERE 1 = 1
`
sqlParams = append(sqlParams, model.ThingTypeCategory, utils.DefaultTimeValue, 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
}
func GetUpcDepot(db *DaoDB, upc string) (result *aliupcapi.GetAliUpcInfoResult, err error) {
sql := `
SELECT * FROM upc_depot WHERE code = ?
`
sqlParams := []interface{}{upc}
err = GetRow(db, &result, sql, sqlParams...)
return result, err
}
func InsertUpcDepot(db *DaoDB, result *aliupcapi.GetAliUpcInfoResult) (err error) {
sql := `
INSERT INTO upc_depot (code, goods_name, manu_name, manu_address, spec, price, img, goods_type, ycg, trade_mark, remark)
VALUES (?,?,?,?,?,?,?,?,?,?,?)
`
sqlParams := []interface{}{
result.Code,
result.GoodsName,
result.ManuName,
result.ManuAddress,
result.Spec,
result.Price,
result.Img,
result.GoodsType,
result.Ycg,
result.Trademark,
result.Remark,
}
_, err = ExecuteSQL(db, sql, sqlParams)
return err
}
func GetSkuExinfos(db *DaoDB, nameIDs []int, vendorIDs []int, exPrefix string, fromTime, toTime time.Time) (skuExinfoMaps []*model.SkuExinfoMap, err error) {
sql := `
SELECT *
FROM sku_exinfo_map
WHERE deleted_at = ?
`
sqlParams := []interface{}{
utils.DefaultTimeValue,
}
if len(nameIDs) > 0 {
sql += " AND name_id IN (" + GenQuestionMarks(len(nameIDs)) + ")"
sqlParams = append(sqlParams, nameIDs)
}
if len(vendorIDs) > 0 {
sql += " AND vendor_id IN (" + GenQuestionMarks(len(vendorIDs)) + ")"
sqlParams = append(sqlParams, vendorIDs)
}
if exPrefix != "" {
sql += " AND ex_prefix LIKE ?"
sqlParams = append(sqlParams, "%"+exPrefix+"%")
}
if fromTime != utils.ZeroTimeValue && toTime != utils.ZeroTimeValue {
sql += " AND NOT (begin_at > ? OR end_at < ?)"
sqlParams = append(sqlParams, toTime, fromTime)
}
if err = GetRows(db, &skuExinfoMaps, sql, sqlParams...); err == nil {
return skuExinfoMaps, nil
}
return nil, err
}
func GetSkuVendorCategoryMaps(db *DaoDB, nameIDs, vendorIDs []int, vendorCategoryIDs []string) (skuVendorCategoryMaps []*model.SkuVendorCategoryMap, err error) {
sql := `
SELECT *
FROM sku_vendor_category_map
WHERE deleted_at = ?
`
sqlParams := []interface{}{
utils.DefaultTimeValue,
}
if len(nameIDs) > 0 {
sql += " AND name_id IN (" + GenQuestionMarks(len(nameIDs)) + ")"
sqlParams = append(sqlParams, nameIDs)
}
if len(vendorIDs) > 0 {
sql += " AND vendor_id IN (" + GenQuestionMarks(len(vendorIDs)) + ")"
sqlParams = append(sqlParams, vendorIDs)
}
if len(vendorCategoryIDs) > 0 {
sql += " AND vendor_category_id IN (" + GenQuestionMarks(len(vendorCategoryIDs)) + ")"
sqlParams = append(sqlParams, vendorCategoryIDs)
}
if err = GetRows(db, &skuVendorCategoryMaps, sql, sqlParams...); err == nil {
return skuVendorCategoryMaps, nil
}
return nil, err
}