浏览代码

迭代八数据填报:我的填报首页和填报页面静态页面

zhangyihao 6 月之前
父节点
当前提交
c38821c2c9
共有 4 个文件被更改,包括 331 次插入17 次删除
  1. 14 14
      package-lock.json
  2. 3 3
      package.json
  3. 134 0
      src/views/dataFilling/myFilling.vue
  4. 180 0
      src/views/dataFilling/writeForm.vue

+ 14 - 14
package-lock.json

@@ -36,9 +36,9 @@
         "diagram-js": "12.3.0",
         "didi": "9.0.2",
         "echarts": "5.5.0",
-        "element-plus": "2.7.5",
+        "element-plus": "^2.7.5",
         "element-resize-detector": "^1.2.4",
-        "file-saver": "2.0.5",
+        "file-saver": "^2.0.5",
         "fuse.js": "7.0.0",
         "highlight.js": "11.9.0",
         "html2canvas": "^1.4.1",
@@ -57,7 +57,7 @@
         "vue-router": "4.3.2",
         "vue-types": "5.1.1",
         "vue3-print-nb": "^0.1.4",
-        "vxe-table": "4.5.22",
+        "vxe-table": "^4.6.21",
         "xlsx": "^0.18.5"
       },
       "devDependencies": {
@@ -5353,9 +5353,9 @@
       }
     },
     "node_modules/dom-zindex": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmmirror.com/dom-zindex/-/dom-zindex-1.0.4.tgz",
