feat(admin): эмулятор МНП — режим реальной записи в МНП на подставного клиента
Третий режим МНП (между «внутренняя имитация» и «боевая запись»): в bj цикл идёт по обычному пользователю, а поручение в QUIK МНП уходит РЕАЛЬНО, но с кодом другого, реально существующего в QUIK клиента (обобщение ручного теста realtest «боевой ЛК → TEST3»). - QuikMNPSettings: RealWrite + RealClientCode (валидация формата кода). - Подмена кода — единая точка quikClientCodeFromPort (после ClientCodeMap); портфель не трогаем. quikActive: RealWrite только при devMode и непустом коде; Emulate (внутренняя имитация) в приоритете. - Шаги боевого пути помечаются «[на подставного клиента <код>]» — видно в «Поручениях QUIK». - Карточка МНП на /admin/emulators — три взаимоисключающих режима (выключено / имитация / реальная запись), поле кода, крупное предупреждение; отдельный красный баннер «Реальные поручения в МНП на клиента <код> (режим разработки)» — не смешиваем с баннером эмуляции НРД. - disableEmulatorsIfDevOff сбрасывает и RealWrite (код остаётся, инертен), новость явно фиксирует прекращение реальных поручений.
This commit is contained in:
@@ -34,26 +34,36 @@ func registerEmulators(mux *http.ServeMux, a *admin, rc *RuntimeConfig) {
|
||||
}
|
||||
s := rc.Snapshot()
|
||||
nsdOn, nsdWhy := lkEmulateNSD(rc)
|
||||
quikMode := "off"
|
||||
if s.Quik.Emulate {
|
||||
quikMode = "emulate"
|
||||
} else if s.Quik.RealWrite {
|
||||
quikMode = "real"
|
||||
}
|
||||
data := struct {
|
||||
page
|
||||
NSDEmuOn bool
|
||||
NSDEmuWhy string
|
||||
NSDFlag bool
|
||||
NSD NSDEmuSettings
|
||||
RejectCodes []emuRejectOption
|
||||
QuikEmuOn bool
|
||||
MNP MNPEmuSettings
|
||||
Flash string
|
||||
NSDEmuOn bool
|
||||
NSDEmuWhy string
|
||||
NSDFlag bool
|
||||
NSD NSDEmuSettings
|
||||
RejectCodes []emuRejectOption
|
||||
QuikEmuOn bool
|
||||
QuikMode string
|
||||
QuikRealCode string
|
||||
MNP MNPEmuSettings
|
||||
Flash string
|
||||
}{
|
||||
page: nowPage("Эмуляторы", "emulators"),
|
||||
NSDEmuOn: nsdOn,
|
||||
NSDEmuWhy: nsdWhy,
|
||||
NSDFlag: s.LK.EmulateNSD,
|
||||
NSD: s.NSDEmu.Defaults(),
|
||||
RejectCodes: emuRejectOptions(),
|
||||
QuikEmuOn: s.Quik.Emulate && devMode(rc),
|
||||
MNP: s.MNPEmu,
|
||||
Flash: r.URL.Query().Get("flash"),
|
||||
page: nowPage("Эмуляторы", "emulators"),
|
||||
NSDEmuOn: nsdOn,
|
||||
NSDEmuWhy: nsdWhy,
|
||||
NSDFlag: s.LK.EmulateNSD,
|
||||
NSD: s.NSDEmu.Defaults(),
|
||||
RejectCodes: emuRejectOptions(),
|
||||
QuikEmuOn: s.Quik.Emulate && devMode(rc),
|
||||
QuikMode: quikMode,
|
||||
QuikRealCode: s.Quik.RealClientCode,
|
||||
MNP: s.MNPEmu,
|
||||
Flash: r.URL.Query().Get("flash"),
|
||||
}
|
||||
render(w, a.emulators, data)
|
||||
})
|
||||
@@ -99,7 +109,18 @@ func registerEmulators(mux *http.ServeMux, a *admin, rc *RuntimeConfig) {
|
||||
return
|
||||
}
|
||||
q := rc.Snapshot().Quik
|
||||
q.Emulate = r.FormValue("emulate") != ""
|
||||
// Режим взаимоисключающий: off | emulate (внутренняя имитация) | real (реальная запись на подставного клиента).
|
||||
mode := r.FormValue("mode")
|
||||
if mode != "emulate" && mode != "real" {
|
||||
mode = "off"
|
||||
}
|
||||
q.Emulate = mode == "emulate"
|
||||
q.RealWrite = mode == "real"
|
||||
q.RealClientCode = strings.TrimSpace(r.FormValue("real_client_code"))
|
||||
if q.RealWrite && q.RealClientCode == "" {
|
||||
emuAjaxReply(w, r, http.StatusBadRequest, "Эмулятор МНП: укажите код клиента QUIK — на него уйдут реальные поручения")
|
||||
return
|
||||
}
|
||||
delay, err := strconv.Atoi(strings.TrimSpace(r.FormValue("step_delay_sec")))
|
||||
if err != nil && strings.TrimSpace(r.FormValue("step_delay_sec")) != "" {
|
||||
emuAjaxReply(w, r, http.StatusBadRequest, "Эмулятор МНП: задержка — целое число секунд")
|
||||
@@ -117,12 +138,13 @@ func registerEmulators(mux *http.ServeMux, a *admin, rc *RuntimeConfig) {
|
||||
return
|
||||
}
|
||||
if err := rc.UpdateQuik(q); err != nil {
|
||||
emuAjaxReply(w, r, http.StatusInternalServerError, "Эмулятор МНП: не сохранилось: "+err.Error())
|
||||
emuAjaxReply(w, r, http.StatusBadRequest, "Эмулятор МНП: "+err.Error())
|
||||
return
|
||||
}
|
||||
msg := "выключен — шаги цикла МНП выполняются в QUIK по-настоящему"
|
||||
if q.Emulate && devMode(rc) {
|
||||
msg = "включён — шаги цикла (блокировка, подпись, снятие, зачисление) проходят без записи в МНП"
|
||||
switch {
|
||||
case q.Emulate && devMode(rc):
|
||||
msg = "внутренняя имитация — шаги цикла (блокировка, подпись, снятие, зачисление) проходят без записи в МНП"
|
||||
var fails []string
|
||||
for _, f := range []struct {
|
||||
on bool
|
||||
@@ -135,6 +157,8 @@ func registerEmulators(mux *http.ServeMux, a *admin, rc *RuntimeConfig) {
|
||||
if len(fails) > 0 {
|
||||
msg += "; отказ на шагах: " + strings.Join(fails, ", ")
|
||||
}
|
||||
case q.RealWrite && devMode(rc):
|
||||
msg = "РЕАЛЬНАЯ запись в боевую МНП на подставного клиента " + q.RealClientCode + " — поручения уходят по-настоящему, код клиента подменяется"
|
||||
}
|
||||
emuAjaxReply(w, r, http.StatusOK, "Эмулятор МНП: "+msg)
|
||||
})
|
||||
@@ -171,7 +195,7 @@ func disableEmulatorsIfDevOff(rc *RuntimeConfig) {
|
||||
return
|
||||
}
|
||||
s := rc.Snapshot()
|
||||
if !s.LK.EmulateNSD && !s.Quik.Emulate {
|
||||
if !s.LK.EmulateNSD && !s.Quik.Emulate && !s.Quik.RealWrite {
|
||||
return
|
||||
}
|
||||
var off []string
|
||||
@@ -184,13 +208,18 @@ func disableEmulatorsIfDevOff(rc *RuntimeConfig) {
|
||||
off = append(off, "эмулятор НРД (заявки ЛК)")
|
||||
}
|
||||
}
|
||||
if s.Quik.Emulate {
|
||||
if s.Quik.Emulate || s.Quik.RealWrite {
|
||||
q := s.Quik
|
||||
q.Emulate = false
|
||||
q.Emulate, q.RealWrite = false, false
|
||||
if err := rc.UpdateQuik(q); err != nil {
|
||||
log.Printf("lk-gateway: авто-сброс эмулятора МНП: %v", err)
|
||||
} else {
|
||||
off = append(off, "эмулятор МНП QUIK")
|
||||
if s.Quik.Emulate {
|
||||
off = append(off, "эмулятор МНП QUIK (внутренняя имитация)")
|
||||
}
|
||||
if s.Quik.RealWrite {
|
||||
off = append(off, "реальная запись в МНП на подставного клиента "+s.Quik.RealClientCode)
|
||||
}
|
||||
}
|
||||
}
|
||||
if len(off) == 0 {
|
||||
@@ -198,7 +227,10 @@ func disableEmulatorsIfDevOff(rc *RuntimeConfig) {
|
||||
}
|
||||
log.Printf("lk-gateway: режим разработки закончился — эмуляторы отключены: %s", strings.Join(off, ", "))
|
||||
body := "Выключены: " + strings.Join(off, ", ") + ". Флаги эмуляции сброшены из настроек: при следующем включении режима разработки эмуляторы не включатся сами — их нужно будет включить заново на странице «Эмуляторы»."
|
||||
if s.Quik.Emulate && !s.Quik.WritesEnabled {
|
||||
if s.Quik.RealWrite {
|
||||
body += " Реальные поручения в боевую МНП на подставного клиента " + s.Quik.RealClientCode + " прекращены."
|
||||
}
|
||||
if (s.Quik.Emulate || s.Quik.RealWrite) && !s.Quik.WritesEnabled {
|
||||
body += " Цикл M2M в МНП остановлен: записи в МНП не разрешены — для боевой работы выберите «Чтение и запись» в настройках QUIK."
|
||||
}
|
||||
_ = rc.AddNews(NewsItem{
|
||||
|
||||
Reference in New Issue
Block a user