feat: 增加顺运宝批量 AI 规格匹配 (#202)
This commit is contained in:
@@ -6,7 +6,9 @@
|
||||
</div>
|
||||
|
||||
<div class="modal-body form-stack">
|
||||
<p><span class="status-pill">{{.StageText}}</span></p>
|
||||
<p><span class="status-pill">{{.StageText}}</span>
|
||||
{{if .MappingSourceText}}<span class="status-pill mapping-source {{.MappingSourceClass}}" title="{{.MappingSourceHelp}}">{{.MappingSourceText}}</span>{{end}}
|
||||
</p>
|
||||
<p class="hint">{{.StageHelp}}</p>
|
||||
<dl class="detail">
|
||||
<dt>明细 ID</dt><dd>{{.SybID}}</dd>
|
||||
|
||||
@@ -23,6 +23,20 @@
|
||||
|
||||
<button type="button" data-modal-open="sync-history-modal">同步记录</button>
|
||||
|
||||
<form id="syb-ai-match-form" method="post" action="/syb/ai-match" hidden>
|
||||
<input type="hidden" name="csrf_token" value="{{.CSRFToken}}">
|
||||
<input type="hidden" name="order_no" value="{{.Keyword}}">
|
||||
<input type="hidden" name="shop" value="{{.ShopFilter}}">
|
||||
<input type="hidden" name="stage" value="{{.StageFilter}}">
|
||||
<input type="hidden" name="page" value="{{.CurrentPage}}">
|
||||
<input type="hidden" name="date_from" value="{{.SyncDateFrom}}">
|
||||
<input type="hidden" name="date_to" value="{{.SyncDateTo}}">
|
||||
</form>
|
||||
<button type="button" data-modal-open="syb-ai-match-create-modal" data-ai-match-open
|
||||
data-need-checked="ai" aria-label="批量 AI 规格匹配">AI匹配</button>
|
||||
{{if .LatestAIMatchBatchURL}}<a class="button-link" href="{{.LatestAIMatchBatchURL}}"
|
||||
aria-label="查看 AI 规格匹配记录">匹配记录</a>{{end}}
|
||||
|
||||
<form id="syb-collect-form" method="post" action="/syb/collect-pdd-batch" hidden></form>
|
||||
<input type="hidden" name="csrf_token" value="{{.CSRFToken}}" form="syb-collect-form">
|
||||
<input type="hidden" name="order_no" value="{{.Keyword}}" form="syb-collect-form">
|
||||
@@ -111,6 +125,7 @@
|
||||
<th>数量</th>
|
||||
<th>价格</th>
|
||||
<th>图片</th>
|
||||
<th>匹配来源</th>
|
||||
<th>下一步</th>
|
||||
<th>更新时间</th>
|
||||
</tr>
|
||||
@@ -121,9 +136,9 @@
|
||||
<td class="col-check">
|
||||
<span title="{{.SelectionHint}}">
|
||||
<input type="checkbox" value="{{.SybID}}" name="ids"
|
||||
data-select-action="{{if .CanCollect}}collect{{else if .CanPurchase}}purchase{{end}}"
|
||||
data-select-action="{{.SelectionActions}}"
|
||||
{{if .CanCollect}}form="syb-collect-form"{{end}}
|
||||
{{if not (or .CanCollect .CanPurchase)}}disabled{{end}}
|
||||
{{if not .SelectionActions}}disabled{{end}}
|
||||
aria-label="选择货运单明细 {{.SybID}}:{{.SelectionHint}}">
|
||||
</span>
|
||||
</td>
|
||||
@@ -147,6 +162,7 @@
|
||||
</button>
|
||||
{{else}}—{{end}}
|
||||
</td>
|
||||
<td>{{if .MappingSourceText}}<span class="status-pill mapping-source {{.MappingSourceClass}}" title="{{.MappingSourceHelp}}">{{.MappingSourceText}}</span>{{else}}—{{end}}</td>
|
||||
<td>
|
||||
{{if eq .Stage "purchase_ready"}}
|
||||
<button type="button" data-modal-open="purchase-modal" data-purchase-open
|
||||
@@ -163,7 +179,7 @@
|
||||
</tr>
|
||||
{{else}}
|
||||
<tr class="empty">
|
||||
<td colspan="11">
|
||||
<td colspan="12">
|
||||
{{if .IsFiltered}}
|
||||
当前筛选条件下没有货运单明细。<br>
|
||||
<small>换个店铺、订单号或清空筛选条件再试。<a href="/syb">查看全部</a></small>
|
||||
@@ -178,6 +194,59 @@
|
||||
</table>
|
||||
</div>
|
||||
|
||||
<div class="modal-backdrop" id="syb-ai-match-create-modal" hidden>
|
||||
<div class="modal" role="dialog" aria-modal="true" aria-labelledby="syb-ai-match-create-title">
|
||||
<div class="modal-head">
|
||||
<h2 id="syb-ai-match-create-title">批量 AI 规格匹配</h2>
|
||||
<button type="button" class="modal-x" data-modal-close aria-label="关闭">×</button>
|
||||
</div>
|
||||
<div class="modal-body form-stack">
|
||||
<p>将处理已选择的 <strong data-ai-match-count>0</strong> 条顺运宝商品,单批最多 100 条。</p>
|
||||
<p class="hint">相同商品、SYB 规格和 PDD 上下文只调用一次;已有有效映射直接复用。条件不足或不确定的条目保留给人工处理。</p>
|
||||
<p class="hint">此操作只保存规格映射,不创建采集任务、采购任务,也不会触发 Client 下单。</p>
|
||||
</div>
|
||||
<div class="modal-foot">
|
||||
<button type="button" data-modal-close>取消</button>
|
||||
<button type="submit" form="syb-ai-match-form" class="primary" data-ai-match-submit>开始匹配</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{{with .AIMatchBatch}}
|
||||
<div class="modal-backdrop" id="syb-ai-match-result-modal" data-ai-match-batch
|
||||
data-ai-match-fetch-url="{{$.AIMatchBatchFetchURL}}">
|
||||
<div class="modal modal-wide ai-match-result-modal" role="dialog" aria-modal="true" aria-labelledby="syb-ai-match-result-title">
|
||||
<div class="modal-head">
|
||||
<h2 id="syb-ai-match-result-title">AI 规格匹配进度</h2>
|
||||
<button type="button" class="modal-x" data-modal-close aria-label="关闭">×</button>
|
||||
</div>
|
||||
<div class="modal-body form-stack">
|
||||
<p><strong data-ai-batch-status>{{.StatusText}}</strong> · {{.ProviderName}} / {{.Model}}</p>
|
||||
<progress data-ai-batch-progress max="{{.Total}}" value="{{.Processed}}">{{.Processed}} / {{.Total}}</progress>
|
||||
<p class="ai-match-summary" aria-live="polite">
|
||||
已处理 <strong data-ai-count="processed">{{.Processed}}</strong> / <span data-ai-count="total">{{.Total}}</span>;
|
||||
成功 <strong data-ai-count="success">{{.Success}}</strong>;复用 <strong data-ai-count="reused">{{.Reused}}</strong>;
|
||||
待人工 <strong data-ai-count="manual">{{.Manual}}</strong>;失败 <strong data-ai-count="failed">{{.Failed}}</strong>
|
||||
</p>
|
||||
<p class="missing" data-ai-batch-error {{if not .ErrorMessage}}hidden{{end}}>{{.ErrorMessage}}</p>
|
||||
<div class="table-wrap ai-match-items-wrap">
|
||||
<table>
|
||||
<thead><tr><th>明细 ID</th><th>结果</th><th>来源</th><th>置信度</th><th>原因</th></tr></thead>
|
||||
<tbody data-ai-batch-items>
|
||||
{{range .Items}}<tr><td>{{.SybID}}</td><td>{{.StatusText}}</td><td>{{if .SourceText}}{{.SourceText}}{{else}}—{{end}}</td><td>{{if .ConfidenceText}}{{.ConfidenceText}}{{else}}—{{end}}</td><td>{{.Message}}</td></tr>{{end}}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
<div class="modal-foot">
|
||||
<button type="button" data-ai-match-refresh>刷新进度</button>
|
||||
<button type="button" data-ai-match-page-refresh>刷新列表</button>
|
||||
<button type="button" data-modal-close>关闭</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{{end}}
|
||||
|
||||
<div class="modal-backdrop" id="syb-collect-modal" hidden>
|
||||
<div class="modal" role="dialog" aria-modal="true" aria-labelledby="syb-collect-modal-title">
|
||||
<div class="modal-head">
|
||||
|
||||
Reference in New Issue
Block a user