浏览代码

Merge remote-tracking branch 'origin/dev' into dev

Hwf 4 月之前
父节点
当前提交
da8041c337

+ 15 - 5
package-lock.json

@@ -43,7 +43,6 @@
         "file-saver": "^2.0.5",
         "file-saver": "^2.0.5",
         "fuse.js": "7.0.0",
         "fuse.js": "7.0.0",
         "gcoord": "^1.0.7",
         "gcoord": "^1.0.7",
-        "handsontable": "^15.1.0",
         "highlight.js": "11.9.0",
         "highlight.js": "11.9.0",
         "html2canvas": "^1.4.1",
         "html2canvas": "^1.4.1",
         "image-conversion": "^2.1.1",
         "image-conversion": "^2.1.1",
@@ -1237,7 +1236,8 @@
       "version": "1.0.0",
       "version": "1.0.0",
       "resolved": "https://registry.npmmirror.com/@handsontable/pikaday/-/pikaday-1.0.0.tgz",
       "resolved": "https://registry.npmmirror.com/@handsontable/pikaday/-/pikaday-1.0.0.tgz",
       "integrity": "sha512-1VN6N38t5/DcjJ7y7XUYrDx1LuzvvzlrFdBdMG90Qo1xc8+LXHqbWbsTEm5Ec5gXTEbDEO53vUT35R+2COmOyg==",
       "integrity": "sha512-1VN6N38t5/DcjJ7y7XUYrDx1LuzvvzlrFdBdMG90Qo1xc8+LXHqbWbsTEm5Ec5gXTEbDEO53vUT35R+2COmOyg==",
