From 3f6bf89b1985b6668f02ffcc9af577b412e92e45 Mon Sep 17 00:00:00 2001 From: zhouwx <1175765986@qq.com> Date: 星期一, 24 三月 2025 17:17:45 +0800 Subject: [PATCH] bug修改 --- src/api/projectManage/project.js | 9 ++ src/views/safetyReview/projectManage/components/employNoticeRecord.vue | 110 ++++++++++++++++++++++----- package.json | 5 + src/views/safetyReview/projectManage/components/exportWord.js | 55 +++++++++++++ public/example.docx | 0 src/views/safetyReview/projectManage/components/riskAnalysis.vue | 15 +++ 6 files changed, 171 insertions(+), 23 deletions(-) diff --git a/package.json b/package.json index 101e041..d6c01f4 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "ruoyi", "version": "3.8.6", - "description": "智慧安评", + "description": "新疆维吾尔自治区智慧安评服务平台", "author": "若依", "license": "MIT", "scripts": { @@ -23,6 +23,7 @@ "@wangeditor/editor-for-vue": "^5.1.12", "@wangeditor/plugin-upload-attachment": "^1.1.0", "axios": "0.27.2", + "docxtemplater": "^3.60.2", "echarts": "5.4.0", "element-plus": "2.2.27", "file-saver": "2.0.5", @@ -30,8 +31,10 @@ "js-base64": "^3.7.5", "js-cookie": "3.0.1", "jsencrypt": "3.3.1", + "jszip-utils": "^0.1.0", "nprogress": "0.2.0", "pinia": "2.0.22", + "pizzip": "^3.1.8", "quill": "^2.0.0-dev.3", "tinymce": "^5.10.2", "vue": "3.2.45", diff --git a/public/example.docx b/public/example.docx new file mode 100644 index 0000000..7175243 --- /dev/null +++ b/public/example.docx Binary files differ diff --git a/src/api/projectManage/project.js b/src/api/projectManage/project.js index a641046..fd5ca57 100644 --- a/src/api/projectManage/project.js +++ b/src/api/projectManage/project.js @@ -17,6 +17,15 @@ }) } +export function getProjectDetail(data) { + return request({ + url: '/manage/project/detail/' + data, + method: 'get' + + }) +} + + export function getProjectStatistics(params) { return request({ url: '/manage/project/statistics', diff --git a/src/views/safetyReview/projectManage/components/employNoticeRecord.vue b/src/views/safetyReview/projectManage/components/employNoticeRecord.vue index d84f6ee..3c03834 100644 --- a/src/views/safetyReview/projectManage/components/employNoticeRecord.vue +++ b/src/views/safetyReview/projectManage/components/employNoticeRecord.vue @@ -64,30 +64,34 @@ </el-table-column> </el-table> </el-form> - <el-upload - style="margin-top: 25px;width: 250px" - :disabled="projectType === 'view' || isEnd" - accept=".pdf" - :action="state.uploadUrl" - :data="{moduleType: 12,projectId: props.projectId}" - :headers="state.header" - method="post" - :limit="state.imgLimit" - :before-upload="beforeUpload" - :on-success="handleAvatarSuccess" - v-model:file-list="state.fileList" - :on-preview="handlePreview" - :on-remove="handleRemove"> - <el-button type="primary">上传从业告知书pdf</el-button> - <template #tip> - <div class="el-upload__tip">只能上传pdf类型,最多上传1份</div> - </template> - </el-upload> + <div style="display: flex;margin-top: 25px;"> + <el-button type="primary" style="margin-right: 20px" @click="exportWord">导出从业告知书word</el-button> + <el-upload + style="width: 250px" + :disabled="projectType === 'view' || isEnd" + accept=".pdf" + :action="state.uploadUrl" + :data="{moduleType: 12,projectId: props.projectId}" + :headers="state.header" + method="post" + :limit="state.imgLimit" + :before-upload="beforeUpload" + :on-success="handleAvatarSuccess" + v-model:file-list="state.fileList" + :on-preview="handlePreview" + :on-remove="handleRemove"> + <el-button type="primary">上传从业告知书pdf</el-button> + <template #tip> + <div class="el-upload__tip">只能上传pdf类型,最多上传1份</div> + </template> + </el-upload> + </div> </div> </template> <script setup> import {defineEmits, defineProps, onMounted, reactive, ref, watchEffect} from "vue" +import {generateWordDocument} from "@/views/safetyReview/projectManage/components/exportWord"; import {ElMessage, ElMessageBox} from "element-plus" import {Search} from '@element-plus/icons-vue' import {addWorkRecord, editWorkRecord, getWorkDetail} from "@/api/projectManage/employNoticeRcd" @@ -98,7 +102,7 @@ import { useRoute } from 'vue-router' import {getToken} from "@/utils/auth"; import {getFiles} from "@/api/projectManage/siteCheckRcd"; -import {delAccessoryFile} from "@/api/projectManage/project"; +import {delAccessoryFile, getProjectDetail} from "@/api/projectManage/project"; import axios from "axios"; const route = useRoute() const state = reactive({ @@ -135,6 +139,7 @@ if(props.projectId){ getWorksList(props.projectId) getProcessFiles(props.projectId); + getPDetail(props.projectId) } isEnd.value = Cookies.get('end') @@ -312,6 +317,71 @@ const url = file.url window.open(url) } + +const templatePath = '/example.docx' +const exportWord = async () => { + const data = state.formData + for (let key in projectDeatil.value) { + if (projectDeatil.value.hasOwnProperty(key)) { + if(key != 'agency') + data[key] = projectDeatil.value[key]; + } + } + const agencyInfo = projectDeatil.value.agency + for (let key in agencyInfo) { + if (agencyInfo.hasOwnProperty(key)) { + if(key != 'address' && key != 'name' ) + data[key] = agencyInfo[key]; + } + } + data.leaderName = projectDeatil.value.leader.name + data.leaderPhone = projectDeatil.value.leader.phone + + data.type = '安全评价' + data.to = data.city + '应急管理局' + data.notice = '系统告知' + data.investigationPlanDate = state.formData.investigationPlanDate.substring(0,10) + data.serviceStartDate = state.formData.serviceStartDate.substring(0,10) + data.serviceEndDate = state.formData.serviceEndDate.substring(0,10) + data.tableData = state.planPersons.map(item => { + return { + ...item, + name: item.person.name + } + }) + console.log('res',data) + const date = new Date() + const options = { + year: 'numeric', + month: '2-digit', + day: '2-digit' + } + data.time = date.toLocaleDateString('zh-CN',options).replace(/\//g, '年') + .replace(/年(\d{2})年/, '年$1月') + .replace(/月(\d{2})$/, '月$1日') + try { + generateWordDocument(templatePath, data, '从业告知书.docx'); + } catch (error){ + ElMessage({ + type: 'warning', + message: '失败' + }); + } +} + +const projectDeatil = ref() +const getPDetail = async (val) => { + const res = await getProjectDetail(val) + if(res.code == 200){ + projectDeatil.value = res.data + + }else { + ElMessage.warning(res.message) + } + +} + + defineExpose({ riskOpen }); diff --git a/src/views/safetyReview/projectManage/components/exportWord.js b/src/views/safetyReview/projectManage/components/exportWord.js new file mode 100644 index 0000000..3ba3d7b --- /dev/null +++ b/src/views/safetyReview/projectManage/components/exportWord.js @@ -0,0 +1,55 @@ +//引入工具 +import PizZip from 'pizzip'; +import Docxtemplater from 'docxtemplater'; +import JSZipUtils from 'jszip-utils'; +import { saveAs } from 'file-saver'; + +// 加载 .docx 模板文件 +function loadFile(url, callback) { + JSZipUtils.getBinaryContent(url, callback); +} + +// 下载生成的文档 +export function download(file, name) { + +} + +// 生成并下载 Word 文档(templatePath是word文档模版地址,data是对应的数据) +export function generateWordDocument(templatePath, data, name) { + loadFile(templatePath, function (error, content) { + if (error) { + throw error + return; + } + + try { + // 加载模板文件内容到 PizZip + const zip = new PizZip(content); + const doc = new Docxtemplater(zip, { + paragraphLoop: true, + linebreaks: true, + }); + + // 设置模板中的占位符数据 + doc.setData(data); + + // 渲染文档 + doc.render(); + + // 生成最终的文档 Blob + const fileWord = doc.getZip().generate({ + type: 'blob', + mimeType: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', + }); + + saveAs(fileWord, name); + + // // 返回生成的文档 Blob + // resolve(fileWord); + } catch (error) { + console.error('Error rendering document:', error); + throw error + } + }); + +} diff --git a/src/views/safetyReview/projectManage/components/riskAnalysis.vue b/src/views/safetyReview/projectManage/components/riskAnalysis.vue index 9929b64..8a57954 100644 --- a/src/views/safetyReview/projectManage/components/riskAnalysis.vue +++ b/src/views/safetyReview/projectManage/components/riskAnalysis.vue @@ -355,10 +355,21 @@ } } const getArea = async ()=>{ - const type = 1 + const type = 0 const res = await getRegionTree({name: '',parentId: null,regionType: type}) if(res.code == 200){ - state.addressList = res.data + const data = res.data.map(item => { + return { + ...item, + children: null + } + }) + const area = { + id: 469, + name: "新疆维吾尔自治区", + children: data + } + state.addressList = [area] }else{ ElMessage.warning(res.message) } -- Gitblit v1.9.2