迭代16: 交易关联驱动持仓份额动态调整(R-018)

This commit is contained in:
2026-09-08 11:09:05 +08:00
parent 22ec732607
commit 1223e2e74b
25 changed files with 1659 additions and 405 deletions
+24 -3
View File
@@ -2,24 +2,45 @@
* 服务端 API:持仓域(从 api.js 拆分,2026-08-31
*
* 端点:
* positions → 全量持仓
* positions → 全量持仓
* positions/orphan-hints → R-018 漏关联软提示:账本活动行 ∩ QMT 快照缺失的 code(只读,不动账本)
*/
/** 持仓端点方法表 */
export const POSITION_METHODS = new Set([
'positions',
'positions/orphan-hints',
]);
/**
* 处理持仓端点
* @param {string} method
* @param {object} args
* @param {object} runtime { manager }
* @param {object} runtime { manager, storage, positionSync }
*/
export async function handlePosition(method, args, { manager }) {
export async function handlePosition(method, args, { manager, storage, positionSync }) {
switch (method) {
case 'positions':
return await manager.getAllPositions();
case 'positions/orphan-hints': {
// R-018 T3:漏关联软提示。账本有活动行(closed/void 双空)但 QMT 快照无此 code → 提示去关联/移出。
// 只读不写(同步机制与账本分界:软提示不自动改账本)。
const snapshot = positionSync && Array.isArray(positionSync.getSnapshot())
? positionSync.getSnapshot()
: null;
if (!storage) return [];
const holdings = await storage.getCurrentHoldings(); // 全策略当前活动持仓
if (!snapshot) return []; // 快照不可用(从未同步/未注入)→ 不提示(避免误报)
const snapshotCodes = new Set(snapshot.map((p) => p.code).filter(Boolean));
return holdings
.filter((h) => !snapshotCodes.has(h.code))
.map((h) => ({
holdingId: h.holdingId,
strategyId: h.strategyId,
code: h.code,
shares: h.shares,
}));
}
default:
throw Object.assign(new Error('unknown position method: ' + method), { code: 'not-found' });
}