Files
jx-callback/business/jxstore/cms/store_sku.go
2018-09-13 23:11:02 +08:00

243 lines
7.0 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 cms
import (
"strconv"
"strings"
"git.rosy.net.cn/baseapi/utils"
"git.rosy.net.cn/jx-callback/business/model"
"git.rosy.net.cn/jx-callback/business/model/dao"
)
type StoreSkuNameExt struct {
model.SkuName
Skus interface{} `orm:"-" json:"skus"`
SkusStr string `json:"-"`
}
type StoreSkuNamesInfo struct {
TotalCount int `json:"totalCount"`
SkuNames []*StoreSkuNameExt `json:"skuNames"`
}
type StoreSkuBindInfo struct {
SkuID int `json:"skuID"`
SubStoreID int `json:"subStoreID"`
IsFocus int `json:"isFocus"` // -1不关注0忽略1关注
IsSale int `json:"isSale"` // -1不可售0忽略1可售
Price int `json:"price"`
}
func GetStoreSkus(storeID int, keyword string, params map[string]interface{}, offset, pageSize int) (skuNamesInfo *StoreSkuNamesInfo, err error) {
db := dao.GetDB()
sql := `
FROM sku_name t1
LEFT JOIN sku t2 ON t1.id = t2.name_id AND t2.deleted_at = '1970-01-01 00:00:00'
JOIN store_sku_bind t4 ON t4.sku_id = t2.id AND t4.deleted_at = '1970-01-01 00:00:00' AND t4.store_id = ?
WHERE t1.deleted_at = '1970-01-01 00:00:00'
`
sqlParams := []interface{}{
storeID,
}
if keyword != "" {
keywordLike := "%" + keyword + "%"
sql += " AND (t1.name LIKE ? OR t1.prefix LIKE ? OR t1.comment LIKE ?"
sqlParams = append(sqlParams, keywordLike, keywordLike, keywordLike)
if keywordInt64, err2 := strconv.ParseInt(keyword, 10, 64); err2 == nil {
sql += " OR t2.jd_id = ? OR t4.id = ?"
sqlParams = append(sqlParams, keywordInt64, keywordInt64)
}
sql += ")"
}
if params["nameID"] != nil {
sql += " AND t1.id = ?"
sqlParams = append(sqlParams, params["nameID"].(int))
}
if params["categoryID"] != nil {
cat := &model.SkuCategory{}
cat.ID = params["categoryID"].(int)
if err = dao.GetEntity(db, cat); err != nil {
return nil, err
}
if cat.Level == 1 {
sql += " AND t1.category_id IN (SELECT id FROM sku_category WHERE parent_id = ?)"
} else {
sql += " AND t1.category_id = ?"
}
sqlParams = append(sqlParams, cat.ID)
}
if params["jdID"] != nil {
sql += " AND t1.jd_id = ?"
sqlParams = append(sqlParams, params["jdID"].(int))
}
if params["name"] != nil {
sql += " AND t1.name LIKE ?"
sqlParams = append(sqlParams, "%"+params["name"].(string)+"%")
}
if params["prefix"] != nil {
sql += " AND t1.prefix LIKE ?"
sqlParams = append(sqlParams, "%"+params["prefix"].(string)+"%")
}
if params["unit"] != nil {
sql += " AND t1.unit = ?"
sqlParams = append(sqlParams, params["unit"].(string))
}
if params["skuID"] != nil {
sql += " AND t2.id = ?"
sqlParams = append(sqlParams, params["skuID"].(int))
}
if params["fromStatus"] != nil {
fromStatus := params["fromStatus"].(int)
toStatus := fromStatus
if params["toStatus"] != nil {
toStatus = params["toStatus"].(int)
}
sql += " AND t2.status >= ? AND t2.status <= ? AND t2.status >= ? AND t2.status <= ?"
sqlParams = append(sqlParams, fromStatus, toStatus, fromStatus, toStatus)
}
sql += `
GROUP BY
t1.id,
t1.created_at,
t1.updated_at,
t1.last_operator,
t1.deleted_at,
t1.prefix,
t1.name,
t1.comment,
t1.brand_id,
t1.category_id,
t1.is_global,
t1.unit,
t1.price,
t1.img,
t1.elm_img_hash_code
`
sqlData := `
SELECT
SQL_CALC_FOUND_ROWS
t1.id,
t1.created_at,
t1.updated_at,
t1.last_operator,
t1.deleted_at,
t1.prefix,
t1.name,
t1.comment,
t1.brand_id,
t1.category_id,
t1.is_global,
t1.unit,
t1.price,
t1.img,
t1.elm_img_hash_code,
CONCAT("[", GROUP_CONCAT(DISTINCT CONCAT('{"id":', t2.id, ',"status":', t2.status, ',"createdAt":"', CONCAT(REPLACE(t2.created_at," ","T"),"+08:00"), '","updatedAt":"', CONCAT(REPLACE(t2.updated_at," ","T"),"+08:00"), '","lastOperator":"', t2.last_operator, '","specQuality":', t2.spec_quality, ',"specUnit":"', t2.spec_unit, '","weight":', t2.weight, ',"jdID":', t2.jd_id, ',"categoryID":', t2.category_id, ',"nameID":', t2.name_id, ',"subStoreID":', t4.sub_store_id, ',"price":', t4.price, ',"storeSkuStatus":', t4.status, "}")), "]") skus_str
` + sql + `
ORDER BY t1.id
LIMIT ? OFFSET ?`
if pageSize == 0 {
pageSize = model.DefPageSize
}
if offset < 0 {
offset = 0
}
sqlParams = append(sqlParams, pageSize, offset)
skuNamesInfo = &StoreSkuNamesInfo{}
// globals.SugarLogger.Debug(sqlData)
if err = dao.GetRows(db, &skuNamesInfo.SkuNames, sqlData, sqlParams...); err == nil {
countInfo := &struct{ Ct int }{}
if err = dao.GetRow(db, countInfo, "SELECT FOUND_ROWS() ct"); err == nil {
skuNamesInfo.TotalCount = countInfo.Ct
for _, skuName := range skuNamesInfo.SkuNames {
if skuName.SkusStr != "" {
if err = utils.UnmarshalUseNumber([]byte(skuName.SkusStr), &skuName.Skus); err != nil {
break
}
}
}
}
}
return skuNamesInfo, err
}
func UpdateStoreSku(storeID int, skuBinds []*StoreSkuBindInfo, userName string) (num int64, err error) {
db := dao.GetDB()
var existBinds []*model.StoreSkuBind
skuIDs := make([]int, len(skuBinds))
placeHolders := make([]string, len(skuBinds))
for k, v := range skuBinds {
skuIDs[k] = v.SkuID
placeHolders[k] = "?"
}
questions := "(" + strings.Join(placeHolders, ",") + ")"
if err = dao.GetRows(db, &existBinds, `
SELECT *
FROM store_sku_bind
WHERE store_id = ?
AND sku_id IN `+questions, storeID, skuIDs); err == nil {
existBindsMap := make(map[int]*model.StoreSkuBind, len(existBinds))
for _, v := range existBinds {
existBindsMap[v.SkuID] = v
}
dao.Begin(db)
for _, v := range skuBinds {
skuBind, ok := existBindsMap[v.SkuID]
if !ok {
if v.IsFocus == 1 {
skuBind = &model.StoreSkuBind{
StoreID: storeID,
SkuID: v.SkuID,
SubStoreID: v.SubStoreID, // todo 这个应该从用户信息中自动获得
}
dao.WrapAddIDCULDEntity(skuBind, userName)
}
} else {
if v.IsFocus != -1 {
dao.WrapUpdateULEntity(skuBind, userName)
}
}
if skuBind != nil {
if v.Price != 0 {
skuBind.Price = v.Price
}
if v.IsSale != 0 {
if v.IsSale == 1 {
skuBind.Status = model.StoreSkuBindStatusNormal
} else {
skuBind.Status = model.StoreSkuBindStatusDontSale
}
}
if ok {
if v.IsFocus == -1 {
_, err = dao.DeleteEntityLogically(db, skuBind, nil, userName, map[string]interface{}{
model.FieldJdSyncStatus: model.SyncFlagDeletedMask,
model.FieldElmSyncStatus: model.SyncFlagDeletedMask,
model.FieldEbaiSyncStatus: model.SyncFlagDeletedMask,
})
} else {
skuBind.DeletedAt = utils.DefaultTimeValue
skuBind.JdSyncStatus = model.SyncFlagModifiedMask
skuBind.ElmSyncStatus = model.SyncFlagModifiedMask
skuBind.EbaiSyncStatus = model.SyncFlagModifiedMask
_, err = dao.UpdateEntity(db, skuBind)
}
} else {
skuBind.JdSyncStatus = model.SyncFlagNewMask
skuBind.ElmSyncStatus = model.SyncFlagNewMask
skuBind.EbaiSyncStatus = model.SyncFlagNewMask
err = dao.CreateEntity(db, skuBind)
}
}
if err != nil {
dao.Rollback(db)
return num, err
}
}
dao.Commit(db)
err = CurVendorSync.SyncStoreSku(db, storeID, -1, false, userName)
}
return num, err
}