股票池发布功能设计


date: 2026-06-02 updated: 2026-06-02 conversation_id: d1cea354-05d1-4f15-87f2-200977731d81 title: "股票池发布功能设计" tags: [deepseek, conversation] ---

股票池发布功能设计

创建时间: 2026-06-02 13:35

👤 用户:

以下为需求文档关于股票池的部分,帮我写发布部分的内容

在分公司管理栏中第一位新增【股票池】,股票池功能如下: 1)如下图所示,进入功能时默认展示股票池列表,固定显示两个股票池。列表显示股票池名称、平均收益率、总收益率、胜率、操作(股票池、已清仓股票),计算逻辑如下: a.股票收益率:(入股池时的【入选价格】/删除时的【价格】*100 -100)% b.平均收益率:(已清仓股票收益率+当前股票收益率)/所有股票数量 c.总收益率:已清仓股票收益率+当前股票收益率 d.胜率:当前盈利>0的股票总数/当日入池股票总数

2)点击上图的股票池则进入下图的股票池详情,

3)在【添加股票】与【发布】按钮中间,新增日期选择框,选择不同日期,对应不同股票池。 4)点击【添加股票】,出现下图所示弹窗,支持股票代码与股票名称查询。支持多选,点击确定则将选中股票加入到股票列表中,调仓时间默认为当前时间。

5)点击【发布】,则将当前股票列表更新至数据库,如果为新增股票,则正常保存,如果为删除股票,则记录删除时的价格为【删除价格】,

6)默认展示下图为未编辑状态的股票列表,默认展示日期为当天。列表字段有股票代码、股票名称、入选日期、调仓时间、入选价格、现价、收益、止盈区间、止损区间、入选理由、发布状态、操作(编辑/删除、保存/取消)。

7)点击编辑时,为如下状态,其中,调仓时间、止盈区间、止跌区间、入选理由可以编辑。 a.止盈区间支持填入止盈最低价与止盈最高价,如果止盈最低价大于止盈最高价,则止盈最低价与止盈最高价的填入框显示红色,点击保存时,弹窗提醒“止盈最低价大于止盈最高价,请修改”,如果止盈最低价或止盈最高价小于入选价格,则填入框显示红色,点击保存时,弹窗提醒“止盈价格小于入选价格,请修改”。 b.止跌区间支持填入止跌最低价与止跌最高价,如果止跌最低价大于止跌最高价,则止跌最低价与止跌最高价的填入框显示红色,点击保存时,弹窗提醒“止跌最低价大于止跌最高价,请修改”,如果止跌最低价或止跌最高价大于入选价格,则填入框显示红色,点击保存时,弹窗提醒“止跌价格大于入选价格,请修改”。 c.入选价格为该股票对应日期,对应交易时刻的价格 d.收益为(当日最新价/入选价格*100 -100)%


💭 思考过程

我们需要根据需求文档中关于股票池部分,来帮助写“发布部分的内容”。具体理解:可能是一个开发任务中关于“股票池”功能中“发布”按钮相关的后端逻辑或API接口设计、前端发布功能描述等?需求原文:“帮我写发布部分的内容”。结合上下文,该需求文档描述了股票池功能的各项特性,其中第5)点提到:“点击【发布】,则将当前股票列表更新至数据库,如果为新增股票,则正常保存,如果为删除股票,则记录删除时的价格为【删除价格】”。还有第6)点展示未编辑状态的股票列表等。我们需要重点围绕“发布”功能,详细设计其逻辑、实现步骤、涉及的数据表字段、处理规则、注意事项等。可能是一个开发人员要求写“发布部分”的技术设计文档或实现说明。因为我作为AI,需要输出对发布部分内容的详细描述,包括业务逻辑、前后端交互、数据库操作、异常处理等。

