Просмотр исходного кода

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

LAPTOP-16IUEB3P\Lenovo 3 лет назад
Родитель
Сommit
17d0ecb59e

+ 18 - 42
src/api/system/file/index.js

@@ -4,40 +4,26 @@ import request from '@/utils/request';
  * 上传文件
  * @param file 文件
  */
-export async function uploadFile(file) {
+export async function uploadFile (data) {
   const formData = new FormData();
-  formData.append('file', file);
-  const res = await request.post('/file/upload', formData);
-  if (res.data.code === 0) {
-    return res.data.data;
-  }
-  return Promise.reject(new Error(res.data.message));
-}
-
-/**
- * 上传 base64 文件
- * @param base64 文件数据
- * @param fileName 文件名称
- */
-export async function uploadBase64File(base64, fileName) {
-  const formData = new FormData();
-  formData.append('base64', base64);
-  if (fileName) {
-    formData.append('fileName', fileName);
-  }
-  const res = await request.post('/file/upload/base64', formData);
-  if (res.data.code === 0 && res.data.data) {
-    return res.data.data;
+  formData.append('multiPartFile', data.multiPartFile);
+  formData.append('module', data.module);
+  const res = await request.post('/main/file/upload', formData);
+  if (res.data.code === '0') {
+    return res.data;
   }
   return Promise.reject(new Error(res.data.message));
 }
 
 /**
- * 分页查询文件上传记录
+ * 获取文件
  */
-export async function pageFiles(params) {
-  const res = await request.get('/file/page', { params });
-  if (res.data.code === 0) {
+export async function getFile (params) {
+  const res = await request.get('/main/file/getFile', {
+    params,
+    headers: { requestType: 'blob' }
+  });
+  if (res.data.code === '0') {
     return res.data.data;
   }
   return Promise.reject(new Error(res.data.message));
@@ -46,22 +32,12 @@ export async function pageFiles(params) {
 /**
  * 删除文件
  */
-export async function removeFile(id) {
-  const res = await request.delete('/file/remove/' + id);
-  if (res.data.code === 0) {
-    return res.data.message;
-  }
-  return Promise.reject(new Error(res.data.message));
-}
-
-/**
- * 批量删除文件
- */
-export async function removeFiles(data) {
-  const res = await request.delete('/file/remove/batch', {
+export async function removeFile (data) {
+  const res = await request.post(
+    `/main/file/delete?fileId=${data.fileId}`,
     data
-  });
-  if (res.data.code === 0) {
+  );
+  if (res.data.code === '0') {
     return res.data.message;
   }
   return Promise.reject(new Error(res.data.message));

+ 7 - 0
src/api/technology/production/index.js

@@ -8,6 +8,13 @@ export default {
       return res.data.data;
     }
   },
+  //列表
+  paramList: async (params) => {
+    const res = await request.get('/main/producetask/param/page', { params });
+    if (res.data.code == 0) {
+      return res.data.data;
+    }
+  },
   //详情
   getById: async (id) => {
     const res = await request.get(`/main/producetask/getById/${id}`);

+ 108 - 0
src/components/upload/fileUpload.vue

@@ -0,0 +1,108 @@
+<template>
+  <el-upload
+    class="upload-demo"
+    action="#"
+    :http-request="handlRequest"
+    :before-remove="beforeRemove"
+    :on-remove="handleRemove"
+    multiple
+    :before-upload="beforeUpload"
+    :file-list="fileList"
+  >
+    <slot>
+      <el-button size="small" type="primary">点击上传</el-button>
+    </slot>
+  </el-upload>
+</template>
+
+<script>
+  import { uploadFile, removeFile } from '@/api/system/file/index.js';
+  import { getImageUrl, getImagePath } from '@/utils/file';
+  export default {
+    props: {
+      value: {
+        type: Array,
+        default: () => []
+      },
+      // 所属模块
+      module: {
+        type: String,
+        required: true
+      },
+      // 限制数量
+      limit: {
+        type: Number,
+        default: -1
+      },
+      // 限制大小 mb
+      size: {
+        type: Number,
+        default: 10
+      }
+    },
+    computed: {
+      fileList: {
+        set (val) {
+          console.log(val);
+          this.$emit(
+            'input',
+            val.map((item) => ({
+              ...item,
+              url: getImagePath(item.url)
+            }))
+          );
+        },
+        get () {
+          const arr = this.value.map((item) => ({
+            ...item,
+            url: getImageUrl(item.url)
+          }));
+          return arr;
+        }
+      }
+    },
+
+    methods: {
+      beforeRemove (file) {
+        if (file.id) {
+          return removeFile({
+            fileId: file.id
+          }).then(() => {
+            return true;
+          });
+        } else {
+          return true;
+        }
+      },
+      handleRemove (file, fileList) {
+        this.fileList = fileList;
+      },
+      beforeUpload (file) {
+        if (file.size / 1024 / 1024 > this.size) {
+          this.$message.error(`大小不能超过 ${this.size}MB`);
+          return false;
+        }
+
+        if (this.limit > 0 && this.fileList.length === this.limit) {
+          this.$message.error(`最多上传 ${this.limit}个文件`);
+          return false;
+        }
+        return uploadFile({
+          module: this.module,
+          multiPartFile: file
+        }).then((res) => {
+          if (res.data) {
+            this.$emit('input', [
+              ...this.value,
+              { ...file, url: res.data.storePath, ...res.data }
+            ]);
+          }
+          return res.data;
+        });
+      },
+      handlRequest () {
+        return Promise.resolve();
+      }
+    }
+  };
+</script>

+ 101 - 0
src/components/upload/imgUpload.vue

@@ -0,0 +1,101 @@
+<template>
+  <ele-image-upload
+    v-model="images"
+    :limit="limit"
+    :drag="true"
+    :multiple="true"
+    :upload-handler="uploadHandler"
+    @upload="onUpload"
+  >
+  </ele-image-upload>
+</template>
+
+<script>
+  import EleImageUpload from 'ele-admin/es/ele-image-upload';
+  import { getImageUrl, getImagePath } from '@/utils/file';
+  import { uploadFile } from '@/api/system/file/index';
+
+  export default {
+    components: { EleImageUpload },
+    props: {
+      // 所属模块
+      module: {
+        type: String,
+        required: true
+      },
+      // 限制数量
+      limit: {
+        type: Number,
+        default: -1
+      },
+      value: {
+        type: Array,
+        default: () => []
+      }
+    },
+    data () {
+      return {};
+    },
+    computed: {
+      images: {
+        set (val) {
+          this.$emit(
+            'input',
+            val.map((item) => ({
+              ...item,
+              url: getImagePath(item.url)
+            }))
+          );
+        },
+        get () {
+          const arr = this.value.map((item) => ({
+            ...item,
+            url: getImageUrl(item.url)
+          }));
+
+          return arr;
+        }
+      }
+    },
+    methods: {
+      /* 上传事件 */
+      uploadHandler (file) {
+        const item = {
+          file,
+          uid: file.uid,
+          name: file.name,
+          progress: 0,
+          status: null
+        };
+        if (!file.type.startsWith('image')) {
+          this.$message.error('只能选择图片');
+          return;
+        }
+        if (file.size / 1024 / 1024 > 2) {
+          this.$message.error('大小不能超过 2MB');
+          return;
+        }
+        this.$emit('input', [...this.value, item]);
+        this.onUpload(item);
+      },
+      /* 上传 item */
+      async onUpload (item) {
+        // 模拟上传
+        item.status = 'uploading';
+        item.progress = 20;
+
+        const res = await uploadFile({
+          module: this.module,
+          multiPartFile: item.file
+        });
+        if (res.data) {
+          item.url = res.data.storePath;
+          item.id = res.data.id;
+
+          item.progress === 100;
+          item.status = 'done';
+        }
+      }
+    }
+  };
+</script>

+ 2 - 2
src/store/modules/user.js

@@ -105,8 +105,8 @@ export default {
     //动态路由
     async fetchUserInfo ({ commit }) {
       const result = await getResourcesTree().catch(() => {});
-      const list = result.filter((i) => i.path === '/page-main-data');
-      if (!list.length) {
+      const list = result?.filter((i) => i.path === '/page-main-data');
+      if (!list?.length) {
         return {};
       }
 

+ 32 - 0
src/utils/file.js

@@ -0,0 +1,32 @@
+import { getToken } from './token-util';
+import { TOKEN_HEADER_NAME } from '@/config/setting';
+
+// 获取图片反显url
+export function getImageUrl (path) {
+  if (process.env.NODE_ENV === 'development') {
+    return `http://192.168.3.51:18086/main/file/getFile?${TOKEN_HEADER_NAME}=${getToken()}&objectName=${path}`;
+  } else {
+    return `/main/file/getFile?${TOKEN_HEADER_NAME}=${getToken()}&objectName=${path}`;
+  }
+}
+// 从反显url上获取接口需要path
+export function getImagePath (url) {
+  if (!url) {
+    return '';
+  }
+
+  const match = url.match(/&objectName=([\S\s]*)/);
+
+  return (match && match[1].split('&')[0]) || '';
+}
+
+// 下载方法
+export function download (data, name) {
+  const a = document.createElement('a');
+  const url = window.URL.createObjectURL(new Blob([data]));
+  const filename = name;
+  a.href = url;
+  a.download = filename;
+  a.click();
+  window.URL.revokeObjectURL(url);
+}

+ 0 - 5
src/views/technology/parameter/components/user-edit.vue

@@ -178,11 +178,6 @@
       }
     },
     methods: {
-      /*回显类型 */
-      checkType(id) {
-        const obj = this.statusList.find((item) => item.value == id);
-        return obj.label;
-      },
       /* 保存编辑 */
       save() {
         this.$refs.form.validate((valid) => {

+ 239 - 0
src/views/technology/production/components/parameter/components/user-edit.vue

@@ -0,0 +1,239 @@
+<!-- 用户编辑弹窗 -->
+<template>
+  <ele-modal
+    width="960px"
+    :visible="visible"
+    :append-to-body="true"
+    :close-on-click-modal="true"
+    custom-class="ele-dialog-form"
+    :title="isUpdate ? '修改参数' : '添加参数'"
+    @update:visible="updateVisible"
+  >
+    <header-title title="基本信息"></header-title>
+    <el-form ref="form" :model="form" :rules="rules" label-width="120px">
+      <el-row>
+        <el-col :span="10">
+          <el-form-item label="参数编码:" prop="code">
+            <el-input
+              clearable
+              disabled
+              v-model="form.code"
+              placeholder="请输入"
+            />
+          </el-form-item>
+        </el-col>
+
+        <el-col :span="10">
+          <el-form-item label="参数名称:" prop="name">
+            <el-input v-model="form.name" clearable placeholder="请输入" />
+          </el-form-item>
+        </el-col>
+        <el-col :span="10">
+          <el-form-item label="默认值:">
+            <el-input v-model="form.defaultValue" placeholder="请输入" />
+          </el-form-item>
+        </el-col>
+        <el-col :span="10">
+          <el-form-item label="参数单位:">
+            <el-input placeholder="请输入" v-model="form.unitName" />
+          </el-form-item>
+        </el-col>
+        <el-col :span="10">
+          <el-form-item label="参数上限:">
+            <el-input placeholder="请输入" v-model="form.maxValue" />
+          </el-form-item>
+        </el-col>
+        <el-col :span="10">
+          <el-form-item label="参数下限:">
+            <el-input placeholder="请输入" v-model="form.minValue" />
+          </el-form-item>
+        </el-col>
+        <el-col :span="20">
+          <el-form-item label="文字描述:">
+            <el-input placeholder="请输入" v-model="form.description" />
+          </el-form-item>
+        </el-col>
+      </el-row>
+    </el-form>
+    <header-title title="其他信息"></header-title>
+    <el-form ref="form1" :model="form" :rules="rules" label-width="120px">
+      <el-row>
+        <el-col :span="10">
+          <el-form-item label="参数类别:" prop="categoryType">
+            <el-select
+              v-model="form.categoryType"
+              filterable
+              placeholder="清选择"
+            >
+              <el-option
+                v-for="item in statusList"
+                :key="item.value"
+                :label="item.label"
+                :value="item.value"
+              >
+              </el-option>
+            </el-select>
+          </el-form-item>
+        </el-col>
+        <el-col :span="10">
+          <el-form-item label="是否必填:" prop="notNull">
+            <el-select v-model="form.notNull" filterable placeholder="清选择">
+              <el-option
+                v-for="item in timeType"
+                :key="item.value"
+                :label="item.label"
+                :value="item.value"
+              >
+              </el-option>
+            </el-select>
+          </el-form-item>
+        </el-col>
+        <el-col :span="20">
+          <el-form-item label="备注:">
+            <el-input placeholder="请输入" v-model="form.remark" />
+          </el-form-item>
+        </el-col>
+      </el-row>
+    </el-form>
+
+    <template v-slot:footer>
+      <el-button @click="updateVisible(false)">取消</el-button>
+      <el-button type="primary" :loading="loading" @click="save">
+        保存
+      </el-button>
+    </template>
+  </ele-modal>
+</template>
+
+<script>
+  import parameter from '@/api/technology/parameter';
+
+  export default {
+    props: {
+      // 弹窗是否打开
+      visible: Boolean,
+      // 修改回显的数据
+      data: Object
+    },
+    data() {
+      const defaultForm = {
+        id: null,
+        code: '',
+        name: '',
+        categoryType: '',
+        defaultValue: '',
+        description: '',
+        maxValue: '',
+        minValue: '',
+        unitName: '',
+        remark: '',
+        notNull: ''
+      };
+      return {
+        defaultForm,
+        // 表单数据
+        form: { ...defaultForm },
+        timeType: [
+          { value: 1, label: '是' },
+          { value: 0, label: '否' }
+        ],
+        statusList: [
+          { label: '工艺', value: 0 },
+          { label: '工序', value: 1 },
+          { label: '产品', value: 2 },
+          { label: '原料', value: 3 },
+          { label: '设备', value: 4 },
+          { label: '其他', value: 5 }
+        ],
+        tacticsType: [
+          { code: 1, label: '标准时间' },
+          { code: 2, label: '最短时间' }
+        ],
+
+        // 表单验证规则
+        rules: {
+          name: [
+            { required: true, message: '请输入工序名称', trigger: 'blur' }
+          ],
+          code: [
+            { required: true, message: '请输入工序编码', trigger: 'blur' }
+          ],
+          categoryType: [
+            { required: true, message: '请选择参数类别', trigger: 'blur' }
+          ],
+          notNull: [
+            { required: true, message: '请选择是否必填', trigger: 'blur' }
+          ]
+        },
+        // 提交状态
+        loading: false,
+        // 是否是修改
+        isUpdate: false
+      };
+    },
+    computed: {
+      // 是否开启响应式布局
+      styleResponsive() {
+        return this.$store.state.theme.styleResponsive;
+      }
+    },
+    methods: {
+      /* 保存编辑 */
+      save() {
+        this.$refs.form.validate((valid) => {
+          this.$refs.form1.validate((va) => {
+            if (!valid || !va) {
+              return false;
+            }
+            this.loading = true;
+            if (!this.isUpdate) {
+              delete this.form.id;
+            }
+            const saveOrUpdate = this.isUpdate
+              ? parameter.update
+              : parameter.save;
+
+            saveOrUpdate(this.form)
+              .then((msg) => {
+                this.loading = false;
+                this.form = {};
+                this.$message.success(msg);
+                this.updateVisible(false);
+                this.$emit('done');
+              })
+              .catch((e) => {
+                this.loading = false;
+                // this.$message.error(e.message);
+              });
+          });
+        });
+      },
+      /* 更新visible */
+      updateVisible(value) {
+        this.$emit('update:visible', value);
+      }
+    },
+
+    watch: {
+      async visible(visible) {
+        if (visible) {
+          if (this.data) {
+            const res = await parameter.getById(this.data.id);
+
+            this.$util.assignObject(this.form, {
+              ...res
+            });
+            this.isUpdate = true;
+          } else {
+            const res = await parameter.getCode();
+            this.form.code = res;
+            this.isUpdate = false;
+          }
+        } else {
+          this.$refs.form.clearValidate();
+          this.form = { ...this.defaultForm };
+        }
+      }
+    }
+  };
+</script>

+ 107 - 0
src/views/technology/production/components/parameter/components/user-search.vue

@@ -0,0 +1,107 @@
+<!-- 搜索表单 -->
+<template>
+  <el-form
+    label-width="120px"
+    class="ele-form-search"
+    @keyup.enter.native="search"
+    @submit.native.prevent
+  >
+    <el-row>
+      <el-col v-bind="styleResponsive ? { lg: 5, md: 12 } : { span: 4 }">
+        <el-form-item label="参数编码:">
+          <el-input clearable v-model="where.code" placeholder="请输入" />
+        </el-form-item>
+      </el-col>
+      <el-col v-bind="styleResponsive ? { lg: 5, md: 12 } : { span: 4 }">
+        <el-form-item label="参数名称:">
+          <el-input clearable v-model="where.name" placeholder="请输入" />
+        </el-form-item>
+      </el-col>
+      <el-col v-bind="styleResponsive ? { lg: 5, md: 12 } : { span: 4 }">
+        <el-form-item label="参数默认值:">
+          <el-input
+            clearable
+            v-model="where.defaultValue"
+            placeholder="请输入"
+          />
+        </el-form-item>
+      </el-col>
+      <el-col v-bind="styleResponsive ? { lg: 5, md: 12 } : { span: 4 }">
+        <el-form-item label="参数分类:">
+          <el-select
+            v-model="where.categoryType"
+            filterable
+            placeholder="清选择"
+          >
+            <el-option
+              v-for="item in statusList"
+              :key="item.value"
+              :label="item.label"
+              :value="item.value"
+            >
+            </el-option>
+          </el-select>
+        </el-form-item>
+      </el-col>
+
+      <el-col v-bind="styleResponsive ? { lg: 4, md: 12 } : { span: 4 }">
+        <div class="ele-form-actions">
+          <el-button
+            type="primary"
+            icon="el-icon-search"
+            class="ele-btn-icon"
+            @click="search"
+          >
+            查询
+          </el-button>
+          <el-button @click="reset">重置</el-button>
+        </div>
+      </el-col>
+    </el-row>
+  </el-form>
+</template>
+
+<script>
+  export default {
+    data() {
+      // 默认表单数据
+      const defaultWhere = {
+        code: '',
+        name: '',
+        defaultValue: '',
+        categoryType: ''
+        // nickname: '',
+        // sex: undefined
+      };
+      return {
+        // 表单数据
+        where: { ...defaultWhere },
+        statusList: [
+          { label: '工艺', value: 0 },
+          { label: '工序', value: 1 },
+          { label: '产品', value: 2 },
+          { label: '原料', value: 3 },
+          { label: '设备', value: 4 },
+          { label: '其他', value: 5 }
+        ]
+      };
+    },
+    computed: {
+      // 是否开启响应式布局
+      styleResponsive() {
+        return this.$store.state.theme.styleResponsive;
+      }
+    },
+    methods: {
+      /* 搜索 */
+      search() {
+        this.$emit('search', this.where);
+      },
+      /*  重置 */
+      reset() {
+        this.where = { ...this.defaultWhere };
+        this.search();
+      }
+    }
+  };
+</script>

+ 194 - 0
src/views/technology/production/components/parameter/index.vue

@@ -0,0 +1,194 @@
+<template>
+  <div class="ele-body">
+    <el-card shadow="never">
+      <!-- 搜索表单 -->
+      <user-search @search="reload" />
+      <!-- 数据表格 -->
+      <ele-pro-table
+        ref="tableParameter"
+        :columns="columns"
+        :datasource="datasource"
+        :selection.sync="selection"
+        row-key="id"
+      >
+        <template v-slot:status="{ row }">
+          {{ checkType(row.categoryType) }}
+        </template>
+        <!-- 状态列 -->
+      </ele-pro-table>
+    </el-card>
+    <!-- 编辑弹窗 -->
+    <user-edit
+      :visible.sync="showEdit"
+      :data="current"
+      @done="reload"
+      ref="userEdit"
+    />
+    <!-- 导入弹窗 -->
+  </div>
+</template>
+
+<script>
+  import UserSearch from './components/user-search.vue';
+  import UserEdit from './components/user-edit.vue';
+
+  import parameter from '@/api/technology/parameter';
+
+  export default {
+    name: 'technologyParameter',
+    components: {
+      UserSearch,
+      UserEdit
+    },
+    data() {
+      return {
+        // 表格列配置
+        columns: [
+          {
+            columnKey: 'selection',
+            type: 'selection',
+            width: 45,
+            align: 'center',
+            reserveSelection: true
+          },
+          {
+            prop: 'code',
+            label: '参数编码',
+            // sortable: 'custom',
+            showOverflowTooltip: true,
+            align: 'center',
+
+            minWidth: 110
+          },
+          {
+            prop: 'name',
+            label: '参数名称',
+            showOverflowTooltip: true,
+            align: 'center',
+            minWidth: 110
+          },
+          {
+            align: 'center',
+            prop: 'description',
+            label: '文本描述',
+            showOverflowTooltip: true,
+            minWidth: 110
+          },
+          {
+            prop: 'maxValue',
+            label: '参数上限',
+            align: 'center',
+            showOverflowTooltip: true
+          },
+          {
+            prop: 'minValue',
+            label: '参数下限',
+            align: 'center',
+            showOverflowTooltip: true
+          },
+          {
+            prop: 'defaultValue',
+            label: '默认值',
+            align: 'center',
+
+            showOverflowTooltip: true
+          },
+          {
+            prop: 'categoryType',
+            label: '参数分类',
+            align: 'center',
+            slot: 'status',
+            showOverflowTooltip: true
+          }
+        ],
+        statusList: [
+          { label: '工艺', value: 0 },
+          { label: '工序', value: 1 },
+          { label: '产品', value: 2 },
+          { label: '原料', value: 3 },
+          { label: '设备', value: 4 },
+          { label: '其他', value: 5 }
+        ],
+        // 表格选中数据
+        selection: [],
+        // 当前编辑数据
+        current: null,
+        // 是否显示编辑弹窗
+        showEdit: false,
+        // 是否显示导入弹窗
+        showImport: false
+      };
+    },
+    methods: {
+      /*回显类型 */
+      checkType(id) {
+        const obj = this.statusList.find((item) => item.value == id);
+        return obj.label;
+      },
+      /* 表格数据源 */
+      async datasource({ page, limit, where, order }) {
+        const res = await parameter.list({
+          ...where,
+          ...order,
+          pageNum: page,
+          size: limit
+        });
+        return res;
+      },
+
+      /* 刷新表格 */
+      reload(where) {
+        this.$refs.table.reload({ page: 1, where: where });
+      },
+      /* 打开编辑弹窗 */
+      openEdit(row) {
+        this.current = row;
+        this.showEdit = true;
+        this.$refs.userEdit.$refs.form &&
+          this.$refs.userEdit.$refs.form.clearValidate();
+      },
+
+      /* 删除 */
+      remove(row) {
+        const loading = this.$loading({ lock: true });
+
+        parameter
+          .delete([row.id])
+          .then((msg) => {
+            loading.close();
+            this.$message.success('删除' + msg);
+            this.reload();
+          })
+          .catch((e) => {
+            loading.close();
+            // this.$message.error(e.message);
+          });
+      },
+      /* 批量删除 */
+      removeBatch() {
+        if (!this.selection.length) {
+          this.$message.error('请至少选择一条数据');
+          return;
+        }
+        this.$confirm('确定要删除选中的工序吗?', '提示', {
+          type: 'warning'
+        })
+          .then(() => {
+            const loading = this.$loading({ lock: true });
+            parameter
+              .delete(this.selection.map((d) => d.id))
+              .then((msg) => {
+                loading.close();
+                this.$message.success('删除' + msg);
+                this.reload();
+              })
+              .catch((e) => {
+                loading.close();
+                // this.$message.error(e.message);
+              });
+          })
+          .catch(() => {});
+      }
+    }
+  };
+</script>

+ 4 - 0
src/views/technology/production/components/user-edit.vue

@@ -194,6 +194,7 @@
     },
     data() {
       const defaultForm = {
+        id: null,
         code: '',
         name: '',
         controlId: '',
@@ -274,6 +275,9 @@
           if (!valid) {
             return false;
           }
+          if (!this.isUpdate) {
+            delete this.form.id;
+          }
 
           this.form.workBeat.beatTimes = this.totalTime;
 

+ 267 - 0
src/views/technology/production/components/user-setting.vue

@@ -0,0 +1,267 @@
+<!-- 用户编辑弹窗 -->
+<template>
+  <ele-modal
+    width="1060px"
+    :visible="visible"
+    :append-to-body="true"
+    :close-on-click-modal="true"
+    custom-class="ele-dialog-form"
+    :title="`给工序【${this.data?.code}${this.data?.name}】配置参数`"
+    @update:visible="updateVisible"
+  >
+    <div class="ele-body">
+      <ele-pro-table
+        ref="table"
+        :needPage="false"
+        :columns="columns"
+        :datasource="datasource"
+      >
+        <!-- 表头工具栏 -->
+        <template v-slot:toolbar>
+          <el-button
+            size="small"
+            type="primary"
+            icon="el-icon-plus"
+            class="ele-btn-icon"
+            @click="() => (addDialog = true)"
+          >
+            添加参数
+          </el-button>
+        </template>
+        <!-- 描述 -->
+        <template v-slot:description="{ row }">
+          <el-input v-model="row.description" placeholder="请输入"></el-input>
+        </template>
+        <!-- 单位 -->
+        <template v-slot:unitName="{ row }">
+          <el-input v-model="row.unitName" placeholder="请输入"></el-input>
+        </template>
+        <!-- 上限 -->
+        <template v-slot:maxValue="{ row }">
+          <el-input v-model="row.maxValue" placeholder="请输入"></el-input>
+        </template>
+        <!-- 下限 -->
+        <template v-slot:minValue="{ row }">
+          <el-input v-model="row.minValue" placeholder="请输入"></el-input>
+        </template>
+        <!-- 默认值 -->
+        <template v-slot:defaultValue="{ row }">
+          <el-input v-model="row.defaultValue" placeholder="请输入"></el-input>
+        </template>
+        <!-- 默认值 -->
+        <template v-slot:notNull="{ row }">
+          <el-select v-model="row.notNull" placeholder="请选择">
+            <el-option
+              v-for="item in timeType"
+              :key="item.value"
+              :label="item.label"
+              :value="item.value"
+            >
+            </el-option>
+          </el-select>
+        </template>
+
+        <!-- 状态列 -->
+
+        <!-- 操作列 -->
+        <template v-slot:action="{ row }">
+          <el-popconfirm
+            class="ele-action"
+            title="确定要删除当前工序吗?"
+            @confirm="remove(row)"
+          >
+            <template v-slot:reference>
+              <el-link type="danger" :underline="false" icon="el-icon-delete">
+                删除
+              </el-link>
+            </template>
+          </el-popconfirm>
+        </template>
+      </ele-pro-table>
+    </div>
+
+    <template v-slot:footer>
+      <el-button @click="updateVisible(false)">取消</el-button>
+      <el-button type="primary" :loading="loading" @click="addParamrter">
+        保存
+      </el-button>
+    </template>
+    <ele-modal
+      width="1720px"
+      :visible="addDialog"
+      :append-to-body="true"
+      :close-on-click-modal="true"
+      @update:visible="closeAdd"
+      custom-class="ele-dialog-form"
+    >
+      <Paramrter ref="Paramrter" />
+      <template v-slot:footer>
+        <el-button @click="closeAdd">取消</el-button>
+        <el-button type="primary" :loading="loading" @click="addParamrter">
+          保存
+        </el-button>
+      </template>
+    </ele-modal>
+  </ele-modal>
+</template>
+
+<script>
+  import producetask from '@/api/technology/production';
+  import parameter from '@/api/technology/parameter';
+  import Paramrter from './parameter';
+
+  export default {
+    components: { Paramrter },
+    props: {
+      // 弹窗是否打开
+      visible: Boolean,
+      // 修改回显的数据
+      data: Object
+    },
+    data() {
+      return {
+        timeType: [
+          { value: 1, label: '是' },
+          { value: 0, label: '否' }
+        ],
+        // 表格列配置
+        columns: [
+          {
+            prop: 'name',
+            label: '参数名称',
+            showOverflowTooltip: true,
+            align: 'center',
+            minWidth: 110
+          },
+          {
+            align: 'center',
+            slot: 'description',
+            prop: 'description',
+            label: '文本描述',
+            showOverflowTooltip: true,
+            minWidth: 110
+          },
+          {
+            prop: 'unitName',
+            slot: 'unitName',
+            label: '参数单位',
+            align: 'center',
+            showOverflowTooltip: true
+          },
+          {
+            prop: 'maxValue',
+            slot: 'maxValue',
+            label: '参数上限',
+            align: 'center',
+            showOverflowTooltip: true
+          },
+          {
+            prop: 'minValue',
+            slot: 'minValue',
+            label: '参数下限',
+            align: 'center',
+            showOverflowTooltip: true
+          },
+          {
+            prop: 'defaultValue',
+            slot: 'defaultValue',
+            label: '默认值',
+            align: 'center',
+            showOverflowTooltip: true
+          },
+          {
+            prop: 'notNull',
+            slot: 'notNull',
+            label: '是否必填',
+            align: 'center',
+            showOverflowTooltip: true
+          },
+
+          {
+            columnKey: 'action',
+            label: '操作',
+
+            align: 'center',
+            resizable: false,
+            slot: 'action',
+            showOverflowTooltip: true
+          }
+        ],
+        loading: false,
+        addDialog: false
+      };
+    },
+
+    methods: {
+      addParamrter() {
+        console.log(this.$refs.table.getData());
+      },
+      /*关闭选择参数*/
+      closeAdd() {
+        this.$refs.Paramrter.$refs.tableParameter.setSelectedRows([]);
+        this.addDialog = false;
+      },
+      /* 刷新表格 */
+      reload(id) {
+        this.$refs.table1111.reload({ where: { id } });
+      },
+      /* 表格数据源 */
+      async datasource({ page, limit, where }) {
+        if (this.data?.id) {
+          const res = await producetask.paramList({
+            taskId: this.data.id,
+            pageNum: 1,
+            size: -1
+          });
+          return res;
+        }
+      },
+      /* 保存编辑 */
+      save() {
+        this.$refs.form.validate((valid) => {
+          if (!valid) {
+            return false;
+          }
+          if (!this.isUpdate) {
+            delete this.form.id;
+          }
+
+          this.form.workBeat.beatTimes = this.totalTime;
+
+          this.loading = true;
+          producetask
+            .save(this.form)
+            .then((msg) => {
+              this.form = {};
+              this.loading = false;
+              this.$message.success(msg);
+              this.updateVisible(false);
+              this.$emit('done');
+            })
+            .catch((e) => {
+              this.loading = false;
+              // this.$message.error(e.message);
+            });
+        });
+      },
+      /* 更新visible */
+      updateVisible(value) {
+        this.$emit('update:visible', value);
+      }
+    },
+
+    watch: {
+      visible(visible) {
+        if (visible) {
+          console.log(this.data, 'DATA');
+          if (this.data) {
+            this.isUpdate = true;
+          } else {
+            this.isUpdate = false;
+          }
+        } else {
+        }
+      }
+    }
+  };
+</script>

+ 26 - 9
src/views/technology/production/index.vue

@@ -56,6 +56,14 @@
           >
             修改
           </el-link>
+          <el-link
+            type="primary"
+            :underline="false"
+            icon="el-icon-setting"
+            @click="openSetting(row)"
+          >
+            配置工艺参数
+          </el-link>
 
           <el-popconfirm
             class="ele-action"
@@ -78,13 +86,19 @@
       @done="reload"
       ref="userEdit"
     />
-    <!-- 导入弹窗 -->
+    <!-- 配置工艺参数 -->
+    <user-setting
+      :visible.sync="showSetting"
+      :data="current"
+      ref="userSetting"
+    />
   </div>
 </template>
 
 <script>
   import UserSearch from './components/user-search.vue';
   import UserEdit from './components/user-edit.vue';
+  import UserSetting from './components/user-setting.vue';
 
   import producetask from '@/api/technology/production';
 
@@ -92,7 +106,8 @@
     name: 'technologyProduction',
     components: {
       UserSearch,
-      UserEdit
+      UserEdit,
+      UserSetting
     },
     data() {
       return {
@@ -140,7 +155,7 @@
           {
             columnKey: 'action',
             label: '操作',
-            width: 220,
+            width: 260,
             align: 'center',
             resizable: false,
             slot: 'action',
@@ -153,11 +168,16 @@
         current: null,
         // 是否显示编辑弹窗
         showEdit: false,
-        // 是否显示导入弹窗
-        showImport: false
+        // 是否显示参数弹窗
+        showSetting: false
       };
     },
     methods: {
+      /*配置工艺参数 */
+      openSetting(row) {
+        this.current = row;
+        this.showSetting = true;
+      },
       /* 表格数据源 */
       async datasource({ page, limit, where, order }) {
         const res = await producetask.list({
@@ -180,10 +200,7 @@
         this.$refs.userEdit.$refs.form &&
           this.$refs.userEdit.$refs.form.clearValidate();
       },
-      /* 打开导入弹窗 */
-      openImport() {
-        this.showImport = true;
-      },
+
       /* 删除 */
       remove(row) {
         const loading = this.$loading({ lock: true });

+ 17 - 0
src/views/test/index.vue

@@ -0,0 +1,17 @@
+<template>
+  <div>
+    <fileUpload v-model="imgList" module="file" :limit="2"></fileUpload>
+    {{ imgList }}
+  </div>
+</template>
+<script>
+  import fileUpload from '@/components/upload/fileUpload';
+  export default {
+    components: { fileUpload },
+    data () {
+      return {
+        imgList: []
+      };
+    }
+  };
+</script>

+ 1 - 1
vue.config.js

@@ -31,7 +31,7 @@ module.exports = {
     proxy: {
       // 当我们的本地的请求 有/api的时候,就会代理我们的请求地址向另外一个服务器发出请求
       '/api': {
-        // target: 'http://192.168.3.51:18086', // 测试
+        target: 'http://192.168.3.51:18086', // 测试
         // target: 'http://192.168.3.35:8080', // kang杨威
         target: 'http://192.168.3.25:8080', // 黄峥嵘
         // target: 'http://192.168.3.41:8080', // 何江鹏