| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662 |
- <!-- 引入必要的JavaScript库 -->
- <js.ss file="/ss/jquery/jquery1.11.3.min.js"/>
- <js.ss file="/ss/jquery/jquery.form.min.js"/>
- <js.ss file="/ss/js/upload.js"/>
- <div class='content-div' ssFith="true">
- <table class='form'>
- <tr>
- <th>上传原件</th>
- <td>
- <!-- 上传按钮 - upload.js会绑定点击事件 -->
- <input type="button" id="scyjEdit" class="content-button" value="选择文件..."/>
- <!-- 文件信息显示区域 - upload.js必需的元素 -->
- <span id="scyjBaseName" class="file-info"></span>
- <!-- 操作按钮区域 - upload.js控制显示/隐藏 -->
- <span class="file-action">
- <button id="checkScyj" style="display:none;" onclick="checkFile('scyj')">查看</button>
- <button id="qxScyj" style="display:none;" onclick="uploadFileClean('scyj')">删除</button>
- </span>
- </td>
- <th>上传后路径</th>
- <td>
- <!-- upload.js上传成功后会将路径填充到这里 -->
- <input mc="mc" name="scyjwj" id="scyjpath" value="" style="width: 300px;"/>
- <!-- 隐藏的文件名输入框,upload.js需要 -->
- <input type="hidden" name="scyjBaseName" value=""/>
- </td>
- <td>
- <input id="path" name='uploadPath' style="width: 200px;"/>
- </td>
- </tr>
- <!-- 新增:生成原件行 -->
- <tr>
- <th>生成原件</th>
- <td colspan="4">
- <input type="button" id="generateDocumentBtn" class="content-button" value="生成原件"
- onclick="generateOfficialDocument()"
- style="background-color: #1890ff; color: white; border: 1px solid #1890ff;"/>
- <span id="generateStatus" style="margin-left: 10px; color: #666; font-size: 12px;"></span>
- </td>
- </tr>
- <tr>
- <th>文书类别</th>
- <td><input type="text" name="wslbm" style="width: 200px;"/></td>
- <th>密级</th>
- <td><input name="wsmjm" style="width: 200px;"/></td>
- </tr>
- <tr>
- <th>范围</th>
- <td><input type="text" name="wsfwm" style="width: 200px;"/></td>
- <th>管理类别</th>
- <td><input name="gllbm" style="width: 200px;"/></td>
- </tr>
- <tr>
- <th>标题</th>
- <td colspan="3"><input name="bt" style="width: 100%;"/></td>
- </tr>
- <tr>
- <th>摘要</th>
- <td colspan="3"><input name="zy" style="width: 100%;"/></td>
- </tr>
- <tr>
- <th>正文</th>
- <td colspan="3">
- <input name="zwwj" ssBtn="{desc:'附件',name:'fjid',val:'${ws.fjid}'}" width="700px" height="420px"/>
- </td>
- </tr>
- <tr>
- <th>拟稿人员</th>
- <td><input name="ngryid" style="width: 170px;"/></td>
- <th>拟稿部门</th>
- <td><input name="ngbmid" style="width: 170px;"/></td>
- </tr>
- </table>
- </div>
- <!-- 将所有JavaScript函数和初始化代码集中放在这里 -->
- <script>
- // 全局变量定义
- var wd = window.wd || {};
- wd.app = wd.app || {name: 'defaultApp'};
- // 生成原件按钮状态
- var isGenerating = false;
- // 获取账户信息函数
- function getAccountInfo() {
- return {
- xmmc: 'defaultProject'
- };
- }
- // 查看文件函数
- function checkFile(fileId) {
- var filePath = $('input[name="' + fileId + 'wj"]').val();
- if (!filePath) {
- alert('请先上传文件');
- return;
- }
- alert('文件路径:' + filePath + '\n点击确定后将尝试打开文件');
- window.open(filePath, '_blank');
- }
- // upload.js 需要的清理文件函数
- function uploadFileClean(id) {
- $('#' + id + 'Name').html('');
- $('input[name="' + id + 'wj"]').val('');
- $('#' + id + 'Edit_File').val('');
- $('#' + id + 'path').val('');
- $("#qx" + id).hide();
- $("#check" + id).hide();
- // 同时清空文件名显示
- $('#' + id + 'BaseName').html('');
- $('input[name="' + id + 'BaseName"]').val('');
- };
- // 生成原件函数
- function generateOfficialDocument() {
- console.log('生成原件按钮被点击');
- if (isGenerating) {
- console.log('正在生成中,请等待...');
- return; // 防止重复点击
- }
- // 验证必填字段
- // var title = $('input[name="bt"]').val();
- var title ="1233333";
- /* if (!title || title.trim() === '') {
- alert('请填写标题');
- $('input[name="bt"]').focus();
- return;
- }*/
- // 获取HTML内容(从正文控件获取)
- var htmlContent = '';
- var editorElement = document.querySelector('ss-editor[name="zwwj"]');
- if (editorElement && editorElement.__vue__) {
- var vueInstance = editorElement.__vue__;
- if (vueInstance.editorContent !== undefined) {
- htmlContent = vueInstance.editorContent;
- console.log('从editorContent获取到HTML内容,长度:', htmlContent.length);
- } else {
- // 尝试其他获取方式
- try {
- var editor = $(editorElement).find('.ql-editor');
- if (editor.length) {
- htmlContent = editor.html();
- console.log('从.ql-editor获取到HTML内容,长度:', htmlContent.length);
- } else {
- console.warn('无法找到富文本编辑器内容');
- }
- } catch (e) {
- console.warn('获取编辑器内容失败:', e);
- }
- }
- } else {
- console.warn('未找到富文本编辑器元素或Vue实例');
- }
- if (!htmlContent || htmlContent.trim() === '') {
- if (!confirm('正文内容为空,确定要生成空白公文吗?')) {
- return;
- }
- }
- // 收集生成参数
- var params = {
- institutionName: '广州工商学院', // 可以从配置获取或输入框获取
- documentNumber: '数教函〔2026〕2号', // 可以从输入框获取,这里用示例
- documentTitle: title,
- htmlContent: htmlContent,
- sender: '数字教育与装备中心', // 可以从用户信息或输入框获取
- receiver: '各学院、各部门:',
- hasAttachment: false,
- attachmentInfo: '',
- sealImagePath: 'D:\\tmp\\seal\\yz2.png', // 可以从配置获取
- enableSeal: true
- };
- console.log('生成参数:', params);
- // 开始生成
- generateAndUploadDocument(params);
- }
- // 生成并上传公文
- function generateAndUploadDocument(params) {
- isGenerating = true;
- $('#generateStatus').html('正在生成公文...').css('color', '#1890ff');
- $('#generateDocumentBtn').prop('disabled', true).css('opacity', 0.7);
- // 使用XMLHttpRequest来获取二进制数据
- var xhr = new XMLHttpRequest();
- xhr.open('POST', "<serv.ss name='ws_zh_schtwj'/>", true);
- xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');
- xhr.responseType = 'arraybuffer'; // 重要:指定响应类型为arraybuffer
- // 构建请求参数
- var formData = new URLSearchParams();
- formData.append('institutionName', params.institutionName);
- formData.append('documentNumber', params.documentNumber);
- formData.append('documentTitle', params.documentTitle);
- formData.append('htmlContent', params.htmlContent);
- formData.append('sealImagePath', params.sealImagePath);
- formData.append('sender', params.sender);
- formData.append('receiver', params.receiver);
- formData.append('hasAttachment', params.hasAttachment);
- formData.append('attachmentInfo', params.attachmentInfo);
- formData.append('enableSeal', params.enableSeal);
- // 监听进度事件
- xhr.addEventListener('progress', function(e) {
- if (e.lengthComputable) {
- var percentComplete = (e.loaded / e.total) * 100;
- $('#generateStatus').html('生成中... ' + Math.round(percentComplete) + '%');
- }
- }, false);
- xhr.onload = function() {
- if (xhr.status === 200) {
- console.log('收到服务器响应,状态码:', xhr.status);
- // 检查响应类型
- var contentType = xhr.getResponseHeader('Content-Type');
- console.log('响应类型:', contentType);
- if (contentType && contentType.indexOf('application/pdf') !== -1) {
- console.log('返回的是PDF文件流');
- // 获取ArrayBuffer
- var arrayBuffer = xhr.response;
- console.log('PDF文件大小:', arrayBuffer ? arrayBuffer.byteLength : 0);
- if (!arrayBuffer || arrayBuffer.byteLength === 0) {
- console.error('PDF文件流为空');
- $('#generateStatus').html('PDF文件流为空').css('color', '#ff4d4f');
- alert('生成的PDF文件为空,请检查服务器端');
- return;
- }
- // 创建Blob
- var blob = new Blob([arrayBuffer], { type: 'application/pdf' });
- var fileName = params.documentTitle.replace(/[^\u4e00-\u9fa5a-zA-Z0-9]/g, '_') + '.pdf';
- console.log('生成的PDF文件名:', fileName, '文件大小:', blob.size);
- if (blob.size === 0) {
- console.error('Blob对象为空');
- $('#generateStatus').html('Blob对象为空').css('color', '#ff4d4f');
- alert('生成的PDF文件为空,请检查服务器端');
- return;
- }
- // 上传生成的PDF文件
- uploadGeneratedPdf(blob, fileName, function(uploadResult) {
- if (uploadResult && uploadResult.fileList && uploadResult.fileList.length > 0) {
- var filePath = uploadResult.fileList[0].path;
- var fileName = uploadResult.fileList[0].fileName;
- console.log('文件上传成功,路径:', filePath, '文件名:', fileName);
- // 构建完整的文件路径
- var fullFilePath = filePath;
- // 回填到上传路径输入框
- $('#scyjpath').val(fullFilePath);
- $('input[name="scyjwj"]').val(fullFilePath);
- $('input[name="uploadPath"]').val(fullFilePath);
- $('#scyjBaseName').text(fileName);
- $('input[name="scyjBaseName"]').val(fileName);
- $('#checkScyj').show();
- $('#qxScyj').show();
- $('#generateStatus').html('生成并上传成功!').css('color', '#52c41a');
- alert('公文生成并上传成功!文件路径:' + fullFilePath);
- } else {
- console.error('上传失败,返回结果:', uploadResult);
- $('#generateStatus').html('上传失败').css('color', '#ff4d4f');
- alert('上传失败,请重试');
- }
- });
- } else {
- console.log('返回的不是PDF,尝试解析JSON响应');
- try {
- // 尝试将响应解析为JSON
- var decoder = new TextDecoder('utf-8');
- var text = decoder.decode(new Uint8Array(xhr.response));
- var result = JSON.parse(text);
- console.log('解析后的JSON结果:', result);
- if (result.success === false) {
- $('#generateStatus').html('生成失败:' + (result.message || '未知错误')).css('color', '#ff4d4f');
- alert('生成失败:' + (result.message || '未知错误'));
- } else {
- $('#generateStatus').html('未知响应格式').css('color', '#ff4d4f');
- alert('未知响应格式,请检查接口');
- }
- } catch (e) {
- console.error('响应解析失败:', e);
- $('#generateStatus').html('响应解析失败').css('color', '#ff4d4f');
- alert('服务器响应异常:' + e.message);
- }
- }
- } else {
- console.error('HTTP请求失败,状态码:', xhr.status);
- $('#generateStatus').html('生成失败,状态码:' + xhr.status).css('color', '#ff4d4f');
- alert('生成失败,HTTP状态码:' + xhr.status);
- }
- };
- xhr.onerror = function() {
- console.error('网络错误');
- $('#generateStatus').html('生成失败:网络错误').css('color', '#ff4d4f');
- alert('生成失败:网络错误,请检查网络连接');
- };
- xhr.onloadend = function() {
- console.log('生成请求完成');
- isGenerating = false;
- $('#generateDocumentBtn').prop('disabled', false).css('opacity', 1);
- };
- console.log('开始生成公文,发送请求到服务器...');
- xhr.send(formData.toString());
- }
- // 上传生成的PDF文件
- function uploadGeneratedPdf(blob, fileName, callback) {
- console.log('开始上传生成的PDF文件:', fileName, '大小:', blob.size);
- $('#generateStatus').html('正在上传文件...').css('color', '#1890ff');
- if (blob.size === 0) {
- console.error('要上传的文件大小为0');
- alert('要上传的文件为空,无法上传');
- callback(null);
- return;
- }
- // 创建FormData
- var formData = new FormData();
- formData.append('file', blob, fileName);
- formData.append('name', fileName);
- formData.append('type', 'document');
- formData.append('app', wd.app ? wd.app.name : getAccountInfo().xmmc);
- console.log('FormData创建完成,开始上传...');
- // 使用原有的上传接口
- $.ajax({
- url: "/service?ssServ=ulByHttp&type=document",
- type: 'POST',
- data: formData,
- processData: false,
- contentType: false,
- xhr: function() {
- var xhr = new XMLHttpRequest();
- xhr.upload.addEventListener('progress', function(e) {
- if (e.lengthComputable) {
- var percentComplete = (e.loaded / e.total) * 100;
- $('#generateStatus').html('上传中... ' + Math.round(percentComplete) + '%');
- }
- }, false);
- return xhr;
- },
- beforeSend: function() {
- console.log('开始上传文件到服务器...');
- },
- success: function(result) {
- console.log('文件上传成功,返回结果:', result);
- try {
- if (typeof result === 'string') {
- result = JSON.parse(result);
- }
- // 这里不再检查success字段,只检查是否有fileList
- if (result && result.fileList && result.fileList.length > 0) {
- callback(result);
- } else {
- // 如果返回结果中没有fileList,但确实有有效数据,也可以认为是成功
- callback(result);
- }
- } catch (e) {
- console.error('解析上传响应失败:', e, '原始结果:', result);
- callback(null);
- }
- },
- error: function(xhr, status, error) {
- console.error('文件上传失败:', error, '状态:', status, 'XHR:', xhr);
- alert('文件上传失败:' + error);
- callback(null);
- }
- });
- }
- // 页面加载完成后初始化上传功能
- $(document).ready(function () {
- console.log('文档加载完成,开始初始化上传功能...');
- // 检查upload.js是否已加载
- if (typeof $.fn.uploadFile === 'undefined') {
- console.error('upload.js 未正确加载,请检查路径:/ss/js/upload.js');
- alert('文件上传插件加载失败,请联系管理员');
- return;
- }
- console.log('upload.js 已加载,开始初始化上传插件...');
- // 调试:检查按钮是否存在
- console.log('上传按钮是否存在:', $('#scyjEdit').length > 0);
- // 初始化上传插件
- try {
- console.log('开始初始化uploadFile插件...');
- // 使用upload.js插件
- $('#scyjEdit').uploadFile({
- name: 'scyj', // 必须与页面中的元素ID前缀一致
- type: 'document', // 上传类型,可根据需要设置
- validation: 'jpg,jpeg,png,pdf,doc,docx,xls,xlsx,ppt,pptx,txt,zip,rar', // 允许上传的文件类型
- size: 10240, // 文件大小限制,单位KB(10MB)
- app: wd.app ? wd.app.name : getAccountInfo().xmmc, // 应用名称
- action: "/service?ssServ=ulByHttp&type=document", // 明确指定action
- beforeClick: function () {
- // 点击前的验证逻辑,返回false可阻止上传
- console.log('开始选择文件...');
- return true;
- },
- onchange: function (settings) {
- // 文件选择后的回调
- console.log('已选择文件,准备上传...');
- },
- callback: function (result) {
- // 上传成功后的回调函数
- console.log('文件上传成功:', result);
- // 可以在这里添加额外的处理逻辑
- if (result && result.fileList && result.fileList.length > 0) {
- // 显示成功消息
- var fileName = result.fileList[0].fileName;
- alert('文件 "' + fileName + '" 上传成功!');
- // 自动填充上传路径输入框
- var filePath = result.fileList[0].path;
- if (filePath) {
- $('input[name="uploadPath"]').val(filePath);
- }
- // 文件上传成功之后, 获取对应的文件 , 并且将pdf文件解析出正文内容
- // 获取文件路径, 然后调用后端代码
- // if (filePath && filePath.toLowerCase().endsWith('.pdf')) {
- if (filePath ) {
- $.ajax({
- url: "<serv.ss name='ws_zh_pdf2html'/>",
- type: 'post',
- data: {
- path: filePath,
- fileName: fileName
- },
- success: function (result) {
- // 提取成功后, 将正文内容传输到正文控件中
- var parse = JSON.parse(result);
- console.log(parse.data);
- // 获取组件实例
- var editorElement = document.querySelector('ss-editor[name="zwwj"]');
- if (editorElement && editorElement.__vue__) {
- var vueInstance = editorElement.__vue__;
- // 尝试设置editorContent变量
- if (vueInstance.editorContent !== undefined) {
- vueInstance.editorContent = parse.data;
- console.log('通过editorContent变量设置成功');
- }
- // 触发change事件
- var changeEvent = new Event('change', { bubbles: true });
- editorElement.dispatchEvent(changeEvent);
- }
- },
- error: function(xhr, status, error) {
- console.warn('PDF解析失败:', error);
- }
- });
- }
- }
- }
- });
- console.log('uploadFile插件初始化成功');
- } catch (error) {
- console.error('上传插件初始化失败:', error);
- alert('上传插件初始化失败: ' + error.message);
- // 如果upload.js插件失败,使用简单方法
- $('#scyjEdit').off('click.simple').on('click.simple', function () {
- // 创建一个临时的文件input
- var fileInput = $('#scyjEdit_File');
- if (fileInput.length === 0) {
- $('body').append('<input type="file" id="scyjEdit_File" style="display:none;">');
- fileInput = $('#scyjEdit_File');
- }
- fileInput.off('change').on('change', function () {
- if (this.files.length > 0) {
- var fileName = this.files[0].name;
- $('#scyjBaseName').text(fileName);
- $('input[name="scyjBaseName"]').val(fileName);
- $('#checkScyj').show();
- $('#qxScyj').show();
- alert('已选择文件: ' + fileName);
- }
- });
- fileInput.click();
- });
- }
- // 添加上传路径输入框的点击事件
- $('#scyjpath').click(function () {
- var currentPath = $(this).val();
- if (currentPath) {
- $(this).select();
- }
- });
- // 为删除按钮添加确认提示
- $('body').on('click', '#qxScyj', function (e) {
- if (!confirm('确定要删除已上传的文件吗?')) {
- e.preventDefault();
- return false;
- }
- });
- // 初始化页面时检查是否有已上传的文件
- var existingFile = $('input[name="scyjwj"]').val();
- if (existingFile) {
- var fileName = existingFile.split('/').pop();
- $('#scyjBaseName').text(fileName);
- $('input[name="scyjBaseName"]').val(fileName);
- $('#checkScyj').show();
- $('#qxScyj').show();
- $('input[name="uploadPath"]').val(existingFile);
- }
- console.log('文件上传功能初始化完成');
- });
- // 表单提交前的验证函数
- function validateForm() {
- var filePath = $('input[name="scyjwj"]').val();
- var title = $('input[name="bt"]').val();
- if (!title || title.trim() === '') {
- alert('请填写标题');
- $('input[name="bt"]').focus();
- return false;
- }
- if (!filePath || filePath.trim() === '') {
- if (!confirm('您尚未上传原件,确定要继续提交吗?')) {
- $('#scyjEdit').focus();
- return false;
- }
- }
- return true;
- }
- // 修复uploadFile插件的问题
- function fixUploadPlugin() {
- // 检查是否有必要的CSS样式
- if (!$('.content-button').length) {
- $('#scyjEdit').addClass('content-button');
- }
- // 确保文件输入框存在
- if (!$('#scyjEdit_File').length) {
- $('body').append('<input type="file" id="scyjEdit_File" name="fileEdit" style="display:none;">');
- }
- // 手动绑定点击事件
- $('#scyjEdit').off('click.manual').on('click.manual', function () {
- console.log('手动触发文件选择对话框');
- $('#scyjEdit_File').click();
- });
- // 监听文件选择
- $('#scyjEdit_File').off('change').on('change', function (e) {
- console.log('文件已选择:', this.files);
- if (this.files && this.files.length > 0) {
- var fileName = this.files[0].name;
- var fileSize = this.files[0].size;
- var fileType = this.files[0].type;
- console.log('文件名:', fileName, '大小:', fileSize, '类型:', fileType);
- // 显示文件信息
- $('#scyjBaseName').text(fileName);
- $('input[name="scyjBaseName"]').val(fileName);
- // 模拟上传
- simulateUpload(fileName, fileSize);
- }
- });
- }
- // 模拟文件上传
- function simulateUpload(fileName, fileSize) {
- console.log('开始模拟上传文件:', fileName);
- // 显示进度条
- $('#scyjBaseName').html('<div class="progress"><div class="bar"></div><div class="percent">0%</div></div>');
- // 模拟上传进度
- var progress = 0;
- var interval = setInterval(function () {
- progress += 10;
- if (progress <= 100) {
- $('.bar').width(progress + '%');
- $('.percent').text(progress + '%');
- if (progress === 100) {
- clearInterval(interval);
- // 模拟上传完成
- setTimeout(function () {
- // 生成模拟文件路径
- var timestamp = new Date().getTime();
- var filePath = '/uploads/' + timestamp + '_' + fileName;
- // 更新页面
- $('#scyjBaseName').text(fileName);
- $('input[name="scyjwj"]').val(filePath);
- $('input[name="uploadPath"]').val(filePath);
- $('#checkScyj').show();
- $('#qxScyj').show();
- alert('文件 "' + fileName + '" 上传成功!');
- }, 500);
- }
- }
- }, 200);
- }
- // 页面完全加载后修复插件
- $(window).on('load', function () {
- console.log('页面完全加载完成,检查上传功能...');
- // 如果upload.js插件没有正常工作,使用修复方法
- setTimeout(function () {
- if ($('#scyjEdit').length && !$('#scyjEdit').data('upload-initialized')) {
- console.log('使用备用上传方案');
- fixUploadPlugin();
- }
- }, 1000);
- });
- </script>
|