diff --git a/.env.development b/.env.development index fd7eb91..568e41e 100644 --- a/.env.development +++ b/.env.development @@ -4,4 +4,5 @@ ENV = 'development' # base api #VUE_APP_BASE_API = 'http://192.168.60.99:8001' VUE_APP_OUT_URL = 'http://192.168.60.24' -VUE_APP_BASE_API = http://192.168.60.99:9001 +# 本地开发使用 localhost,远程可使用 http://192.168.60.99:9001 +VUE_APP_BASE_API = http://localhost:9001 diff --git a/src/views/task/list/components/importOutline.vue b/src/views/task/list/components/importOutline.vue new file mode 100644 index 0000000..25b3c22 --- /dev/null +++ b/src/views/task/list/components/importOutline.vue @@ -0,0 +1,341 @@ + + + + + 导入说明 + + 请先导出当前年份大纲,若需要增加下一年份大纲,请删除ID列,并填写归属年份。 + 有ID:覆盖更新已有记录 + 无ID:新增记录,必须包含「年份」列 + 外键校验:工作项目、性质级别、责任科室必须在系统中存在,否则导入失败 + + + + + 将文件拖到此处,或点击上传 + 只能上传 xls/xlsx 文件,表头需与导出一致 + + + + 数据校验失败,无法导入: + + {{ err }} + + + + + 数据预览(共 {{ tableList.length }} 条) + + + + + + + + + + + + + + + + + + + + + + 取 消 + + 确认导入 + + + + + + + + diff --git a/src/views/task/list/outline.vue b/src/views/task/list/outline.vue index 56d4ab0..73e9a8f 100644 --- a/src/views/task/list/outline.vue +++ b/src/views/task/list/outline.vue @@ -19,6 +19,8 @@ 查询 添加 + 导出 + 导入 @@ -62,6 +64,7 @@ + @@ -80,12 +83,16 @@ import addOutline from '../list/components/addOutline.vue' import addPlan from '../list/components/addPlan.vue' import addUnit from '../list/components/addUnit.vue' - import state from '@/store/modules/user.js' + import importOutline from '../list/components/importOutline.vue' + import state from '@/store/modules/user.js' + import * as XLSX from 'xlsx' + import { saveAs } from 'file-saver' export default { components: { addOutline, addPlan, addUnit, + importOutline, }, data() { return { @@ -173,6 +180,24 @@ width: 240, align: 'left' }], + // 导出列配置(含id列、年份列) + exportColumns: [ + { label: 'ID', prop: 'id' }, + { label: '年份', prop: 'year' }, + { label: '工作项目', prop: 'menu' }, + { label: '性质级别', prop: 'level' }, + { label: '工作内容', prop: 'work_content' }, + { label: '要求', prop: 'work_require' }, + { label: '主要工作', prop: 'content' }, + { label: '工作周期', prop: 'period' }, + { label: '工作步骤', prop: 'require' }, + { label: '完成时间', prop: 'end_time' }, + { label: '责任科室', prop: 'duty_dep_id' }, + { label: '参与科室', prop: 'join_dep_id' }, + { label: '具体流程概述', prop: 'flow' }, + { label: '所需资源概述', prop: 'resource' }, + { label: '是否已创建计划或专项任务', prop: 'has_mission_status' } + ] } }, computed: { @@ -260,9 +285,50 @@ toUrlPlan(){ this.$router.push('/task/list/plan_1') }, - toUrlUnit(e){ + toUrlUnit(e) { this.$router.push('/task/list/unit_4') }, + // 导出 + exportTable() { + if (!this.mission_log || this.mission_log.length === 0) { + this.$Message.warning('暂无数据可导出') + return + } + const headers = this.exportColumns.map(i => ({ + key: i.prop, + title: i.label + })) + const exportData = this.mission_log.map(row => { + const item = { ...row, year: row.year || this.select.year } + // 是否已创建计划或专项任务 + if (row.mission_plans && row.mission_plans.length > 0) { + item.has_mission_status = '已创建计划' + } else if (row.missions && row.missions.length > 0) { + item.has_mission_status = '已创建专项任务' + } else { + item.has_mission_status = '' + } + return item + }) + const data = exportData.map(row => headers.map(header => row[header.key] ?? '')) + data.unshift(headers.map(header => header.title)) + const wb = XLSX.utils.book_new() + const ws = XLSX.utils.aoa_to_sheet(data) + const sheetName = `${this.select.year}年任务大纲` + XLSX.utils.book_append_sheet(wb, ws, sheetName) + const wbout = XLSX.write(wb, { + bookType: 'xlsx', + bookSST: true, + type: 'array' + }) + saveAs(new Blob([wbout], { + type: 'application/octet-stream' + }), `任务大纲_${this.select.year}.xlsx`) + this.$Message.success('导出成功') + }, + showImport() { + this.$refs.importOutline.show() + } }, watch: {}
+ 导入说明 +
请先导出当前年份大纲,若需要增加下一年份大纲,请删除ID列,并填写归属年份。
有ID:覆盖更新已有记录
无ID:新增记录,必须包含「年份」列
外键校验:工作项目、性质级别、责任科室必须在系统中存在,否则导入失败
数据校验失败,无法导入: