'use strict'; // 每日进销存 · 定时截图通知(管理员专用) // // 安全约定: // · 全部接口要求登录且 role === 'admin' // · 响应里只有「是否已配置」与脱敏预览,绝不返回通知中心密钥 / 对象存储密钥 // · 收件人名单由后端校验与规范化,前端只能提交姓名文本 const express = require('express'); const { getDailyInventoryNotificationAdminConfig, listRunRecords, saveDailyInventoryNotificationConfig, } = require('../services/dailyInventoryNotificationSettings'); const { runDailyInventoryNotificationJob, } = require('../jobs/dailyInventoryNotificationJob'); const router = express.Router(); function sendError(res, error, fallback) { const status = Number(error?.statusCode) || 500; console.error('[DailyInventoryNotification]', { message: error?.message || fallback, code: error?.code || null, status, }); res.status(status).json({ success: false, error: error.message || fallback }); } /** 仅管理员可查看与修改通知设置、执行立即测试 */ function requireAdmin(req, res, next) { if (req?.user?.role !== 'admin') { return res.status(403).json({ success: false, error: '仅管理员可操作通知设置' }); } return next(); } router.use(requireAdmin); // 读取通知设置(含通知中心 / 对象存储的配置状态与最近执行记录) router.get('/config', async (_req, res) => { try { res.json({ success: true, data: await getDailyInventoryNotificationAdminConfig() }); } catch (error) { sendError(res, error, '加载每日进销存通知设置失败'); } }); // 保存通知设置 router.put('/config', async (req, res) => { try { const saved = await saveDailyInventoryNotificationConfig(req.body || {}); res.json({ success: true, data: { ...saved, admin: await getDailyInventoryNotificationAdminConfig() } }); } catch (error) { sendError(res, error, '保存每日进销存通知设置失败'); } }); // 立即测试:真实走一次截图 + 上传 + 通知,但不写入正式幂等记录 router.post('/test', async (_req, res) => { try { const result = await runDailyInventoryNotificationJob({ mode: 'test' }); res.json({ success: result?.success === true, data: result }); } catch (error) { sendError(res, error, '执行每日进销存通知测试失败'); } }); // 最近执行记录(管理员排障用) router.get('/runs', async (req, res) => { try { const limit = Math.min(Math.max(Number(req.query?.limit) || 10, 1), 50); res.json({ success: true, data: await listRunRecords(limit) }); } catch (error) { sendError(res, error, '加载每日进销存通知执行记录失败'); } }); module.exports = router;