Pārlūkot izejas kodu

目标导入导出

zhangqiOMG 2 gadi atpakaļ
vecāks
revīzija
c9531d3962

+ 14 - 0
src/HManagement/personalTarget/personalTargetStatistics/index.vue

@@ -1,4 +1,8 @@
 <template>
+<div>
+  <div class="container normal-panel normal-margin">
+    <el-button type="default" size="small" @click="exportData">导 出</el-button>
+  </div>
   <div class="container normal-panel">
     <el-form size="small" inline label-position="left" label-width="50px">
       <el-form-item label="年度">
@@ -466,6 +470,7 @@
       </el-table-column>
     </el-table>
   </div>
+</div>
 </template>
 
 <script>
@@ -490,6 +495,15 @@ export default {
         }
       })
       this.tableData = res.data
+    },
+    async exportData () {
+      const res = await this.$api.requested({
+        "id": 20220916095402,
+        "content": {
+          "row":this.tableData
+        }
+      })
+      window.open(res.msg)
     }
   },
   mounted () {

+ 14 - 0
src/HManagement/projectTarget/projectTargetStatistics/index.vue

@@ -1,4 +1,8 @@
 <template>
+<div>
+  <div class="container normal-panel normal-margin">
+    <el-button type="default" size="small" @click="exportData">导 出</el-button>
+  </div>
   <div class="container normal-panel">
     <el-form size="small" inline label-position="left" label-width="50px">
       <el-form-item label="年度">
@@ -479,6 +483,7 @@
       </el-table-column>
     </el-table>
   </div>
+</div>
 </template>
 
 <script>
@@ -503,6 +508,15 @@ export default {
         }
       })
       this.tableData = res.data
