Jelajahi Sumber

fix:图纸资料,bom加版本

lupeng 1 tahun lalu
induk
melakukan
ed6389feb3

+ 16 - 0
src/api/drawing/index.ts

@@ -0,0 +1,16 @@
+import request from "@/utils/request";
+import { Drawing} from "./types";
+
+/**
+ * 修改图纸启用,禁用状态
+ *
+ * @param id
+ * @param data
+ */
+export function updateDrawaing(data: Drawing) {
+  return request({
+    url: "/api/v1/base/drawing/update",
+    method: "post",
+    data: data,
+  });
+}

+ 4 - 0
src/api/drawing/types.ts

@@ -0,0 +1,4 @@
+export interface Drawing {
+  id?:number;
+  enable?: number;
+}

+ 39 - 3
src/hooks/userCrud.ts

@@ -128,6 +128,45 @@ export const useCrud = (config?: UseCrudConfig) => {
         config?.done && config?.done();
       }
     },
+    dataEditList: async (config?: UseCrudConfig) => {
+      handleSearchData();
+      try {
+        const res = await request({
+          url: `${url.value}/page`,
+          method: "post",
+          data: {
+            pageNo: page.value.currentPage,
+            pageSize: page.value.pageSize,
+            ...search.value,
+            ...(commonConfig.value?.params ?? {}),
+          },
+        });
+        if (res?.data) {
+          if(res?.data instanceof Array){
+            data.value = res?.data || []
+            page.value.total = res?.data?.length || 0
+          }else{
+            data.value = res?.data?.records || [];
+            for (let i = 0; i < data.value.length; i++) {
+              data.value[i].$cellEdit = true;
+              if(data.value[i].children!=undefined&&data.value[i].children!=null&&data.value[i].children.length > 0 ){
+                for(let j=0;j < data.value[i].children.length; j++){
+                  data.value[i].children[j].$cellEdit = true;
+                }
+              }
+            }
+            console.info(data.value);
+            page.value.total = res?.data?.totalCount || 0;
+          }
+
+        }
+        config?.done && config?.done();
+      } catch (err) {
+        config?.loading && config?.loading();
+      } finally {
+        config?.done && config?.done();
+      }
+    },
     dataNoPageList: async (config?: UseCrudConfig) => {
       handleSearchData();
       try {
@@ -141,9 +180,6 @@ export const useCrud = (config?: UseCrudConfig) => {
         if (res?.data) {
           data.value = res?.data || [];
         }
-        for (let i = 0; i < data.value.length; i++) {
-          data.value[i].$cellEdit = true;
-        }
         config?.done && config?.done();
       } catch (err) {
         config?.loading && config?.loading();

+ 2 - 0
src/store/modules/dictionary.ts

@@ -23,6 +23,8 @@ export const useDictionaryStore = defineStore("dictionaryStore", () => {
     "danwei_type",
     "trace_type",
     "skill_type",
+    "drawing_type",
+    "enable",
   ];
   const dicts = ref<{ string?: any[] }>({});
   function checkDicts() {

+ 1 - 1
src/utils/request.ts

@@ -43,7 +43,7 @@ service.interceptors.response.use(
     if (error.response.data) {
       const { code, msg } = error.response.data;
       // token 过期,重新登录
-      if (code === "A0230") {
+      if (code === "4106") {
         ElMessageBox.confirm("当前页面已失效,请重新登录", "提示", {
           confirmButtonText: "确定",
           cancelButtonText: "取消",

+ 132 - 0
src/views/base/bom/components/version-page.vue

@@ -0,0 +1,132 @@
+<template>
+
+
+  <div class="mainContentBox">
+    <avue-form
+      ref="formRef"
+      v-model="form"
+      :option="option"
+      @submit="rowSave"
+    >
+      <template #drawingPath="scope">
+        <single-upload v-model="form.drawingPath" />
+      </template>
+    </avue-form>
+    <avue-crud
+      ref="crudRef"
+      v-model:search="search"
+      v-model="form"
+      :data="data"
+      :option="option"
+      v-model:page="page"
+      @row-save="createRow"
+      @row-update="updateRow"
+      @row-del="deleteRow"
+      @search-change="searchChange"
+      @search-reset="resetChange"
+      @size-change="dataList"
+      @current-change="dataList"
+      @selection-change="selectionChange"
+      search-option="false"
+    >
+
+
+    </avue-crud>
+  </div>
+
+</template>
+<script setup>
+  import { ref, getCurrentInstance } from "vue";
+  import { useCrud } from "@/hooks/userCrud";
+  import ButtonPermKeys from "@/common/configs/buttonPermission";
+  import { useCommonStoreHook } from "@/store";
+
+  const { isShowTable, tableType } = toRefs(useCommonStoreHook());
+  import { useDictionaryStoreHook } from "@/store";
+  import {
+    addStationDevice,
+  } from "@/api/station";
+  const test = () => {
+    isShowTable.value = true;
+    tableType.value = tableType.value == 1 ? 2 : 1;
+  };
+
+  // 传入一个url,后面不带/
+  const { form, data, option, search, page, toDeleteIds, Methords, Utils } =
+    useCrud({
+      src: "/api/v1/base/bomVersion",
+    });
+  const { dataList, createRow, updateRow, deleteRow, searchChange, resetChange } =
+    Methords; //增删改查
+  const { selectionChange, multipleDelete } = Methords; //选中和批量删除事件
+  const { checkBtnPerm, downloadTemplate, exportData } = Utils; //按钮权限等工具
+  // checkBtnPerm(ButtonPermKeys.PLAN.BTNS.order_add) :permission="permission"
+  // const permission = reactive({
+  //   delBtn: checkPerm(buttonPermission.PLAN.BTNS.order_del),
+  //   addBtn: checkPerm(buttonPermission.PLAN.BTNS.order_add),
+  //   editBtn: checkPerm(buttonPermission.PLAN.BTNS.order_edit),
+  //   menu: true,
+  // });
+  function rowSave(form2,done,loading) {
+    form.value.materialCode=props.materialCode;
+    createRow(form,done,loading);
+
+  }
+
+
+
+  const crudRef = ref(null); //crudRef.value 获取avue-crud对象
+
+  onMounted(() => {
+    // console.log("crudRef", crudRef)
+    search.value.materialCode=props.materialCode;
+    dataList();
+  });
+
+
+  const uploadFinished = () => {
+    // 上传完成后的刷新操作
+    page.currentPage = 1;
+    dataList();
+  };
+
+
+
+
+  // 设置表格列或者其他自定义的option
+  option.value = Object.assign(option.value, {
+    selection: true,
+    column: [
+      {
+        label: "版本号",
+        prop: "bomVersion",
+        type:"number",
+        controlsPosition: '',
+        min:1,
+        precision: 1,
+      },
+      { label: "物料编码", prop: "materialCode", width: 130,overHidden: true,display:false,hide:true},
+
+
+
+      ],
+    viewBtn: false,
+    addBtn:false,
+  });
+  const props = defineProps({
+    materialCode: {
+      type: String,
+      default: () => {
+        return 0;
+      }
+    },
+    dialog:{
+      type:Object,
+      default:()=>{
+        return {};
+      }
+    }
+  })
+
+</script>
+

+ 42 - 5
src/views/base/bom/index.vue

@@ -20,12 +20,26 @@
       @selection-change="selectionChange"
     >
       <template #menu-left="{ size }">
+        <div style="display:flex">
         <el-button
           type="primary"
           icon="el-icon-plus"
           @click="openMaterial"
-          >新增</el-button
-        ></template>
+          >新增</el-button>
+           <el-select v-model="value" placeholder="请选择BOM版本" style="width:150px;margin-left:15px" @click="openBomVersion">
+          <el-option
+            v-for="item in options"
+            :key="item.value"
+            :label="item.label"
+            :value="item.value"
+          >
+          </el-option>
+        </el-select>
+
+          </div>
+
+
+      </template>
 
         <CommonTable
           ref="ctableRef"
@@ -40,11 +54,16 @@
 
         </div>
       </template>
+
       <template #menu-right="{}">
+
+
         <el-dropdown split-button
           >导入
           <template #dropdown>
+
             <el-dropdown-menu>
+
               <el-dropdown-item
                 @click="downloadTemplate('/api/v1/plan/order/template')"
               >
@@ -64,7 +83,14 @@
       tableType="MARTERIAL"
       @selected-sure="onSelectedFinish"
     />
-
+    <el-dialog
+      v-model="dialog.visible"
+      :title="dialog.title"
+      width="900px"
+      @close="dialog.visible = false"
+    >
+      <version-page  :materialCode="route.materialCode" :dialog="dialog"/>
+    </el-dialog>
   </div>
 </template>
 <script setup lang="ts">
@@ -99,14 +125,25 @@ const openMaterial=()=>{
     ctableRef.value.startSelect();
   }
 }
-const formData=ref({});
+const openBomVersion=()=>{
+
+  dialog.visible=true;
+}
+const value=ref({
+    value: '0',
+    label: '请选择BOM版本',
+});
+const options=ref([]);
 const dataBomLists=()=>{
   search.value.materialCode=route.value.materialCode;
   dataNoPageList();
 }
 
 const ctableRef = ref(null);
-
+const dialog = reactive({
+  title: "BOM版本",
+  visible: false,
+});
 const binding = (row) => {
   if (ctableRef.value) {
     ctableRef.value.startSelect();

+ 105 - 0
src/views/base/information/columns.ts

@@ -0,0 +1,105 @@
+import { useDictionaryStoreHook } from "@/store";
+const { dicts } = useDictionaryStoreHook();
+import {updateDrawaing} from "@/api/drawing";
+import { useCrud } from "@/hooks/userCrud";
+const { form, data, option, search, page, toDeleteIds, Methords, Utils } =
+  useCrud({
+    src: "/api/v1/base/drawing",
+  });
+const { dataList, createRow, updateRow, deleteRow, searchChange, resetChange } =
+  Methords;
+const drawing=reactive({});
+
+export const columns = [
+  { label: "图纸名称", prop: "drawingTitle", width: 130,overHidden: true,search: true ,rules: [{
+      required: true,
+      message: "请填写图纸名称",
+      trigger: "blur"
+    }],},
+  { label: "图纸编号", prop: "drawingCode", width: 140,search: true,overHidden: true,search: true ,rules: [{
+      required: true,
+      message: "请填写图纸编号",
+      trigger: "blur"
+    }],},
+  {
+    label: "图纸类型",
+    prop: "drawingDictValue",
+    search: true,
+    filterable: true,
+    type: 'select',
+    width: 100,overHidden: true,
+    dicData:dicts.drawing_type,
+    props: { label: "dictLabel", value: "dictValue" },
+    rules: [{
+      required: true,
+      message: "请选择物料属性",
+      trigger: "blur"
+    }],
+  },
+  {
+    label: "文件",
+    prop: "drawingPath",
+    span: 24,
+    slot: true,
+    hide:true,
+  },
+  { label: "文件",
+    prop: "drawing",
+    type: 'img',
+    span: 24,
+    display:false,
+    slot: true,
+    formatter: (row, column, cellValue, index) => {
+      return `${row.drawingPath}`;} },
+  {
+    label: "版本",
+    prop: "drawingVersion",
+    type:"number",
+    precision:1,
+    rules: [{
+      required: true,
+      message: "版本号不能为空",
+      trigger: "blur"
+    }]
+
+
+  },
+  {
+    label: "创建时间",
+    prop: "created",
+    display:false,
+  },
+  { label: "启用状态",
+    slot:true,
+    cell: true,
+    align: 'center',
+    headerAlign: 'center',
+    prop: "enable",
+    dicData: [{
+      label: '',
+      value: 0
+    }, {
+      label: '',
+      value: 1
+    }],
+    value: 1,
+    width: 100,
+    type: 'switch',
+    overHidden: true,
+    value:1,
+    click:(row, column, cellValue, index)=>{
+
+      drawing.id=row.row.id;
+      if(row.row.enable===1){
+        drawing.enable=0;
+      }
+      if(row.row.enable===0){
+        drawing.enable=1;
+      }
+      updateDrawaing(drawing).then(
+        ()=>{dataList();}
+
+      );
+   }
+  },
+];

+ 102 - 0
src/views/base/information/index.vue

@@ -0,0 +1,102 @@
+<template>
+  <div class="mainContentBox">
+    <avue-crud
+      ref="crudRef"
+      v-model:search="search"
+      v-model="form"
+      :data="data"
+      :option="option"
+      v-model:page="page"
+      @row-save="createRow"
+      @row-update="updateRow"
+      @row-del="deleteRow"
+      @search-change="searchChange"
+      @search-reset="resetChange"
+      @size-change="dataList"
+      @current-change="dataList"
+      @selection-change="selectionChange"
+    >
+      <template #fileUrl-form="scope">
+        <single-upload v-model="form.drawingPath" />
+      </template>
+      <template #menu="{row,index,type}">
+        <el-button @click="deleteRecord(row,index,done)"
+                   text
+                   type="primary"
+        >删除</el-button>
+      </template>
+    </avue-crud>
+
+
+    <ExcelUpload ref="uploadRef" @finished="uploadFinished" />
+  </div>
+</template>
+<script setup lang="ts">
+import { ref, getCurrentInstance } from "vue";
+import { useCrud } from "@/hooks/userCrud";
+import ButtonPermKeys from "@/common/configs/buttonPermission";
+import { columns } from "./columns";
+import { useCommonStoreHook, useDictionaryStoreHook } from "@/store";
+import {updateDrawaing} from "@/api/drawing";
+const { isShowTable, tableType } = toRefs(useCommonStoreHook());
+// 数据字典相关
+const { dicts } = useDictionaryStoreHook();
+
+const test = () => {
+  isShowTable.value = true;
+  tableType.value = tableType.value == 1 ? 2 : 1;
+};
+
+
+// 传入一个url,后面不带/
+const { form, data, option, search, page, toDeleteIds, Methords, Utils } =
+  useCrud({
+    src: "/api/v1/base/drawing",
+  });
+const { dataEditList, createRow, updateRow, deleteRow, searchChange, resetChange } =
+  Methords; //增删改查
+const { selectionChange, multipleDelete } = Methords; //选中和批量删除事件
+const { checkBtnPerm, downloadTemplate, exportData } = Utils; //按钮权限等工具
+// checkBtnPerm(ButtonPermKeys.PLAN.BTNS.order_add) :permission="permission"
+// const permission = reactive({
+//   delBtn: checkPerm(buttonPermission.PLAN.BTNS.order_del),
+//   addBtn: checkPerm(buttonPermission.PLAN.BTNS.order_add),
+//   editBtn: checkPerm(buttonPermission.PLAN.BTNS.order_edit),
+//   menu: true,
+// });
+
+const crudRef = ref(null); //crudRef.value 获取avue-crud对象
+const router = useRouter();
+
+onMounted(() => {
+  // console.log("crudRef", crudRef)
+  dataEditList();
+});
+
+
+
+/**
+ * 上传excel相关
+ */
+const uploadRef = ref(null);
+const uploadFinished = () => {
+  // 上传完成后的刷新操作
+  page.currentPage = 1;
+  dataEditList();
+};
+
+
+// 设置表格列或者其他自定义的option
+option.value = Object.assign(option.value, {
+  selection: false,
+  viewBtn:false,
+  editBtn:false,
+
+  column: columns,
+});
+
+const deleteRecord=(row,index,done)=>{
+  deleteRow(row,index,done);
+  dataEditList();
+}
+</script>

+ 4 - 5
src/views/base/materials/columns.ts

@@ -26,7 +26,7 @@ export const columns = [
       trigger: "blur"
     }],
   },
-  { label: "物料规格", prop: "spec", width: 100,overHidden: true,search: true,rules: [{
+  { label: "物料规格", prop: "spec", width: 100,overHidden: true,rules: [{
       required: true,
       message: "请填写物料规格",
       trigger: "blur"
@@ -34,7 +34,6 @@ export const columns = [
   {
     label: "单位",
     prop: "unitDictValue",
-    search: true,
     filterable: true,
     type: "select",
     dicData:dicts.danwei_type,
@@ -124,8 +123,8 @@ export const columns = [
     dicData:dicts.stage,
     props: { label: "dictLabel", value: "dictValue" },
   },
-  { label: "客户型号", prop: "customerModel",width: 100,overHidden: true, search: true },
-  { label: "保质期(天)", prop: "qualityGuaranteePeriod",width: 100,overHidden: true, search: true },
+  { label: "客户型号", prop: "customerModel",width: 100,overHidden: true,  },
+  { label: "保质期(天)", prop: "qualityGuaranteePeriod",width: 100,overHidden: true, },
   {
     label: "封装方法",
     prop: "packageDictValue",
@@ -162,7 +161,7 @@ export const columns = [
       trigger: "blur"
     }],
   },
-  { label: "筛选规范", prop: "selectionSpec",width: 150,overHidden: true, search: true , type: "textarea",span:18},
+  { label: "筛选规范", prop: "selectionSpec",width: 150,overHidden: true,  type: "textarea",span:18},
 
   { label: "备注", prop: "remark", width: 150,overHidden: true,type: "textarea", span:18 },
 ];

+ 12 - 1
src/views/base/modeling/factory/index.vue

@@ -9,7 +9,7 @@
       v-model:page="page"
       @row-save="createRow"
       @row-update="updateRow"
-      @row-del="deleteRow"
+      @row-del="delete(row,index,done)"
       @search-change="searchChange"
       @search-reset="resetChange"
       @size-change="dataList"
@@ -92,6 +92,17 @@
     }
 
   };
+  const delete=(row,index,done)=>{
+    if(row.level==="first"){
+      deleteRow(row,index,done);
+    }
+    if(row.level==="second"){
+      workShopRef.value.startSelect();
+    }
+    if(row.level==="third"){
+      productionLineRef.value.startSelect();
+    }
+  }
   const dialog = reactive({
     title: "绑定子项",
     visible: false,

+ 43 - 0
src/views/quality/unqualified/columns.ts

@@ -0,0 +1,43 @@
+import { useDictionaryStoreHook } from "../../../store/index";
+const { dicts } = useDictionaryStoreHook();
+export const columns = [
+
+  {
+    label: "报故时间",
+    prop: "created",
+  },
+
+
+  {
+    label: "物料名称",
+    prop: "bomMaterialName",
+    overHidden:true,
+  },
+  {
+    label: "物料属性",
+    prop: "bomMaterialAttribute",
+    type: 'select',
+    dicData:dicts.material_properties,
+    props: { label: "dictLabel", value: "dictValue" },
+  },
+  {
+    label: "物料数量",
+    prop: "bomMaterialNumber",
+    min:0,
+    slot:true,
+    cell: true,
+    type: "number",
+    precision: 2,
+  },
+  {
+    label: "物料名称",
+    prop: "materialName",
+    overHidden:true,
+  },
+
+  {
+    label: "物料编码",
+    prop: "bomMaterialCode",
+  },
+
+];

+ 260 - 0
src/views/quality/unqualified/index.vue

@@ -0,0 +1,260 @@
+<template>
+  <div class="mainContentBox">
+    <!--{{dataDetail}}-->
+    <!--{{dicts}}-->
+    <div class="detail">
+      <div class="title-detail">物料名称:{{dataDetail.materialCode}}</div>
+      <div class="title-detail">物料编码:{{dataDetail.materialName}}</div>
+      <div class="title-detail">物料属性:{{dataDetail.attributeDictLabel}}</div>
+    </div>
+    <avue-crud
+      ref="crudRef"
+      v-model:search="search"
+      v-model="form"
+      :data="data"
+      :option="option"
+      @row-update="updateRow"
+      @row-del="deleteRow"
+      @search-change="searchChange"
+      @search-reset="resetChange"
+      @selection-change="selectionChange"
+    >
+      <template #menu-left="{ size }">
+        <el-button
+          type="primary"
+          icon="el-icon-plus"
+          @click="openMaterial"
+          >新增</el-button
+        ></template>
+
+        <CommonTable
+          ref="ctableRef"
+          tableTitle="物料选择"
+          tableType="BOM"
+          @selected-sure="onSelectedFinish"
+        />
+      <template #footer>
+        <div class="detail-footer">
+          <el-button type="primary" @click="onSelected"> 保存 </el-button>
+          <el-button @click="routeBack">取消</el-button>
+
+        </div>
+      </template>
+      <template #menu-right="{}">
+        <el-dropdown split-button
+          >导入
+          <template #dropdown>
+            <el-dropdown-menu>
+              <el-dropdown-item
+                @click="downloadTemplate('/api/v1/plan/order/template')"
+              >
+                <i-ep-download />下载模板
+              </el-dropdown-item>
+              <el-dropdown-item @click="importExcelData">
+                <i-ep-top />导入数据
+              </el-dropdown-item>
+            </el-dropdown-menu>
+          </template>
+        </el-dropdown>
+      </template>
+    </avue-crud>
+    <CommonTable
+      ref="ctableRef"
+      tableTitle="BOM添加"
+      tableType="MARTERIAL"
+      @selected-sure="onSelectedFinish"
+    />
+
+  </div>
+</template>
+<script setup lang="ts">
+import { ref, getCurrentInstance } from "vue";
+import { useCrud } from "../../../hooks/userCrud";
+import ButtonPermKeys from "../../../common/configs/buttonPermission";
+import { columns } from "./columns";
+import { useCommonStoreHook, useDictionaryStoreHook } from "../../../store/index";
+import {
+  getList,
+} from "@/api/bom";
+import {
+  getMaterialDetails,
+} from "@/api/material";
+
+import {
+  batchAddBom,
+} from "@/api/bom";
+const { isShowTable, tableType } = toRefs(useCommonStoreHook());
+// 数据字典相关
+const { dicts } = useDictionaryStoreHook();
+const router = useRouter();
+const route = useRoute();
+
+const dataDetail=ref({});
+const test = () => {
+  isShowTable.value = true;
+  tableType.value = tableType.value == 1 ? 2 : 1;
+};
+const openMaterial=()=>{
+  if (ctableRef.value) {
+    ctableRef.value.startSelect();
+  }
+}
+const formData=ref({});
+const dataBomLists=()=>{
+  search.value.materialCode=route.value.materialCode;
+  dataNoPageList();
+}
+
+const ctableRef = ref(null);
+
+const binding = (row) => {
+  if (ctableRef.value) {
+    ctableRef.value.startSelect();
+  }
+};
+const onSelected=()=>{
+  for(var i=0;i<data.value.length;i++){
+    if(data.value[i].bomMaterialNumber<=0){
+      ElMessage({
+        message: data.value[i].bomMaterialName+"数量不能为0",
+        type: "error",
+      });
+      return;
+    }
+  }
+  if(data.value.length===0){
+    ElMessage({
+      message: "物料记录不能为空!",
+      type: "error",
+    });
+    return;
+  }
+  batchAddBom(data.value).then(
+    (data: any)=>{
+      if(data.code==="200") {
+        ElMessage({
+          message: data.msg,
+          type: "success",
+        });
+        router.back();
+      }
+      else {
+        ElMessage({
+          message: data.msg,
+          type: "error",
+        });
+      }
+    }
+  );
+}
+// 传入一个url,后面不带/
+const { form, data, option, search, page, toDeleteIds, Methords, Utils } =
+  useCrud({
+    src: "/api/v1/base/materialBom",
+  });
+const { dataNoPageList,createRow, updateRow, deleteRow, searchChange, resetChange } =
+  Methords; //增删改查
+const { selectionChange, multipleDelete } = Methords; //选中和批量删除事件
+const { checkBtnPerm, downloadTemplate, exportData } = Utils; //按钮权限等工具
+// checkBtnPerm(ButtonPermKeys.PLAN.BTNS.order_add) :permission="permission"
+// const permission = reactive({
+//   delBtn: checkPerm(buttonPermission.PLAN.BTNS.order_del),
+//   addBtn: checkPerm(buttonPermission.PLAN.BTNS.order_add),
+//   editBtn: checkPerm(buttonPermission.PLAN.BTNS.order_edit),
+//   menu: true,
+// });
+
+const crudRef = ref(null); //crudRef.value 获取avue-crud对象
+
+onMounted(() => {
+  // console.log("crudRef", crudRef)
+  search.value.materialCode=route.params.materialCode;
+  queryMaterialDetail();
+  dataNoPageList();
+
+});
+
+/**
+ * 上传excel相关
+ */
+const uploadRef = ref(null);
+const uploadFinished = () => {
+  // 上传完成后的刷新操作
+  dataNoPageList();
+};
+const importExcelData = () => {
+  if (uploadRef.value) {
+    uploadRef.value.show("/api/v1/plan/order/import");
+  }
+};
+
+// 设置表格列或者其他自定义的option
+option.value = Object.assign(option.value, {
+  selection: true,
+  addBtn: false,
+  viewBtn: false,
+  editBtn:false,
+  saveBtn:false,
+  cellBtn: true,
+  column: columns,
+});
+const routeBack =()=>{
+  router.back();
+}
+const onSelectedFinish = (selectedValue) => {
+  for(var i=0;i<data.value.length;i++){
+    if(data.value[i].bomMaterialCode===selectedValue.materialCode){
+      ElMessage({
+        message: data.value[i].bomMaterialName+"已经添加过了",
+        type: "error",
+      });
+      return;
+    }
+  }
+  const bom=ref({
+    materialCode:route.params.materialCode,
+    bomMaterialCode:selectedValue.materialCode,
+    bomMaterialName:selectedValue.materialName,
+    bomMaterialAttribute:selectedValue.attributeDictValue,
+    bomMaterialNumber:0,
+    $cellEdit:true,
+  });
+  data.value.push(bom.value);
+};
+const queryMaterialDetail = () => {
+  getMaterialDetails(route.params.materialCode).then(
+
+    ({ data }) => {
+      dataDetail.value=data;
+      dicts.material_properties;
+      for(var i=0;i<dicts.material_properties.length;i++){
+        if(data.attributeDictValue===dicts.material_properties[i].dictValue){
+          dataDetail.value.attributeDictLabel=dicts.material_properties[i].dictLabel;
+        }
+      }
+
+    }
+  );
+};
+</script>
+<style type="text/css">
+  .title-detail{
+    width: 30%;
+    height: 50px;
+    line-height: 50px;
+    margin: 25px 20px 25px 0;
+    float: left;
+  }
+  .detail{
+    margin: 0 auto;
+    width: 100%;
+  }
+  .avue-crud{
+    float: left;
+  }
+  .detail-footer{
+    float: right;
+    margin-top:15px;
+  }
+
+</style>