ソースを参照

Merge branch 'test' of http://110.41.163.243:9980/kd-aiot/kd-aiot-frontend-aps into dev

yusheng 9 ヶ月 前
コミット
4ff83e274c

+ 43 - 7
src/api/system/file/index.js

@@ -1,11 +1,11 @@
 import request from '@/utils/request';
-import {download } from '@/utils/file';
+import { download } from '@/utils/file';
 
 /**
  * 上传文件
  * @param file 文件
  */
-export async function uploadFile (data) {
+export async function uploadFile(data) {
   const formData = new FormData();
   formData.append('multiPartFile', data.multiPartFile);
   formData.append('module', data.module);
@@ -15,11 +15,47 @@ export async function uploadFile (data) {
   }
   return Promise.reject(new Error(res.data.message));
 }
+/**
+ * 导入文件 批量
+ * @param file 文件
+ */
+export async function importBatch(
+  data,
+  api,
+  onUploadProgressCb,
+  fileKeyName = 'file'
+) {
+  const formData = new FormData();
+  data.multiPartFiles.forEach((item, index) => {
+    formData.append(fileKeyName, item);
+  });
+  const res = await request.post(api, formData, {
+    onUploadProgress: onUploadProgressCb ? onUploadProgressCb : () => {}
+  });
+  if (res.data.code === '0') {
+    return res.data;
+  }
+  return Promise.reject(new Error(res.data.message));
+}
+/**
+ * 下载模板
+ */
+export async function downLoadTemplate(url, name) {
+  const res = await request.post(
+    url,
+    {},
+    {
+      responseType: 'blob'
+    }
+  );
+  console.log(res.data, '***********');
+  download(res.data, name);
+}
 /**
  * 上传文件 批量
  * @param file 文件
  */
-export async function uploadBatch (data) {
+export async function uploadBatch(data) {
   const formData = new FormData();
   data.multiPartFiles.forEach((item, index) => {
     formData.append(`multiPartFiles`, item);
@@ -37,7 +73,7 @@ export async function uploadBatch (data) {
 /**
  * 获取文件路径
  */
-export async function getPathAddress () {
+export async function getPathAddress() {
   const res = await request.post('/main/file/getPathAddress');
   if (res.data.code === '0') {
     return res.data.data;
@@ -47,7 +83,7 @@ export async function getPathAddress () {
 /**
  * 获取文件
  */
-export async function getFile (params, fileName) {
+export async function getFile(params, fileName) {
   const res = await request.get('/main/file/getFile', {
     params,
     responseType: 'blob'
@@ -62,7 +98,7 @@ export async function getFile (params, fileName) {
 /**
  * 删除文件
  */
-export async function removeFile (data) {
+export async function removeFile(data) {
   const res = await request.post(
     `/main/file/delete?fileId=${data.fileId}`,
     data
@@ -75,7 +111,7 @@ export async function removeFile (data) {
 /**
  * 文件列表
  */
-export async function getFileList (data) {
+export async function getFileList(data) {
   const res = await request.post(`/main/file/list`, data);
   if (res.data.code === '0') {
     return res.data.data;

+ 189 - 0
src/components/upload/import-dialog.vue

@@ -0,0 +1,189 @@
+<template>
+  <!-- 上传 -->
+  <el-dialog title="导入文件上传" :visible.sync="dialogVisible" width="40%">
+    <el-form label-width="110px" class="zw-criterion">
+      <el-form-item label="选择文件">
+        <el-upload
+          class="avatar-uploader"
+          action="#"
+          :show-file-list="false"
+          :http-request="handlSuccess"
+          :multiple="true"
+        >
+          <el-button icon="el-icon-plus" size="small" type="primary"
+            >文件上传</el-button
+          >
+          <div slot="tip" class="el-upload__tip" v-if="fileUrl">
+            只能上传excel文件,点击
+            <el-link
+              type="primary"
+              :underline="false"
+              @click="downLoadTemplate()"
+            >
+              下载模板</el-link
+            >
+          </div>
+        </el-upload>
+      </el-form-item>
+      <el-form-item label="上传列表">
+        <div class="imgs-box">
+          <p v-for="(item, index) in attaments" :key="index" class="imgs-p">
+            <span> {{ item.name }}</span>
+            <el-link @click="delFileList(index)" type="primary">删除</el-link>
+          </p>
+        </div>
+      </el-form-item>
+    </el-form>
+    <div slot="footer" class="dialog-footer">
+      <el-button size="small" @click="dialogVisible = false">关 闭</el-button>
+      <el-button size="small" @click="upload" type="primary">上 传</el-button>
+    </div>
+    <div id="progress" v-if="isProgress">
+      <el-progress
+        type="circle"
+        :percentage="percentage"
+        text-color="#fff"
+      ></el-progress>
+    </div>
+  </el-dialog>
+</template>
+
+<script>
+  import { importBatch,downLoadTemplate } from '@/api/system/file/index.js';
+  import { download1 } from '@/utils/file';
+  import { number } from 'echarts';
+
+  export default {
+    props: {
+      // eslint-disable-next-line vue/require-prop-type-constructor
+      defModule: '',
+      fileUrl: '',
+      fileName: '',
+      apiUrl: '',
+      isWeb: {
+        type: Boolean,
+        default: true
+      } ,
+      fileKeyName:'file'
+    },
+    //注册组件
+    data() {
+      return {
+        showViewer: false, // 显示查看器
+        dialogVisible: false,
+        uploadShow: false,
+        isProgress: false,
+        module: '',
+        percentage: 0,
+        attaments: [], //上传文件
+        file: ''
+      };
+    },
+
+    created() {},
+    methods: {
+      open() {
+        this.attaments = [];
+        this.module = '';
+        this.dialogVisible = true;
+      },
+      //删除附件
+      delFileList(index) {
+        this.attaments.splice(index, 1);
+      },
+      //上传限制
+      beforeUpload(file) {
+        const isLt10M = file.size / 1024 / 1024 < 10;
+        if (!isLt10M) {
+          this.$message.error('导入单文件大小不能超过 10MB!');
+        }
+        return isLt10M;
+      },
+      //图片上传
+      handlSuccess(param) {
+        this.file = param.file;
+        this.attaments.push(param.file);
+      },
+      // 文件上传
+      async upload() {
+        if (this.attaments.length == 0) {
+          return this.$message.warning('文件不能为空!');
+        }
+        this.module = this.$props.defModule;
+        this.isProgress = true;
+        this.percentage = 0;
+        await importBatch(
+          {
+            module: this.module,
+            multiPartFiles: this.attaments
+          },
+          this.apiUrl,
+          (data) => {
+            console.log(data, 'data');
+            this.percentage = parseFloat(
+              ((data.loaded * 100) / data.total).toFixed(2)
+            );
+            if (this.percentage >= 100) {
+              setTimeout(() => {
+                this.isProgress = false;
+              }, 500);
+            }
+          },
+          this.fileKeyName
+        )
+          .then((res) => {
+            this.$message.success('操作成功!');
+            this.dialogVisible = false;
+            this.isProgress = false;
+            this.$emit('success');
+          })
+          .catch(() => {
+            this.isProgress = false;
+          });
+      },
+      //下载模板
+      downLoadTemplate() {
+        if(this.isWeb){
+          download1(window.location.origin + this.fileUrl, this.fileName);
+        }else{
+          downLoadTemplate(this.fileUrl,this.fileName);
+        }
+
+      }
+    }
+  };
+</script>
+
+<style lang="scss">
+  .zw-table-header {
+    float: right;
+  }
+
+  .imgs-box .imgs-p {
+    height: 30px;
+    background: #f0f3f3;
+    line-height: 30px;
+    width: 372px;
+    margin-bottom: 5px;
+    padding: 0 10px;
+    display: flex;
+    justify-content: space-between;
+  }
+  .zw-criterion-normal {
+    padding: 20px 0 0 0;
+  }
+  .el-main {
+    overflow: hidden;
+  }
+  #progress {
+    background: rgba($color: #000000, $alpha: 0.5);
+    position: fixed;
+    width: 100%;
+    height: 100%;
+    top: 0;
+    left: 0;
+    display: flex;
+    justify-content: center;
+    align-items: center;
+  }
+</style>

+ 1 - 1
src/views/productionPlan/factoryPlan.vue

@@ -1,6 +1,6 @@
 <template>
   <div>
-    <homeIndex :timeDimensionPlanType="3" :cacheKeyUrl="cacheKeyUrl" :isLineNumbre="true"></homeIndex>
+    <homeIndex :timeDimensionPlanType="3" :cacheKeyUrl="cacheKeyUrl" :isLineNumbre="true" :isImport="true"></homeIndex>
   </div>
 </template>
 

+ 22 - 2
src/views/productionPlan/index.vue

@@ -111,6 +111,14 @@
         >
         <el-button type="danger" size="mini">延期申请</el-button>
         <el-button type="danger" size="mini">变更申请</el-button>
+        <el-button
+          type="info"
+          icon="el-icon-upload2"
+          size="mini"
+          @click="$refs.importDialogRef.open()"
+          v-if="isImport"
+          >导入</el-button
+        >
       </div>
 
       <el-tabs
@@ -322,6 +330,14 @@
       :factoryType="factoryType"
       @close="factoryClose"
     ></factoryAdd>
+    <importDialog
+      ref="importDialogRef"
+      @success="reload"
+      :fileUrl="'/aps/productionplan/importTemplate'"
+      :isWeb="false"
+      fileName="生产临时计划模板"
+      apiUrl="/aps/productionplan/importFile"
+    />
   </div>
 </template>
 
@@ -346,6 +362,8 @@
   import { fieldModel } from '@/api/saleOrder';
   import { debounce } from 'lodash';
   import tabMixins from '@/mixins/tableColumnsMixin';
+  import importDialog from '@/components/upload/import-dialog.vue';
+
   import {
     findBomCategoryByCategoryId,
     listBomType
@@ -360,13 +378,16 @@
       disassemblePlanPop,
       factoryAdd,
       homogeneityInspectDialog,
-      homogeneityInspectInstallDialog
+      homogeneityInspectInstallDialog,importDialog
     },
     props: {
       timeDimensionPlanType: { type: Number, default: 1 },
       isLineNumbre: {
         default: false
       },
+      isImport: {
+        default: false
+      },
       cacheKeyUrl: { type: String, default: '513b2388-aps-productionPlan' }
     },
     data() {
@@ -1113,7 +1134,6 @@
         this.$confirm('确定删除当前数据?', '提示')
           .then(() => {
             if (this.isLineNumbre) {
-
               factoryDelete(row.id).then((res) => {
                 this.reload();
                 this.$message.success('删除成功');