Резервное копирование: поля формы в столбик, дата последней копии по-русски; gofmt
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014FsEKyJrYF69Cj9ZXzFLRi
This commit is contained in:
@@ -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"],
|
||||
|
||||
@@ -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")
|
||||
}
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user