修复止盈确认弹窗缺少参数导致的报错,已平仓页面按品种分组展示

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
fish
2026-07-28 09:44:42 +08:00
parent 05d0b7524f
commit 50328f49ce
2 changed files with 43 additions and 10 deletions
+14 -5
View File
@@ -65,14 +65,14 @@
onclick="showMaxLocksModal({{ round.id }}, {{ round.max_locks }})">修改锁仓数</button> onclick="showMaxLocksModal({{ round.id }}, {{ round.max_locks }})">修改锁仓数</button>
<form method="post" action="/positions/{{ round.id }}/close" style="display:inline;"> <form method="post" action="/positions/{{ round.id }}/close" style="display:inline;">
<input type="hidden" name="result" value="profit_taken"> <input type="hidden" name="result" value="profit_taken">
<button class="btn" style="background:var(--success);color:#fff;font-size:0.78rem;padding:4px 14px;" onclick="confirmDelete(event, '确认 {{ round.contract_code }} 止盈清仓?', this.closest('form').action)">止盈</button> <button class="btn" style="background:var(--success);color:#fff;font-size:0.78rem;padding:4px 14px;" onclick="confirmDelete(event, '确认 {{ round.contract_code }} 止盈清仓?', this.closest('form'))">止盈</button>
</form> </form>
<form method="post" action="/positions/{{ round.id }}/close" style="display:inline;"> <form method="post" action="/positions/{{ round.id }}/close" style="display:inline;">
<input type="hidden" name="result" value="meltdown"> <input type="hidden" name="result" value="meltdown">
<button class="btn" style="background:var(--danger);color:#fff;font-size:0.78rem;padding:4px 14px;" onclick="confirmDelete(event, '确认 {{ round.contract_code }} 熔断清仓?', this.closest('form').action)">熔断</button> <button class="btn" style="background:var(--danger);color:#fff;font-size:0.78rem;padding:4px 14px;" onclick="confirmDelete(event, '确认 {{ round.contract_code }} 熔断清仓?', this.closest('form'))">熔断</button>
</form> </form>
<form method="post" action="/positions/{{ round.id }}/delete" style="display:inline;"> <form method="post" action="/positions/{{ round.id }}/delete" style="display:inline;">
<button style="background:transparent;color:#dc2626;border:1px solid #ef4444;padding:3px 10px;border-radius:4px;cursor:pointer;font-size:0.78rem;" onclick="confirmDelete(event, '确定删除 {{ round.contract_code }} 整轮数据?', this.closest('form').action)">删除</button> <button style="background:transparent;color:#dc2626;border:1px solid #ef4444;padding:3px 10px;border-radius:4px;cursor:pointer;font-size:0.78rem;" onclick="confirmDelete(event, '确定删除 {{ round.contract_code }} 整轮数据?', this.closest('form'))">删除</button>
</form> </form>
</span> </span>
</div> </div>
@@ -254,13 +254,22 @@ function filterContracts() {
</div> </div>
</div> </div>
<script> <script>
function confirmDelete(e, msg, url) { function confirmDelete(e, msg, formEl) {
e.preventDefault(); e.preventDefault();
document.getElementById('confirmMsg').textContent = msg; document.getElementById('confirmMsg').textContent = msg;
document.getElementById('confirmBtn').onclick = function() { document.getElementById('confirmBtn').onclick = function() {
var f = document.createElement('form'); var f = document.createElement('form');
f.method = 'POST'; f.method = 'POST';
f.action = url; f.action = formEl.action;
// copy hidden inputs from the original form
var inputs = formEl.querySelectorAll('input[type="hidden"]');
for (var i = 0; i < inputs.length; i++) {
var clone = document.createElement('input');
clone.type = 'hidden';
clone.name = inputs[i].name;
clone.value = inputs[i].value;
f.appendChild(clone);
}
document.body.appendChild(f); document.body.appendChild(f);
f.submit(); f.submit();
}; };
+29 -5
View File
@@ -171,14 +171,35 @@
<div class="tab-panel active"> <div class="tab-panel active">
{# ═══════════════ 已平仓 ═══════════════ #} {# ═══════════════ 已平仓 ═══════════════ #}
{% set closed_tab = request.query_params.get('tab', '全部') %}
{% set grouped_closed = {} %}
{% for t in closed_trades %}
{% set _ = grouped_closed.setdefault(t.product_code, []).append(t) %}
{% endfor %}
{% if closed_trades %} {% if closed_trades %}
<div class="section-title">已平仓 · {{ closed_trades|length }} 笔</div> <div class="section-title">已平仓 · {{ closed_trades|length }} 笔</div>
<div class="table-wrap">
<div class="sub-tabs">
<a href="/trades/?view=closed&tab=全部" class="sub-tab-btn{% if closed_tab == '全部' %} active{% endif %}">全部</a>
{% for pc in product_codes %}
{% set count = grouped_closed.get(pc, [])|length %}
<a href="/trades/?view=closed&tab={{ pc }}" class="sub-tab-btn{% if closed_tab == pc %} active{% endif %}">{{ pc }}{% if count %} · {{ count }}{% endif %}</a>
{% endfor %}
</div>
{% for pc in product_codes %}
{% if closed_tab == '全部' or closed_tab == pc %}
{% set trades = grouped_closed.get(pc, []) %}
{% if trades %}
<div class="table-wrap" style="margin-bottom:24px;">
{% if closed_tab == '全部' %}
<div class="section-title" style="font-size:0.88rem;margin-bottom:0;padding:6px 12px;">{{ pc }} · {{ trades|length }} 笔</div>
{% endif %}
<table> <table>
<tr><th>品种</th><th>合约</th><th>方向</th><th>开仓</th><th>平仓</th><th>持仓</th><th>开仓价</th><th>平仓价</th><th>开仓费</th><th>平仓费</th><th>盈亏</th><th>操作</th></tr> <tr><th>合约</th><th>方向</th><th>开仓</th><th>平仓</th><th>持仓</th><th>开仓价</th><th>平仓价</th><th>开仓费</th><th>平仓费</th><th>盈亏</th><th>操作</th></tr>
{% for t in closed_trades %} {% for t in trades %}
<tr> <tr>
<td>{{ t.product_code }}</td>
<td><strong>{{ t.contract_code.replace(t.product_code, '', 1) }}</strong></td> <td><strong>{{ t.contract_code.replace(t.product_code, '', 1) }}</strong></td>
<td> <td>
{% if t.direction == 'short' %} {% if t.direction == 'short' %}
@@ -205,7 +226,7 @@
{% endif %} {% endif %}
</td> </td>
<td> <td>
<button style="background:var(--success-bg);color:var(--success-fg);border:1px solid var(--success);padding:3px 10px;border-radius:4px;cursor:pointer;font-size:0.78rem;margin-left:8px;" <button style="background:var(--success-bg);color:var(--success-fg);border:1px solid var(--success);padding:3px 10px;border-radius:4px;cursor:pointer;font-size:0.78rem;"
onclick="showEditForm('trade', {{ t.id }}, '{{ t.product_code }}', '{{ t.contract_code }}', '{{ t.direction }}', {{ t.open_price }}, {{ t.open_fee or 0 }}, '{{ t.open_date }}', {{ t.close_price }}, {{ t.close_fee or 0 }}, '{{ t.close_date }}', '{{ t.status }}')">编辑</button> onclick="showEditForm('trade', {{ t.id }}, '{{ t.product_code }}', '{{ t.contract_code }}', '{{ t.direction }}', {{ t.open_price }}, {{ t.open_fee or 0 }}, '{{ t.open_date }}', {{ t.close_price }}, {{ t.close_fee or 0 }}, '{{ t.close_date }}', '{{ t.status }}')">编辑</button>
<form method="post" action="/trades/{{ t.id }}/delete" style="display:inline;margin-left:8px;"> <form method="post" action="/trades/{{ t.id }}/delete" style="display:inline;margin-left:8px;">
<button style="background:transparent;color:#dc2626;border:1px solid #ef4444;padding:3px 10px;border-radius:4px;cursor:pointer;font-size:0.78rem;" onclick="confirmDelete(event, '确定删除此记录?', this.closest('form').action)">删除</button> <button style="background:transparent;color:#dc2626;border:1px solid #ef4444;padding:3px 10px;border-radius:4px;cursor:pointer;font-size:0.78rem;" onclick="confirmDelete(event, '确定删除此记录?', this.closest('form').action)">删除</button>
@@ -215,6 +236,9 @@
{% endfor %} {% endfor %}
</table> </table>
</div> </div>
{% endif %}
{% endif %}
{% endfor %}
{% set ns = namespace(total_pnl=0, total_open_fee=0, total_close_fee=0) %} {% set ns = namespace(total_pnl=0, total_open_fee=0, total_close_fee=0) %}
{% for t in closed_trades %} {% for t in closed_trades %}