feat: 统一顺运宝日期同步并记录历史 (#59)

This commit is contained in:
chengma
2026-08-09 18:22:58 +08:00
parent ea7932db63
commit 05a54b044d
18 changed files with 934 additions and 144 deletions
+64 -39
View File
@@ -2,13 +2,19 @@
{{template "header" .}}
<div class="toolbar">
<form class="inline" method="post" action="/syb/sync">
<form class="inline sync-range-form" method="post" action="/syb/sync">
<input type="hidden" name="csrf_token" value="{{.CSRFToken}}">
<input type="hidden" name="order_no" value="{{.Keyword}}">
<label for="sync-date-from">开始日期</label>
<input id="sync-date-from" type="date" name="date_from"
value="{{.SyncDateFrom}}" max="{{.Today}}" required>
<label for="sync-date-to">结束日期</label>
<input id="sync-date-to" type="date" name="date_to"
value="{{.SyncDateTo}}" max="{{.Today}}" required>
<button type="submit" class="primary">同步</button>
</form>
<button type="button" data-modal-open="sync-range-modal">指定日期同步</button>
<button type="button" data-modal-open="sync-history-modal">同步记录</button>
<form class="inline" method="post" action="/syb/create-task">
<input type="hidden" name="csrf_token" value="{{.CSRFToken}}">
@@ -30,44 +36,65 @@
</form>
</div>
{{/* 指定日期只用于补拉历史数据。日常增量仍走工具栏第一个“同步”按钮,
避免操作员忘记清掉旧日期、下一次又误跑同一段历史数据。 */}}
<div class="modal-backdrop" id="sync-range-modal" {{if not .NeedRangeSync}}hidden{{end}}>
<div class="modal modal-narrow" role="dialog" aria-modal="true"
aria-labelledby="sync-range-modal-title">
{{if .RangeError}}<p class="missing sync-range-message" role="alert">{{.RangeError}}</p>{{end}}
{{if .RangeWarning}}<p class="hint sync-range-message">{{.RangeWarning}}</p>{{end}}
<p class="hint sync-range-message">
按顺运宝货运单创建日期(UTC+8)同步,开始日和结束日都包含,每次最多 31 天。
</p>
<div class="modal-backdrop" id="sync-history-modal" {{if not .NeedSyncHistory}}hidden{{end}}>
<div class="modal modal-wide" role="dialog" aria-modal="true"
aria-labelledby="sync-history-modal-title">
<div class="modal-head">
<h2 id="sync-range-modal-title">指定日期同步</h2>
<h2 id="sync-history-modal-title">同步记录</h2>
<button type="button" class="modal-x" data-modal-close aria-label="关闭">×</button>
</div>
<form method="post" action="/syb/sync">
<input type="hidden" name="csrf_token" value="{{.CSRFToken}}">
<input type="hidden" name="order_no" value="{{.Keyword}}">
<div class="modal-body">
{{if .RangeError}}
<p class="missing" role="alert">{{.RangeError}}</p>
{{end}}
<div class="field-row">
<div class="field">
<label for="sync-date-from">开始日期</label>
<input id="sync-date-from" type="date" name="date_from"
value="{{.SyncDateFrom}}" max="{{.Today}}" required autofocus>
</div>
<div class="field">
<label for="sync-date-to">结束日期</label>
<input id="sync-date-to" type="date" name="date_to"
value="{{.SyncDateTo}}" max="{{.Today}}" required>
</div>
</div>
<p class="hint">
按顺运宝货运单创建日期(UTC+8)同步,开始日和结束日都包含。
每次最多选择 31 天;日常同步请直接使用工具栏的“同步”。
</p>
<div class="modal-body">
<p class="hint">共 {{.SyncHistory.Total}} 条,按发起时间从新到旧排列。</p>
<div class="table-wrap sync-history-table">
<table>
<thead>
<tr>
<th>状态</th><th>日期范围</th><th>操作账号</th><th>开始时间</th>
<th>完成时间</th><th>同步结果</th><th>覆盖进度</th><th>失败原因</th>
</tr>
</thead>
<tbody>
{{range .SyncHistory.Rows}}
<tr>
<td><span class="sync-status {{.StatusClass}}">{{.StatusText}}</span></td>
<td>{{.DateRange}}</td>
<td>{{.Username}}</td>
<td>{{.StartedAt}}</td>
<td>{{.FinishedAt}}</td>
<td>{{.Summary}}</td>
<td>{{.CursorText}}</td>
<td class="sync-error">{{if .ErrorMessage}}{{.ErrorMessage}}{{else}}—{{end}}</td>
</tr>
{{else}}
<tr class="empty"><td colspan="8">还没有同步记录。</td></tr>
{{end}}
</tbody>
</table>
</div>
<div class="modal-foot">
<button type="button" data-modal-close>取消</button>
<button type="submit" class="primary">开始同步</button>
</div>
</form>
</div>
<div class="modal-foot sync-history-foot">
<span>第 {{.SyncHistory.Page}} / {{.SyncHistory.TotalPages}} 页</span>
<span class="grow"></span>
{{if .HistoryPagination.HasPrev}}
<a class="button-link" href="{{.HistoryPagination.FirstURL}}">首页</a>
<a class="button-link" href="{{.HistoryPagination.PrevURL}}">上一页</a>
{{else}}
<span class="button-link disabled">首页</span><span class="button-link disabled">上一页</span>
{{end}}
{{if .HistoryPagination.HasNext}}
<a class="button-link" href="{{.HistoryPagination.NextURL}}">下一页</a>
<a class="button-link" href="{{.HistoryPagination.LastURL}}">末页</a>
{{else}}
<span class="button-link disabled">下一页</span><span class="button-link disabled">末页</span>
{{end}}
<button type="button" data-modal-close>关闭</button>
</div>
</div>
</div>
@@ -161,11 +188,9 @@
<form method="post" action="/syb/login-and-sync">
<input type="hidden" name="csrf_token" value="{{.CSRFToken}}">
<input type="hidden" name="order_no" value="{{.Keyword}}">
{{/* 指定日期同步遇到登录时必须把范围带过来;为空就是普通增量同步。 */}}
{{if .HasSyncRange}}
{{/* 登录和 OCR 降级后必须把工具栏里已确认的日期范围原样带回来。 */}}
<input type="hidden" name="date_from" value="{{.SyncDateFrom}}">
<input type="hidden" name="date_to" value="{{.SyncDateTo}}">
{{end}}
<div class="modal-body">
{{/* `[必须]` 工单 #47:自动识别验证码失败/降级时要说明原因
(已尝试 N 次 / 服务不可用),操作员才知道是配置错了还是