将应用自管表的 JdbcClient 数据访问迁移为实体、Mapper、构造器查询和必要的显式 SQL。 保留 AgentScope 自管表及原有业务语义,并补充事务、查询与数据库集成测试。
51 lines
2.8 KiB
XML
51 lines
2.8 KiB
XML
<?xml version="1.0" encoding="UTF-8" ?>
|
|
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
|
"https://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
|
<mapper namespace="tech.easyflow.manuagent.mapper.ProjectPlanMapper">
|
|
|
|
<!--
|
|
版本号计算与写入保持在同一条 PostgreSQL 语句内;唯一约束继续作为并发冲突的最终保护。
|
|
-->
|
|
<select id="insertNextDraft"
|
|
resultType="tech.easyflow.manuagent.entity.ProjectPlanEntity"
|
|
affectData="true"
|
|
flushCache="true">
|
|
INSERT INTO app.project_plan(id, project_id, plan_version, status, plan_json, created_by)
|
|
SELECT
|
|
#{plan.id, typeHandler=tech.easyflow.manuagent.typehandler.UuidTypeHandler},
|
|
#{plan.projectId, typeHandler=tech.easyflow.manuagent.typehandler.UuidTypeHandler},
|
|
COALESCE(MAX(plan_version), 0) + 1,
|
|
'DRAFT',
|
|
#{plan.planJson, jdbcType=OTHER, typeHandler=tech.easyflow.manuagent.typehandler.JsonbStringTypeHandler},
|
|
#{plan.createdBy, typeHandler=tech.easyflow.manuagent.typehandler.UuidTypeHandler}
|
|
FROM app.project_plan
|
|
WHERE project_id = #{plan.projectId, typeHandler=tech.easyflow.manuagent.typehandler.UuidTypeHandler}
|
|
RETURNING id, project_id, plan_version, status, plan_json, confirmed_at, created_at
|
|
</select>
|
|
|
|
<select id="selectCurrent" resultType="tech.easyflow.manuagent.entity.ProjectPlanEntity">
|
|
SELECT id, project_id, plan_version, status, plan_json, confirmed_at, created_at
|
|
FROM app.project_plan
|
|
WHERE project_id = #{projectId, typeHandler=tech.easyflow.manuagent.typehandler.UuidTypeHandler}
|
|
ORDER BY CASE status WHEN 'CONFIRMED' THEN 0 ELSE 1 END, plan_version DESC
|
|
LIMIT 1
|
|
</select>
|
|
|
|
<!-- 条件更新和 RETURNING 在同一语句中完成,避免确认状态检查与写入之间出现竞态。 -->
|
|
<select id="confirmDraft"
|
|
resultType="tech.easyflow.manuagent.entity.ProjectPlanEntity"
|
|
affectData="true"
|
|
flushCache="true">
|
|
UPDATE app.project_plan
|
|
SET status = 'CONFIRMED',
|
|
plan_json = #{planJson, jdbcType=OTHER, typeHandler=tech.easyflow.manuagent.typehandler.JsonbStringTypeHandler},
|
|
confirmed_by = #{userId, typeHandler=tech.easyflow.manuagent.typehandler.UuidTypeHandler},
|
|
confirmed_at = CURRENT_TIMESTAMP,
|
|
updated_at = CURRENT_TIMESTAMP
|
|
WHERE id = #{planId, typeHandler=tech.easyflow.manuagent.typehandler.UuidTypeHandler}
|
|
AND project_id = #{projectId, typeHandler=tech.easyflow.manuagent.typehandler.UuidTypeHandler}
|
|
AND status = 'DRAFT'
|
|
RETURNING id, project_id, plan_version, status, plan_json, confirmed_at, created_at
|
|
</select>
|
|
</mapper>
|