Переглянути джерело

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

xu 9 місяців тому
батько
коміт
0d65b3a66c

+ 1 - 0
server/api/v1/admin/project.go

@@ -283,6 +283,7 @@ func (pa *ProjectApi) QueryProjectMaterialsList(c *gin.Context) {
 // CreateProject 创建项目
 func (pa *ProjectApi) CreateProject(c *gin.Context) {
 	form, err := c.MultipartForm()
+	fmt.Println(form)
 	files := form.File["file"]
 	if err != nil {
 		response.FailWithMessage("失败", c)

+ 1 - 1
server/config.yaml

@@ -125,7 +125,7 @@ mysql:
     config: charset=utf8mb4&parseTime=True&loc=Local
     db-name: lc_finance
     username: root
-    password: root
+    password: 123456
     path: 127.0.0.1
     engine: ""
     log-mode: error

+ 2 - 2
web/.env.development

@@ -6,8 +6,8 @@ VITE_BASE_API = /api
 VITE_FILE_API = /api
 //VITE_BASE_PATH = http://192.168.110.218
 //VITE_BASE_PATH = http://192.168.110.214
-VITE_BASE_PATH = http://192.168.110.231
-//VITE_BASE_PATH = http://127.0.0.1
+//VITE_BASE_PATH = http://192.168.110.231
+VITE_BASE_PATH = http://127.0.0.1
 VITE_POSITION = close
 VITE_EDITOR = webstorm
 

+ 4 - 2
web/package.json

@@ -18,11 +18,12 @@
         "@vueuse/core": "^10.7.2",
         "@wangeditor/editor": "^5.1.23",
         "@wangeditor/editor-for-vue": "^5.1.12",
-        "ant-design-vue": "4.x",
+        "ant-design-vue": "~4.2.6",
         "axios": "^1.4.0",
         "core-js": "^3.31.1",
         "echarts": "5.4.3",
         "element-plus": "^2.3.8",
+        "file-saver": "^2.0.5",
         "highlight.js": "^11.8.0",
         "js-cookie": "^3.0.5",
         "jsencrypt": "^3.3.2",
@@ -41,7 +42,8 @@
         "ucharts": "^0.0.0",
         "vue": "^3.4.21",
         "vue-router": "^4.3.2",
-        "vuedraggable": "^4.1.0"
+        "vuedraggable": "^4.1.0",
+        "xlsx": "^0.18.5"
     },
     "devDependencies": {
         "@babel/eslint-parser": "^7.22.9",

+ 84 - 0
web/src/view/finance/financeAnalysis/components/material.vue

@@ -0,0 +1,84 @@
+<template>
+  <div style="display: flex;">
+    <el-upload
+        action=""
+        :auto-upload="false"
+        :show-file-list="false"
+        :on-change="handleFileChange"
+        accept=".xlsx, .xls"
+    >
+      <el-button type="primary">导入Excel</el-button>
+    </el-upload>
+
+    <el-button type="success" @click="exportExcel" style="margin-left: 40px">导出Excel</el-button>
+  </div>
+  <div style="height: 20px"></div>
+  <el-table :data="fileList">
+    <el-table-column></el-table-column>
+  </el-table>
+  <el-drawer
+      v-model="detailShow"
+      title="材料详情"
+      direction="rtl"
+  >
+    <el-table :data="tableData" border style="width: 1800px" height="700px">
+      <el-table-column
+          v-for="column in tableColumns"
+          :key="column.prop"
+          :prop="column.prop"
+          :label="column.label"
+      />
+    </el-table>
+  </el-drawer>
+  <div style="height: 30px"></div>
+</template>
+
+<script setup>
+import { ref } from 'vue';
+import { ElUpload, ElButton, ElMessage } from 'element-plus';
+import * as XLSX from 'xlsx';
+const fileList = reactive([])
+
+const loading = ref(false);
+const tableColumns = ref([]);
+const tableData = ref([]);
+const detailShow = ref(false)
+
+const handleFileChange = (file) => {
+  const reader = new FileReader();
+  reader.onload = (e) => {
+    try {
+      const data = new Uint8Array(e.target.result);
+      const workbook = XLSX.read(data, { type: 'array' });
+      const firstSheet = workbook.Sheets[workbook.SheetNames[0]];
+      const jsonData = XLSX.utils.sheet_to_json(firstSheet);
+      // console.log('data', data)
+      // console.log('workbook', workbook)
+      // console.log('firstSheet', firstSheet)
+      // console.log('jsonData', jsonData)
+
+      if (jsonData.length === 0) throw new Error('Excel文件为空');
+
+      // 动态生成表头
+      tableColumns.value = Object.keys(jsonData[0]).map(key => ({
+        prop: key,
+        label: key.replace(/_/g, ' '),
+      }));
+      tableData.value = jsonData;
+      ElMessage.success('导入成功');
+    } catch (error) {
+      ElMessage.error(`解析失败: ${error.message}`);
+    }
+  };
+  reader.readAsArrayBuffer(file.raw);
+  reader.onloadstart = () => loading.value = true;
+  reader.onloadend = () => loading.value = false;
+}
+
+const exportExcel = () => {
+  const worksheet = XLSX.utils.json_to_sheet(tableData.value)
+  const workbook = XLSX.utils.book_new()
+  XLSX.utils.book_append_sheet(workbook, worksheet, 'Sheet1')
+  XLSX.writeFile(workbook, '导出数据.xlsx')
+};
+</script>

+ 6 - 0
web/src/view/finance/financeAnalysis/financeAnalysis.vue

@@ -159,6 +159,11 @@
           >
             <CostSum ref="sumOut" />
           </el-tab-pane>
+          <el-tab-pane
+              label="材料清单"
+              name="5">
+              <Material/>
+          </el-tab-pane>
         </el-tabs>
       </el-col>
     </el-row>
@@ -270,6 +275,7 @@ import Payment from '@/view/finance/financeAnalysis/components/payment.vue'
 import expense from '@/assets/expenses.png'
 import { queryProjectMonthFee } from '@/api/cost'
 import ProjectCost from './components/projectCost.vue'
+import Material from './components/material.vue'
 defineOptions({
   name: 'FinanceAnalysis'
 })