-      "integrity": "sha512-PNk7u71TJ1C9Lwjjp5nNuQcVWuECFMmr9kZAwi2UbgWUM7jXdTCe4O4x5bhLUa07jpcZUVA5Du3ho7/FXzS9Ng=="
+      "version": "1.0.6",
+      "resolved": "https://registry.npmmirror.com/dom-zindex/-/dom-zindex-1.0.6.tgz",
+      "integrity": "sha512-FKWIhiU96bi3xpP9ewRMgANsoVmMUBnMnmpCT6dPMZOunVYJQmJhSRruoI0XSPoHeIif3kyEuiHbFrOJwEJaEA=="
     },
     "node_modules/domelementtype": {
       "version": "1.3.1",
@@ -12595,12 +12595,12 @@
       }
     },
     "node_modules/vxe-table": {
-      "version": "4.5.22",
-      "resolved": "https://registry.npmmirror.com/vxe-table/-/vxe-table-4.5.22.tgz",
-      "integrity": "sha512-bUmn6KSL9FE0Dfrsw7VjJAS8tratL1OBIDVzt1djgijU6WAwyp3697POkMR9TZ4HHvV6uGDSCuGzUUXGFodvVQ==",
+      "version": "4.6.21",
+      "resolved": "https://registry.npmmirror.com/vxe-table/-/vxe-table-4.6.21.tgz",
+      "integrity": "sha512-txrqMbzM9MBWU6g+1B51+wRvPfH2pCA8IGAUlgSF61xoVxAAN/vmgLGoUANd1p7q1osYs8FDV34OZE2KIUibAA==",
       "dependencies": {
-        "dom-zindex": "^1.0.1",
-        "xe-utils": "^3.5.24"
+        "dom-zindex": "^1.0.6",
+        "xe-utils": "^3.5.30"
       },
       "peerDependencies": {
         "vue": "^3.2.28"
@@ -12746,9 +12746,9 @@
       "dev": true
     },
     "node_modules/xe-utils": {
-      "version": "3.5.29",
-      "resolved": "https://registry.npmmirror.com/xe-utils/-/xe-utils-3.5.29.tgz",
-      "integrity": "sha512-9Ty3k/nHUptUzBZ/S+Z6umfpNWKU6ZFdGR2qHeynKRTjI/Tjd5ku/n6O1oKQCwtxQ3QzCl3NnD2LRy9SCTmnNw=="
+      "version": "3.5.31",
+      "resolved": "https://registry.npmmirror.com/xe-utils/-/xe-utils-3.5.31.tgz",
+      "integrity": "sha512-oS4yv8qktvlE0wc9yYkitDidEmThc5qN0UTRvKCvrWnejxbTyIxbwfrdZmPKdKGZtB+/U8cEAMFywLJjHtD11A=="
     },
     "node_modules/xlsx": {
       "version": "0.18.5",

+ 3 - 3
package.json

@@ -45,9 +45,9 @@
     "diagram-js": "12.3.0",
     "didi": "9.0.2",
     "echarts": "5.5.0",
-    "element-plus": "2.7.5",
+    "element-plus": "^2.7.5",
     "element-resize-detector": "^1.2.4",
-    "file-saver": "2.0.5",
+    "file-saver": "^2.0.5",
     "fuse.js": "7.0.0",
     "highlight.js": "11.9.0",
     "html2canvas": "^1.4.1",
@@ -66,7 +66,7 @@
     "vue-router": "4.3.2",
     "vue-types": "5.1.1",
     "vue3-print-nb": "^0.1.4",
-    "vxe-table": "4.5.22",
+    "vxe-table": "^4.6.21",
     "xlsx": "^0.18.5"
   },
   "devDependencies": {

+ 134 - 0
src/views/dataFilling/myFilling.vue

@@ -0,0 +1,134 @@
+<template>
+  <div>
+    <div v-show="!writeFormState.show" class="app-container">
+      <div>
+        <transition name="fade">
+          <div v-show="showSearch">
+            <el-form ref="queryFormRef" :model="queryParams">
+              <el-row :gutter="20">
+                <el-col :span="6">
+                  <el-form-item label="表格名称:" prop="table_name" label-width="auto">
+                    <el-input v-model="queryParams.table_name" placeholder="请输入巡查人"></el-input>
+                  </el-form-item>
+                </el-col>
+                <el-col :span="6">
+                  <el-form-item label="任务状态:" prop="task_status">
+                    <el-radio-group v-model="queryParams.task_status">
+                      <el-radio value="0" size="large">待填报</el-radio>
+                      <el-radio value="1" size="large">已上报</el-radio>
+                    </el-radio-group>
+                  </el-form-item>
+                </el-col>
+                <el-col :span="6">
+                  <el-button type="primary" @click="handleQuery">查询</el-button>
+                  <el-button @click="resetQuery">重置</el-button>
+                </el-col>
+              </el-row>
+            </el-form>
+          </div>
+        </transition>
+        <!-- 表格组件 -->
+        <el-table ref="multipleTable" v-loading="loading" :data="tableData" @selection-change="handleSelectionChange">
+          <el-table-column label="序号" align="center" prop="table_id" />
+          <el-table-column label="表格名称" align="center" prop="table_name" />
+          <el-table-column label="开始日期" align="center" prop="run_time" />
+          <el-table-column label="截止填报时间" align="center" prop="filling_time" />
+          <el-table-column label="任务状态" align="center" prop="status" />
+          <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+            <template #default="scope">
+              <el-text v-if="scope.row.status === '待填报'" class="common-btn-text-primary" @click="handleWrite(scope.row)">填表</el-text>
+              <el-text class="common-btn-text-primary" @click="handleView(scope.row)">详情</el-text>
+            </template>
+          </el-table-column>
+        </el-table>
+        <pagination v-show="total > 0" v-model:page="queryParams.page" v-model:limit="queryParams.pageSize" :total="total" @pagination="tableData" />
+      </div>
+    </div>
+  </div>
+  <WriteForm v-if="writeFormState.show" :event-id="writeFormState.eventId" @close="handleCancel" />
+</template>
+<script setup lang="ts">
+import { onMounted, reactive, ref } from 'vue';
+import WriteForm from './writeForm.vue';
+const loading = ref(true);
+const showSearch = ref(true);
+const multiple = ref(true);
+const ids = ref<Array<number | string>>([]);
+const single = ref(true);
+const total = ref(0);
+const tableData = ref([]);
+const { proxy } = getCurrentInstance() as ComponentInternalInstance;
+const initFormData = reactive({
+  table_id: '',
+  table_name: '',
+  filling_time: '',
+  run_time: '',
+  task_status: ''
+});
+const data = reactive({
+  form: { ...initFormData },
+  queryParams: {
+    page: 1,
+    pageSize: 10,
+    table_name: '',
+    task_status: ''
+  }
+});
+
+const { queryParams, form } = toRefs(data);
+// 模拟数据源
+const staticData = [
+  {
+    table_id: 1,
+    table_name: '测试表单',
+    run_time: '2024-10-15',
+    filling_time: '2024-10-15 18:00:00',
+    status: '待填报'
+  },
+  {
+    table_id: 2,
+    table_name: '应急工单数据表',
+    run_time: '2024-06-24',
+    filling_time: '2025-06-24 18:00:00',
+    status: '待填报'
+  },
+  {
+    table_id: 3,
+    table_name: '安全风险通告数据表',
+    run_time: '2024-06-24',
+    filling_time: '2025-06-24 18:00:00',
+    status: '已上报'
+  }
+];
+let writeFormState = reactive({
+  show: false,
+  eventId: ''
+});
+const handleCancel = () => {
+  writeFormState.show = false;
+};
+const handleWrite = (row) => {
+  if (row) {
+    writeFormState.eventId = row.id;
+    writeFormState.show = true;
+  }
+};
+// 初始化数据
+onMounted(() => {
+  tableData.value = staticData;
+  total.value = staticData.length;
+  loading.value = false;
+});
+const handleQuery = () => {
+  queryParams.value.page = 1;
+  fetchWorkrData();
+};
+// 重置查询条件
+const resetQuery = () => {
+  queryParams.value = { page: 1, pageSize: 10, table_name: '', task_status: '' };
+  handleQuery();
+};
+const handleSelectionChange = (selection) => {
+  ids.value = selection.map((item) => item.id);
+};
+</script>

+ 180 - 0
src/views/dataFilling/writeForm.vue

@@ -0,0 +1,180 @@
+<template>
+  <div class="app-container p-2">
+    <el-row :gutter="20">
+      <el-col :lg="30" :xs="24" style="">
+        <el-row :span="24" :gutter="10">
+          <el-col :span="18" label="任务名称">
+            <h2 v-if="detailData.title" key="business" style="font-weight: bolder">{{ detailData.title }}</h2>
+            <p class="report-period">【填报周期】:{{ detailData.start }} 至 {{ detailData.end }}</p>
+          </el-col>
+          <el-col :span="1.5">
+            <el-button type="primary" @click="handleReport()"> 上报 </el-button>
+          </el-col>
+          <el-col :span="1.5">
+            <el-button type="primary" @click="exportToExcel()"> 导出表格 </el-button>
+          </el-col>
+          <el-col :span="1.5">
+            <el-button type="primary" @click="handleSave()"> 保存 </el-button>
+          </el-col>
+          <el-col :span="1.5">
+            <el-button type="danger" @click="handleReturn()"> 返回 </el-button>
+          </el-col>
+        </el-row>
+      </el-col>
+      <el-row :gutter="10" class="mb8">
+        <el-col :span="1.5">
+          <el-button type="primary" @click="handleAdd">批量导入</el-button>
+        </el-col>
+        <el-col :span="1.5">
+          <el-button type="primary" @click="handleDownloadEmptyTable"> 下载空表格 </el-button>
+        </el-col>
+        <el-col :span="1.5">
+          <el-button type="primary" @click="handleAddRow"> 新增一行 </el-button>
+        </el-col>
+      </el-row>
+      <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>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script setup lang="ts">
+import { ref, onMounted } from 'vue';
+import { ElTable, ElButton, ElCol, ElRow, ElTableColumn } from 'element-plus';
+import * as XLSX from 'xlsx';
+
+const detailData = ref({
+  title: '测试表单',
+  start: '2024-10-15 17:02:22',
+  end: '2024-10-15 18:00:00'
+});
+
+const editableHeaders = ref(['时间', '地点', '损坏程度', '救援人员', '物资']);
+const tableData = ref([
+  {
+    时间: '2024-01-01',
+    地点: '某地',
+    损坏程度: '轻度',
+    救援人员: '张三, 李四',
+    物资: '食品, 水'
+  },
+  {
+    时间: '2024-01-02',
+    地点: '某地',
+    损坏程度: '中度',
+    救援人员: '王五, 赵六',
+    物资: '帐篷, 医疗用品'
+  }
+]);
+
+function saveEdit(rowIndex, header, value) {
+  tableData.value[rowIndex][header] = value;
+}
+
+function saveHeader(header, newValue) {
+  const index = editableHeaders.value.indexOf(header);
+  if (index !== -1) {
+    editableHeaders.value.splice(index, 1, newValue);
+  }
+}
+
+function addDefaultRow() {
+  tableData.value.push({
+    时间: '',
+    地点: '',
+    损坏程度: '',
+    救援人员: '',
+    物资: ''
+  });
+}
+
+onMounted(() => {
+  addDefaultRow();
+});
+
+const exportToExcel = () => {
+  const worksheet = XLSX.utils.json_to_sheet(tableData.value);
+  const workbook = { Sheets: { data: worksheet }, SheetNames: ['data'] };
+  const excelBuffer = XLSX.write(workbook, { bookType: 'xlsx', type: 'array' });
+
+  const blob = new Blob([excelBuffer], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' });
+  const link = document.createElement('a');
+  const url = window.URL.createObjectURL(blob);
+  link.href = url;
+  link.download = 'SheetJS.xlsx';
+  link.click();
+  window.URL.revokeObjectURL(url); // 清理
+};
+
+const handleAdd = () => console.log('批量导入');
+const handleDownloadEmptyTable = () => console.log('下载空表格');
+const handleAddRow = () => addDefaultRow();
+const handleReport = () => console.log('上报');
+const handleSave = () => console.log('保存');
+const handleReturn = () => console.log('返回');
+</script>
+
+<style scoped>
+.app-container {
+  font-family: Avenir, Helvetica, Arial, sans-serif;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+  text-align: center;
+  color: #2c3e50;
+}
+.report-period {
+  margin-top: 10px;
+  font-size: 14px;
+  color: #606266;
+}
+.editable-span {
+  cursor: pointer;
+  display: inline-block;
+  white-space: nowrap;
+  overflow: hidden;
+  text-overflow: ellipsis;
+}
+.editable-span[contenteditable='true'] {
+  white-space: normal;
+  outline: none; /* 移除编辑时的焦点边框 */
+}
+.editable-span[contenteditable='true']:empty::before {
+  content: attr(data-placeholder); /* 可选:为空时显示占位符 */
+  color: #999;
+}
+.editable-header {
+  cursor: pointer;
+  display: inline-block;
+  white-space: nowrap;
+  overflow: hidden;
+  text-overflow: ellipsis;
+}
+.editable-header[contenteditable='true'] {
+  white-space: normal;
+  outline: none; /* 移除编辑时的焦点边框 */
+}
+.editable-header[contenteditable='true']:empty::before {
+  content: attr(data-placeholder); /* 可选:为空时显示占位符 */
+  color: #999;
+}
+</style>