'use strict'; const superagent = require('superagent'); const moment = require('moment'); const { convertHTMLToDOCX } = require('../utils/tools'); module.exports.addIndustrySolution = async (ctx, next) => { try { const { models } = ctx.app.fs.dc; const { apiUrl, industrySolutionAppKey } = ctx.app.fs.config.fastGpt; const { monitoringItem, factors, userId } = ctx.request.body; if (!monitoringItem || !factors || !userId) { throw '缺少请求参数' }; const userText = `生成${monitoringItem}监测方案, 监测因素: ${factors.join('、')}`; const res = await superagent .post(`${apiUrl}/api/v1/chat/completions`) .send({ "stream": false, "detail": true, "messages": [ { "role": "user", "content": [ { "type": "text", "text": userText } ] } ] }) .set({ "Authorization": `Bearer ${industrySolutionAppKey}`, "Content-Type": "application/json", }) .timeout({ response: 1000 * 60 * 24, deadline: 1000 * 60 * 24, }); const content = res.body.choices[0].message.content.replace('\nFS·监测方案GENERATE:', ''); const tokens = res.body.responseData.reduce((sum, item) => { if (item.inputTokens) sum += item.inputTokens; if (item.outputTokens) sum += item.outputTokens; if (item.embeddingTokens) sum += item.embeddingTokens; return sum; }, 0); // 保存到数据库 await models.IndustrySolutionRecord.create({ content, tokens, userId, createdAt: moment().format('YYYY-MM-DD HH:mm:ss'), updatedAt: moment().format('YYYY-MM-DD HH:mm:ss'), }); ctx.body = content; ctx.status = 200; } catch (error) { ctx.logger.log(error); ctx.status = 400; ctx.body = { message: typeof error == 'string' ? error : '生成行业方案失败' }; } } module.exports.downloadIndustrySolution = async (ctx, next) => { try { const { content } = ctx.request.body; if (!content) { throw '缺少请求参数' }; const docxBuffer = await convertHTMLToDOCX(content); ctx.set('Content-Type', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'); ctx.set('Content-Disposition', `attachment; filename=${encodeURIComponent(`监测方案`)}.docx`); ctx.body = docxBuffer; ctx.status = 200; } catch (error) { ctx.logger.log(error); ctx.status = 400; ctx.body = { message: typeof error == 'string' ? error : '下载行业方案失败' }; } }