package cms import ( "strconv" "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"` ElmID int64 `json:"elmID"` EbaiID int64 `json:"ebaiID"` } 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 { skuID, ok := params["skuID"].(int) if ok { sql += " AND t2.id = ?" sqlParams = append(sqlParams, skuID) } else { skuIDs := params["skuID"].([]interface{}) sql += " AND t2.id IN (" + dao.GenQuestionMarks(len(skuIDs)) + ")" sqlParams = append(sqlParams, skuIDs) } } 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) dao.Begin(db) 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 } } } } } dao.Commit(db) 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)) for k, v := range skuBinds { skuIDs[k] = v.SkuID } questions := "(" + dao.GenQuestionMarks(len(skuBinds)) + ")" 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 skuBind.JdSyncStatus |= model.SyncFlagPriceMask skuBind.ElmSyncStatus |= model.SyncFlagPriceMask skuBind.EbaiSyncStatus |= model.SyncFlagPriceMask } if v.IsSale != 0 { if v.IsSale == 1 { skuBind.Status = model.StoreSkuBindStatusNormal } else { skuBind.Status = model.StoreSkuBindStatusDontSale } skuBind.JdSyncStatus |= model.SyncFlagSaleMask skuBind.ElmSyncStatus |= model.SyncFlagSaleMask skuBind.EbaiSyncStatus |= model.SyncFlagSaleMask } if ok { if v.IsFocus == -1 { num++ _, err = dao.DeleteEntityLogically(db, skuBind, nil, userName, map[string]interface{}{ model.FieldStatus: model.StoreSkuBindStatusDeleted, model.FieldJdSyncStatus: model.SyncFlagDeletedMask, model.FieldElmSyncStatus: model.SyncFlagDeletedMask, model.FieldEbaiSyncStatus: model.SyncFlagDeletedMask, }) } else { // todo 如果修改ebai与elm ID怎么处理呢? if v.IsFocus == 1 { skuBind.DeletedAt = utils.DefaultTimeValue } num++ skuBind.JdSyncStatus |= model.SyncFlagModifiedMask skuBind.ElmSyncStatus |= model.SyncFlagModifiedMask skuBind.EbaiSyncStatus |= model.SyncFlagModifiedMask _, err = dao.UpdateEntity(db, skuBind) } } else { if v.EbaiID != 0 { skuBind.EbaiID = v.EbaiID } if v.ElmID != 0 { skuBind.ElmID = v.ElmID } num++ skuBind.JdSyncStatus = model.SyncFlagNewMask skuBind.ElmSyncStatus = model.SyncFlagNewMask skuBind.EbaiSyncStatus = model.SyncFlagNewMask err = dao.CreateEntity(db, skuBind) } } if err != nil { num = 0 dao.Rollback(db) return num, err } } dao.Commit(db) err = CurVendorSync.SyncStoreSku(db, storeID, skuIDs, false, userName) } return num, err }