Procházet zdrojové kódy

新增工种和资质管理

huang_an před 1 rokem
rodič
revize
36b1952eb9

+ 106 - 20
src/api/factoryModel/index.js

@@ -1,17 +1,14 @@
 import request from '@/utils/request';
 // 获取车间下的所有产线
-export async function listFactoryLine (params) {
-  const res = await request.post(
-    `/main/factoryarea/listFactoryLine`,
-    params
-  );
+export async function listFactoryLine(params) {
+  const res = await request.post(`/main/factoryarea/listFactoryLine`, params);
   if (res.data.code == 0) {
     return res.data.data;
   }
   return Promise.reject(new Error(res.data.message));
 }
 // 获取工厂下的所有车间
-export async function listWorkshopByParentId (params) {
+export async function listWorkshopByParentId(params) {
   const res = await request.get(
     `/main/factoryarea/listWorkshopByParentId/${params}`,
     {}
@@ -22,7 +19,7 @@ export async function listWorkshopByParentId (params) {
   return Promise.reject(new Error(res.data.message));
 }
 // 保存
-export async function saveOrUpdate (params) {
+export async function saveOrUpdate(params) {
   const res = await request.post(`/main/factoryarea/saveOrUpdate`, params);
   if (res.data.code == 0) {
     return res.data.message;
@@ -30,7 +27,7 @@ export async function saveOrUpdate (params) {
   return Promise.reject(new Error(res.data.message));
 }
 // 查询工厂列表-分页
-export async function getFactoryarea (params) {
+export async function getFactoryarea(params) {
   const res = await request.get(`/main/factoryarea/page`, {
     params
   });
@@ -40,7 +37,7 @@ export async function getFactoryarea (params) {
   return Promise.reject(new Error(res.data.message));
 }
 // 删除
-export async function deletefactoryarea (params) {
+export async function deletefactoryarea(params) {
   const res = await request.get(`/main/factoryarea/delete/${params}`);
   if (res.data.code == 0) {
     return res.data.message;
@@ -48,7 +45,7 @@ export async function deletefactoryarea (params) {
   return Promise.reject(new Error(res.data.message));
 }
 // 保存修改工位
-export async function saveOrUpdate_gw (params) {
+export async function saveOrUpdate_gw(params) {
   const res = await request.post(
     `/main/factoryworkstation/saveOrUpdate`,
     params
@@ -59,7 +56,7 @@ export async function saveOrUpdate_gw (params) {
   return Promise.reject(new Error(res.data.message));
 }
 // 工位分页查询
-export async function getFactoryworkstation (params) {
+export async function getFactoryworkstation(params) {
   const res = await request.get(`/main/factoryworkstation/page`, {
     params
   });
@@ -69,7 +66,7 @@ export async function getFactoryworkstation (params) {
   return Promise.reject(new Error(res.data.message));
 }
 // 工位删除
-export async function deleteFactoryworkstation (params) {
+export async function deleteFactoryworkstation(params) {
   const res = await request.delete(`/main/factoryworkstation/delete/${params}`);
   if (res.data.code == 0) {
     return res.data.message;
@@ -77,7 +74,7 @@ export async function deleteFactoryworkstation (params) {
   return Promise.reject(new Error(res.data.message));
 }
 // 工位详情
-export async function getById (params) {
+export async function getById(params) {
   const res = await request.get(`/main/factoryworkstation/getById/${params}`);
   if (res.data.code == 0) {
     return res.data.data;
@@ -85,7 +82,7 @@ export async function getById (params) {
   return Promise.reject(new Error(res.data.message));
 }
 // 工艺路线工序实例-列表(查询所有)
-export async function getProduceList (params) {
+export async function getProduceList(params) {
   const res = await request.get(
     `/main/producerouting/taskinstance/getAllList`,
     { params }
@@ -96,18 +93,107 @@ export async function getProduceList (params) {
   return Promise.reject(new Error(res.data.message));
 }
 
-
 // 所有在工位的设备
+export async function allDeviceList(params) {
+  const res = await request.get(`/main/factoryworkstation/allDeviceList`, {
+    params
+  });
+  if (res.data.code == 0) {
+    return res.data.data;
+  }
+  return Promise.reject(new Error(res.data.message));
+}
 
-export async function allDeviceList (params) {
-  const res = await request.get(
-    `/main/factoryworkstation/allDeviceList`,
-    { params }
-  );
+// 工种列表查询
+export async function getProfessionPageList(params) {
+  const res = await request.get(`/main/profession/page`, { params });
   if (res.data.code == 0) {
     return res.data.data;
   }
   return Promise.reject(new Error(res.data.message));
 }
 
+// 新增工种
+export async function saveJobTypes(data) {
+  const res = await request.post(`/main/profession/save`, data);
+  if (res.data.code == 0) {
+    return res.data.message;
+  }
+  return Promise.reject(new Error(res.data.message));
+}
 
+// 通过id查询工种详情
+export async function getProfessiongetById(id) {
+  const res = await request.get(`/main/profession/getById/${id}`);
+  if (res.data.code == 0) {
+    return res.data.data;
+  }
+  return Promise.reject(new Error(res.data.message));
+}
+
+// 删除工种
+export async function deleteProfessiongetById(data) {
+  const res = await request.delete(`/main/profession/delete`, { data });
+  if (res.data.code == 0) {
+    return res.data.message;
+  }
+  return Promise.reject(new Error(res.data.message));
+}
+
+// 修改工种
+export async function updateProfessiongetById(data) {
+  const res = await request.put(`/main/profession/update`, data);
+  if (res.data.code == 0) {
+    return res.data.message;
+  }
+  return Promise.reject(new Error(res.data.message));
+}
+
+// 资质列表查询
+export async function getProfessionCertificationPageList(params) {
+  const res = await request.get(`/main/professionCertification/page`, {
+    params
+  });
+  if (res.data.code == 0) {
+    return res.data.data;
+  }
+  return Promise.reject(new Error(res.data.message));
+}
+
+// 新增资质
+export async function saveProfessionCertification(data) {
+  const res = await request.post(`/main/professionCertification/save`, data);
+  if (res.data.code == 0) {
+    return res.data.message;
+  }
+  return Promise.reject(new Error(res.data.message));
+}
+
+// 通过id查询资质详情
+export async function getProfessionCertificationById(id) {
+  const res = await request.get(`/main/professionCertification/getById/${id}`);
+  if (res.data.code == 0) {
+    return res.data.data;
+  }
+  return Promise.reject(new Error(res.data.message));
+}
+
+// 删除资质
+export async function deleteProfessionCertificationById(data) {
+  const res = await request.delete(`/main/professionCertification/delete`, {
+    data
+  });
+  if (res.data.code == 0) {
+    return res.data.message;
+  }
+  return Promise.reject(new Error(res.data.message));
+}
+
+// 修改资质
+export async function updateProfessionCertificationById(data) {
+  const res = await request.put(`/main/professionCertification/update`, data);
+  if (res.data.code == 0) {
+    return res.data.message;
+  }
+  return Promise.reject(new Error(res.data.message));
+}

+ 9 - 0
src/api/material/BOM.js

@@ -129,6 +129,15 @@ export async function saveBomTreeList(data) {
   return Promise.reject(new Error(res.data.message));
 }
 
+// 删除BOM树节点
+export async function deleteBomTreeList(data) {
+  const res = await request.delete(`/main/bomCategory/delete`, { data });
+  if (res.data.code == 0) {
+    return res.data.message;
+  }
+  return Promise.reject(new Error(res.data.message));
+}
+
 // 获取产品BOM列表
 export async function getBomPageList(params) {
   const res = await request.get(`/main/bomCategory/page`, { params });

+ 2 - 4
src/enum/dict.js

@@ -41,8 +41,7 @@ export default {
   机构类型: 'group_type',
   工作流任务分配规则的类型: 'bpm_task_assign_rule_type',
   工作流任务分配自定义脚本: 'bpm_task_assign_script',
-  流程实例的结果:'bpm_process_instance_result',
-
+  流程实例的结果: 'bpm_process_instance_result'
 };
 
 export const numberList = [
@@ -57,6 +56,5 @@ export const numberList = [
   'angle',
   'id_type',
   'rule_status',
-   'ledger',
-
+  'ledger'
 ];

+ 9 - 9
src/views/factoryModel/factoryManagement/index.vue

@@ -63,7 +63,7 @@
       search,
       edit
     },
-    data () {
+    data() {
       return {
         columns: [
           {
@@ -117,11 +117,11 @@
         }
       };
     },
-    created () {
+    created() {
       this.getGs();
     },
     methods: {
-      datasource ({ page, where, limit }) {
+      datasource({ page, where, limit }) {
         return getFactoryarea({
           ...where,
           pageNum: page,
@@ -129,24 +129,24 @@
           type: 1
         });
       },
-      search (where) {
+      search(where) {
         this.$refs.table.reload({
           where: where,
           page: 1
         });
       },
-      openEdit (type, row) {
+      openEdit(type, row) {
         this.$refs.edit.open(type, row);
       },
       // 获取公司数据
-      getGs () {
+      getGs() {
         listOrganizations().then((list) => {
           console.log(list);
           this.dict.groupId = list;
         });
       },
       // 回显公司名称
-      showgroupName (id) {
+      showgroupName(id) {
         let result = this.dict.groupId.find((n) => n.id == id);
         if (result) {
           return result.name;
@@ -154,7 +154,7 @@
           return '';
         }
       },
-      remove (row) {
+      remove(row) {
         deletefactoryarea(row.id)
           .then((message) => {
             this.$message.success(message);
@@ -164,7 +164,7 @@
             this.$message.error(e.message);
           });
       },
-      done () {
+      done() {
         this.$refs.search.search();
       }
     }

+ 308 - 0
src/views/factoryModel/jobManagement/components/user-edit.vue

@@ -0,0 +1,308 @@
+<!-- 用户编辑弹窗 -->
+<template>
+  <ele-modal
+    width="960px"
+    :visible="visible"
+    :append-to-body="true"
+    :close-on-click-modal="false"
+    custom-class="ele-dialog-form"
+    :title="isView ? '查看工种' : isUpdate ? '修改工种' : '添加工种'"
+    @update:visible="updateVisible"
+  >
+    <header-title title="基本信息"></header-title>
+    <el-form ref="form" :model="form" :rules="rules" label-width="100px">
+      <el-row>
+        <el-col :span="10">
+          <el-form-item label="类型:" prop="type">
+            <el-select
+              style="width: 100%"
+              :disabled="isView"
+              v-model="form.type"
+              filterable
+            >
+              <el-option
+                v-for="item in typeList"
+                :key="item.dictCode"
+                :label="item.dictValue"
+                :value="item.dictCode"
+              >
+              </el-option>
+            </el-select>
+          </el-form-item>
+        </el-col>
+
+        <el-col :span="10">
+          <el-form-item label="编码:" prop="code">
+            <el-input
+              :disabled="isView"
+              v-model="form.code"
+              clearable
+              placeholder="请输入"
+            />
+          </el-form-item>
+        </el-col>
+      </el-row>
+      <el-row>
+        <el-col :span="10">
+          <el-form-item label="等级:" prop="level">
+            <el-select
+              style="width: 100%"
+              :disabled="isView"
+              v-model="form.level"
+              filterable
+            >
+              <el-option
+                :label="item.label"
+                :value="item.value"
+                v-for="(item, index) in levelOptions"
+                :key="index"
+              >
+              </el-option>
+            </el-select>
+          </el-form-item>
+        </el-col>
+      </el-row>
+      <el-row>
+        <el-col :span="20">
+          <el-form-item label="名称:" prop="name">
+            <el-input
+              :disabled="isView"
+              v-model="form.name"
+              clearable
+              placeholder="请输入"
+            />
+          </el-form-item>
+        </el-col>
+      </el-row>
+      <el-row>
+        <el-col :span="20">
+          <el-form-item label="标准工时费:" prop="hourCost">
+            <div class="hourCostStyle">
+              <el-input
+                style="width: 80%"
+                :disabled="isView"
+                v-model="form.hourCost"
+                clearable
+                placeholder="请输入"
+              />
+              <el-select :disabled="isView" v-model="form.money">
+                <el-option
+                  :label="item.label"
+                  :value="item.value"
+                  v-for="(item, index) in moneyOptions"
+                  :key="index"
+                >
+                </el-option>
+              </el-select>
+              <div>/</div>
+              <el-select :disabled="isView" v-model="form.date">
+                <el-option
+                  :label="item.label"
+                  :value="item.value"
+                  v-for="(item, index) in timeOptions"
+                  :key="index"
+                >
+                </el-option>
+              </el-select>
+            </div>
+          </el-form-item>
+        </el-col>
+      </el-row>
+      <el-row>
+        <el-col :span="20">
+          <el-form-item label="资质:" prop="name">
+            <el-select
+              style="width: 100%"
+              :disabled="isView"
+              v-model="form.aptitude"
+              filterable
+            >
+              <el-option
+                v-for="item in typeList"
+                :key="item.dictCode"
+                :label="item.dictValue"
+                :value="item.dictCode"
+              >
+              </el-option>
+            </el-select>
+          </el-form-item>
+        </el-col>
+      </el-row>
+    </el-form>
+
+    <template v-slot:footer>
+      <el-button @click="updateVisible(false)">取消</el-button>
+      <el-button v-if="isView" type="primary" @click="updateVisible(false)">
+        确定
+      </el-button>
+      <el-button v-else type="primary" :loading="loading" @click="save">
+        保存
+      </el-button>
+    </template>
+  </ele-modal>
+</template>
+
+<script>
+  import {
+    saveJobTypes,
+    getProfessiongetById,
+    updateProfessiongetById
+  } from '@/api/factoryModel';
+  export default {
+    props: {
+      // 弹窗是否打开
+      visible: Boolean,
+      // 修改回显的数据
+      data: Object,
+      isView: Boolean,
+      controlList: Array,
+      typeList: Array
+    },
+    data() {
+      const defaultForm = function () {
+        return {
+          id: '',
+          aptitude: '',
+          code: '',
+          hourCost: '',
+          level: '',
+          name: '',
+          type: '',
+          status: 0,
+          money: '元',
+          date: '小时'
+        };
+      };
+      return {
+        defaultForm,
+        // 表单数据
+        form: defaultForm(),
+        moneyOptions: [
+          {
+            label: '元',
+            value: '元'
+          }
+        ],
+        timeOptions: [
+          {
+            label: '小时',
+            value: '小时'
+          },
+          {
+            label: '天',
+            value: '天'
+          },
+          {
+            label: '月',
+            value: '月'
+          }
+        ],
+        levelOptions: [
+          {
+            label: '初级',
+            value: '1'
+          },
+          {
+            label: '中级',
+            value: '2'
+          },
+          {
+            label: '高级',
+            value: '3'
+          }
+        ],
+        // 表单验证规则
+        rules: {
+          name: [{ required: true, message: '请输入名称', trigger: 'blur' }],
+          code: [{ required: true, trigger: 'blur', message: '请输入编码' }],
+          hourCost: [
+            { required: true, trigger: 'blur', message: '请输入标准工时费' }
+          ],
+          aptitude: [
+            { required: true, message: '请选择资质', trigger: 'change' }
+          ],
+          level: [{ required: true, message: '请选择等级', trigger: 'change' }],
+          type: [{ required: true, message: '请选择类型', trigger: 'change' }]
+        },
+        // 提交状态
+        loading: false,
+        // 是否是修改
+        isUpdate: false,
+        chooseItem: null
+      };
+    },
+    methods: {
+      /* 保存编辑 */
+      save() {
+        this.$refs.form.validate((valid) => {
+          if (!valid) {
+            return false;
+          }
+          console.log(this.form);
+          if (!this.isUpdate) {
+            delete this.form.id;
+          }
+          this.form.unit = this.form.money + '/' + this.form.date;
+          this.loading = true;
+          let apiStr = null;
+          if (this.isUpdate) {
+            apiStr = updateProfessiongetById;
+          } else {
+            apiStr = saveJobTypes;
+          }
+          apiStr(this.form)
+            .then((msg) => {
+              this.loading = false;
+              this.$message.success((this.isUpdate ? '修改' : '新建') + '成功');
+              this.updateVisible(false);
+              this.$emit('done');
+            })
+            .catch((e) => {
+              this.loading = false;
+              // this.$message.error(e.message);
+            });
+        });
+      },
+      /* 更新visible */
+      updateVisible(value) {
+        this.form = { ...this.defaultForm() };
+        this.$emit('update:visible', value);
+      }
+    },
+
+    watch: {
+      async visible(visible) {
+        if (visible) {
+          if (this.data) {
+            const res = await getProfessiongetById(this.data.id);
+            console.log(res);
+            this.$util.assignObject(this.form, {
+              ...res
+            });
+            this.form.money = res.unit.split('/')[0];
+            this.form.date = res.unit.split('/')[1];
+            this.isUpdate = true;
+            console.log(this.form);
+          } else {
+            this.form = { ...this.defaultForm() };
+            this.isUpdate = false;
+          }
+        } else {
+          this.$refs.form.clearValidate();
+          this.form = { ...this.defaultForm() };
+        }
+      }
+    }
+  };
+</script>
+<style lang="scss" scoped>
+  .hourCostStyle {
+    display: flex;
+    > div {
+      margin-right: 10px;
+    }
+    > div:last-child {
+      margin-right: 0;
+    }
+  }
+</style>

+ 91 - 0
src/views/factoryModel/jobManagement/components/user-search.vue

@@ -0,0 +1,91 @@
+<!-- 搜索表单 -->
+<template>
+  <el-form
+    label-width="77px"
+    class="ele-form-search"
+    @keyup.enter.native="search"
+    @submit.native.prevent
+  >
+    <el-row :gutter="15">
+      <el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">
+        <el-form-item label="类型:" prop="type">
+          <el-select clearable v-model="where.type">
+            <el-option
+              v-for="item in typeList"
+              :key="item.dictCode"
+              :label="item.dictValue"
+              :value="item.dictCode"
+            >
+            </el-option>
+          </el-select>
+        </el-form-item>
+      </el-col>
+      <el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">
+        <el-form-item label="编码:">
+          <el-input clearable v-model="where.code" placeholder="请输入" />
+        </el-form-item>
+      </el-col>
+      <el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">
+        <el-form-item label="名称:">
+          <el-input clearable v-model="where.name" placeholder="请输入" />
+        </el-form-item>
+      </el-col>
+
+      <el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">
+        <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: '',
+        type: null
+      };
+      return {
+        // 表单数据
+        where: { ...defaultWhere },
+        controlList: []
+      };
+    },
+    props: {
+      typeList: {
+        type: Array,
+        default() {
+          return [];
+        }
+      }
+    },
+    computed: {
+      // 是否开启响应式布局
+      styleResponsive() {
+        return this.$store.state.theme.styleResponsive;
+      }
+    },
+    methods: {
+      /* 搜索 */
+      search() {
+        this.$emit('search', this.where);
+      },
+      /*  重置 */
+      reset() {
+        this.where = { ...this.defaultWhere };
+        this.search();
+      }
+    }
+  };
+</script>

+ 328 - 0
src/views/factoryModel/jobManagement/index.vue

@@ -0,0 +1,328 @@
+<template>
+  <div class="ele-body">
+    <el-card shadow="never">
+      <!-- 搜索表单 -->
+      <user-search :typeList="typeOptions" @search="reload" />
+      <!-- 数据表格 -->
+      <ele-pro-table
+        ref="table"
+        :columns="columns"
+        :datasource="datasource"
+        :selection.sync="selection"
+        row-key="id"
+      >
+        <!-- 表头工具栏 -->
+        <template v-slot:toolbar>
+          <el-button
+            size="small"
+            type="primary"
+            icon="el-icon-plus"
+            class="ele-btn-icon"
+            @click="openEdit()"
+          >
+            新建
+          </el-button>
+          <el-button
+            size="small"
+            type="danger"
+            icon="el-icon-delete"
+            class="ele-btn-icon"
+            @click="removeBatch"
+            plain
+          >
+            删除
+          </el-button>
+          <el-button
+            size="small"
+            type="primary"
+            icon="el-icon-upload2"
+            class="ele-btn-icon"
+            plain
+          >
+            导出
+          </el-button>
+          <el-button
+            size="small"
+            type="primary"
+            icon="el-icon-download"
+            class="ele-btn-icon"
+            plain
+          >
+            导入
+          </el-button>
+        </template>
+
+        <!-- 操作列 -->
+        <template v-slot:action="{ row }">
+          <el-link
+            type="primary"
+            :underline="false"
+            icon="el-icon-edit"
+            @click="openEdit(row)"
+          >
+            修改
+          </el-link>
+          <el-link
+            type="primary"
+            :underline="false"
+            icon="el-icon-setting"
+            @click="openEdit(row, true)"
+          >
+            详情
+          </el-link>
+
+          <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>
+    </el-card>
+    <!-- 编辑弹窗 -->
+    <user-edit
+      :visible.sync="showEdit"
+      :data="current"
+      :controlList="controlList"
+      :isView="isView"
+      @done="reload"
+      ref="userEdit"
+      :typeList="typeOptions"
+    />
+  </div>
+</template>
+
+<script>
+  import UserSearch from './components/user-search.vue';
+  import UserEdit from './components/user-edit.vue';
+  import {
+    getProfessionPageList,
+    deleteProfessiongetById
+  } from '@/api/factoryModel';
+  import control from '@/api/technology/control';
+  import dictMixins from '@/mixins/dictMixins';
+
+  export default {
+    name: 'technologyProduction',
+    components: {
+      UserSearch,
+      UserEdit
+    },
+    mixins: [dictMixins],
+    data() {
+      return {
+        levelOptions: [
+          {
+            label: '初级',
+            value: '1'
+          },
+          {
+            label: '中级',
+            value: '2'
+          },
+          {
+            label: '高级',
+            value: '3'
+          }
+        ],
+        isView: false,
+        // 表格列配置
+        columns: [
+          {
+            columnKey: 'selection',
+            type: 'selection',
+            width: 45,
+            align: 'center',
+            fixed: 'left'
+          },
+          {
+            label: '序号',
+            type: 'index',
+            width: 55,
+            align: 'center'
+          },
+          {
+            slot: 'type',
+            label: '类型',
+            showOverflowTooltip: true,
+            align: 'center',
+            minWidth: 110,
+            formatter: (_row) => {
+              return this.getDictValue('工种', _row.type);
+            }
+          },
+          {
+            align: 'center',
+            prop: 'code',
+            label: '编码',
+            showOverflowTooltip: true,
+            minWidth: 110
+          },
+          {
+            slot: 'name',
+            prop: 'name',
+            label: '名称',
+            showOverflowTooltip: true,
+            align: 'center',
+            minWidth: 110
+          },
+          {
+            slot: 'level',
+            prop: 'level',
+            label: '等级',
+            showOverflowTooltip: true,
+            align: 'center',
+            minWidth: 110,
+            formatter: (_row) => {
+              return this.levelOptions.filter(
+                (item) => _row.level == item.value
+              )[0].label;
+            }
+          },
+          {
+            slot: 'hourCost',
+            prop: 'hourCost',
+            label: '标准工时费',
+            showOverflowTooltip: true,
+            align: 'center',
+            minWidth: 110
+          },
+          {
+            slot: 'aptitude',
+            label: '资质',
+            showOverflowTooltip: true,
+            align: 'center',
+            minWidth: 110,
+            formatter: (_row) => {
+              return this.getDictValue('工种', _row.aptitude);
+            }
+          },
+          {
+            columnKey: 'action',
+            label: '操作',
+            width: 260,
+            align: 'center',
+            resizable: false,
+            slot: 'action',
+            showOverflowTooltip: true
+          }
+        ],
+        // 表格选中数据
+        selection: [],
+        // 当前编辑数据
+        current: null,
+        // 是否显示编辑弹窗
+        showEdit: false,
+        // 是否显示参数弹窗
+        showSetting: false,
+        controlList: [],
+        sampleShow: false,
+        taskId: null
+      };
+    },
+    created() {
+      this.requestDict('工种');
+    },
+    computed: {
+      typeOptions() {
+        return this.dict[this.dictEnum['工种']];
+      }
+    },
+    methods: {
+      /*配置工艺参数 */
+      openSetting(row) {
+        this.current = row;
+        this.showSetting = true;
+      },
+      /* 表格数据源 */
+      async datasource({ page, limit, where, order }) {
+        const res = await getProfessionPageList({
+          ...where,
+          ...order,
+          pageNum: page,
+          size: limit
+        });
+        return res;
+      },
+
+      /* 刷新表格 */
+      reload(where) {
+        this.$refs.table.reload({ page: 1, where: where });
+      },
+      /* 打开编辑弹窗 */
+      openEdit(row, isView) {
+        this.isView = !!isView;
+        this.getControlList();
+        this.current = row;
+        this.showEdit = true;
+        this.$refs.userEdit.$refs.form &&
+          this.$refs.userEdit.$refs.form.clearValidate();
+      },
+
+      getControlList() {
+        const params = {
+          pageNum: 1,
+          size: -1
+        };
+        control.list().then((res) => {
+          this.controlList = res.list;
+        });
+      },
+
+      /* 删除 */
+      remove(row) {
+        const loading = this.$loading({ lock: true });
+
+        deleteProfessiongetById([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 });
+            deleteProfessiongetById(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(() => {});
+      },
+
+      sampleParam(row) {
+        this.taskId = row.id;
+        this.sampleShow = true;
+      },
+
+      close(done) {
+        this.sampleShow = false;
+      }
+    }
+  };
+</script>

+ 304 - 0
src/views/factoryModel/qualificationManagement/components/user-edit.vue

@@ -0,0 +1,304 @@
+<!-- 用户编辑弹窗 -->
+<template>
+  <ele-modal
+    width="960px"
+    :visible="visible"
+    :append-to-body="true"
+    :close-on-click-modal="false"
+    custom-class="ele-dialog-form"
+    :title="isView ? '查看工种' : isUpdate ? '修改工种' : '添加工种'"
+    @update:visible="updateVisible"
+  >
+    <header-title title="基本信息"></header-title>
+    <el-form ref="form" :model="form" :rules="rules" label-width="100px">
+      <el-row>
+        <el-col :span="10">
+          <el-form-item label="类型:" prop="type">
+            <el-select
+              style="width: 100%"
+              :disabled="isView"
+              v-model="form.type"
+              filterable
+            >
+              <el-option
+                v-for="item in typeList"
+                :key="item.dictCode"
+                :label="item.dictValue"
+                :value="item.dictCode"
+              >
+              </el-option>
+            </el-select>
+          </el-form-item>
+        </el-col>
+
+        <el-col :span="10">
+          <el-form-item label="编码:" prop="code">
+            <el-input
+              :disabled="isView"
+              v-model="form.code"
+              clearable
+              placeholder="请输入"
+            />
+          </el-form-item>
+        </el-col>
+      </el-row>
+      <el-row>
+        <el-col :span="10">
+          <el-form-item label="等级:" prop="level">
+            <el-select
+              style="width: 100%"
+              :disabled="isView"
+              v-model="form.level"
+              filterable
+            >
+              <el-option
+                :label="item.label"
+                :value="item.value"
+                v-for="(item, index) in levelOptions"
+                :key="index"
+              >
+              </el-option>
+            </el-select>
+          </el-form-item>
+        </el-col>
+      </el-row>
+      <el-row>
+        <el-col :span="20">
+          <el-form-item label="名称:" prop="name">
+            <el-input
+              :disabled="isView"
+              v-model="form.name"
+              clearable
+              placeholder="请输入"
+            />
+          </el-form-item>
+        </el-col>
+      </el-row>
+      <el-row>
+        <el-col :span="20">
+          <el-form-item label="附件:" prop="accessory">
+            <fileUpload
+              v-if="!isView"
+              v-model="filedList"
+              :show-file-list="false"
+              module="main"
+              @input="uploadedSuccess($event, form)"
+              :limit="1"
+            />
+            <div v-if="form.accessory?.storePath">
+              <span>{{ form.accessory.name }}</span>
+              <el-button
+                style="margin-left: 10px"
+                size="mini"
+                type="primary"
+                @click="downloadFile(form.accessory.storePath, form)"
+                >下载</el-button
+              >
+            </div>
+          </el-form-item>
+        </el-col>
+      </el-row>
+      <el-row>
+        <el-col :span="20">
+          <el-form-item label="有效时间:" prop="date">
+            <el-date-picker
+              :disabled="isView"
+              v-model="form.date"
+              type="daterange"
+              value-format="yyyy-MM-dd HH:mm:ss"
+              range-separator="至"
+              start-placeholder="开始日期"
+              end-placeholder="结束日期"
+            >
+            </el-date-picker>
+          </el-form-item>
+        </el-col>
+      </el-row>
+    </el-form>
+
+    <template v-slot:footer>
+      <el-button @click="updateVisible(false)">取消</el-button>
+      <el-button v-if="isView" type="primary" @click="updateVisible(false)">
+        确定
+      </el-button>
+      <el-button v-else type="primary" :loading="loading" @click="save">
+        保存
+      </el-button>
+    </template>
+  </ele-modal>
+</template>
+
+<script>
+  import fileUpload from '@/components/upload/fileUpload';
+  import { getFile } from '@/api/system/file';
+  import {
+    saveProfessionCertification,
+    getProfessionCertificationById,
+    updateProfessionCertificationById
+  } from '@/api/factoryModel';
+  export default {
+    components: {
+      fileUpload
+    },
+    props: {
+      // 弹窗是否打开
+      visible: Boolean,
+      // 修改回显的数据
+      data: Object,
+      isView: Boolean,
+      controlList: Array,
+      typeList: Array
+    },
+    data() {
+      const defaultForm = function () {
+        return {
+          id: '',
+          code: '',
+          level: '',
+          name: '',
+          type: '',
+          status: 0,
+          accessory: {},
+          date: '小时'
+        };
+      };
+      return {
+        filedList: [],
+        defaultForm,
+        // 表单数据
+        form: defaultForm(),
+        moneyOptions: [
+          {
+            label: '元',
+            value: '元'
+          }
+        ],
+        timeOptions: [
+          {
+            label: '小时',
+            value: '小时'
+          },
+          {
+            label: '天',
+            value: '天'
+          },
+          {
+            label: '月',
+            value: '月'
+          }
+        ],
+        levelOptions: [
+          {
+            label: '初级',
+            value: '1'
+          },
+          {
+            label: '中级',
+            value: '2'
+          },
+          {
+            label: '高级',
+            value: '3'
+          }
+        ],
+        // 表单验证规则
+        rules: {
+          name: [{ required: true, message: '请输入名称', trigger: 'blur' }],
+          code: [{ required: true, trigger: 'blur', message: '请输入编码' }],
+          date: [{ required: true, message: '请选择资质', trigger: 'change' }],
+          level: [{ required: true, message: '请选择等级', trigger: 'change' }],
+          type: [{ required: true, message: '请选择类型', trigger: 'change' }]
+        },
+        // 提交状态
+        loading: false,
+        // 是否是修改
+        isUpdate: false,
+        chooseItem: null
+      };
+    },
+    methods: {
+      downloadFile(url, form) {
+        console.log(form);
+        getFile({ objectName: url }, '附件');
+      },
+      uploadedSuccess(data, row) {
+        console.log(data, row);
+        row.accessory.storePath = data[0].storePath;
+        row.accessory.name = data[0].name;
+        this.filedList = [];
+      },
+      /* 保存编辑 */
+      save() {
+        this.$refs.form.validate((valid) => {
+          if (!valid) {
+            return false;
+          }
+          console.log(this.form);
+          if (!this.isUpdate) {
+            delete this.form.id;
+          }
+          this.form.startTime = this.form.date[0];
+          this.form.endTime = this.form.date[1];
+          this.loading = true;
+          let apiStr = null;
+          if (this.isUpdate) {
+            apiStr = updateProfessionCertificationById;
+          } else {
+            apiStr = saveProfessionCertification;
+          }
+          apiStr(this.form)
+            .then((msg) => {
+              this.loading = false;
+              this.$message.success((this.isUpdate ? '修改' : '新建') + '成功');
+              this.updateVisible(false);
+              this.$emit('done');
+            })
+            .catch((e) => {
+              this.loading = false;
+              // this.$message.error(e.message);
+            });
+        });
+      },
+      /* 更新visible */
+      updateVisible(value) {
+        this.form = { ...this.defaultForm() };
+        this.$emit('update:visible', value);
+      }
+    },
+
+    watch: {
+      async visible(visible) {
+        if (visible) {
+          if (this.data) {
+            const res = await getProfessionCertificationById(this.data.id);
+            console.log(res);
+            this.$util.assignObject(this.form, {
+              ...res
+            });
+            this.form.date = [res.startTime, res.endTime];
+            this.isUpdate = true;
+            console.log(this.form);
+          } else {
+            this.filedList = [];
+            this.form = { ...this.defaultForm() };
+            this.isUpdate = false;
+          }
+        } else {
+          this.$refs.form.clearValidate();
+          this.form = { ...this.defaultForm() };
+        }
+      }
+    }
+  };
+</script>
+<style lang="scss" scoped>
+  .hourCostStyle {
+    display: flex;
+    > div {
+      margin-right: 10px;
+    }
+    > div:last-child {
+      margin-right: 0;
+    }
+  }
+</style>

+ 91 - 0
src/views/factoryModel/qualificationManagement/components/user-search.vue

@@ -0,0 +1,91 @@
+<!-- 搜索表单 -->
+<template>
+  <el-form
+    label-width="77px"
+    class="ele-form-search"
+    @keyup.enter.native="search"
+    @submit.native.prevent
+  >
+    <el-row :gutter="15">
+      <el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">
+        <el-form-item label="类型:" prop="type">
+          <el-select clearable v-model="where.type">
+            <el-option
+              v-for="item in typeList"
+              :key="item.dictCode"
+              :label="item.dictValue"
+              :value="item.dictCode"
+            >
+            </el-option>
+          </el-select>
+        </el-form-item>
+      </el-col>
+      <el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">
+        <el-form-item label="编码:">
+          <el-input clearable v-model="where.code" placeholder="请输入" />
+        </el-form-item>
+      </el-col>
+      <el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">
+        <el-form-item label="名称:">
+          <el-input clearable v-model="where.name" placeholder="请输入" />
+        </el-form-item>
+      </el-col>
+
+      <el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">
+        <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: '',
+        type: null
+      };
+      return {
+        // 表单数据
+        where: { ...defaultWhere },
+        controlList: []
+      };
+    },
+    props: {
+      typeList: {
+        type: Array,
+        default() {
+          return [];
+        }
+      }
+    },
+    computed: {
+      // 是否开启响应式布局
+      styleResponsive() {
+        return this.$store.state.theme.styleResponsive;
+      }
+    },
+    methods: {
+      /* 搜索 */
+      search() {
+        this.$emit('search', this.where);
+      },
+      /*  重置 */
+      reset() {
+        this.where = { ...this.defaultWhere };
+        this.search();
+      }
+    }
+  };
+</script>

+ 334 - 0
src/views/factoryModel/qualificationManagement/index.vue

@@ -0,0 +1,334 @@
+<template>
+  <div class="ele-body">
+    <el-card shadow="never">
+      <!-- 搜索表单 -->
+      <user-search :typeList="typeOptions" @search="reload" />
+      <!-- 数据表格 -->
+      <ele-pro-table
+        ref="table"
+        :columns="columns"
+        :datasource="datasource"
+        :selection.sync="selection"
+        row-key="id"
+      >
+        <!-- 表头工具栏 -->
+        <template v-slot:toolbar>
+          <el-button
+            size="small"
+            type="primary"
+            icon="el-icon-plus"
+            class="ele-btn-icon"
+            @click="openEdit()"
+          >
+            新建
+          </el-button>
+          <el-button
+            size="small"
+            type="danger"
+            icon="el-icon-delete"
+            class="ele-btn-icon"
+            @click="removeBatch"
+            plain
+          >
+            删除
+          </el-button>
+          <el-button
+            size="small"
+            type="primary"
+            icon="el-icon-upload2"
+            class="ele-btn-icon"
+            plain
+          >
+            导出
+          </el-button>
+          <el-button
+            size="small"
+            type="primary"
+            icon="el-icon-download"
+            class="ele-btn-icon"
+            plain
+          >
+            导入
+          </el-button>
+        </template>
+
+        <!-- 操作列 -->
+        <template v-slot:action="{ row }">
+          <el-link
+            type="primary"
+            :underline="false"
+            icon="el-icon-edit"
+            @click="openEdit(row)"
+          >
+            修改
+          </el-link>
+          <el-link
+            type="primary"
+            :underline="false"
+            icon="el-icon-setting"
+            @click="openEdit(row, true)"
+          >
+            详情
+          </el-link>
+
+          <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>
+    </el-card>
+    <!-- 编辑弹窗 -->
+    <user-edit
+      :visible.sync="showEdit"
+      :data="current"
+      :controlList="controlList"
+      :isView="isView"
+      @done="reload"
+      ref="userEdit"
+      :typeList="typeOptions"
+    />
+  </div>
+</template>
+
+<script>
+  import UserSearch from './components/user-search.vue';
+  import UserEdit from './components/user-edit.vue';
+  import {
+    getProfessionCertificationPageList,
+    deleteProfessionCertificationById
+  } from '@/api/factoryModel';
+  import control from '@/api/technology/control';
+  import dictMixins from '@/mixins/dictMixins';
+
+  export default {
+    name: 'technologyProduction',
+    components: {
+      UserSearch,
+      UserEdit
+    },
+    mixins: [dictMixins],
+    data() {
+      return {
+        levelOptions: [
+          {
+            label: '初级',
+            value: '1'
+          },
+          {
+            label: '中级',
+            value: '2'
+          },
+          {
+            label: '高级',
+            value: '3'
+          }
+        ],
+        isView: false,
+        // 表格列配置
+        columns: [
+          {
+            columnKey: 'selection',
+            type: 'selection',
+            width: 45,
+            align: 'center',
+            fixed: 'left'
+          },
+          {
+            label: '序号',
+            type: 'index',
+            width: 55,
+            align: 'center'
+          },
+          {
+            slot: 'type',
+            label: '类型',
+            showOverflowTooltip: true,
+            align: 'center',
+            minWidth: 110,
+            formatter: (_row) => {
+              return this.getDictValue('工种', _row.type);
+            }
+          },
+          {
+            align: 'center',
+            prop: 'code',
+            label: '编码',
+            showOverflowTooltip: true,
+            minWidth: 110
+          },
+          {
+            slot: 'name',
+            prop: 'name',
+            label: '名称',
+            showOverflowTooltip: true,
+            align: 'center',
+            minWidth: 110
+          },
+          {
+            slot: 'level',
+            prop: 'level',
+            label: '等级',
+            showOverflowTooltip: true,
+            align: 'center',
+            minWidth: 110,
+            formatter: (_row) => {
+              return this.levelOptions.filter(
+                (item) => _row.level == item.value
+              )[0].label;
+            }
+          },
+          {
+            slot: 'startTime',
+            prop: 'startTime',
+            label: '有效开始时间',
+            showOverflowTooltip: true,
+            align: 'center',
+            minWidth: 110
+          },
+          {
+            slot: 'endTime',
+            prop: 'endTime',
+            label: '有效结束时间',
+            showOverflowTooltip: true,
+            align: 'center',
+            minWidth: 110
+          },
+          {
+            slot: 'accessory.name',
+            prop: 'accessory.name',
+            label: '附件',
+            showOverflowTooltip: true,
+            align: 'center',
+            minWidth: 110
+          },
+          {
+            columnKey: 'action',
+            label: '操作',
+            width: 260,
+            align: 'center',
+            resizable: false,
+            slot: 'action',
+            showOverflowTooltip: true
+          }
+        ],
+        // 表格选中数据
+        selection: [],
+        // 当前编辑数据
+        current: null,
+        // 是否显示编辑弹窗
+        showEdit: false,
+        // 是否显示参数弹窗
+        showSetting: false,
+        controlList: [],
+        sampleShow: false,
+        taskId: null
+      };
+    },
+    created() {
+      this.requestDict('工种');
+    },
+    computed: {
+      typeOptions() {
+        return this.dict[this.dictEnum['工种']];
+      }
+    },
+    methods: {
+      /*配置工艺参数 */
+      openSetting(row) {
+        this.current = row;
+        this.showSetting = true;
+      },
+      /* 表格数据源 */
+      async datasource({ page, limit, where, order }) {
+        const res = await getProfessionCertificationPageList({
+          ...where,
+          ...order,
+          pageNum: page,
+          size: limit
+        });
+        return res;
+      },
+
+      /* 刷新表格 */
+      reload(where) {
+        this.$refs.table.reload({ page: 1, where: where });
+      },
+      /* 打开编辑弹窗 */
+      openEdit(row, isView) {
+        this.isView = !!isView;
+        this.getControlList();
+        this.current = row;
+        this.showEdit = true;
+        this.$refs.userEdit.$refs.form &&
+          this.$refs.userEdit.$refs.form.clearValidate();
+      },
+
+      getControlList() {
+        const params = {
+          pageNum: 1,
+          size: -1
+        };
+        control.list().then((res) => {
+          this.controlList = res.list;
+        });
+      },
+
+      /* 删除 */
+      remove(row) {
+        const loading = this.$loading({ lock: true });
+
+        deleteProfessionCertificationById([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 });
+            deleteProfessionCertificationById(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(() => {});
+      },
+
+      sampleParam(row) {
+        this.taskId = row.id;
+        this.sampleShow = true;
+      },
+
+      close(done) {
+        this.sampleShow = false;
+      }
+    }
+  };
+</script>

+ 2 - 2
src/views/material/BOMmanage/components/attribute.vue

@@ -205,11 +205,11 @@
         bomTypeOptions: [
           {
             label: 'PBOM',
-            value: 1
+            value: '1'
           },
           {
             label: 'MBOM',
-            value: 2
+            value: '2'
           }
         ]
       };

+ 52 - 6
src/views/material/BOMmanage/components/baseInfo.vue

@@ -4,22 +4,47 @@
       <el-row>
         <el-col :span="6" label-width="100px">
           <el-form-item label="BOM编码" prop="type">
-            <el-input placeholder="BOM编码" v-model="form.type"></el-input>
+            <el-input
+              disabled
+              placeholder="BOM编码"
+              v-model="dataInfo.code"
+            ></el-input>
           </el-form-item>
         </el-col>
         <el-col :span="6" label-width="100px">
           <el-form-item label="BOM名称" prop="type">
-            <el-input placeholder="BOM名称" v-model="form.type"></el-input>
+            <el-input
+              disabled
+              placeholder="BOM名称"
+              v-model="dataInfo.name"
+            ></el-input>
           </el-form-item>
         </el-col>
         <el-col :span="6" label-width="100px">
           <el-form-item label="版本号" prop="type">
-            <el-input placeholder="版本号" v-model="form.type"></el-input>
+            <el-input
+              disabled
+              placeholder="版本号"
+              v-model="dataInfo.versions"
+            ></el-input>
           </el-form-item>
         </el-col>
         <el-col :span="6" label-width="100px">
           <el-form-item label="状态" prop="type">
-            <el-input placeholder="状态" v-model="form.type"></el-input>
+            <el-select
+              style="width: 100%"
+              disabled
+              v-model="dataInfo.status"
+              placeholder="请选择"
+            >
+              <el-option
+                v-for="item in statusOptions"
+                :label="item.label"
+                :value="item.value"
+                :key="item.value"
+              >
+              </el-option>
+            </el-select>
           </el-form-item>
         </el-col>
       </el-row>
@@ -27,7 +52,11 @@
       <el-row>
         <el-col :span="6" label-width="100px">
           <el-form-item label="所属工厂" prop="code">
-            <el-input placeholder="所属工厂" v-model="form.code"></el-input>
+            <el-input
+              disabled
+              placeholder="所属工厂"
+              v-model="dataInfo.code"
+            ></el-input>
           </el-form-item>
         </el-col>
       </el-row>
@@ -39,8 +68,25 @@
   export default {
     data() {
       return {
-        form: {}
+        statusOptions: [
+          {
+            label: '默认',
+            value: '0'
+          },
+          {
+            label: '归档',
+            value: '1'
+          }
+        ]
       };
+    },
+    props: {
+      dataInfo: {
+        type: Object,
+        default() {
+          return {};
+        }
+      }
     }
   };
 </script>

+ 4 - 4
src/views/material/BOMmanage/components/bomTreeDialog.vue

@@ -207,21 +207,21 @@
         statusOptions: [
           {
             label: '默认',
-            value: 0
+            value: '0'
           },
           {
             label: '归档',
-            value: 1
+            value: '1'
           }
         ],
         bomTypeOptions: [
           {
             label: 'PBOM',
-            value: 1
+            value: '1'
           },
           {
             label: 'MBOM',
-            value: 2
+            value: '2'
           }
         ]
       };

+ 6 - 2
src/views/material/BOMmanage/components/workmanship.vue

@@ -415,8 +415,12 @@
           pageNum: page,
           size: limit
         });
-        this.currentTableData = data[0];
-        return data[0].taskParam;
+        if (data?.length > 0) {
+          this.currentTableData = data[0];
+          return data[0].taskParam;
+        } else {
+          return [];
+        }
       },
       editWorkingProcedure(row) {
         this.$refs.processModalRef.open(

+ 47 - 5
src/views/material/BOMmanage/details.vue

@@ -49,11 +49,15 @@
                 >新建</el-button
               >
               <el-button
-                v-if="currentNodeData.bomType == 2"
+                v-if="
+                  currentNodeData.bomType == 2 &&
+                  currentNodeData.children?.length <= 0
+                "
                 type="danger"
                 size="mini"
                 icon="el-icon-delete"
                 plain
+                @click="remove"
                 >删除</el-button
               >
               <el-button
@@ -82,7 +86,10 @@
               </div>
             </div>
 
-            <baseInfo v-if="currentNodeData.bomType == 2" />
+            <baseInfo
+              :dataInfo="currentNodeData"
+              v-if="currentNodeData.bomType == 2"
+            />
             <el-tabs class="tab-box" type="border-card">
               <el-tab-pane label="属性">
                 <attribute :attributeData="currentNodeData"></attribute>
@@ -91,7 +98,10 @@
                 <document></document>
               </el-tab-pane>
               <el-tab-pane v-if="currentNodeData.level == 3" label="工艺">
-                <workmanship :taskParam="currentNodeData"></workmanship>
+                <workmanship
+                  ref="workmanshipRef"
+                  :taskParam="currentNodeData"
+                ></workmanship>
               </el-tab-pane>
             </el-tabs>
           </div>
@@ -103,7 +113,11 @@
 </template>
 
 <script>
-  import { getBomTreeList, convert } from '@/api/material/BOM.js';
+  import {
+    getBomTreeList,
+    convert,
+    deleteBomTreeList
+  } from '@/api/material/BOM.js';
   import { getTreeByGroup } from '@/api/classifyManage';
   import attribute from './components/attribute.vue';
   import baseInfo from './components/baseInfo.vue';
@@ -122,7 +136,8 @@
     data() {
       return {
         currentNodeData: {
-          bomType: 1
+          bomType: 1,
+          children: []
         },
         taskParam: [],
         current: {},
@@ -146,6 +161,33 @@
       this.getTreeData();
     },
     methods: {
+      remove() {
+        this.$confirm('是否确认删除?', '提示', {
+          confirmButtonText: '确定',
+          cancelButtonText: '取消',
+          type: 'warning'
+        })
+          .then(() => {
+            const loading = this.$loading({ lock: true });
+
+            deleteBomTreeList([this.currentNodeData.id])
+              .then((msg) => {
+                loading.close();
+                this.$message.success('删除' + msg);
+                this.getTreeData();
+              })
+              .catch((e) => {
+                loading.close();
+                // this.$message.error(e.message);
+              });
+          })
+          .catch(() => {
+            this.$message({
+              type: 'info',
+              message: '已取消删除'
+            });
+          });
+      },
       bomChange() {
         this.getTreeData();
       },

+ 6 - 1
src/views/material/product/components/index-data.vue

@@ -255,7 +255,6 @@
             showOverflowTooltip: true,
             minWidth: 110
           },
-
           {
             prop: 'brandNum',
             align: 'center',
@@ -274,6 +273,12 @@
             align: 'center',
             showOverflowTooltip: true
           },
+          {
+            prop: 'level',
+            label: '级别',
+            align: 'center',
+            showOverflowTooltip: true
+          },
           {
             prop: 'measuringUnit',
             label: '计量单位',