-      "license": "(0BSD OR MIT)"
+      "license": "(0BSD OR MIT)",
+      "peer": true
     },
     },
     "node_modules/@handsontable/vue3": {
     "node_modules/@handsontable/vue3": {
       "version": "15.1.0",
       "version": "15.1.0",
@@ -4717,7 +4717,8 @@
       "resolved": "https://registry.npmmirror.com/@types/trusted-types/-/trusted-types-2.0.7.tgz",
       "resolved": "https://registry.npmmirror.com/@types/trusted-types/-/trusted-types-2.0.7.tgz",
       "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==",
       "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==",
       "license": "MIT",
       "license": "MIT",
-      "optional": true
+      "optional": true,
+      "peer": true
     },
     },
     "node_modules/@types/uuid": {
     "node_modules/@types/uuid": {
       "version": "10.0.0",
       "version": "10.0.0",
@@ -7251,6 +7252,7 @@
       "resolved": "https://registry.npmmirror.com/chevrotain/-/chevrotain-6.5.0.tgz",
       "resolved": "https://registry.npmmirror.com/chevrotain/-/chevrotain-6.5.0.tgz",
       "integrity": "sha512-BwqQ/AgmKJ8jcMEjaSnfMybnKMgGTrtDKowfTP3pX4jwVy0kNjRsT/AP6h+wC3+3NC+X8X15VWBnTCQlX+wQFg==",
       "integrity": "sha512-BwqQ/AgmKJ8jcMEjaSnfMybnKMgGTrtDKowfTP3pX4jwVy0kNjRsT/AP6h+wC3+3NC+X8X15VWBnTCQlX+wQFg==",
       "optional": true,
       "optional": true,
+      "peer": true,
       "dependencies": {
       "dependencies": {
         "regexp-to-ast": "0.4.0"
         "regexp-to-ast": "0.4.0"
       }
       }
@@ -7532,6 +7534,7 @@
       "integrity": "sha512-7vsMc/Lty6AGnn7uFpYT56QesI5D2Y/UkgKounk87OP9Z2H9Z8kj6jzcSGAxFmUtDOS0ntK6lbQz+Nsa0Jj6mQ==",
       "integrity": "sha512-7vsMc/Lty6AGnn7uFpYT56QesI5D2Y/UkgKounk87OP9Z2H9Z8kj6jzcSGAxFmUtDOS0ntK6lbQz+Nsa0Jj6mQ==",
       "hasInstallScript": true,
       "hasInstallScript": true,
       "license": "MIT",
       "license": "MIT",
+      "peer": true,
       "funding": {
       "funding": {
         "type": "opencollective",
         "type": "opencollective",
         "url": "https://opencollective.com/core-js"
         "url": "https://opencollective.com/core-js"
@@ -8113,6 +8116,7 @@
       "resolved": "https://registry.npmmirror.com/dompurify/-/dompurify-3.2.4.tgz",
       "resolved": "https://registry.npmmirror.com/dompurify/-/dompurify-3.2.4.tgz",
       "integrity": "sha512-ysFSFEDVduQpyhzAob/kkuJjf5zWkZD8/A9ywSp1byueyuCfHamrCBa14/Oc2iiB0e51B+NpxSl5gmzn+Ms/mg==",
       "integrity": "sha512-ysFSFEDVduQpyhzAob/kkuJjf5zWkZD8/A9ywSp1byueyuCfHamrCBa14/Oc2iiB0e51B+NpxSl5gmzn+Ms/mg==",
       "license": "(MPL-2.0 OR Apache-2.0)",
       "license": "(MPL-2.0 OR Apache-2.0)",
+      "peer": true,
       "optionalDependencies": {
       "optionalDependencies": {
         "@types/trusted-types": "^2.0.7"
         "@types/trusted-types": "^2.0.7"
       }
       }
@@ -9742,6 +9746,7 @@
       "version": "15.1.0",
       "version": "15.1.0",
       "resolved": "https://registry.npmmirror.com/handsontable/-/handsontable-15.1.0.tgz",
       "resolved": "https://registry.npmmirror.com/handsontable/-/handsontable-15.1.0.tgz",
       "integrity": "sha512-tRCdIap3qSydy1bwM5UwMbsgAlcvnUjA3m+6nCblVXHCGBE0a5eHiYoGMX6iCF/JIKGZbMO5aAtzE6u3G18jfQ==",
       "integrity": "sha512-tRCdIap3qSydy1bwM5UwMbsgAlcvnUjA3m+6nCblVXHCGBE0a5eHiYoGMX6iCF/JIKGZbMO5aAtzE6u3G18jfQ==",
+      "peer": true,
       "dependencies": {
       "dependencies": {
         "@handsontable/pikaday": "^1.0.0",
         "@handsontable/pikaday": "^1.0.0",
         "core-js": "^3.37.0",
         "core-js": "^3.37.0",
@@ -9990,6 +9995,7 @@
       "resolved": "https://registry.npmmirror.com/hyperformula/-/hyperformula-3.0.0.tgz",
       "resolved": "https://registry.npmmirror.com/hyperformula/-/hyperformula-3.0.0.tgz",
       "integrity": "sha512-fAmwxQnbo405llUZiLcnrQTWA26kmbWZk+Cn58PJrANJ/xHBk7ls0ilcNJRIJdti5Z6AqPVi0hZSKvHLbTYtyQ==",
       "integrity": "sha512-fAmwxQnbo405llUZiLcnrQTWA26kmbWZk+Cn58PJrANJ/xHBk7ls0ilcNJRIJdti5Z6AqPVi0hZSKvHLbTYtyQ==",
       "optional": true,
       "optional": true,
+      "peer": true,
       "dependencies": {
       "dependencies": {
         "chevrotain": "^6.5.0",
         "chevrotain": "^6.5.0",
         "tiny-emitter": "^2.1.0"
         "tiny-emitter": "^2.1.0"
@@ -11152,6 +11158,7 @@
       "resolved": "https://registry.npmmirror.com/moment/-/moment-2.30.1.tgz",
       "resolved": "https://registry.npmmirror.com/moment/-/moment-2.30.1.tgz",
       "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==",
       "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==",
       "license": "MIT",
       "license": "MIT",
+      "peer": true,
       "engines": {
       "engines": {
         "node": "*"
         "node": "*"
       }
       }
@@ -11368,6 +11375,7 @@
       "resolved": "https://registry.npmmirror.com/numbro/-/numbro-2.5.0.tgz",
       "resolved": "https://registry.npmmirror.com/numbro/-/numbro-2.5.0.tgz",
       "integrity": "sha512-xDcctDimhzko/e+y+Q2/8i3qNC9Svw1QgOkSkQoO0kIPI473tR9QRbo2KP88Ty9p8WbPy+3OpTaAIzehtuHq+A==",
       "integrity": "sha512-xDcctDimhzko/e+y+Q2/8i3qNC9Svw1QgOkSkQoO0kIPI473tR9QRbo2KP88Ty9p8WbPy+3OpTaAIzehtuHq+A==",
       "license": "MIT",
       "license": "MIT",
+      "peer": true,
       "dependencies": {
       "dependencies": {
         "bignumber.js": "^8 || ^9"
         "bignumber.js": "^8 || ^9"
       },
       },
@@ -12837,7 +12845,8 @@
       "version": "0.4.0",
       "version": "0.4.0",
       "resolved": "https://registry.npmmirror.com/regexp-to-ast/-/regexp-to-ast-0.4.0.tgz",
       "resolved": "https://registry.npmmirror.com/regexp-to-ast/-/regexp-to-ast-0.4.0.tgz",
       "integrity": "sha512-4qf/7IsIKfSNHQXSwial1IFmfM1Cc/whNBQqRwe0V2stPe7KmN1U0tWQiIx6JiirgSrisjE0eECdNf7Tav1Ntw==",
       "integrity": "sha512-4qf/7IsIKfSNHQXSwial1IFmfM1Cc/whNBQqRwe0V2stPe7KmN1U0tWQiIx6JiirgSrisjE0eECdNf7Tav1Ntw==",
-      "optional": true
+      "optional": true,
+      "peer": true
     },
     },
     "node_modules/regexp-util": {
     "node_modules/regexp-util": {
       "version": "2.0.0",
       "version": "2.0.0",
@@ -14161,7 +14170,8 @@
       "version": "2.1.0",
       "version": "2.1.0",
       "resolved": "https://registry.npmmirror.com/tiny-emitter/-/tiny-emitter-2.1.0.tgz",
       "resolved": "https://registry.npmmirror.com/tiny-emitter/-/tiny-emitter-2.1.0.tgz",
       "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==",
       "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==",
-      "optional": true
+      "optional": true,
+      "peer": true
     },
     },
     "node_modules/tiny-inflate": {
     "node_modules/tiny-inflate": {
       "version": "1.0.3",
       "version": "1.0.3",

+ 0 - 1
package.json

@@ -52,7 +52,6 @@
     "file-saver": "^2.0.5",
     "file-saver": "^2.0.5",
     "fuse.js": "7.0.0",
     "fuse.js": "7.0.0",
     "gcoord": "^1.0.7",
     "gcoord": "^1.0.7",
-    "handsontable": "^15.1.0",
     "highlight.js": "11.9.0",
     "highlight.js": "11.9.0",
     "html2canvas": "^1.4.1",
     "html2canvas": "^1.4.1",
     "image-conversion": "^2.1.1",
     "image-conversion": "^2.1.1",

+ 11 - 1
src/api/dataFilling/fillingManage.ts

@@ -55,4 +55,14 @@ export const fillingTable = (reportId) => {
   });
   });
 };
 };
 
 
-
+// 我的填报-填表-上报
+export function fillingReport(reportId, form) {
+  return request({
+    url: '/api/dataFilling/submission-status',
+    method: 'post',
+    data: {
+      report_id: reportId,
+      data: form
+    }
+  });
+}

+ 1 - 1
src/views/dataFilling/fillingAdd.vue

@@ -334,7 +334,7 @@ const handleFileUpload = ({ file }) => {
       const firstSheetName = workbook.SheetNames[0];
       const firstSheetName = workbook.SheetNames[0];
       const worksheet = workbook.Sheets[firstSheetName];
       const worksheet = workbook.Sheets[firstSheetName];
       const jsonData = XLSX.utils.sheet_to_json(worksheet, { header: 1 });
       const jsonData = XLSX.utils.sheet_to_json(worksheet, { header: 1 });
-      hotData.value = jsonData.slice(1); // 假设第一行是标题行,我们跳过它
+      hotData.value = jsonData.splice(0, 1); // 假设第一行是标题行,我们跳过它
       showTable.value = true;
       showTable.value = true;
     });
     });
   };
   };