+    },
+    async exportData () {
+      const res = await this.$api.requested({
+        "id": 20220916160002,
+        "content": {
+          "row":this.tableData
+        }
+      })
+      window.open(res.msg)
     }
   },
   mounted () {

+ 195 - 0
src/HManagement/projectTarget/target/modules/edit/components/importFile.vue

@@ -0,0 +1,195 @@
+<template>
+  <div>
+    <!-- 按钮类型 -->
+    <el-button type="success" size="small" @click="dialogUploadVisible = true" icon="el-icon-upload">导 入</el-button>
+    <el-dialog title="文件上传" class="import-panel" :visible.sync="dialogUploadVisible" width="500px" append-to-body :close-on-click-modal="false" :show-close="false" :before-close="clearFiles">
+      <div slot="title"></div>
+      <div style="padding:20px">
+        <el-upload
+          style="width:100%"
+          ref="my-upload"
+          class="upload-demo normal-margin"
+          :accept="accept"
+          action="#"
+          :auto-upload="false"
+          :show-file-list="false"
+          :on-change="handleChange"
+          drag
+          multiple>
+          <i class="el-icon-upload"></i>
+          <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
+        </el-upload>
+        <div class="progress_panel" v-for="file in filelist" :key="file.uid">
+          <img v-if="file.type === 'DOC' || file.type === 'DOCX'" width="30" src="../../../../../../assets/file_icons/word.png"
+            alt="">
+          <img v-else-if="file.type === 'PDF'" width="30" src="../../../../../../assets/file_icons/PDF.png" alt="">
+          <img v-else-if="file.type === 'MP4' || file.type === 'AVI'" width="30" src="../../../../../../assets/file_icons/video.png"
+            alt="">
+          <img v-else-if="file.type === 'XLS' || file.type === 'XLSX'" width="30" src="../../../../../../assets/file_icons/excel.png"
+            alt="">
+          <img v-else-if="file.type === 'PNG' || file.type === 'JPG'|| file.type === 'JPEG'" width="30"
+            src="../../../../../../assets/file_icons/image.png" alt="">
+          <img v-else-if="file.type === 'PPT' || file.type === 'PPTX'" width="30" src="../../../../../../assets/file_icons/PPT.png"
+            alt="">
+          <img v-else width="30" src="../../../../../../assets/file_icons/unknow.png" alt="">
+          <div>
+            <p v-if="file.progress === 100" style="float:right"><span style="color:#67C23A">●</span>上传成功</p>
+            <p>{{file.raw?file.raw.name:'暂无上传文件'}}</p>
+            <el-progress :percentage="file.progress" :show-text="false"></el-progress>
+          </div>
+        </div>
+        <slot name="errorFile"></slot>
+        <p class="tips">• 为保证数据导入顺利,推荐您下载并使用<a :href="modelurl">《Excel标准模板》</a></p>
+        <p class="tips">• 文件中数据不能超过5000行</p>
+        <div class="dialog-footer">
+          <el-button size="small" @click="dialogUploadVisible = false" class="normal-btn-width">取 消</el-button>
+          <el-button size="small" type="warning" @click="dialogUploadVisible = false" class="normal-btn-width btn-warning">确 定</el-button>
+        </div>
+      </div>
+      
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+
+export default {
+  /*
+    folderid:文件夹id; 必填
+    btntype:展示上传按钮的类型;
+    accept:限制上传文件类型;
+    bindData:附件上传成功后对应需要绑定的数据信息
+  */
+  props:['folderid','btntype','accept','bindData'],
+  data () {
+    return {
+      dialogUploadVisible: false,
+      params: {
+        "classname": "system.attachment.huawei.OBS",
+        "method": "getFileName",
+        "content": {
+          "filename": '',
+          "filetype": '',
+          "parentid": ""//归属文件夹ID
+        }
+      },
+      file: {},
+      filelist: [],
+      CampaignList:[],
+      activeName:'first',
+      modelurl:'',
+      campaignid:''
+
+    }
+  },
+  mounted () {
+    this.getModelUrl()
+  },
+  methods: {
+    handleChange (file, filelist) {
+      this.filelist = filelist
+      var index = file.raw.name.lastIndexOf(".");
+      var ext = file.name.substr(index + 1);
+      this.params.content.filename = file.raw.name
+      this.params.content.filetype = ext
+      this.getUploadUrl(file, ext)
+    },
+    handleClick () {
+      this.getModelUrl()
+    },
+    // 获取导入模板
+    async getModelUrl () {
+      const res = await this.$api.requested({
+        "id": 20220914154902,
+        "content": {},
+      })
+      this.modelurl = res.msg
+    },
+    // 获取华为云上传地址
+    async getUploadUrl (file, ext) {
+      this.params.content.parentid = this.folderid
+      const res = await this.$api.requested(this.params)
+      let url = res.data.uploadurl
+      let obsfilename = res.data.serialfilename
+
+      this.upoladFileToServer(url, file, ext, obsfilename)
+    },
+    // 上传到华为云
+    async upoladFileToServer (url, file, ext, obsfilename) {      
+      let THIS = this
+      let config = {
+        headers: ext === 'pdf' ? { 'Content-Type': 'application/pdf' } : { 'Content-Type': 'application/octet-stream' },
+        onUploadProgress: function (progressEvent) {
+          let percent = progressEvent.loaded / progressEvent.total * 100
+          THIS.filelist.forEach(e => {
+            if (e.uid === file.uid) {
+              THIS.$set(e, 'type', ext.toUpperCase());
+              THIS.$set(e, 'progress', percent);
+            }
+          })
+        },
+      }
+      const res = await this.$upload.hw_upload(url, file.raw, config)
+      this.createFileRecord(obsfilename)
+    },
+
+    // 上传成功以后生成附件记录
+    async createFileRecord (obsfilename) {
+      let obj = {
+         "serialfilename": obsfilename
+      }
+      obj = Object.assign({},obj,this.bindData)
+      let param = {
+        "classname": "system.attachment.huawei.OBS",
+        "method": "uploadSuccess",
+        "content":obj
+      }
+      
+      const res = await this.$api.requested(param)
+      this.$emit('onImportSuccess',res)
+    },
+
+    clearFiles () {
+      this.$refs['my-upload'].clearFiles()
+      this.filelist = []
+      this.dialogUploadVisible = false
+    },
+  }
+}
+
+</script>
+<style>
+.import-panel .el-dialog__header,.import-panel .el-dialog__body{
+  padding: 0 !important;
+}
+.upload-demo > div {
+  width: 100% !important;
+}
+.upload-demo .el-upload-dragger {
+  width: 100% !important;
+}
+</style>
+<style scoped>
+.progress_panel {
+  display: flex;
+  align-items: center;
+  padding: 10px;
+  margin: 10px 0;
+  border-radius: 5px;
+  transition: linear 0.2s all;
+}
+.progress_panel:hover {
+  box-shadow: 0px 0px 5px #ccc;
+}
+.progress_panel > div {
+  flex: 1;
+  padding: 0 10px;
+}
+.progress_panel > div > p {
+  line-height: 30px;
+}
+.tips{
+  line-height: 30px;
+}
+</style>
+

+ 28 - 3
src/HManagement/projectTarget/target/modules/edit/index.vue

@@ -2,7 +2,9 @@
   <div>
     <div v-if="!onlyread" class="container normal-panel normal-margin">
       <add v-if="tool.checkAuth($route.name,'insert')" class="inline-16" :data="mainInfo" @onSuccess="onSuccess"></add>
-      <el-button size="small">导 入</el-button>
+      <importFile class="inline-16" accept=".xlsx" :folderid="folderid" :bindData="{ownertable:'sa_salestargetbill',ownerid:'',usetype:'default'}" @onImportSuccess="onImportSuccess">
+        <a class="error-link" v-if="errorurl" :href="errorurl" slot="errorFile">下载错误数据</a>
+      </importFile>
     </div>
     <div class="container normal-panel normal-margin">
       <el-descriptions title="基本信息" :column="4">
@@ -47,6 +49,7 @@
 import add from './components/add.vue'
 import ondel from './components/del.vue'
 import editTarget from './components/editTarget.vue'
+import importFile from './components/importFile.vue'
 
 import targetTable from './components/table.vue'
 export default {
@@ -54,11 +57,14 @@ export default {
     targetTable,
     add,
     ondel,
-    editTarget
+    editTarget,
+    importFile
   },
   data () {
     return {
-      mainInfo:{}
+      mainInfo:{},
+      errorurl:null,
+      folderid:JSON.parse(sessionStorage.getItem('folderid')).appfolderid,
     }
   },
   methods:{
@@ -74,6 +80,25 @@ export default {
     },
     onSuccess () {
       this.$refs['table'].queryData(this.mainInfo.year)
+    },
+    async onImportSuccess (res) {
+      let attachmentid = res.data.attachmentids[0]
+      const res1 = await this.$api.requested({
+        "id": 20220914163602,
+        "content": {
+          "attachmentid":attachmentid,
+          "sa_salestargetbillid":this.$route.query.id,
+          "year":this.mainInfo.year
+        },
+      })
+      if (res1.msg !== '成功') { 
+        this.errorurl = res1.msg
+      } else {
+        this.errorurl = null
+      }
+      this.tool.showMessage(res1,()=>{
+        this.mainData()
+      })
     }
   },
   mounted () {

Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 0 - 0
yos/css/about.6f261a6d.css


+ 1 - 1
yos/index.html

@@ -1 +1 @@
-<!doctype html><html lang=""><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width,initial-scale=1"><link href="//netdna.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css" rel="stylesheet"><link rel="icon" href="favicon.ico"><title>yos_manage</title><script defer="defer" type="module" src="js/chunk-vendors.8e4fd6d5.js"></script><script defer="defer" type="module" src="js/app.3edcc58e.js"></script><link href="css/app.09f1a246.css" rel="stylesheet"><script defer="defer" src="js/chunk-vendors-legacy.25c4112b.js" nomodule></script><script defer="defer" src="js/app-legacy.be298f8c.js" nomodule></script></head><body><noscript><strong>We're sorry but yos_manage doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id="app"></div></body></html>
+<!doctype html><html lang=""><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width,initial-scale=1"><link href="//netdna.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css" rel="stylesheet"><link rel="icon" href="favicon.ico"><title>yos_manage</title><script defer="defer" type="module" src="js/chunk-vendors.8e4fd6d5.js"></script><script defer="defer" type="module" src="js/app.5d9ee505.js"></script><link href="css/app.09f1a246.css" rel="stylesheet"><script defer="defer" src="js/chunk-vendors-legacy.d9087565.js" nomodule></script><script defer="defer" src="js/app-legacy.46bc510f.js" nomodule></script></head><body><noscript><strong>We're sorry but yos_manage doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id="app"></div></body></html>

Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 0 - 0
yos/js/210-legacy.4cfa15fc.js


Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 0 - 0
yos/js/476.a8415a03.js


Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 0 - 0
yos/js/702-legacy.8d4e18fc.js


Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 0 - 0
yos/js/702.8139d955.js


Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 0 - 0
yos/js/about-legacy.fd3d42c5.js


Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 0 - 0
yos/js/about.5ba8474c.js


Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 0 - 0
yos/js/app-legacy.be298f8c.js


Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 0 - 0
yos/js/app.3edcc58e.js


Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 0 - 0
yos/js/chunk-vendors-legacy.25c4112b.js


Daži faili netika attēloti, jo izmaiņu fails ir pārāk liels