571a7d0e67
Кнопка была submit внутри формы режима, у которой обработчик submit делает preventDefault — клик ничего не отправлял. Теперь type=button + fetch на /admin/setup/quik/detect-account (X-BJ-Ajax), результат в строке статуса, найденный счёт подставляется в поле. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Q7eREaYwUt1i4fNLZcGnjn
93 lines
3.3 KiB
Go
93 lines
3.3 KiB
Go
package lkgateway
|
||
|
||
import (
|
||
"context"
|
||
"database/sql"
|
||
"net/http"
|
||
"strings"
|
||
"time"
|
||
)
|
||
|
||
// quikdetect.go — автоподбор торгового счёта фирмы для неторговых поручений.
|
||
// Источник — сама БД модуля QUIK: различные Account из таблиц Actions/Export по
|
||
// коду нашей фирмы (QuikFirm/FirmID = код участника). Если счёт один — подставляем;
|
||
// несколько — показываем на выбор; нет истории — просим ввести вручную.
|
||
|
||
// quikDetectAccounts — торговые счета фирмы firm из БД МНП (только чтение).
|
||
func quikDetectAccounts(ctx context.Context, s QuikMNPSettings, firm string) ([]string, error) {
|
||
db, err := quikOpen(s)
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
defer db.Close()
|
||
cctx, cancel := context.WithTimeout(ctx, 20*time.Second)
|
||
defer cancel()
|
||
const q = `SELECT DISTINCT LTRIM(RTRIM(Account)) AS acc FROM (
|
||
SELECT Account, QuikFirm, FirmID FROM dbo.Actions
|
||
UNION ALL
|
||
SELECT Account, QuikFirm, FirmID FROM dbo.Export
|
||
) t
|
||
WHERE Account IS NOT NULL AND LTRIM(RTRIM(Account)) <> ''
|
||
AND (@firm = '' OR QuikFirm = @firm OR FirmID = @firm)
|
||
ORDER BY acc`
|
||
rows, err := db.QueryContext(cctx, q, sql.Named("firm", firm))
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
defer rows.Close()
|
||
var out []string
|
||
for rows.Next() {
|
||
var a string
|
||
if err := rows.Scan(&a); err == nil {
|
||
if a = strings.TrimSpace(a); a != "" {
|
||
out = append(out, a)
|
||
}
|
||
}
|
||
}
|
||
return out, rows.Err()
|
||
}
|
||
|
||
// detectQuikAccount — POST /admin/setup/quik/detect-account: подобрать торговый счёт из QUIK.
|
||
func (h *setupHandlers) detectQuikAccount(w http.ResponseWriter, r *http.Request) {
|
||
if !requireAdvanced(w, r) {
|
||
return
|
||
}
|
||
if r.Method != http.MethodPost {
|
||
http.Error(w, "method", http.StatusMethodNotAllowed)
|
||
return
|
||
}
|
||
// ответ: для fetch (кнопка в форме режима) — текстом; иначе — флеш.
|
||
reply := func(msg string) {
|
||
if r.Header.Get("X-BJ-Ajax") != "" {
|
||
w.Header().Set("Content-Type", "text/plain; charset=utf-8")
|
||
_, _ = w.Write([]byte(msg))
|
||
return
|
||
}
|
||
setupFlash(w, r, "QUIK: "+msg)
|
||
}
|
||
s := h.rc.Snapshot().Quik
|
||
if s.Server == "" || !s.Verified {
|
||
reply("сначала подключитесь к БД МНП (Настройка → QUIK, «Проверить подключение»)")
|
||
return
|
||
}
|
||
firm := quikFirmID()
|
||
accs, err := quikDetectAccounts(r.Context(), s, firm)
|
||
if err != nil {
|
||
reply("определить счёт не удалось — " + quikErrorDetail(err))
|
||
return
|
||
}
|
||
switch len(accs) {
|
||
case 0:
|
||
reply("торговых счетов фирмы " + firm + " в истории поручений (Actions/Export) не найдено — введите счёт вручную")
|
||
case 1:
|
||
s.Account = accs[0]
|
||
if err := h.rc.UpdateQuik(s); err != nil {
|
||
reply("не сохранилось — " + err.Error())
|
||
return
|
||
}
|
||
reply("торговый счёт подставлен из QUIK — " + accs[0])
|
||
default:
|
||
reply("у фирмы " + firm + " несколько торговых счетов (" + strings.Join(accs, ", ") + ") — впишите нужный вручную")
|
||
}
|
||
}
|