feat: 地区选择器改走接口、订单市价重算与资金流水、同步日志内容复用

region-address-picker 接 region-picker API;订单支持按进价重算 market_price、追踪页资金流水;MES/ERP/中台同步日志共用内容查看组件;地区管理支持 pid 下钻与拼音检索。
This commit is contained in:
李琦
2026-10-15 10:01:20 +08:00
parent 8df1ffb80a
commit 50fc55925f
87 changed files with 6653 additions and 576 deletions

View File

@@ -4,13 +4,20 @@ import log from 'electron-log/main';
/**
* 开机自启:基于系统登录项实现(Windows 写 HKCU\...\Run 注册表、mac 写「系统设置 → 登录项」),
* 无需管理员权限;系统登录项本身就是持久化存储,无需额外落盘记录状态。
*
* 注意(Windows):set 时若带了 args,get 必须传同一组 args,否则 openAtLogin 恒为 false,
* 托盘「开机自启」勾选态刷新后就会丢回显(Electron 官方文档明确要求)。
*/
/** 开机自启启动参数:主进程据此静默进托盘,不弹主窗口 */
const AUTO_LAUNCH_ARGS = ['--hidden'];
/** 读取当前开机自启状态(直接以系统登录项为准,避免自维护状态与系统不同步) */
export function getAutoLaunchEnabled(): boolean {
// 开发模式下登录项指向 electron 开发二进制,无意义,统一视为关闭
if (!app.isPackaged) return false;
return app.getLoginItemSettings().openAtLogin;
// Windows 必须带上与 set 时相同的 args,否则匹配不到注册表项
return app.getLoginItemSettings({ args: AUTO_LAUNCH_ARGS }).openAtLogin;
}
/**
@@ -24,7 +31,8 @@ export function setAutoLaunchEnabled(enable: boolean): boolean {
}
app.setLoginItemSettings({
openAtLogin: enable,
args: enable ? ['--hidden'] : [],
// 关闭时清空 args,避免残留无意义的启动参数
args: enable ? AUTO_LAUNCH_ARGS : [],
});
return getAutoLaunchEnabled();
}

View File

@@ -12,6 +12,12 @@ import log from 'electron-log/main';
* 临时文件 loadFile 对任意大小都稳定,打完即删。
*/
/** 自定义纸张(微米);如热敏 80mm = width: 80000 */
export interface PrintPageSizeMicrons {
width: number;
height: number;
}
export interface PrintHtmlOptions {
/** 完整的打印 HTML(含样式),由渲染层拼好传入 */
html: string;
@@ -19,6 +25,13 @@ export interface PrintHtmlOptions {
deviceName?: string;
/** 是否静默打印(true 不弹系统打印对话框) */
silent?: boolean;
/**
* 纸张尺寸(微米)。挂号小票等场景传 80mm 宽,避免落到打印机默认 A4
* 不传则跟打印机默认纸张
*/
pageSize?: PrintPageSizeMicrons | string;
/** 优先采用 CSS @page size(与 pageSize 互补) */
preferCSSPageSize?: boolean;
}
export interface PrintResult {
@@ -30,7 +43,13 @@ export interface PrintResult {
* 执行打印,返回是否成功与失败原因(渲染层据此提示用户)
*/
export async function printHtml(options: PrintHtmlOptions): Promise<PrintResult> {
const { html, deviceName, silent = true } = options;
const {
html,
deviceName,
silent = true,
pageSize,
preferCSSPageSize = false,
} = options;
// 临时文件带时间戳防并发打印互相覆盖
const tempFile = join(app.getPath('temp'), `xk-print-${Date.now()}-${Math.random().toString(36).slice(2)}.html`);
await writeFile(tempFile, html, 'utf8');
@@ -58,6 +77,9 @@ export async function printHtml(options: PrintHtmlOptions): Promise<PrintResult>
silent,
deviceName: deviceName || undefined,
printBackground: true,
// 热敏小票等:显式纸张,避免落到驱动默认 A4
...(pageSize ? { pageSize } : {}),
...(preferCSSPageSize ? { preferCSSPageSize: true } : {}),
},
(success, failureReason) => finish(success, success ? undefined : failureReason),
);

View File

@@ -67,11 +67,13 @@ const desktopAPI = {
/** 获取系统打印机列表(打印设置下拉用) */
getPrinters: (): Promise<Array<{ name: string; displayName: string; isDefault: boolean }>> =>
ipcRenderer.invoke('desktop:get-printers'),
/** 静默打印:传入拼好的完整 HTML,主进程隐藏窗口出纸 */
/** 静默打印:传入拼好的完整 HTML,主进程隐藏窗口出纸;可带 pageSize(微米)指定热敏纸等 */
printHTML: (options: {
html: string;
deviceName?: string;
silent?: boolean;
pageSize?: { width: number; height: number } | string;
preferCSSPageSize?: boolean;
}): Promise<{ ok: boolean; message?: string }> =>
ipcRenderer.invoke('desktop:print-html', options),
/** 读取桌面端设置(打印机名称、静默打印开关等) */