+ 4 - 28
src/views/dataFilling/formDetail.vue

@@ -16,17 +16,7 @@
         </el-row>
         </el-row>
       </el-col>
       </el-col>
       <el-col :lg="30" :xs="24">
       <el-col :lg="30" :xs="24">
-<!--        <el-table :data="tableData" border>-->
-<!--          <el-table-column v-for="header in editableHeaders" :key="header" :label="header" :prop="header">-->
-<!--            <template #header="{ column }">-->
-<!--              <span class="editable-header" v-text="column.label"></span>-->
-<!--            </template>-->
-<!--            <template #default="{ row, $index }">-->
-<!--              <span class="editable-span" v-text="row[header]"></span>-->
-<!--            </template>-->
-<!--          </el-table-column>-->
-<!--        </el-table>-->
-        <div style="height: 400px">
+        <div :style="{ height: tableHeight + 'px' }">
           <hot-table v-if="tableData.length > 0" ref="wrapper" :data="tableData" :settings="hotSettings" />
           <hot-table v-if="tableData.length > 0" ref="wrapper" :data="tableData" :settings="hotSettings" />
         </div>
         </div>
       </el-col>
       </el-col>
@@ -56,6 +46,7 @@ const detailData = ref({
   start: '',
   start: '',
   end: ''
   end: ''
 });
 });