进一步分析:需求场景类似于股票池管理后台,管理员可以编辑当前股票池(添加股票、修改股票参数、删除股票),点击“发布”后将编辑后的股票列表持久化,并记录相关价格信息(例如删除时记录删除价格)。另外需要考虑已清仓股票的收益率计算逻辑。发布部分内容应该包括:前端点击发布时调用接口,传递当前股票池ID和当前股票列表(包含每只股票的操作类型:新增、修改、删除?注意,需求中提到“如果为新增股票,则正常保存,如果为删除股票,则记录删除时的价格为删除价格”。而对于修改操作(例如编辑止盈止损区间、入选理由等),也应该保存修改。另外需要管理股票池的版本/快照?由于有日期选择框,不同日期对应不同股票池内容,所以发布时可能是针对某一日期的股票池内容进行更新?需求里面提到“默认展示日期为当天”,发布时更新该日期的股票池列表。具体需要理清:日期选择框选择不同日期,显示对应的历史发布版本的股票列表?还是说不同日期表示股票池配置的生效日期?需求描述:在【添加股票】与【发布】按钮中间,新增日期选择框,选择不同日期,对应不同股票池。说明股票池内容是按日期版本化的。所以发布时,应该针对选中的日期,将当前股票列表保存为该日期的股票池内容。若该日期原有股票列表,需要对比本次发布相对于原有列表的差异,处理新增和删除股票,同时对于修改的股票更新相关信息。需求中第5点“点击发布,则将当前股票列表更新至数据库,如果为新增股票,则正常保存,如果为删除股票,则记录删除时的价格为删除价格”。这里隐含逻辑:前端在未编辑状态下显示当前日期的股票列表,经过用户添加/删除/编辑后,点击发布,提交当前完整的股票列表。后端对比数据库里该日期的已有股票列表,确定哪些是新增(原无此股票),哪些是删除(原有此股票但当前列表中无),哪些是修改(现有且存在但字段有变化)。对于删除的股票,需要记录删除时的价格(当前最新价格?或者当时的价格?需求中说“记录删除时的价格为【删除价格】”,可能是记录该股票的现价(最新价)作为删除价格,用于计算已清仓股票的收益率((删除价格/入选价格 *100-100)%)。并且删除的股票应移入已清仓股票列表?或者标记为已清仓。另外还支持股票池列表里的平均收益率、总收益率、胜率计算需要基于当前持有股票和已清仓股票(删除的股票变为已清仓),所以发布时对删除股票,应将之标记为已清仓,并记录清仓价格(删除价格)和清仓日期。还需要处理股票收益率的更新逻辑:对于当前持有的股票,需要根据每日最新价计算浮动收益,但在发布时可能只是调整持仓的编辑。对于发布功能整体,要理解成:用户编辑完某日期的股票池配置(包含股票及其止盈止损区间、入选理由等),点击发布后保存该配置,并根据调仓变更记录管理股票持仓历史以及已清仓股票。

鉴于客户需要“帮我写发布部分的内容”,可以输出为面向开发的说明文档,包括:1.发布功能概述;2.接口设计(请求参数、响应);3.后端处理流程(对比差异、处理新增、修改、删除逻辑);4.数据库表结构设计示例;5.特殊说明(删除价格获取、入选价格如何确定、收益率计算数据更新等);6.错误处理和事务要求等。同时考虑前端发布时传递的数据结构。由于需求文档中还涉及止盈止损区间校验、编辑时保存校验等,但发布时应该已经在前端编辑保存(每一行编辑时有保存/取消)?实际上从需求来看,股票列表每一行有编辑/删除和保存/取消按钮,类似于行内编辑,用户修改单行后点击保存,才会暂存修改;点击发布是将所有暂存的修改(包括增删改)一次性提交到数据库。也可能采取全局发布模式,用户在界面上添加股票、修改股票数据(通过编辑弹窗或者行内编辑保存后),这些变化在前端状态维护,最终点击发布批量提交。为确保可靠,采用完整列表提交方式。因此发布部分内容要描述清楚后端如何进行原子性更新,并记录清仓记录。

考虑到用户给出的需求点中,股票池列表还涉及平均收益率、总收益率、胜率等计算,这些计算需要通过历史交易数据和当前持仓数据实时计算,发布时也会影响这些指标(例如删除股票变为已清仓会影响平均收益率和总收益率、胜率)。因此发布时除了保存当天的股票列表,还需要更新已清仓股票记录及相关统计,但是统计指标一般由查询时动态计算,所以发布更新持仓数据和清仓记录后,查询时根据最新数据计算即可。

我作为AI,需要输出一个完整、清晰、可执行的“发布部分的内容”说明,最好包含伪代码或步骤,以及数据库字段设计。另外对于新增股票,要求保存入选价格,入选价格应该是该股票在入选日期对应交易时刻的价格(需求中第7.c条:入选价格为该股票对应日期,对应交易时刻的价格)。通常入选日期就是加入股票池的日期(也可能是调仓时间?)。需求第4点提到点击添加股票,调仓时间默认为当前时间。入选日期可以取调仓时间对应的日期。至于入选价格,应该根据股票代码和入选日期从行情数据服务获取该日(可能具体到时刻,但一般按收盘价或特定时间价格)。不过对于发布部分,入选价格需要前端传递还是在后端获取?由于用户添加股票时可能是实时选择,入选价格需要基于当前日期(默认当天入选价格),但需求描述:入选价格为该股票对应日期,对应交易时刻的价格。实现时可以在添加股票时后端获取当前最新价格作为入选价格,或者前端填入?为了保证准确性,发布时后端可根据股票代码和入选日期(从调仓时间提取)获取对应交易日收盘价或最新价作为入选价格。为了简化,最好在添加股票时,后端返回入选价格并保存。如果在发布时前端传递入选价格可能被篡改,需求文档没有严格要求,但为了数据准确,建议后端根据调仓时间和股票代码获取当日当时价格作为入选价格(例如最新价)。如果非交易日,取最近交易日价格。所以发布时,对于新增的股票,后端需要确定入选价格,并保存;对于修改股票,入选价格不变;删除股票,记录删除价格(发布时当前最新价,或者根据删除操作时当前现价?可能删除时采用提交发布时的现价。最好发布时后端获取每个删除股票的当日最新价作为删除价格记录到清仓记录中。

此外,考虑到止盈止损区间编辑等需求,发布时需要校验止盈止损与入选价格的关系,需求文档中编辑时有校验,但发布时也应该再次校验,防止绕过前端校验。

综上,撰写“发布部分的内容”,应包含以下主题:发布功能业务描述、前端调用方式、后端流程、数据库表设计、差异对比逻辑、清仓处理规则、价格获取规则、事务及并发处理、错误提示。并以markdown格式输出,语言专业且详细。

还需注意需求里固定显示两个股票池(列表显示两个固定股票池),发布时针对哪个股票池?由当前所在分公司管理下股票池详情页发布,股票池有唯一标识。故还需考虑股票池ID。

确定写作思路。

以下是根据需求文档撰写的【股票池】功能中“发布”部分的完整内容,涵盖前端调用、后端处理逻辑、数据库设计、差异对比、价格处理及异常机制等,可直接用于开发参考。


发布功能详细设计

1. 功能概述

用户在股票池详情页完成 添加股票编辑股票信息(止盈区间、止损区间、调仓时间、入选理由)、删除股票 等操作后,点击 【发布】 按钮,将当前日期(或日期选择框所选日期)下的股票列表持久化到数据库。 发布时需识别本次变更相对于数据库中已有数据的差异:

  • 新增股票:正常保存股票信息,并记录入选价格(基于入选日期从行情服务获取)。
  • 删除股票:记录该股票的 删除价格(发布时的最新价),将其移入“已清仓股票”记录,不再属于当前持仓。
  • 修改股票:更新止盈区间、止损区间、调仓时间、入选理由等字段。

发布完成后,前端刷新股票列表并展示最新的持仓数据,同时重新计算股票池的平均收益率、总收益率、胜率等指标。

2. 前置条件

  • 用户已进入某股票池的详情页(固定两个股票池之一,带有唯一 pool_id)。
  • 日期选择框已选中某个日期 target_date(默认为当天)。
  • 前端当前展示的股票列表(包含增删改后的完整列表)已经过前端基本校验(如止盈止损与入选价格的关系、止盈最低价 ≤ 最高价等)。
  • 后端需具备获取股票实时价格或历史交易日收盘价的行情接口。

3. 接口定义

3.1 请求信息

  • URLPOST /api/stockpool/{poolid}/publish
  • Content-Typeapplication/json
  • 请求体示例
{
  "targetDate": "2026-06-02",
  "stocks": [
    {
      "stockCode": "000001",
      "stockName": "平安银行",
      "adjustTime": "2026-06-02 10:30:00",
      "stopProfitMin": 15.20,
      "stopProfitMax": 16.80,
      "stopLossMin": 12.50,
      "stopLossMax": 13.20,
      "reason": "技术形态突破"
    },
    {
      "stockCode": "600036",
      "stockName": "招商银行",
      "adjustTime": "2026-06-01 14:00:00",
      "stopProfitMin": 38.00,
      "stopProfitMax": 42.00,
      "stopLossMin": 32.00,
      "stopLossMax": 33.50,
      "reason": "业绩预增"
    }
  ]
}
  • 字段说明
  • targetDate:发布的日期,与日期选择框所选日期一致。
  • stocks:当前详情页中所有的股票列表(完整列表,用于和数据库存量对比)。

注:删除操作不需要单独标记,后端通过对比存量与本次提交的 stockCode 集合即可识别删除项。

3.2 响应信息

  • 成功HTTP 200
{
  "code": 0,
  "message": "发布成功",
  "data": {
    "addedCount": 1,
    "modifiedCount": 2,
    "deletedCount": 1
  }
}
  • 失败HTTP 400500
{
  "code": 40001,
  "message": "止盈最低价大于止盈最高价,请修改",
  "details": [ { "stockCode": "000001", "field": "stopProfitMin" } ]
}

4. 后端处理流程

4.1 整体步骤

  1. 校验参数:验证 pool_idtargetDate 有效性;stocks 列表不能为 null(允许空列表,表示清空该日期的股票池)。
  2. 获取存量数据:从数据库查询该股票池(pool_id)在 targetDate 下的现有股票列表(未清仓的持仓记录)。
  3. 分类对比
  • stockCode 为唯一键,对比本次提交的 stocks 与存量数据,分为 新增修改删除 三类。
  • 修改的判断标准:相同股票代码下,止盈区间、止损区间、调仓时间、入选理由任一字段发生变化。
  1. 价格处理
  • 新增股票:根据每只股票的 adjustTime(若未提供则用 targetDate 收盘时间),调用行情服务获取该时刻的价格,作为 入选价格 保存。
  • 删除股票:对于存量中有、提交列表中无的股票,获取发布时刻的最新价(或 targetDate 收盘价)作为 删除价格,并记录清仓信息。
  • 修改股票:入选价格不变,只更新可编辑字段。
  1. 持久化操作(使用数据库事务):
  • 插入新增股票记录到 stockpooldetail 表,状态为 holding
  • 更新修改股票记录。
  • 对删除股票:将原记录状态更新为 closed(已清仓),同时写入 closedprice(删除价格)、closedat(当前时间),并插入一条清仓记录到 closedstockrecord 表。
  1. 触发重算(可选):异步更新该股票池在 targetDate 下的平均收益率、总收益率、胜率等统计缓存,或下次查询时实时计算。
  2. 返回结果

4.2 差异对比伪代码

def publish_stock_pool(pool_id, target_date, submitted_stocks):
    # 1. 获取存量
    existing = db.query(
        "SELECT * FROM stock_pool_detail WHERE pool_id = ? AND target_date = ? AND status = 'holding'",
        pool_id, target_date
    )
    existing_map = {s.stock_code: s for s in existing}
    submitted_map = {s.stock_code: s for s in submitted_stocks}

    # 2. 分类
    added_codes = set(submitted_map.keys()) - set(existing_map.keys())
    deleted_codes = set(existing_map.keys()) - set(submitted_map.keys())
    # 修改 = 共同code 且 字段值不同
    modified_codes = []
    for code in (set(existing_map.keys()) & set(submitted_map.keys())):
        if fields_changed(existing_map[code], submitted_map[code]):
            modified_codes.append(code)

    # 3. 处理新增(获取入选价格)
    for code in added_codes:
        stock = submitted_map[code]
        entry_price = get_price_at_time(stock.stock_code, stock.adjust_time)
        insert_holding_record(pool_id, target_date, stock, entry_price)

    # 4. 处理删除(记录删除价格)
    for code in deleted_codes:
        stock = existing_map[code]
        delete_price = get_current_price(stock.stock_code)  # 或 target_date收盘价
        mark_as_closed(stock.id, delete_price)

    # 5. 处理修改
    for code in modified_codes:
        update_holding_record(existing_map[code].id, submitted_map[code])

    commit()

5. 数据库表设计(关键字段)

5.1 股票池持仓明细表 stockpooldetail

字段名类型说明
idbigint主键
pool_idvarchar(32)股票池标识(固定两个之一)
target_datedate该记录对应的日期(与日期选择框联动)
stock_codevarchar(16)股票代码
stock_namevarchar(64)股票名称
entry_datedate入选日期(取自 adjust_time 的日期部分)
adjust_timedatetime调仓时间(用户可编辑)
entry_pricedecimal(10,4)入选价格(由后端根据 adjust_time 获取)
stopprofitmindecimal(10,4)止盈最低价
stopprofitmaxdecimal(10,4)止盈最高价
stoplossmindecimal(10,4)止损最低价
stoplossmaxdecimal(10,4)止损最高价
reasontext入选理由
statusvarchar(16)holding / closed
closed_pricedecimal(10,4)删除价格(仅当 status=closed 时有值)
closed_atdatetime清仓时间
create_timedatetime创建时间
update_timedatetime更新时间

注:targetdate + poolid + stock_code 应建立唯一索引(但同一股票在不同日期可重复出现,表示不同批次的调仓)。

5.2 已清仓记录表 closedstockrecord(可选,用于历史追溯)

字段名类型说明
idbigint主键
pool_idvarchar(32)股票池ID
stock_codevarchar(16)股票代码
entry_pricedecimal(10,4)入选价格
closed_pricedecimal(10,4)删除价格(清仓价)
closed_datedate清仓日期
return_ratedecimal(10,4)收益率 (closedprice/entryprice -1)
......其他冗余字段(名称、调仓时间等)

当发布删除股票时,同时向 closedstockrecord 插入一条记录,以便计算历史总收益率。

6. 关键规则说明

6.1 入选价格的确定

  • 调用行情服务(如 tushare、万得、自建行情库),根据股票代码 stockcodeadjusttime(精确到分钟)获取对应时刻价格。
  • adjust_time 为非交易日或非交易时段,则取最近的交易时段价格(例如前一交易日收盘价或当日开盘价)。
  • 若获取失败,发布应中断并提示“获取入选价格失败,请稍后重试”。

6.2 删除价格的确定

  • 点击发布时,对于被删除的股票,取发布时刻的最新价(实时行情)作为删除价格。
  • 若最新价不可用(如停牌),则取 target_date 的收盘价。若仍无,则取最近一个有交易的价格并记录 warning 日志。

6.3 编辑校验的二次保障

虽然前端在编辑行内有校验,但发布时后端仍需进行最终校验:

  • 对每一只股票(包括新增和修改)校验:
  • stopprofitminstopprofitmax,否则返回错误。
  • stoplossminstoplossmax,否则返回错误。
  • stopprofitminstopprofitmax大于 entry_price(入选价格),否则提示“止盈价格小于入选价格”。
  • stoplossminstoplossmax小于 entry_price,否则提示“止损价格大于入选价格”。

6.4 事务与并发控制

  • 使用数据库事务(@Transactional),确保新增、修改、删除操作要么全部成功,要么全部回滚。
  • 在事务开始前,对 stockpooldetail 表加 行级锁SELECT ... FOR UPDATE)或乐观锁(版本号),防止两个管理员同时发布同一日期的股票池导致数据错乱。

6.5 与统计指标的联动

发布操作完成后,不会立即重算股票池列表的总收益率、平均收益率等,因为这些指标通常在查询列表进入详情页时动态计算:

  • 总收益率 = 所有已清仓股票收益率之和 + 当前持仓股票浮动收益率之和

(浮动收益率 = (最新价 / 入选价格) × 100 - 100)

  • 平均收益率 = 总收益率 / (已清仓股票数量 + 当前持仓股票数量)
  • 胜率 = (当前浮动盈利 > 0 的股票数量) / 当日入池股票总数(指该日期下所有持仓股票数,不含已清仓)

发布后,通过前端刷新重新调用列表接口获取最新计算值即可。

7. 异常处理与错误码

错误码说明处理方式
40001止盈最低价大于止盈最高价返回具体股票代码及字段,提示用户修改
40002止盈价格小于入选价格同上
40003止损最低价大于止损最高价同上
40004止损价格大于入选价格同上
40005行情服务不可用,获取入选价格失败提示稍后重试
40900并发发布冲突,数据已被他人修改提示刷新后重新发布
50000数据库操作异常回滚事务,记录日志

8. 前端调用注意事项

  • 点击【发布】前,应确保当前页面所有的行内编辑(保存/取消)已完成,即所有变更已统一到 stocks 数组中。
  • 如果当前日期选择框的日期 不是当天,发布时应弹窗二次确认:“你正在修改历史日期的股票池,是否继续?”(需求未明确,但建议增加以避免误操作)。
  • 发布过程中显示 loading 遮罩,禁止重复点击;发布成功后刷新列表,并提示“发布成功”。

9. 示例时序图(简略)

前端                    后端                    行情服务
 |                       |                         |
 |-- 点击发布,提交完整列表 -->|                         |
 |                       |-- 查询存量数据 ---------->|
 |                       |                         |
 |                       |-- 对比差异,分类处理 ------>|
 |                       |                         |
 |                       |-- 获取新增股票的入选价 ---->|
 |                       |<-- 返回价格 --------------|
 |                       |                         |
 |                       |-- 获取删除股票的删除价 ---->|
 |                       |<-- 返回价格 --------------|
 |                       |                         |
 |                       |-- 开启事务,保存数据 ------>|
 |                       |                         |
 |<-- 返回发布结果 -------|                         |
 |                       |                         |

以上即为股票池【发布】功能的完整设计,可直接交付开发实现。