FPSMS-frontend
您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
 
 

50 行
1.9 KiB

  1. "use client";
  2. import { clientAuthFetch } from "@/app/utils/clientAuthFetch";
  3. import { NEXT_PUBLIC_API_URL } from "@/config/api";
  4. import { STOCK_TAKE_QTY_GAP_WARN_PERCENT } from "./stockTakeQtyGapWarning";
  5. export const STOCK_TAKE_QTY_GAP_WARN_SETTING = "STOCK_TAKE.qtyGapWarnPercent";
  6. export const STOCK_TAKE_QTY_GAP_SETTING_EVENT = "stock-take-qty-gap-warn-percent";
  7. type SettingsRow = { name: string; value: string };
  8. let cached: number | null = null;
  9. export function parseQtyGapWarnPercent(raw: string | null | undefined): number {
  10. const text = String(raw ?? "").trim();
  11. if (!text) return STOCK_TAKE_QTY_GAP_WARN_PERCENT;
  12. const n = Number(text);
  13. if (!Number.isFinite(n) || n < 0 || n > 1000) return STOCK_TAKE_QTY_GAP_WARN_PERCENT;
  14. return Math.round(n);
  15. }
  16. export async function fetchStockTakeQtyGapWarnPercent(): Promise<number> {
  17. if (cached != null) return cached;
  18. const base = (NEXT_PUBLIC_API_URL ?? "").replace(/\/$/, "");
  19. const res = await clientAuthFetch(`${base}/settings`, { method: "GET" });
  20. if (!res.ok) return STOCK_TAKE_QTY_GAP_WARN_PERCENT;
  21. const rows = (await res.json()) as SettingsRow[];
  22. const value = rows.find((row) => row.name === STOCK_TAKE_QTY_GAP_WARN_SETTING)?.value;
  23. cached = parseQtyGapWarnPercent(value);
  24. return cached;
  25. }
  26. export async function saveStockTakeQtyGapWarnPercent(percent: number): Promise<void> {
  27. const base = (NEXT_PUBLIC_API_URL ?? "").replace(/\/$/, "");
  28. const res = await clientAuthFetch(
  29. `${base}/settings/${encodeURIComponent(STOCK_TAKE_QTY_GAP_WARN_SETTING)}`,
  30. {
  31. method: "POST",
  32. headers: { "Content-Type": "application/json" },
  33. body: JSON.stringify({ value: String(percent) }),
  34. },
  35. );
  36. if (!res.ok) {
  37. const text = await res.text().catch(() => "");
  38. throw new Error(text || `Failed to save setting: ${res.status}`);
  39. }
  40. cached = percent;
  41. window.dispatchEvent(new CustomEvent(STOCK_TAKE_QTY_GAP_SETTING_EVENT, { detail: percent }));
  42. }