diff --git a/backend/data/stock_data_api.go b/backend/data/stock_data_api.go index 8b178e3..130d88b 100644 --- a/backend/data/stock_data_api.go +++ b/backend/data/stock_data_api.go @@ -463,15 +463,64 @@ func (receiver StockDataApi) SetAlarmChangePercent(val, alarmPrice float64, stoc return "设置成功" } -func (receiver StockDataApi) SetStockSort(sort int64, stockCode string) { +func (receiver StockDataApi) SetStockSort(newSort int64, stockCode string) { if strutil.HasPrefixAny(stockCode, []string{"gb_"}) { stockCode = strings.ToLower(stockCode) stockCode = strings.Replace(stockCode, "gb_", "us", 1) } - err := db.Dao.Model(&FollowedStock{}).Where("stock_code = ?", strings.ToLower(stockCode)).Update("sort", sort).Error - if err != nil { - logger.SugaredLogger.Error(err.Error()) + + // 获取当前排序值 + var currentStock FollowedStock + if err := db.Dao.Model(&FollowedStock{}).Where("stock_code = ?", strings.ToLower(stockCode)).First(¤tStock).Error; err != nil { + logger.SugaredLogger.Error("找不到当前股票: ", err.Error()) + return } + + oldSort := currentStock.Sort + + // 如果排序值没有变化,直接返回 + if oldSort == newSort { + return + } + // 检查新排序位置是否被占用 + var count int64 + if err := db.Dao.Model(&FollowedStock{}).Where("sort = ?", newSort).Count(&count).Error; err != nil { + logger.SugaredLogger.Error("检查新排序位置被占用失败: ", err.Error()) + return + } + if count == 0 { + // 新位置未被占用,直接更新当前记录 + if err := db.Dao.Model(&FollowedStock{}). + Where("stock_code = ?", strings.ToLower(stockCode)). + Update("sort", newSort).Error; err != nil { + logger.SugaredLogger.Error("更新排序位置失败: ", err.Error()) + } + } else { + // 新位置已被占用,需要移动其他记录 + if newSort < oldSort { + // 向前移动:将中间记录向后移动 + if err := db.Dao.Model(&FollowedStock{}). + Where("sort >= ? AND sort < ?", newSort, oldSort). + Update("sort", gorm.Expr("sort + 1")).Error; err != nil { + logger.SugaredLogger.Error("向前排序更新失败: ", err.Error()) + } + } else { + // 向后移动:将中间记录向前移动 + if err := db.Dao.Model(&FollowedStock{}). + Where("sort > ? AND sort <= ?", oldSort, newSort). + Update("sort", gorm.Expr("sort - 1")).Error; err != nil { + logger.SugaredLogger.Error("向后排序更新失败: ", err.Error()) + } + } + + // 更新目标记录的排序 + if err := db.Dao.Model(&FollowedStock{}). + Where("stock_code = ?", strings.ToLower(stockCode)). + Update("sort", newSort).Error; err != nil { + logger.SugaredLogger.Error("更新股票排序失败: ", err.Error()) + } + } + } func (receiver StockDataApi) SetStockAICron(cron string, stockCode string) { if strutil.HasPrefixAny(stockCode, []string{"gb_"}) { diff --git a/frontend/src/components/stock.vue b/frontend/src/components/stock.vue index 379b9cc..e231977 100644 --- a/frontend/src/components/stock.vue +++ b/frontend/src/components/stock.vue @@ -151,7 +151,6 @@ const danmakuColor = computed(()=> { const icon = ref('https://raw.githubusercontent.com/ArvinLovegood/go-stock/master/build/appicon.png'); const sortedResults = computed(() => { - ////console.log("computed",sortedResults.value) const sortedKeys =keys(results.value).sort(); ////console.log("sortedKeys",sortedKeys) const sortedObject = {}; @@ -226,7 +225,7 @@ onMounted(() => { GetFollowList(currentGroupId.value).then(result => { - followList.value = result + followList.value = result for (const followedStock of result) { if(followedStock.StockCode.startsWith("us")){ followedStock.StockCode="gb_"+ followedStock.StockCode.replace("us", "").toLowerCase() @@ -586,14 +585,16 @@ async function updateData(result) { } } - //result.key=result.sort + // result.key=result.sort + results.value = Object.fromEntries( + Object.entries(results.value).filter( + ([key]) => !key.includes(result["股票代码"]) + )); result.key=GetSortKey(result.sort,result["股票代码"]) results.value[GetSortKey(result.sort,result["股票代码"])]=result if(!stocks.value.includes(result["股票代码"])) { delete results.value[result.key] } - - ////console.log("updateData",result) } @@ -1293,6 +1294,7 @@ function updateCostPriceAndVolumeNew(code,price,volume,alarm,formModel){ message.success(result) GetFollowList(currentGroupId.value).then(result => { followList.value = result + stocks.value=[] for (const followedStock of result) { if (!stocks.value.includes(followedStock.StockCode)) { stocks.value.push(followedStock.StockCode)