From 0ccafbecbc480da9a6cdfe548b6246305074bc5e Mon Sep 17 00:00:00 2001 From: leiyun Date: Fri, 8 May 2026 14:57:10 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A4=84=E7=90=86=E5=9B=BE=E7=89=87CDN?= =?UTF-8?q?=E8=AF=81=E4=B9=A6=E8=BF=87=E6=9C=9F=E5=AF=BC=E8=87=B4=E7=AD=BE?= =?UTF-8?q?=E5=90=8D=E6=97=A0=E6=B3=95=E6=98=BE=E7=A4=BA=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/config/router.js | 1 + src/controller/mp.js | 81 ++++++++++++++++++++++++++++++++++++++- src/service/screenshot.js | 5 ++- 3 files changed, 84 insertions(+), 3 deletions(-) diff --git a/src/config/router.js b/src/config/router.js index b9c0252..631d33b 100644 --- a/src/config/router.js +++ b/src/config/router.js @@ -75,6 +75,7 @@ module.exports = [ ['/api/mp/unreadCount', 'mp/unreadCount'], ['/api/mp/subscribeConfig', 'mp/subscribeConfig'], ['/api/mp/regenerateSign', 'mp/regenerateSign'], + ['/api/mp/regenerateSignByUrl', 'mp/regenerateSignByUrl', 'post'], // 瘤种管理 ['/admin/tag', 'admin/tag/index'], diff --git a/src/controller/mp.js b/src/controller/mp.js index 22fc96c..4957777 100644 --- a/src/controller/mp.js +++ b/src/controller/mp.js @@ -636,11 +636,11 @@ module.exports = class extends Base { * GET /api/mp/regenerateSign */ async regenerateSignAction() { - return false; + return false; // 先关闭接口,确认后再删除这行 try { const patients = await this.model('patient') .field('id, name, sign_promise') - .where({ is_deleted: 0, sign_promise: ['!=', ''] }) + .where({ is_deleted: 0, sign_promise: ['!=', ''],id: ['in', [61,62]] }) .select(); if (!patients.length) return this.json({ code: 1, msg: '没有需要处理的患者' }); @@ -681,6 +681,83 @@ module.exports = class extends Base { } } + /** + * POST /api/mp/regenerateSignByUrl + * Temp no-login endpoint. Rebuild sign_income/sign_privacy/sign_promise with a fresh signature image. + * Body: { id, url } + */ + async regenerateSignByUrlAction() { + return false; // 先关闭接口,确认后再删除这行 + const id = parseInt(this.post('id') || this.get('id'), 10); + const signImageUrl = this.post('url') || this.post('signImageUrl') || this.get('url') || this.get('signImageUrl'); + + if (![61, 62].includes(id)) { + return this.json({ code: 1, msg: '只允许处理患者 61、62' }); + } + if (!signImageUrl || !/^https?:\/\//i.test(signImageUrl)) { + return this.json({ code: 1, msg: 'url 参数错误' }); + } + + try { + const patient = await this.model('patient') + .field('id,name,id_card,sign_income,sign_privacy,sign_promise,income_amount,create_time,update_time') + .where({ id, is_deleted: 0 }) + .find(); + + if (think.isEmpty(patient)) { + return this.json({ code: 1, msg: '患者不存在' }); + } + if (!patient.name || !patient.id_card) { + return this.json({ code: 1, msg: '患者姓名或身份证缺失' }); + } + + const screenshotService = this.service('screenshot'); + const signTime = patient.update_time || patient.create_time || think.datetime(new Date()); + const tasks = [ + { field: 'sign_income', key: 'sign_income', amount: patient.income_amount }, + { field: 'sign_privacy', key: 'sign_privacy' }, + { field: 'sign_promise', key: 'sign_promise' } + ]; + const updates = {}; + const results = []; + + for (const item of tasks) { + const doc = await this.model('content').getByKey(item.key); + if (think.isEmpty(doc)) { + throw new Error(`${item.key} 协议内容未配置`); + } + + const newUrl = await screenshotService.generate({ + title: doc.title, + content: doc.content, + signImageUrl, + signerName: patient.name, + signerIdCard: patient.id_card, + signTime, + amount: item.amount || null + }); + + updates[item.field] = newUrl; + results.push({ + field: item.field, + oldUrl: patient[item.field] || '', + newUrl + }); + } + + await this.model('patient').where({ id }).update(updates); + + return this.json({ + code: 0, + data: { id, results }, + msg: '重生成成功' + }); + } catch (error) { + think.logger.error('regenerateSignByUrl error:', error); + return this.json({ code: 1, msg: '重生成失败: ' + error.message }); + } + } + // @private async _verifyIdCard(name, idCard) { const faceidConfig = require('../config/faceid.js'); diff --git a/src/service/screenshot.js b/src/service/screenshot.js index 03ead83..216ab2e 100644 --- a/src/service/screenshot.js +++ b/src/service/screenshot.js @@ -40,7 +40,10 @@ module.exports = class extends think.Service { await page.setContent(html, { waitUntil: 'networkidle0', timeout: 15000 }); // 等签名图片加载 - await page.waitForSelector('.sign-img', { timeout: 5000 }).catch(() => {}); + await page.waitForFunction(() => { + const img = document.querySelector('.sign-img'); + return img && img.complete && img.naturalWidth > 0 && img.naturalHeight > 0; + }, { timeout: 10000 }); const screenshot = await page.screenshot({ fullPage: true, type: 'png' }); await browser.close();