GuDingZiChan/backend/src/controllers/printDownloadController.ts
WuYongJie c7a9324635 feat(打印): 新增远程标签打印与 .NET 打印助手
- 新增打印终端、配对码、打印任务相关表结构与接口\n- 增加后台打印终端/任务管理页和资产标签远程打印入口\n- 引入 .NET 8 Windows 打印助手源码及下载清单配置
2026-03-25 21:05:30 +08:00

126 lines
3.9 KiB
TypeScript

import fs from 'fs'
import path from 'path'
import type { Request, Response } from 'express'
import { errorResponse, successResponse } from '../utils/response'
import {
getPrintAgentLatestManifest,
getXPrinterOfficialLatestManifest,
listPrintAgentReleaseManifests,
listXPrinterArchiveManifests,
resolvePrintAgentLatestBinary,
resolvePrintAgentReleaseBinary,
resolveXPrinterArchiveBinary
} from '../services/printDownloadService'
const getBaseUrl = (req: Request) => {
const protocol = (req.get('x-forwarded-proto') || req.protocol || 'http').split(',')[0]
const host = req.get('x-forwarded-host') || req.get('host')
return `${protocol}://${host}`
}
const sendBinaryDownload = (
res: Response,
filePath: string,
downloadName: string,
missingMessage: string
) => {
if (!fs.existsSync(filePath)) {
return errorResponse(res, missingMessage, 404)
}
return res.download(path.resolve(filePath), downloadName)
}
export const getPrintAgentLatestDownload = async (req: Request, res: Response) => {
try {
const { manifest, filePath } = resolvePrintAgentLatestBinary()
return sendBinaryDownload(res, filePath, manifest.filename, '最新打印助手安装包尚未上传')
} catch (error: any) {
return errorResponse(res, error.message || '读取打印助手安装包失败', 404)
}
}
export const getPrintAgentReleaseList = async (req: Request, res: Response) => {
try {
const baseUrl = getBaseUrl(req)
const latestManifest = getPrintAgentLatestManifest()
const releases = listPrintAgentReleaseManifests().map((manifest) => ({
...manifest,
download_url: `${baseUrl}/downloads/print-agent/releases/${manifest.version}`
}))
successResponse(
res,
{
latest_version: latestManifest.version,
latest_download_url: `${baseUrl}/downloads/print-agent/latest`,
releases
},
'获取成功'
)
} catch (error: any) {
errorResponse(res, error.message || '读取打印助手版本列表失败', 404)
}
}
export const getPrintAgentReleaseDownload = async (req: Request, res: Response) => {
try {
const version = String(req.params.version || '').trim()
if (!version) {
return errorResponse(res, '版本号不能为空', 422)
}
const { manifest, filePath } = resolvePrintAgentReleaseBinary(version)
return sendBinaryDownload(
res,
filePath,
manifest.filename,
`打印助手 ${version} 安装包尚未上传`
)
} catch (error: any) {
return errorResponse(res, error.message || '读取打印助手安装包失败', 404)
}
}
export const getXPrinterOfficialLatestController = async (req: Request, res: Response) => {
try {
const manifest = getXPrinterOfficialLatestManifest()
successResponse(res, manifest, '获取成功')
} catch (error: any) {
errorResponse(res, error.message || '读取芯烨官方驱动信息失败', 404)
}
}
export const getXPrinterArchiveListController = async (req: Request, res: Response) => {
try {
const baseUrl = getBaseUrl(req)
const archives = listXPrinterArchiveManifests().map((manifest) => ({
...manifest,
download_url: `${baseUrl}/downloads/printer-driver/xprinter/archive/${manifest.version}`
}))
successResponse(res, archives, '获取成功')
} catch (error: any) {
errorResponse(res, error.message || '读取芯烨归档驱动失败', 404)
}
}
export const getXPrinterArchiveDownloadController = async (req: Request, res: Response) => {
try {
const version = String(req.params.version || '').trim()
if (!version) {
return errorResponse(res, '版本号不能为空', 422)
}
const { manifest, filePath } = resolveXPrinterArchiveBinary(version)
return sendBinaryDownload(
res,
filePath,
manifest.filename,
`芯烨归档驱动 ${version} 尚未上传`
)
} catch (error: any) {
return errorResponse(res, error.message || '读取芯烨归档驱动失败', 404)
}
}