今天主要参与了低碳调度结果分析模块中两个需求的开发:一个是补充平均节点价格的计算逻辑,另一个是调整节点价格分析和节点列表查询相关接口。整体感受是,很多后端需求本身并不难写,真正的难点往往在于理解业务数据从哪里来、表和表之间怎么关联,以及不同指标的计算口径是什么。
一、补充平均节点价格计算逻辑
上午到公司后,我先继续写昨天没有完成的需求:补充平均节点价格的计算逻辑。
一开始卡住的原因不是 Java 语法,也不是 MyBatis-Plus 查询怎么写,而是不清楚这个指标应该依赖哪些数据。比如节点价格来自算法结果,平均价格又不能简单地对所有节点价格取平均,而是需要结合对应设备的负荷权重来计算。
后来组长过来把相关表、字段和整体计算链路给我讲了一遍,我才真正理解这个需求的核心:
平均节点价格不是简单平均,而是按负荷进行加权平均。
抽象后的计算逻辑可以理解为:
平均节点价格 = Σ(节点价格 × 修正后负荷) / Σ(修正后负荷)
实现时我主要做了几件事:
- 查询指定方案、日期范围下的设备节点价格数据;
- 按日期对价格曲线进行分组,方便后续逐日逐点计算;
- 查询负荷预测数据,作为加权平均的权重;
- 根据设备是否为固定负荷,决定是否应用负荷修正系数;
- 对缺失数据、空曲线、除数为 0 等情况做兜底处理;
- 最终返回平均节点价格、最高节点价格、最低节点价格,并保证图表数据和顶部指标卡口径一致。
这个需求让我比较有收获的一点是:后端计算类接口不能只关注"查出来再返回",还要非常关注指标口径。尤其是涉及电价、负荷、曲线、时间点这类数据时,一个字段理解错,最后结果就会整体偏掉。
二、调整节点价格分析接口
下午组长又让我改一个节点价格分析接口。
原来的接口会先根据前端传入的设备 ID,再去关联拓扑映射关系,查询出对应的节点 ID 列表。现在前端传参已经调整,参数里直接传的就是节点 ID 列表,所以后端不再需要走原来的映射逻辑。
这个改动相对比较清晰,我主要做的是:
- 删除原来不再需要的拓扑映射查询;
- 直接使用请求参数中的节点 ID 列表;
- 保留原来的节点价格、阻塞价格、能量价格曲线计算逻辑;
- 对节点列表为空的情况返回固定长度的空曲线,避免前端展示异常。
这个需求提醒我,接口逻辑不是越复杂越好。当上下游约定变化后,后端要及时收敛不必要的查询链路,让接口更直接、更稳定。
三、重写节点列表查询接口
另一个接口是节点列表查询接口。这个接口的需求看起来很简单:返回设备类型为指定类型的节点 ID 和节点名称,并且支持前端传入名称进行模糊搜索。
但我一开始还是不知道怎么下手,因为我不确定节点 ID 和节点名称分别在哪些数据里,以及设备和拓扑节点之间的关系应该怎么走。后来又让组长帮我梳理了一遍,明确数据来源之后,我就把接口重新实现了一版。
整体思路是:
- 先根据设备类型查询设备与拓扑节点的映射关系;
- 提取有效的节点 ID,并做去重;
- 再根据节点 ID 去查询节点基础信息;
- 如果前端传了名称关键字,则增加模糊查询条件;
- 最后封装成只包含节点 ID 和节点名称的 DTO 返回给前端。
这里我也做了一点细节处理,比如节点 ID 去重、空数据直接返回空集合、接口返回对象只暴露前端真正需要的字段。这样既减少了无用数据传输,也降低了接口暴露内部数据结构的风险。
四、今天的技术收获
今天最大的收获不是某一个 API 的用法,而是对后端业务开发流程有了更清晰的认识。
以前我会觉得"需求不会写"就是代码能力不够,但今天发现,很多时候是业务上下文没有打通。只要明确了数据来源、关联关系和计算规则,代码实现反而是比较自然的事情。
这次开发中我主要练习到了:
- 使用 MyBatis-Plus 构造条件查询;
- 使用 Stream 对数据进行分组、去重和 DTO 转换;
- 处理多日期、多时间点的曲线类数据;
- 使用 BigDecimal 做金额/价格类计算;
- 对空集合、空曲线、缺失数据进行防御式处理;
- 根据前后端参数变化,简化接口实现;
- 将业务计算逻辑拆成多个 helper 方法,提高可读性。
五、AI 工作流分享会
下午还参加了一个 AI 工作流技巧分享会。一个前端同事分享了如何通过公司内部 MCP,把 Codex 和项目管理平台连接起来,用来辅助生成需求分析文档,也介绍了一些 Claude Code 和 Codex 的使用方式。
这部分内容和我今天手上的后端需求关联不算特别强,但也让我意识到,AI 工具不只是写代码,也可以参与需求理解、文档整理和任务拆解。对实习生来说,如果能把 AI 用在"辅助理解业务"和"提高开发效率"上,应该会比单纯让它生成代码更有价值。
六、总结
今天这两个提交分别对应了平均节点价格计算逻辑的补充,以及节点列表、节点价格相关接口的调整。对我来说,这是一次比较典型的后端业务开发经历:先理解业务口径,再定位数据来源,最后用代码把计算和接口串起来。
也更加意识到,Java 后端开发不只是写 Controller、Service、DAO,更重要的是能把业务规则翻译成稳定、清晰、可维护的代码。尤其是在实习阶段,遇到不懂的表关系和字段含义时,及时向组长确认,比自己盲猜更重要。业务理解到位之后,代码才有方向。