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