+let tableHeight = window.innerHeight - 230
 
 
 const exportToExcel = () => {
 const exportToExcel = () => {
   const worksheet = XLSX.utils.json_to_sheet(tableData.value);
   const worksheet = XLSX.utils.json_to_sheet(tableData.value);
@@ -72,26 +63,10 @@ const exportToExcel = () => {
 };
 };
 
 
 const fetchFillDetail = async () => {
 const fetchFillDetail = async () => {
-  // try {
-  //   const res = await fillDetail({ report_id: props.eventId });
-  //   tableData.value = res.data.map((item) => ({
-  //     '员工姓名': item.ygxm,
-  //     '员工性别': item.ygxb,
-  //     '加班小时': item.jbxs,
-  //     '新的备注': item.bz,
-  //     '新的地址': item.dz
-  //   }));
-  //   detailData.value.start = res.start_time;
-  //   detailData.value.end = res.end_time;
-  // } catch (error) {
-  //   console.error('Error fetching data:', error);
-  // }
   fillDetail({ report_id: props.eventId }).then((res) => {
   fillDetail({ report_id: props.eventId }).then((res) => {
     detailData.value.start = res.start_time;
     detailData.value.start = res.start_time;
     detailData.value.end = res.end_time;
     detailData.value.end = res.end_time;
-    // tableData.value = res.data;
-
-    tableData.value = res.data.map(item => [item.ygxm, item.ygxb, item.jbxs, item.bz, item.dz]);
+    tableData.value = res.data;
   })
   })
 };
 };
 
 
@@ -101,6 +76,7 @@ const handleReturn = () => {
 
 
 const hotSettings = reactive({
 const hotSettings = reactive({
   language: 'zh-CN',
   language: 'zh-CN',
+  readOnly: true,
   colHeaders: true,
   colHeaders: true,
   rowHeaders: true,
   rowHeaders: true,
   autoColumnSize: true,
   autoColumnSize: true,

+ 207 - 78
src/views/dataFilling/writeForm.vue

@@ -23,7 +23,12 @@
       </el-col>
       </el-col>
       <el-row :gutter="10" class="mb8">
       <el-row :gutter="10" class="mb8">
         <el-col :span="1.5">
         <el-col :span="1.5">
-          <el-button type="primary" @click="handleAdd">批量导入</el-button>
+<!--          <el-button type="primary" @click="handleAdd">导入</el-button>-->
+          <el-upload class="upload-demo" :http-request="handleAdd" :before-upload="beforeUpload" accept=".xlsx, .xls">
+            <template #trigger>
+              <el-button size="big" type="primary">导入</el-button>
+            </template>
+          </el-upload>
         </el-col>
         </el-col>
         <el-col :span="1.5">
         <el-col :span="1.5">
           <el-button type="primary" @click="handleDownloadEmptyTable">下载空表格</el-button>
           <el-button type="primary" @click="handleDownloadEmptyTable">下载空表格</el-button>
@@ -33,26 +38,15 @@
         </el-col>
         </el-col>
       </el-row>
       </el-row>
       <el-col :lg="30" :xs="24">
       <el-col :lg="30" :xs="24">
-        <el-table :data="tableData" border>
-          <el-table-column v-for="header in editableHeaders" :key="header" :label="header" :prop="header">
-            <template #header="{ column }">
-              <span
-                class="editable-header"
-                contenteditable="true"
-                @blur="saveHeader(column.label, $event.target.innerText)"
-                v-text="column.label"
-              ></span>
-            </template>
-            <template #default="{ row, $index }">
-              <span
-                class="editable-span"
-                contenteditable="true"
-                @blur="saveEdit($index, header, $event.target.innerText)"
-                v-text="row[header]"
-              ></span>
-            </template>
-          </el-table-column>
-        </el-table>
+        <div :style="{ height: tableHeight + 'px' }">
+          <hot-table ref="wrapper" :data="tableData" :settings="hotSettings" />
+        </div>
+<!--        <div  :style="{ height: tableHeight + 'px' }" style="height: 400px">-->
+<!--          <hot-table :settings="hotSettings">-->
+<!--            <hot-column v-for="item in editableHeaders" :title="item.field_comment">-->
+<!--            </hot-column>-->
+<!--          </hot-table>-->
+<!--        </div>-->
       </el-col>
       </el-col>
     </el-row>
     </el-row>
   </div>
   </div>
@@ -61,50 +55,64 @@
 <script setup lang="ts">
 <script setup lang="ts">
 import * as XLSX from 'xlsx';
 import * as XLSX from 'xlsx';
 import { writeView, submitFill } from '@/api/dataFilling/datafilling';
 import { writeView, submitFill } from '@/api/dataFilling/datafilling';
+import { HotTable, HotColumn } from '@handsontable/vue3';
+import 'handsontable/languages';
+import 'handsontable/dist/handsontable.full.css';
+import { registerAllModules } from 'handsontable/registry';
+import { ElButton } from 'element-plus';
+import { ref } from 'vue';
+import { fillingReport } from '@/api/dataFilling/fillingManage';
+registerAllModules();
 
 
 const props = defineProps({
 const props = defineProps({
   eventId: String
   eventId: String
 });
 });
 
 
 const emits = defineEmits(['close']);
 const emits = defineEmits(['close']);
-
+let wrapper = ref();
+let tableHeight = window.innerHeight - 230
 const detailData = ref({
 const detailData = ref({
   title: '表单数据',
   title: '表单数据',
   start: '2024-10-15 17:02:22',
   start: '2024-10-15 17:02:22',
   end: '2024-10-15 18:00:00'
   end: '2024-10-15 18:00:00'
 });
 });
 
 
+const fileList = ref([]);
+const { proxy } = getCurrentInstance();
 const editableHeaders = ref<string[]>([]);
 const editableHeaders = ref<string[]>([]);
 const tableData = ref<any[]>([]);
 const tableData = ref<any[]>([]);
 const headerMapping = ref<{ [key: string]: string }>({});
 const headerMapping = ref<{ [key: string]: string }>({});
+const fields = ref();
 // 获取表头数据
 // 获取表头数据
 const fetchHeaders = async () => {
 const fetchHeaders = async () => {
-  try {
-    const response = await writeView({ report_id: props.eventId });
-    if (response.code === 200) {
-      const headers = response.fields.map((field) => field.field_comment);
-      editableHeaders.value = headers;
-
-      // 填充映射
-      response.fields.forEach(field => {
-        headerMapping.value[field.field_comment] = field.field_name;
-      });
-    } else {
-      console.error('获取表头失败:', response.msg);
-    }
-  } catch (error) {
-    console.error('请求错误:', error);
-  }
-};
+  const response = await writeView({ report_id: props.eventId });
+  fields.value = response.fields;
+  const headers = response.fields.map((field) => field.field_comment);
+  editableHeaders.value = headers;
+  let arr1 = [];
+  let arr2 = [];
+  let arr3 = [];
 
 
-// 初始化表格数据
-const loadFromLocalStorage = () => {
-  const storedData = localStorage.getItem('tableData');
-  if (storedData) {
-    tableData.value = JSON.parse(storedData);
+  // tableData.value = response.tableData;
+  //如果tableData是空就用下满这段,tableData有数据就用tableData的内容
+  if (!response.tableData || response.tableData.length === 0) {
+    headers.forEach((item) => {
+      arr1.push('');
+      arr2.push('');
+      arr3.push('');
+    })
+    tableData.value = [arr1, arr2 ,arr3];
+    wrapper.value.hotInstance.loadData([arr1, arr2 ,arr3]);
   } else {
   } else {
-    tableData.value = [];
+    tableData.value = response.tableData
+    wrapper.value.hotInstance.loadData(response.tableData);
   }
   }
+
+      // 填充映射
+      // response.fields.forEach(field => {
+      //   headerMapping.value[field.field_comment] = field.field_name;
+      // });
+
 };
 };
 
 
 const addDefaultRow = () => {
 const addDefaultRow = () => {
@@ -127,7 +135,16 @@ const saveHeader = (header, newValue) => {
 };
 };
 
 
 const exportToExcel = () => {
 const exportToExcel = () => {
-  const worksheet = XLSX.utils.json_to_sheet(tableData.value);
+  let resultList = [];
+  resultList.push(editableHeaders.value);
+  // editableHeaders.value.forEach((header) => {
+  //   resultList.push(header);
+  // })
+  tableData.value.forEach((item) => {
+    resultList.push(item);
+  })
+
+  const worksheet = XLSX.utils.aoa_to_sheet(resultList);
   const workbook = { Sheets: { data: worksheet }, SheetNames: ['data'] };
   const workbook = { Sheets: { data: worksheet }, SheetNames: ['data'] };
   const excelBuffer = XLSX.write(workbook, { bookType: 'xlsx', type: 'array' });
   const excelBuffer = XLSX.write(workbook, { bookType: 'xlsx', type: 'array' });
 
 
@@ -140,51 +157,164 @@ const exportToExcel = () => {
   window.URL.revokeObjectURL(url); // 清理
   window.URL.revokeObjectURL(url); // 清理
 };
 };
 
 
-const handleAdd = () => console.log('批量导入');
+const handleAdd = ({file}) => {
+
+  const reader = new FileReader();
+  reader.onload = (event) => {
+    nextTick(() => {
+      const data = new Uint8Array(event.target.result);
+      const workbook = XLSX.read(data, { type: 'array' });
+      const firstSheetName = workbook.SheetNames[0];
+      const worksheet = workbook.Sheets[firstSheetName];
+      const jsonData = XLSX.utils.sheet_to_json(worksheet, { header: 1 });
+      tableData.value = jsonData.slice(1); // 假设第一行是标题行,我们跳过它
+      wrapper.value.hotInstance.loadData(tableData.value);
+    });
+  };
+  reader.readAsArrayBuffer(file);
+  fileList.value = [];
+  return { success: true, file };
+};
+const beforeUpload = (file) => {
+  const isExcel = file.type === 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' || file.type === 'application/vnd.ms-excel';
+  if (!isExcel) {
+    proxy.$modal.msgError('只能上传xlsx/xls文件!');
+  }
+  return isExcel;
+};
+
 const handleDownloadEmptyTable = () => console.log('下载空表格');
 const handleDownloadEmptyTable = () => console.log('下载空表格');
-const handleAddRow = () => addDefaultRow();
+const handleAddRow = () => {
+  wrapper.value.hotInstance.alter('insert_row_below', wrapper.value.hotInstance.countRows()); // 在末尾插入空行
+}
 const handleSave = () => {
 const handleSave = () => {
-  localStorage.setItem('tableData', JSON.stringify(tableData.value));
-  alert('数据已保存');
+
+
+
+  // localStorage.setItem('tableData', JSON.stringify(tableData.value));
+  // alert('数据已保存');
 };
 };
 const handleReturn = () => {
 const handleReturn = () => {
   emits('close');
   emits('close');
 };
 };
+const dataTemp = ref()
+const formattedData = () => {
+  dataTemp.value = tableData.value.map(row =>
+    fields.value.reduce((obj, field, index) => {
+      const key = field.file_name === 'xmbz' ? 'bz' : field.file_name;
+      obj[key] = row[index];
+      return obj;
+    }, {})
+  )
+};
 const handleReport = async () => {
 const handleReport = async () => {
-  try {
-    const mappedData = tableData.value.map((row) => {
-      const mappedRow: any = {};
-      Object.keys(row).forEach((header) => {
-        const fieldName = headerMapping.value[header];
-        if (fieldName) {
-          mappedRow[fieldName] = row[header];
-        }
-      });
-      return mappedRow;
-    });
-
-    const data = {
-      report_id: props.eventId,
-      data: mappedData
-    };
+  formattedData();
+  // fillingReport(props.eventId)
 
 
-    const response = await submitFill(data);
-    if (response.code === 200) {
-      alert('数据上报成功');
-    } else {
-      alert('数据上报失败: ' + response.msg);
-    }
-  } catch (error) {
-    console.error('上报数据时发生错误:', error);
-    alert('数据上报失败,请稍后再试');
-  }
+  // try {
+  //   const mappedData = tableData.value.map((row) => {
+  //     const mappedRow: any = {};
+  //     Object.keys(row).forEach((header) => {
+  //       const fieldName = headerMapping.value[header];
+  //       if (fieldName) {
+  //         mappedRow[fieldName] = row[header];
+  //       }
+  //     });
+  //     return mappedRow;
+  //   });
+  //
+  //   const data = {
+  //     report_id: props.eventId,
+  //     data: mappedData
+  //   };
+  //
+  //   const response = await submitFill(data);
+  //   if (response.code === 200) {
+  //     alert('数据上报成功');
+  //   } else {
+  //     alert('数据上报失败: ' + response.msg);
+  //   }
+  // } catch (error) {
+  //   console.error('上报数据时发生错误:', error);
+  //   alert('数据上报失败,请稍后再试');
+  // }
 };
 };
 // 组件挂载时调用
 // 组件挂载时调用
 onMounted(() => {
 onMounted(() => {
-  loadFromLocalStorage();
   fetchHeaders();
   fetchHeaders();
   addDefaultRow();
   addDefaultRow();
 });
 });
+
+const hotSettings = reactive({
+  data: [['1','2']],
+  language: 'zh-CN',
+  colHeaders: editableHeaders,
+  rowHeaders: true,
+  autoColumnSize: true,
+  width: '100%', // auto  or  100%
+  height: '100%', // auto  or  100%
+  licenseKey: 'non-commercial-and-evaluation', // 隐藏版权文字
+  colWidths: 129, // 默认单元格宽度
+  rowHeights: 28, // 默认单元格高度
+  wordWrap: true, // 单元格文字是否换行展示
+  contextMenu: {
+    // 自定义右键菜单
+    items: {
+      'row_above': {
+        name: '向上插一行'
+      },
+      'row_below': {
+        name: '向下插一行'
+      },
+      'col_left': {
+        name: '向左插一列'
+      },
+      'col_right': {
+        name: '向右插一列'
+      },
+      'hsep1': '---------', // 分隔线
+      'remove_row': {
+        name: '删除当前行'
+      },
+      'remove_col': {
+        name: '删除当前列'
+      },
+      'clear_column': {
+        name: '清空当前列'
+      },
+      'hsep2': '---------', // 必须和上次的变量名不一样
+      'undo': {
+        name: '撤销'
+      },
+      'cut': {
+        name: '剪切'
+      },
+      'copy': {
+        name: '复制'
+      },
+      'alignment': {
+        name: '对齐'
+      },
+      'hsep3': '---------',
+      'commentsAddEdit': {
+        // 必须开启 comments: true
+        name: '添加备注'
+      },
+      'commentsRemove': {
+        // 必须开启 comments: true
+        name: '删除备注'
+      },
+      'freeze_column': {
+        // 必须开启 manualColumnFreeze: true
+        name: '固定列'
+      },
+      'unfreeze_column': {
+        // 必须开启 manualColumnFreeze: true
+        name: '取消固定列'
+      }
+    }
+  }
+});
 </script>
 </script>
 
 
 <style scoped>
 <style scoped>
@@ -192,7 +322,6 @@ onMounted(() => {
   font-family: Avenir, Helvetica, Arial, sans-serif;
   font-family: Avenir, Helvetica, Arial, sans-serif;
   -webkit-font-smoothing: antialiased;
   -webkit-font-smoothing: antialiased;
   -moz-osx-font-smoothing: grayscale;
   -moz-osx-font-smoothing: grayscale;
-  text-align: center;
   color: #2c3e50;
   color: #2c3e50;
 }
 }
 .report-period {
 .report-period {

+ 8 - 2
src/views/emergencyCommandMap/LeftSection/AssociatedEvent.vue

@@ -1,7 +1,7 @@
 <template>
 <template>
   <Dialog custom-show type="sm" :title="title" confirm-text="关联事件" confirm-class="common-btn-danger" @close="closeDialog" @confirm="submitEvent">
   <Dialog custom-show type="sm" :title="title" confirm-text="关联事件" confirm-class="common-btn-danger" @close="closeDialog" @confirm="submitEvent">
-    <el-form ref="eventFormRef" :model="form" :rules="rules" label-width="190px">
-      <el-form-item label="灾害事件" prop="event_title">
+    <el-form ref="eventFormRef" :model="form" :rules="rules" label-width="80px">
+      <el-form-item label="灾害事件" prop="event_title" >
         <el-select
         <el-select
           v-model="form.event_title"
           v-model="form.event_title"
           placeholder="请选择事件"
           placeholder="请选择事件"
@@ -171,6 +171,12 @@ const selectEvent = (eventTitle) => {
 </script>
 </script>
 
 
 <style lang="scss" scoped>
 <style lang="scss" scoped>
+:deep(.dialog-content) {
+  overflow: unset !important;
+}
+:deep(.el-form-item__label) {
+  color: #fff !important;
+}
 .dialog-footer {
 .dialog-footer {
   height: 150px;
   height: 150px;
   display: flex;
   display: flex;

+ 1 - 1
src/views/knowledge/HiddenStandards/index.vue

@@ -58,7 +58,7 @@
             </template>
             </template>
           </el-table-column>
           </el-table-column>
         </el-table>
         </el-table>
-        <pagination v-show="total > 0" v-model:page="queryParams.page" v-model:limit="queryParams.pageSize" :total="total" @pagination="tableData" />
+        <pagination v-show="total > 0" v-model:page="queryParams.page" v-model:limit="queryParams.pageSize" :total="total" @pagination="fetchWorkrData" />
         <el-dialog v-model="dialogTableVisible" :title="detailInfo.file_title" width="800">
         <el-dialog v-model="dialogTableVisible" :title="detailInfo.file_title" width="800">
           <div style="display:flex; align-items: center;">
           <div style="display:flex; align-items: center;">
             <el-icon><Download style="color: #1890ff" /></el-icon>
             <el-icon><Download style="color: #1890ff" /></el-icon>

+ 3 - 1
src/views/knowledge/knowledge-management/index.vue

@@ -1,7 +1,6 @@
 <template>
 <template>
   <div>
   <div>
     <div class="app-container">
     <div class="app-container">
-      <h1>事件总结报告</h1>
       <div v-show="!dialog.visible && !knowledgeDetailState.show">
       <div v-show="!dialog.visible && !knowledgeDetailState.show">
         <transition name="fade">
         <transition name="fade">
           <div v-show="showSearch">
           <div v-show="showSearch">
@@ -202,6 +201,9 @@ let knowledgeDetailState = reactive({
 
 
 // getLists是获取列表数据的方法
 // getLists是获取列表数据的方法
 const getList = async () => {
 const getList = async () => {
+  if (queryParams.publishDate === null) {
+    queryParams.publishDate = ['', ''];
+  }
   // 开始加载数据
   // 开始加载数据
   loading.value = true;
   loading.value = true;
   try {
   try {