Резервное копирование: поля формы в столбик, дата последней копии по-русски; gofmt

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014FsEKyJrYF69Cj9ZXzFLRi
This commit is contained in:
zuevav
2026-10-05 14:59:36 +03:00
parent 6aecac1cc8
commit 2c01ec2927
7 changed files with 24 additions and 12 deletions
+1
View File
@@ -57,6 +57,7 @@ var templateFuncs = template.FuncMap{
"quikRecipientsInfo": quikRecipientsInfo,
"lkPortfolioStates": lkPortfolioStates,
"backupStatus": backupStatus,
"backupWhen": backupWhen,
"intList": func(v ...int) []int { return v },
"nsdSegTip": nsdSegTip,
"devOn": authTemplateFuncs["devOn"],
+9
View File
@@ -177,3 +177,12 @@ func registerBackup(mux *http.ServeMux, rc *RuntimeConfig) {
jsonOut(w, opResult(backupOp(ctx, "restore", backupParams(r))))
})
}
// backupWhen — время копии из статуса (RFC 3339) в виде «05.10.2026 14:46».
func backupWhen(at string) string {
t, err := time.Parse(time.RFC3339, at)
if err != nil {
return at
}
return t.Local().Format("02.01.2006 15:04")
}
+3 -3
View File
@@ -857,9 +857,9 @@ func depoAgentJobStatus(ctx context.Context, f FancyMSSQLSettings, adminUser, ad
defer mdb.Close()
var (
jobEnabled, schedEnabled, subType, subInt sql.NullInt64
runDate, runTime, runStatus sql.NullInt64
runMsg sql.NullString
now time.Time
runDate, runTime, runStatus sql.NullInt64
runMsg sql.NullString
now time.Time
)
err = mdb.QueryRowContext(ctx, `SELECT j.enabled, s.enabled, s.freq_subday_type, s.freq_subday_interval,
h.run_date, h.run_time, h.run_status, h.message, GETDATE()
+1 -1
View File
@@ -47,7 +47,7 @@ func quikOutgoingBeforeSend(ctx context.Context, rc *RuntimeConfig, req *m2m.M2M
if req == nil {
return nil
}
q := quikSettingsFor(rc, string(req.Header.GUID)) // тест «боевой ЛК → TEST3» — боевая запись (realtest.go)
q := quikSettingsFor(rc, string(req.Header.GUID)) // тест «боевой ЛК → TEST3» — боевая запись (realtest.go)
if !quikActive(q) || !q.AutoOut || manualQuikSkipped(ctx) { // ручной ввод: заблокировано сотрудником
return nil
}
+5 -5
View File
@@ -182,11 +182,11 @@ type FancyMSSQLSettings struct {
// Обработка трансферных таблиц DEPO силами bj (вместо джобы SQL Agent bj2depo):
// bj сам вызывает процедуру DepoJobProc каждые DepoJobEverySec секунд.
DepoJobRun bool `json:"depo_job_run"`
DepoJobMode string `json:"depo_job_mode"` // bj | sql-auto | sql-manual (пусто = не выбран)
DepoJobCheck string `json:"depo_job_check"` // результат последней проверки готовности
DepoJobCheckOK bool `json:"depo_job_check_ok"`
DepoJobCheckAt time.Time `json:"depo_job_check_at"`
DepoJobRun bool `json:"depo_job_run"`
DepoJobMode string `json:"depo_job_mode"` // bj | sql-auto | sql-manual (пусто = не выбран)
DepoJobCheck string `json:"depo_job_check"` // результат последней проверки готовности
DepoJobCheckOK bool `json:"depo_job_check_ok"`
DepoJobCheckAt time.Time `json:"depo_job_check_at"`
// DepoProcCheck — работает ли обработка событий процедурами (BJ_PING), отдельно от запуска джобы.
DepoProcCheck string `json:"depo_proc_check,omitempty"`
DepoProcCheckOK bool `json:"depo_proc_check_ok,omitempty"`
@@ -996,9 +996,10 @@
<div class="card">
<h2><span class="dot {{if not $b.Enabled}}warn{{else if and $bs $bs.OK}}ok{{else}}err{{end}}"></span>Копии сервера bj на сетевое хранилище</h2>
<p class="muted">Что копируется: база bj (заявки, сделки, кабинет), база и папка шлюза НРД (настройки, сертификаты, полученные от НРД документы), настройки и данные bj. Пароль хранилища bj у себя не хранит — он лежит на сервере в файле, доступном только системе. Восстановить копию можно в мастере настройки (шаг 1, «Восстановить из резервной копии»).</p>
<p style="margin:8px 0">{{if $bs}}Последняя копия: <b>{{$bs.At}}</b> — {{if $bs.OK}}<span style="color:var(--ok)">✓ {{$bs.Dir}}, {{$bs.Msg}}</span>{{else}}<span style="color:var(--err)">✗ {{$bs.Msg}}</span>{{end}}{{else}}<span class="muted">Копий ещё не было.</span>{{end}}</p>
<p style="margin:8px 0">{{if $bs}}Последняя копия: <b>{{backupWhen $bs.At}}</b> — {{if $bs.OK}}<span style="color:var(--ok)">✓ {{$bs.Dir}}, {{$bs.Msg}}</span>{{else}}<span style="color:var(--err)">✗ {{$bs.Msg}}</span>{{end}}{{else}}<span class="muted">Копий ещё не было.</span>{{end}}</p>
<style>#bk-form label:not(.chk){display:block;margin:0}#bk-form label:not(.chk) input,#bk-form label:not(.chk) select{width:100%;box-sizing:border-box;margin-top:4px}</style>
<form method="post" action="/admin/setup/backup" id="bk-form" style="display:grid;gap:10px;max-width:640px">
<label style="display:flex;align-items:center;gap:8px;font-weight:400"><input type="checkbox" name="enabled" style="width:auto"{{if $b.Enabled}} checked{{end}}> <b>Делать копии по расписанию</b></label>
<label class="chk" style="display:flex;align-items:center;gap:8px;font-weight:400"><input type="checkbox" name="enabled" style="width:auto"{{if $b.Enabled}} checked{{end}}> <b>Делать копии по расписанию</b></label>
<div style="display:grid;grid-template-columns:2fr 1fr;gap:10px">
<label>Хранилище (SMB)<input name="share" value="{{$b.Share}}" placeholder="//10.10.10.11/Backup"></label>
<label>Папка<input name="dir" value="{{$b.Dir}}" placeholder="BJ_Backup/bj"></label>
@@ -54,6 +54,7 @@ a.wstep:hover .bub { box-shadow:0 0 0 4px var(--accent-weak); }
<details>
<summary style="cursor:pointer;font-weight:600">Переустановка сервера? Восстановить из резервной копии</summary>
<p class="muted" style="font-size:13px;margin:8px 0">Если у вас есть резервная копия bj на сетевом хранилище (Настройка → Резервное копирование), можно восстановить её вместо настройки с нуля: вернутся настройки, пользователи, лицензия, журнал заявок, база и папка шлюза НРД. Текущие данные этого сервера будут заменены. bj и шлюз НРД на время восстановления остановятся — обычно 1–3 минуты.</p>
<style>#rs-form label:not(.chk){display:block;margin:0}#rs-form label:not(.chk) input,#rs-form label:not(.chk) select{width:100%;box-sizing:border-box;margin-top:4px}#rs-pick label{flex:1;min-width:220px}</style>
<form id="rs-form" style="display:grid;gap:8px;max-width:640px" onsubmit="return false">
<div style="display:grid;grid-template-columns:2fr 1fr;gap:8px">
<label>Хранилище (SMB)<input name="share" placeholder="//10.10.10.11/Backup" value="{{.Settings.Backup.Share}}"></label>
@@ -65,7 +66,7 @@ a.wstep:hover .bub { box-shadow:0 0 0 4px var(--accent-weak); }
</div>
<div><button class="btn" type="button" id="rs-list">Показать копии</button></div>
<div id="rs-pick" style="display:none;gap:8px;align-items:flex-end;flex-wrap:wrap">
<label>Копия<select name="name" id="rs-name" style="min-width:220px"></select></label>
<label>Копия<select name="name" id="rs-name"></select></label>
<button class="btn" type="button" id="rs-go" style="background:var(--err);border-color:var(--err)">Восстановить</button>
</div>
<div id="rs-out" class="muted" style="font-size:13px"></div>