Browse Source

Merge branch 'master' of http://192.168.101.4:3000/jiaxiaoqiang/JG-ADMIN-TEMP

jiaxiaoqiang 1 year ago
parent
commit
c202d285c0
40 changed files with 1645 additions and 284 deletions
  1. 1 0
      package.json
  2. 16 0
      src/api/drawing/index.ts
  3. 4 0
      src/api/drawing/types.ts
  4. 25 0
      src/api/order/index.ts
  5. 0 17
      src/api/process/index.ts
  6. 35 0
      src/components/CommonTable/index.vue
  7. 1 1
      src/components/Upload/ExcelUpload.vue
  8. 40 3
      src/hooks/userCrud.ts
  9. 3 1
      src/main.ts
  10. 2 0
      src/store/modules/dictionary.ts
  11. 1 1
      src/utils/request.ts
  12. 132 0
      src/views/base/bom/components/version-page.vue
  13. 42 5
      src/views/base/bom/index.vue
  14. 0 182
      src/views/base/craftManagement/defectMana/index.vue
  15. 18 11
      src/views/base/craftManagement/route/index.vue
  16. 1 1
      src/views/base/defectMana/index.vue
  17. 105 0
      src/views/base/information/columns.ts
  18. 102 0
      src/views/base/information/index.vue
  19. 4 5
      src/views/base/materials/columns.ts
  20. 12 1
      src/views/base/modeling/factory/index.vue
  21. 6 0
      src/views/plan/order/components/order-page.vue
  22. 13 0
      src/views/plan/order/index.vue
  23. 6 6
      src/views/plan/prepare/index.vue
  24. 33 13
      src/views/plan/requisition/index.vue
  25. 1 1
      src/views/plan/schedule/index.vue
  26. 21 10
      src/views/plan/workOrder/components/choice-route-page.vue
  27. 56 4
      src/views/plan/workOrder/components/work-order-seq.vue
  28. 4 1
      src/views/plan/workOrder/index.vue
  29. 137 0
      src/views/pro/traceability/components/checkCom.vue
  30. 107 0
      src/views/pro/traceability/components/equitCom.vue
  31. 112 0
      src/views/pro/traceability/components/faultCom.vue
  32. 106 0
      src/views/pro/traceability/components/materialsCom.vue
  33. 116 0
      src/views/pro/traceability/components/recordCom.vue
  34. 2 2
      src/views/pro/traceability/components/traceabilityCom.vue
  35. 74 17
      src/views/pro/traceability/index.vue
  36. 1 1
      src/views/quality/outsource/index.vue
  37. 43 0
      src/views/quality/unqualified/columns.ts
  38. 260 0
      src/views/quality/unqualified/index.vue
  39. 1 1
      src/views/storage/stock/index.vue
  40. 2 0
      src/views/system/dict/components/dict-item.vue

+ 1 - 0
package.json

@@ -68,6 +68,7 @@
     "vue-draggable-plus": "^0.4.0",
     "vue-i18n": "9.9.1",
     "vue-pdf-embed": "^2.0.2",
+    "vue-qrcode": "^2.2.2",
     "vue-router": "^4.3.0",
     "vue3-pdfjs": "^0.1.6",
     "xlsx": "^0.18.5"

+ 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;
+}

+ 25 - 0
src/api/order/index.ts

@@ -176,3 +176,28 @@ export function revokeWorkOrder(workOrderId: any) {
     method: "get",
   });
 }
+
+export function queryWorkOrderList(params: any) {
+  return request({
+    url: "/api/v1/plan/workOrder/list",
+    method: "post",
+    data: params
+  });
+}
+
+export function prepareCheckInfo(
+    workOrderCode: string
+): AxiosPromise<any> {
+  return request({
+    url: "/api/v1/plan/prepare/checkInfo/"+workOrderCode,
+    method: "get",
+  });
+}
+export function refreshPrepareCheckInfo(
+    workOrderCode: string
+): AxiosPromise<any> {
+  return request({
+    url: "/api/v1/plan/prepare/refresh/"+workOrderCode,
+    method: "get",
+  });
+}

+ 0 - 17
src/api/process/index.ts

@@ -21,20 +21,3 @@ export function updateOutSourceApply(
 }
 
 
-export function prepareCheckInfo(
-    workOrderCode: string
-): AxiosPromise<any> {
-  return request({
-    url: "/api/v1/process/prepare/checkInfo/"+workOrderCode,
-    method: "get",
-  });
-}
-export function refreshPrepareCheckInfo(
-    workOrderCode: string
-): AxiosPromise<any> {
-  return request({
-    url: "/api/v1/process/prepare/refresh/"+workOrderCode,
-    method: "get",
-  });
-}
-

+ 35 - 0
src/components/CommonTable/index.vue

@@ -80,14 +80,41 @@ const crudRef = ref(null); //crudRef.value 获取avue-crud对象
 
 const commonTableEmits = defineEmits(["selectedSure"]);
 
+const calculateColumnWidth = (column) => {
+  if (!column.label) {
+    return column.minWidth;
+  }
+  // 字宽度
+  const fontSize = 17;
+  let width = fontSize * (column.label.length + 2);
+  // 如果开启过滤
+  if (column.filters) {
+    width += 12;
+  }
+  // 如果开启排序
+  if (column.sortable) {
+    width += 24;
+  }
+  return width;
+};
+
 onMounted(() => {
   url.value = tableConfig[props.tableType].url;
   option.value = Object.assign(option.value, {
     menu: false,
     highlightCurrentRow: true,
     addBtn: false,
+    height: "500",
+    overHidden: true,
+    indexWidth: "120px",
     column: tableConfig[props.tableType].column,
   });
+  // 列处理
+  if (option.value.column) {
+    for (let col of option.value.column) {
+      col.minWidth = calculateColumnWidth(col);
+    }
+  }
   // dataList();
 });
 watch(
@@ -98,8 +125,16 @@ watch(
       menu: false,
       highlightCurrentRow: true,
       addBtn: false,
+      height: "500",
+      overHidden: true,
       column: tableConfig[props.tableType].column,
     });
+    // 列处理
+    if (option.value.column) {
+      for (let col of option.value.column) {
+        col.minWidth = calculateColumnWidth(col);
+      }
+    }
     dataList();
   }
 );

+ 1 - 1
src/components/Upload/ExcelUpload.vue

@@ -91,7 +91,7 @@ const handleSubmit = async () => {
   let data: any = await request({
     url: uploadUrl.value,
     method: "post",
-    data: { ...importData, ...importData },
+    data: { ...importData, ...otherParams },
     headers: {
       "Content-Type": "multipart/form-data",
     },

+ 40 - 3
src/hooks/userCrud.ts

@@ -127,6 +127,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 {
@@ -140,9 +179,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();
@@ -325,6 +361,7 @@ export const useCrud = (config?: UseCrudConfig) => {
      * 根据搜索项导出数据
      */
     exportData: async (urlStr: string) => {
+      handleSearchData();
       const response = await request({
         url: urlStr,
         method: "post",

+ 3 - 1
src/main.ts

@@ -4,7 +4,6 @@ import router from "@/router";
 import { setupStore } from "@/store";
 import { setupDirective } from "@/directive";
 import { setupElIcons, setupI18n, setupPermission } from "@/plugins";
-
 // 本地SVG图标
 import "virtual:svg-icons-register";
 
@@ -16,6 +15,7 @@ import "animate.css";
 
 // avue
 import { setupEleAvue } from "@/plugins";
+import VueQrcode from "vue-qrcode";
 
 const app = createApp(App);
 // 全局注册 自定义指令(directive)
@@ -31,4 +31,6 @@ setupPermission();
 
 setupEleAvue(app);
 
+app.component('vue-qrcode', VueQrcode)
+
 app.use(router).mount("#app");

+ 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<{ [key: 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();

+ 0 - 182
src/views/base/craftManagement/defectMana/index.vue

@@ -1,182 +0,0 @@
-<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 #menu-left="{ size }">
-        <el-button
-          :disabled="toDeleteIds.length < 1"
-          type="danger"
-          icon="el-icon-delete"
-          :size="size"
-          @click="multipleDelete"
-          >删除</el-button
-        >
-      </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>
-        <el-button
-          class="ml-3"
-          @click="exportData('/api/v1/plan/order/export')"
-        >
-          <template #icon> <i-ep-download /> </template>导出
-        </el-button>
-      </template> -->
-    </avue-crud>
-    <ExcelUpload ref="uploadRef" @finished="uploadFinished" />
-  </div>
-</template>
-<script setup>
-import { ref, getCurrentInstance } from "vue";
-import { useCrud } from "@/hooks/userCrud";
-import dictDataUtil from "@/common/configs/dictDataUtil";
-import ButtonPermKeys from "@/common/configs/buttonPermission";
-import { useCommonStoreHook, useDictionaryStoreHook } from "@/store";
-
-// 数据字典相关
-const { dicts } = useDictionaryStoreHook();
-
-// 传入一个url,后面不带/
-const { form, data, option, search, page, toDeleteIds, Methords, Utils } =
-  useCrud({
-    src: "/api/v1/op/baseBug",
-  });
-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,
-// });
-
-const crudRef = ref(null); //crudRef.value 获取avue-crud对象
-
-onMounted(() => {
-  // console.log("crudRef", crudRef)
-  dataList();
-});
-
-/**
- * 上传excel相关
- */
-const uploadRef = ref(null);
-const uploadFinished = () => {
-  // 上传完成后的刷新操作
-  page.currentPage = 1;
-  dataList();
-};
-const importExcelData = () => {
-  if (uploadRef.value) {
-    uploadRef.value.show("/api/v1/plan/order/import");
-  }
-};
-
-// 设置表格列或者其他自定义的option
-const switchOp = [
-  {
-    label: "",
-    value: 0,
-  },
-  {
-    label: "",
-    value: 1,
-  },
-];
-option.value = Object.assign(option.value, {
-  selection: true,
-  column: [
-    {
-      label: "缺陷类型",
-      prop: "bugType",
-      minWidth: 200,
-      search: true,
-      overHidden: true,
-      rules: [
-        {
-          required: true,
-          message: "缺陷类型不能为空",
-          trigger: "change",
-        },
-      ],
-      type: "select",
-      dicUrl: dictDataUtil.request_url + dictDataUtil.TYPE_CODE.defect_mana,
-      props: {
-        label: "dictLabel",
-        value: "dictValue",
-      },
-    },
-    {
-      label: "缺陷编码",
-      prop: "bugCode",
-      span: 12,
-      search: true,
-      disabled: false,
-      overHidden: true,
-      rules: [
-        {
-          required: true,
-          message: "缺陷编码不能为空",
-          trigger: "blur",
-        },
-      ],
-    },
-    {
-      label: "缺陷名称",
-      prop: "bugName",
-      span: 12,
-      search: true,
-      rules: [
-        {
-          required: true,
-          message: "缺陷名称不能为空",
-          trigger: "blur",
-        },
-      ],
-    },
-    {
-      label: "备注",
-      prop: "remark",
-      span: 12,
-      search: true,
-      rules: [
-        {
-          required: false,
-          message: "备注不能为空",
-          trigger: "blur",
-        },
-      ],
-    },
-  ],
-});
-</script>

+ 18 - 11
src/views/base/craftManagement/route/index.vue

@@ -65,13 +65,20 @@
       width="500"
       align-center
     >
-      <el-form :model="tmpForm" label-width="auto" style="max-width: 600px">
-        <el-form-item label="工艺路线编号">
-          <el-input v-model="tmpForm.processRouteCode" />
-        </el-form-item>
-        <el-form-item label="工艺路线名称">
-          <el-input v-model="tmpForm.processRouteName" />
-        </el-form-item>
+      <el-form :model="tmpForm" label-width="auto" style="max-width: 800px">
+        <el-row>
+          <el-col :span="12">
+            <el-form-item label="工艺路线编号">
+              <el-input v-model="tmpForm.processRouteCode" />
+            </el-form-item>
+          </el-col>
+
+          <el-col :span="12">
+            <el-form-item label="工艺路线名称">
+              <el-input v-model="tmpForm.processRouteName" />
+            </el-form-item>
+          </el-col>
+        </el-row>
       </el-form>
       <template #footer>
         <div class="dialog-footer">
@@ -151,15 +158,15 @@ const startChooseProduct = () => {
     ctableRef.value.startSelect();
   }
 };
-
 // 已经绑定了工序的可以复制,跟后端HT商量只传id即可。
 const copyRow = (row) => {
   if (row.usable == 0) {
     ElMessage.error("该路线未被绑定!");
     return;
   }
-  tmpForm.value.id = row.id;
-  centerDialogVisible.value = true;
+  form.value = Object.assign(form.value, row);
+  form.value.processRouteVersion = "";
+  crudRef.value.rowAdd();
 };
 
 const renameRoute = () => {
@@ -224,7 +231,7 @@ option.value = Object.assign(option.value, {
     {
       label: "工艺路线类型",
       prop: "processRouteType",
-      minWidth: 200,
+      minWidth: 120,
       search: true,
       overHidden: true,
       rules: [

+ 1 - 1
src/views/base/defectMana/index.vue

@@ -141,7 +141,7 @@ option.value = Object.assign(option.value, {
       prop: "bugCode",
       span: 12,
       search: true,
-      disabled: true,
+      editDisabled: true,
       rules: [
         {
           required: true,

+ 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,

+ 6 - 0
src/views/plan/order/components/order-page.vue

@@ -102,6 +102,12 @@ option.value = Object.assign(option.value, {
       prop: "materialModel",
     },
     {
+      label: "产品版本",
+      width: 130,
+      overHidden: true,
+      prop: "materialVersion",
+    },
+    {
       label: "订单状态",
       prop: "orderState",
       display: false,

+ 13 - 0
src/views/plan/order/index.vue

@@ -270,6 +270,19 @@ option.value = {
       prop: "materialModel",
     },
     {
+      label: "产品版本",
+      width: 120,
+      overHidden: true,
+      prop: "materialVersion",
+      rules: [
+        {
+          required: true,
+          message: "产品版本不能为空",
+          trigger: "trigger",
+        },
+      ],
+    },
+    {
       label: "订单状态",
       prop: "orderState",
       display: false,

+ 6 - 6
src/views/plan/prepare/index.vue

@@ -34,14 +34,14 @@
             @click="handleRefresh(row.workOrderCode)"
         ><i-ep-edit />刷新
         </el-button>
-        <el-button
+<!--        <el-button
             type="primary"
             link
             v-if="row.bom === '0' || row.dataFile === '0'|| row.routeId === '0'|| row.craftFile === '0' || row.materialState === '0' || row.deviceState === '0'"
             size="small"
             @click="deleteRow(row)"
         ><i-ep-edit />删除
-        </el-button>
+        </el-button>-->
       </template>
 <!--      <template #menu-left="{ size }">
         <el-button
@@ -68,7 +68,7 @@
 <script setup>
 import { ref, getCurrentInstance } from "vue";
 import { useCrud } from "@/hooks/userCrud";
-import {prepareCheckInfo,refreshPrepareCheckInfo} from "@/api/process"
+import {prepareCheckInfo,refreshPrepareCheckInfo} from "@/api/order"
 
 import { useCommonStoreHook } from "@/store";
 const { isShowTable, tableType } = toRefs(useCommonStoreHook());
@@ -80,7 +80,7 @@ const test = () => {
 // 传入一个url,后面不带/
 const { form, data, option, search, page, toDeleteIds, Methords, Utils } =
   useCrud({
-    src: "/api/v1/process/prepare",
+    src: "/api/v1/plan/prepare",
   });
 const { dataList, createRow, updateRow, deleteRow, searchChange, resetChange } = Methords; //增删改查
 const { selectionChange, multipleDelete } = Methords; //选中和批量删除事件
@@ -126,6 +126,7 @@ option.value = Object.assign(option.value, {
   delBtn: false,
   selection: false,
   editBtn: false,
+  addBtn: false,
   dialogWidth: '45%', // 设置编辑弹窗的宽度为50%
   column: [
     {
@@ -344,7 +345,6 @@ option.value = Object.assign(option.value, {
       editDisplay: false,
       span: 24,
       dicData: [ { label: "已齐套", value: "1", },{ label: "未齐套", value: "0", }, ],
-      multiple: true,
     },
     {
       label: "物料状态",
@@ -385,7 +385,7 @@ option.value = Object.assign(option.value, {
         if (val.materialState === '1') {
           return '<b class="el-tag el-tag--success el-tag--light">已齐套</b>';
         }
-        return '<b class="el-tag el-tag--danger el-tag--light">未齐套</b>';
+        return '<b class="el-tag el-tag--danger el-tag--light">'+val.materialStr+'</b>';
       },
     },
     {

+ 33 - 13
src/views/plan/requisition/index.vue

@@ -71,25 +71,33 @@
           <el-row style="width: 100%;height: 30px;"></el-row>
           <el-row>
             <el-col :span="2" ><el-text tag="p">领用单位:</el-text></el-col>
-            <el-col :span="6" ><el-text tag="p" >{{form.applyOrg}}</el-text></el-col>
+            <el-col :span="6" >
+              <el-text tag="p" v-if="dialogType === 1 || form.state > 0">{{form.applyOrg}}</el-text>
+              <el-input v-else size="small" style="width:150px;padding-bottom: 5px;" v-model="form.applyOrg"/>
+            </el-col>
             <el-col :span="2" ><el-text tag="p">发件单位: </el-text></el-col>
-            <el-col :span="6" ><el-text tag="p" >{{form.sendOrg}} </el-text></el-col>
-            <el-col :span="2" ><el-text tag="p">计划编号:</el-text></el-col>
+            <el-col :span="6" >
+              <el-text tag="p" v-if="dialogType === 1 || form.state > 0">{{form.sendOrg}} </el-text>
+              <el-input v-else size="small" style="width:150px;padding-bottom: 5px;" v-model="form.sendOrg"/>
+            </el-col>
+            <el-col :span="2" ><el-text tag="p">工单编号:</el-text></el-col>
             <el-col :span="6">
-              <el-text tag="p" v-if="dialogType === 1 || form.state > 0">{{form.orderCode}}</el-text>
+              <el-text tag="p" v-if="dialogType === 1 || form.state > 0">{{form.workOrderCode}}</el-text>
               <el-select
                   v-else
                   size="small"
-                  v-model="form.orderCode"
-                  placeholder="请选择计划单号"
+                  v-model="form.workOrderCode"
+                  placeholder="请选择单号"
                   clearable
+                  style="width:150px;padding-bottom: 5px;"
+                  filterable
                   @change="changeOrder"
               >
                 <el-option
                     v-for="option in orderList"
-                    :key="option.orderCode"
-                    :label="option.orderCode"
-                    :value="option.orderCode"
+                    :key="option.workOrderCode"
+                    :label="option.workOrderCode"
+                    :value="option.workOrderCode"
                 />
               </el-select>
             </el-col>
@@ -114,13 +122,18 @@
                 <el-input v-else v-model="row.num" type="number"/>
               </template>
             </el-table-column>
+            <el-table-column label="实际接收" align="receiveNum" v-if="form.state === '6' || form.state === '8'">
+              <template v-slot="{row}">
+                <el-text>{{row.receiveNum}}</el-text>
+              </template>
+            </el-table-column>
             <el-table-column label="备注" align="remark">
               <template v-slot="{row}">
                 <el-text v-if="dialogType === 1 || form.state > 0">{{row.remark}}</el-text>
                 <el-input v-else v-model="row.remark"/>
               </template>
             </el-table-column>
-            <el-table-column label="操作" align="remark" v-if="form.state === '0'">
+            <el-table-column label="操作" align="remark" v-if="dialogType !== 1 && form.state === '0'">
               <template v-slot="{row,index}">
                 <el-button type="danger" @click="minusItem(row)" icon="el-icon-minus" style="margin-left:15px;width:25px;height:25px;" circle />
               </template>
@@ -303,7 +316,7 @@ import { ref, getCurrentInstance } from "vue";
 import { html2CanvasPrint } from "@/utils/common";
 import { useCrud } from "@/hooks/userCrud";
 import dictDataUtil from "@/common/configs/dictDataUtil";
-import {queryApplyInfoDetails,queryOrderList,saveApplyInfoDetails,auditApplyInfoDetails} from "@/api/order"
+import {queryApplyInfoDetails,queryWorkOrderList,saveApplyInfoDetails,auditApplyInfoDetails} from "@/api/order"
 import {getUserList} from "@/api/system/user"
 import { useCommonStoreHook } from "@/store";
 const { isShowTable, tableType } = toRefs(useCommonStoreHook());
@@ -327,7 +340,7 @@ const minusItem =(row)=>{
   tableDataList.value = tableDataList.value.filter(item=>item.id !== row.id)
 }
 const changeOrder =(val)=>{
-  queryApplyInfoDetails({orderCode: val}).then((data)=>{
+  queryApplyInfoDetails({workOrderCode: val}).then((data)=>{
     tableDataList.value = data.data
   })
 }
@@ -497,6 +510,13 @@ option.value = Object.assign(option.value, {
       overHidden: true,
     },
     {
+      label: "工单单号",
+      prop: "workOrderCode",
+      search: true,
+      width: 150,
+      overHidden: true,
+    },
+    {
       label: "计划单号",
       prop: "orderCode",
       search: true,
@@ -561,7 +581,7 @@ option.value = Object.assign(option.value, {
 });
 
 onMounted(() => {
-  queryOrderList({}).then((data)=>{
+  queryWorkOrderList({}).then((data)=>{
     if(!data.data){
       ElMessage.warning("请维护物料BOM")
     }

+ 1 - 1
src/views/plan/schedule/index.vue

@@ -110,7 +110,7 @@ option.value = Object.assign(option.value, {
   delBtn: false,
   column: [
     {
-      label: "序列号",
+      label: "流转卡号",
       prop: "seqNo",
       editDisabled: true,
       search: true,

+ 21 - 10
src/views/plan/workOrder/components/choice-route-page.vue

@@ -32,6 +32,12 @@ const props = defineProps({
     default: () => {
       return '';
     }
+  },
+  materialVersion: {
+    type: String,
+    default: () => {
+      return '';
+    }
   }
 })
 watch(
@@ -42,6 +48,14 @@ watch(
     dataList();
   }
 );
+watch(
+    () => props.materialVersion,
+    () => {
+      search.value.processRouteVersion = props.materialVersion
+      search.value.enabled = "0"
+      dataList();
+    }
+);
 // 传入一个url,后面不带/
 const { form, data, option, search, page, toDeleteIds, Methords, Utils } =
   useCrud({
@@ -113,10 +127,12 @@ option.value = Object.assign(option.value, {
       overHidden: true,
       minWidth: 200,
     },
-    // 在产品那边绑定了工艺路线才是已绑定
     {
       label: "路线状态",
-      prop: "used",
+      prop: "usable",
+      addDisplay: false,
+      editDisplay: false,
+      slot: true,
       width: 100,
       type: "radio",
       dicData: [
@@ -150,21 +166,15 @@ option.value = Object.assign(option.value, {
     {
       label: "版本",
       prop: "processRouteVersion",
-      addDisplay: false,
-      editDisplay: false,
     },
     {
       label: "创建人",
-      prop: "createBy",
-      addDisplay: false,
-      editDisplay: false,
+      prop: "creator",
       overHidden: true,
     },
     {
       label: "创建时间",
-      prop: "createWhen",
-      addDisplay: false,
-      editDisplay: false,
+      prop: "created",
       width: 150,
       overHidden: true,
     },
@@ -172,6 +182,7 @@ option.value = Object.assign(option.value, {
 });
 
 onMounted(() => {
+  search.value.processRouteVersion = props.materialVersion
   search.value.prodtCode = props.materialCode
   search.value.enabled = "0"
   dataList();

+ 56 - 4
src/views/plan/workOrder/components/work-order-seq.vue

@@ -11,7 +11,15 @@
         @search-reset="resetChange"
         @size-change="dataList"
         @current-change="dataList"
+        @selection-change="selectionChange1"
     >
+      <template #menu-left="{}">
+        <el-button
+            :disabled="toDeleteIds.length < 1"
+            class="ml-3"
+            @click="printCode">打印
+        </el-button>
+      </template>
       <template #menu-right="{}">
         <el-dropdown split-button
         >导入
@@ -35,7 +43,25 @@
           <template #icon> <i-ep-download /> </template>导出
         </el-button>
       </template>
+
     </avue-crud>
+    <el-dialog
+        v-model="dialog.visible"
+        :title="dialog.title"
+        width="1250px"
+        @close="dialog.visible = false"
+    >
+      <div style="display: flex;flex-wrap: wrap;" ref="toPrintRef">
+        <div v-for="item of toDeleteIds" style="width: 200px;height:220px;">
+          <vue-qrcode  :value="item.seqNo"  size="45" error-level="H"></vue-qrcode>
+          <div style="font-size:14px;">{{item.seqNo}}</div>
+        </div>
+      </div>
+      <div class="dialog-footer" align="center">
+        <el-button @click="dialog.visible = false">取消</el-button>
+        <el-button type="primary" @click="printPage">打印</el-button>
+      </div>
+    </el-dialog>
     <ExcelUpload ref="uploadRef" @finished="uploadFinished" />
   </div>
 </template>
@@ -43,7 +69,9 @@
 import {defineProps, ref} from "vue";
 import { useCrud } from "@/hooks/userCrud";
 import { useCommonStoreHook } from "@/store";
+import { html2CanvasPrint } from "@/utils/common";
 const { isShowTable, tableType } = toRefs(useCommonStoreHook());
+const toPrintRef = ref(null);
 const test = () => {
   isShowTable.value = true;
   tableType.value = tableType.value == 1 ? 2 : 1;
@@ -56,6 +84,16 @@ const props = defineProps({
     }
   }
 })
+const printPage = ()=>{
+  html2CanvasPrint(toPrintRef.value);
+}
+const dialog = reactive({
+  title: "二维码打印",
+  visible: false,
+});
+const selectionChange1 =(row)=>{
+  toDeleteIds.value = row
+}
 watch(
     () => props.workOrderCode,
     () => {
@@ -73,19 +111,33 @@ const { selectionChange, multipleDelete } = Methords; //选中和批量删除事
 const { checkBtnPerm, downloadTemplate, exportData } = Utils; //按钮权限等工具
 const crudRef = ref(null); //crudRef.value 获取avue-crud对象
 
+const printCode = () =>{
+  dialog.visible = true
+}
+
+
 // 设置表格列或者其他自定义的option
 option.value = Object.assign(option.value, {
   delBtn: false,
-  selection: false,
+  selection: true,
   search: false,
+  filterBtn: false,
+  columnBtn: false,
   editBtn: false,
   addBtn: false,
   viewBtn: false,
   menu: false,
   column: [
     {
-      label: "序列号",
+      label: "流转卡号",
       prop: "seqNo",
+      width: 220,
+      search: true,
+      overHidden: true,
+    },
+    {
+      label: "配套编码",
+      prop: "supportingCode",
       search: true,
       overHidden: true,
     },
@@ -98,7 +150,7 @@ option.value = Object.assign(option.value, {
     {
       label: "状态",
       prop: "state",
-      minWidth: 100,
+      minWidth: 60,
       type: "select",
       dicData: [{label: '正常',value: 0},{label: '冻结',value: 1},{label: '完成',value: 2}],
     },
@@ -120,7 +172,7 @@ const uploadFinished = () => {
 };
 const importExcelData = () => {
   if (uploadRef.value) {
-    uploadRef.value.show("/api/v1/plan/seq/import");
+    uploadRef.value.show("/api/v1/plan/seq/import","流转号导入",{workOrderCode: props.workOrderCode});
   }
 };
 </script>

+ 4 - 1
src/views/plan/workOrder/index.vue

@@ -90,7 +90,7 @@
         width="80%"
         @close="dialog1.visible = false"
     >
-      <choice-route-page :material-code="form.materialCode" @routeInfo="routeInfo"/>
+      <choice-route-page :material-version="materialVersion" :material-code="form.materialCode" @routeInfo="routeInfo"/>
     </el-dialog>
 
     <el-dialog
@@ -293,6 +293,7 @@ const handleSubmit =()=>{
     }
   });
 }
+const materialVersion = ref(null)
 const orderInfo = (value) => {
   form.value.orderCode = value.orderCode
   form.value.orderName = value.orderName
@@ -300,6 +301,7 @@ const orderInfo = (value) => {
   form.value.materialName = value.materialName
   form.value.materialModel = value.materialModel
   form.value.priority = value.priority
+  materialVersion.value = value.materialVersion
   dialog.visible = false
 }
 const lineInfo = (value) => {
@@ -334,6 +336,7 @@ const crudRef = ref(null); //crudRef.value 获取avue-crud对象
 option.value = Object.assign(option.value, {
   delBtn: false,
   selection: true,
+  viewBtn: false,
   editBtn: false,
   column: [
     {

+ 137 - 0
src/views/pro/traceability/components/checkCom.vue

@@ -0,0 +1,137 @@
+<template>
+  <div class="mainContentBox">
+    <avue-crud
+      ref="crudRef2"
+      v-model:search="search"
+      v-model="form"
+      :data="data"
+      :option="option"
+      v-model:page="page"
+    />
+    <!-- <el-collapse accordion>
+      <el-collapse-item
+        :title="item.opName"
+        :name="item.id"
+        v-for="item in data"
+        :key="item.id"
+      />
+    </el-collapse> -->
+  </div>
+</template>
+<script setup>
+import { ref, getCurrentInstance } from "vue";
+import { useCrud } from "@/hooks/userCrud";
+import dictDataUtil from "@/common/configs/dictDataUtil";
+import ButtonPermKeys from "@/common/configs/buttonPermission";
+import { useCommonStoreHook, useDictionaryStoreHook } from "@/store";
+
+// 数据字典相关
+const { dicts } = useDictionaryStoreHook();
+
+// 传入一个url,后面不带/
+const {
+  form,
+  data,
+  option,
+  search,
+  page,
+  toDeleteIds,
+  Methords,
+  Utils,
+  commonConfig,
+} = useCrud({
+  src: "/api/v1/process/web/traceability/checkRecordInfo",
+});
+const { dataList, createRow, updateRow, deleteRow, searchChange, resetChange } =
+  Methords; //增删改查
+const { selectionChange, multipleDelete } = Methords; //选中和批量删除事件
+const { checkBtnPerm, downloadTemplate, exportData } = Utils; //按钮权限等工具
+
+const crudRef = ref(null); //crudRef.value 获取avue-crud对象
+
+const refreshTra = (row) => {
+  commonConfig.value.params = { seqNo: row.seqNo };
+  dataList();
+};
+defineExpose({ refreshTra });
+onMounted(() => {});
+
+option.value = Object.assign(option.value, {
+  selection: false,
+  border: true,
+  index: false,
+  expandLevel: 3,
+  headerAlign: "center",
+  align: "center",
+  labelWidth: 100,
+  addBtn: false,
+  menu: false,
+  header: false,
+  column: [
+    {
+      label: "工序名称",
+      prop: "opName",
+    },
+    {
+      label: "点检项名称",
+      prop: "checkName",
+      search: false,
+    },
+    {
+      label: "点检项编码",
+      prop: "checkCode",
+      search: false,
+    },
+    {
+      label: "内容",
+      prop: "content",
+      search: false,
+    },
+    {
+      label: "结果",
+      prop: "result",
+      search: false,
+    },
+    // {
+    //   label: "操作人",
+    //   prop: "operator",
+    //   search: false,
+    // },
+    {
+      label: "标准值",
+      prop: "standard",
+      search: false,
+    },
+    {
+      label: "上限值",
+      prop: "upper",
+      search: false,
+    },
+    {
+      label: "下限值",
+      prop: "lower",
+      search: false,
+    },
+    {
+      label: "实测值",
+      prop: "realValue",
+      search: false,
+    },
+    {
+      label: "单位",
+      prop: "unit",
+      search: false,
+      dicData: dicts.danwei_type,
+      props: {
+        label: "dictLabel",
+        value: "dictValue",
+      },
+    },
+    {
+      label: "录入时间",
+      prop: "created",
+      search: false,
+    },
+  ],
+});
+</script>

+ 107 - 0
src/views/pro/traceability/components/equitCom.vue

@@ -0,0 +1,107 @@
+<template>
+  <div class="mainContentBox">
+    <avue-crud
+      ref="crudRef2"
+      v-model:search="search"
+      v-model="form"
+      :data="data"
+      :option="option"
+      v-model:page="page"
+    />
+    <!-- <el-collapse accordion>
+      <el-collapse-item
+        :title="item.opName"
+        :name="item.id"
+        v-for="item in data"
+        :key="item.id"
+      />
+    </el-collapse> -->
+  </div>
+</template>
+<script setup>
+import { ref, getCurrentInstance } from "vue";
+import { useCrud } from "@/hooks/userCrud";
+import dictDataUtil from "@/common/configs/dictDataUtil";
+import ButtonPermKeys from "@/common/configs/buttonPermission";
+import { useCommonStoreHook, useDictionaryStoreHook } from "@/store";
+
+// 数据字典相关
+const { dicts } = useDictionaryStoreHook();
+
+// 传入一个url,后面不带/
+const {
+  form,
+  data,
+  option,
+  search,
+  page,
+  toDeleteIds,
+  Methords,
+  Utils,
+  commonConfig,
+} = useCrud({
+  src: "/api/v1/process/web/traceability/equitRecordInfo",
+});
+const { dataList, createRow, updateRow, deleteRow, searchChange, resetChange } =
+  Methords; //增删改查
+const { selectionChange, multipleDelete } = Methords; //选中和批量删除事件
+const { checkBtnPerm, downloadTemplate, exportData } = Utils; //按钮权限等工具
+
+const crudRef = ref(null); //crudRef.value 获取avue-crud对象
+
+const refreshTra = (row) => {
+  commonConfig.value.params = { seqNo: row.seqNo };
+  dataList();
+};
+defineExpose({ refreshTra });
+onMounted(() => {});
+
+option.value = Object.assign(option.value, {
+  selection: false,
+  border: true,
+  index: false,
+  expandLevel: 3,
+  headerAlign: "center",
+  align: "center",
+  labelWidth: 100,
+  addBtn: false,
+  menu: false,
+  header: false,
+  column: [
+    {
+      label: "工序名称",
+      prop: "opName",
+    },
+    {
+      label: "设备类型",
+      prop: "equitType",
+      search: false,
+    },
+    {
+      label: "精度要求",
+      prop: "accuracy",
+      search: false,
+    },
+    {
+      label: "设备有效期",
+      prop: "validDate",
+      search: false,
+    },
+    {
+      label: "设备名称",
+      prop: "result",
+      search: false,
+    },
+    {
+      label: "设备编码",
+      prop: "standard",
+      search: false,
+    },
+    {
+      label: "录入时间",
+      prop: "created",
+      search: false,
+    },
+  ],
+});
+</script>

+ 112 - 0
src/views/pro/traceability/components/faultCom.vue

@@ -0,0 +1,112 @@
+<template>
+  <div class="mainContentBox">
+    <avue-crud
+      ref="crudRef2"
+      v-model:search="search"
+      v-model="form"
+      :data="data"
+      :option="option"
+      v-model:page="page"
+    />
+    <!-- <el-collapse accordion>
+      <el-collapse-item
+        :title="item.opName"
+        :name="item.id"
+        v-for="item in data"
+        :key="item.id"
+      />
+    </el-collapse> -->
+  </div>
+</template>
+<script setup>
+import { ref, getCurrentInstance } from "vue";
+import { useCrud } from "@/hooks/userCrud";
+import dictDataUtil from "@/common/configs/dictDataUtil";
+import ButtonPermKeys from "@/common/configs/buttonPermission";
+import { useCommonStoreHook, useDictionaryStoreHook } from "@/store";
+
+// 数据字典相关
+const { dicts } = useDictionaryStoreHook();
+
+// 传入一个url,后面不带/
+const {
+  form,
+  data,
+  option,
+  search,
+  page,
+  toDeleteIds,
+  Methords,
+  Utils,
+  commonConfig,
+} = useCrud({
+  src: "/api/v1/process/web/traceability/escalationRecordInfo",
+});
+const { dataList, createRow, updateRow, deleteRow, searchChange, resetChange } =
+  Methords; //增删改查
+const { selectionChange, multipleDelete } = Methords; //选中和批量删除事件
+const { checkBtnPerm, downloadTemplate, exportData } = Utils; //按钮权限等工具
+
+const crudRef = ref(null); //crudRef.value 获取avue-crud对象
+
+const refreshTra = (row) => {
+  commonConfig.value.params = { seqNo: row.seqNo };
+  dataList();
+};
+defineExpose({ refreshTra });
+onMounted(() => {});
+
+option.value = Object.assign(option.value, {
+  selection: false,
+  border: true,
+  index: false,
+  expandLevel: 3,
+  headerAlign: "center",
+  align: "center",
+  labelWidth: 100,
+  addBtn: false,
+  menu: false,
+  header: false,
+  column: [
+    {
+      label: "冻结状态",
+      prop: "state",
+      dicData: dicts.escalation_fault_state,
+      props: {
+        label: "dictLabel",
+        value: "dictValue",
+      },
+    },
+    {
+      label: "报故人",
+      prop: "personResponsible",
+      search: false,
+    },
+    {
+      label: "报故工位",
+      prop: "stationName",
+      search: false,
+    },
+    {
+      label: "报故时间",
+      prop: "created",
+      search: false,
+    },
+    {
+      label: "处理结果",
+      prop: "disposalMeasures",
+      dicData: dicts.disposal_measures_type,
+      props: {
+        label: "dictLabel",
+        value: "dictValue",
+      },
+      search: false,
+    },
+    {
+      label: "备注",
+      prop: "standard",
+      search: false,
+    },
+  ],
+});
+</script>

+ 106 - 0
src/views/pro/traceability/components/materialsCom.vue

@@ -0,0 +1,106 @@
+<template>
+  <div class="mainContentBox">
+    <avue-crud
+      ref="crudRef2"
+      v-model:search="search"
+      v-model="form"
+      :data="data"
+      :option="option"
+      v-model:page="page"
+    />
+    <!-- <el-collapse accordion>
+      <el-collapse-item
+        :title="item.opName"
+        :name="item.id"
+        v-for="item in data"
+        :key="item.id"
+      />
+    </el-collapse> -->
+  </div>
+</template>
+<script setup>
+import { ref, getCurrentInstance } from "vue";
+import { useCrud } from "@/hooks/userCrud";
+import dictDataUtil from "@/common/configs/dictDataUtil";
+import ButtonPermKeys from "@/common/configs/buttonPermission";
+import { useCommonStoreHook, useDictionaryStoreHook } from "@/store";
+
+// 数据字典相关
+const { dicts } = useDictionaryStoreHook();
+
+// 传入一个url,后面不带/
+const {
+  form,
+  data,
+  option,
+  search,
+  page,
+  toDeleteIds,
+  Methords,
+  Utils,
+  commonConfig,
+} = useCrud({
+  src: "/api/v1/process/web/traceability/materialsRecordInfo",
+});
+const { dataList, createRow, updateRow, deleteRow, searchChange, resetChange } =
+  Methords; //增删改查
+const { selectionChange, multipleDelete } = Methords; //选中和批量删除事件
+const { checkBtnPerm, downloadTemplate, exportData } = Utils; //按钮权限等工具
+
+const crudRef = ref(null); //crudRef.value 获取avue-crud对象
+
+const refreshTra = (row) => {
+  commonConfig.value.params = { seqNo: row.seqNo };
+  dataList();
+};
+defineExpose({ refreshTra });
+onMounted(() => {});
+
+option.value = Object.assign(option.value, {
+  selection: false,
+  border: true,
+  index: false,
+  expandLevel: 3,
+  headerAlign: "center",
+  align: "center",
+  labelWidth: 100,
+  addBtn: false,
+  menu: false,
+  header: false,
+  column: [
+    {
+      label: "工序名称",
+      prop: "opName",
+    },
+    {
+      label: "物料名称",
+      prop: "itemName",
+    },
+    {
+      label: "物料规格",
+      prop: "itemModel",
+      type: "select",
+      dicData: dicts.workshop_section,
+      props: {
+        label: "dictLabel",
+        value: "dictValue",
+      },
+    },
+    {
+      label: "物料编号",
+      prop: "itemCode",
+      search: false,
+    },
+    {
+      label: "需求数量",
+      prop: "needNum",
+      search: false,
+    },
+    {
+      label: "已采集数量",
+      prop: "realNum",
+      search: false,
+    },
+  ],
+});
+</script>

+ 116 - 0
src/views/pro/traceability/components/recordCom.vue

@@ -0,0 +1,116 @@
+<template>
+  <div class="mainContentBox">
+    <avue-crud
+      ref="crudRef2"
+      v-model:search="search"
+      v-model="form"
+      :data="data"
+      :option="option"
+      v-model:page="page"
+    />
+    <!-- <el-collapse accordion>
+      <el-collapse-item
+        :title="item.opName"
+        :name="item.id"
+        v-for="item in data"
+        :key="item.id"
+      />
+    </el-collapse> -->
+  </div>
+</template>
+<script setup>
+import { ref, getCurrentInstance } from "vue";
+import { useCrud } from "@/hooks/userCrud";
+import dictDataUtil from "@/common/configs/dictDataUtil";
+import ButtonPermKeys from "@/common/configs/buttonPermission";
+import { useCommonStoreHook, useDictionaryStoreHook } from "@/store";
+
+// 数据字典相关
+const { dicts } = useDictionaryStoreHook();
+
+// 传入一个url,后面不带/
+const {
+  form,
+  data,
+  option,
+  search,
+  page,
+  toDeleteIds,
+  Methords,
+  Utils,
+  commonConfig,
+} = useCrud({
+  src: "/api/v1/process/web/traceability/traceabilityRecordInfo",
+});
+const { dataList, createRow, updateRow, deleteRow, searchChange, resetChange } =
+  Methords; //增删改查
+const { selectionChange, multipleDelete } = Methords; //选中和批量删除事件
+const { checkBtnPerm, downloadTemplate, exportData } = Utils; //按钮权限等工具
+
+const crudRef = ref(null); //crudRef.value 获取avue-crud对象
+
+const refreshTra = (row) => {
+  commonConfig.value.params = { seqNo: row.seqNo };
+  dataList();
+};
+defineExpose({ refreshTra });
+onMounted(() => {});
+
+option.value = Object.assign(option.value, {
+  selection: false,
+  border: true,
+  index: false,
+  expandLevel: 3,
+  headerAlign: "center",
+  align: "center",
+  labelWidth: 100,
+  addBtn: false,
+  menu: false,
+  header: false,
+  column: [
+    {
+      label: "工序名称",
+      prop: "opName",
+    },
+    {
+      label: "记录项名称",
+      prop: "thName",
+    },
+    {
+      label: "单位",
+      prop: "unit",
+      search: false,
+      dicData: dicts.danwei_type,
+      props: {
+        label: "dictLabel",
+        value: "dictValue",
+      },
+    },
+    {
+      label: "标准值",
+      prop: "standard",
+      search: false,
+    },
+    {
+      label: "上限值",
+      prop: "upper",
+      search: false,
+    },
+    {
+      label: "下限值",
+      prop: "lower",
+      search: false,
+    },
+    {
+      label: "实测值",
+      prop: "realValue",
+      search: false,
+    },
+    {
+      label: "录入时间",
+      prop: "created",
+      search: false,
+    },
+  ],
+});
+</script>

+ 2 - 2
src/views/pro/traceability/components/traceabilityCom.vue

@@ -41,8 +41,8 @@ const { checkBtnPerm, downloadTemplate, exportData } = Utils; //按钮权限等
 
 const crudRef = ref(null); //crudRef.value 获取avue-crud对象
 
-const refreshTra = (seqNo) => {
-  commonConfig.value.params = { seqNo: seqNo };
+const refreshTra = (row) => {
+  commonConfig.value.params = { seqNo: row.seqNo };
   dataList();
 };
 defineExpose({ refreshTra });

+ 74 - 17
src/views/pro/traceability/index.vue

@@ -25,7 +25,7 @@
             <el-descriptions-item label="产品名称">{{
               productReviewInfo.materialName
             }}</el-descriptions-item>
-            <el-descriptions-item label="序列号">{{
+            <el-descriptions-item label="流转卡号">{{
               productReviewInfo.seqNo
             }}</el-descriptions-item>
             <el-descriptions-item label="物料编号">{{
@@ -38,28 +38,42 @@
             <el-descriptions-item label="Remarks">
               <el-tag size="small">否</el-tag>
             </el-descriptions-item>
-            <el-descriptions-item label="工单出站">5</el-descriptions-item>
+            <el-descriptions-item label="工单出站">{{
+              productReviewInfo.outNum
+            }}</el-descriptions-item>
             <el-descriptions-item label="交付日期">{{
               productReviewInfo.planStartEnd
             }}</el-descriptions-item>
           </el-descriptions>
         </el-header>
         <el-main>
-          <el-tabs type="border-card">
-            <el-tab-pane label="生产履历">
+          <el-tabs
+            type="border-card"
+            @tab-click="tabsEvent"
+            v-model="defaultTabName"
+          >
+            <el-tab-pane name="traceabilityComRef" label="生产履历">
               <TraceabilityCom ref="traceabilityComRef" />
             </el-tab-pane>
-            <el-tab-pane label="已采物料">
-              <template #label>
-                <span
-                  >已采物料
-                  <el-badge value="8" class="item" type="primary" />
-                </span>
-              </template>
-              已采物料
+            <el-tab-pane name="materialsComRef" label="已采物料">
+              <MaterialsCom ref="materialsComRef" />
+            </el-tab-pane>
+            <el-tab-pane name="recordComRef" label="记录项">
+              <RecordCom ref="recordComRef"
+            /></el-tab-pane>
+            <el-tab-pane name="checkComRef" label="点检判定">
+              <CheckCom ref="checkComRef" />
             </el-tab-pane>
-            <el-tab-pane label="图片采集">图片采集</el-tab-pane>
-            <el-tab-pane label="缺陷项">缺陷项</el-tab-pane>
+            <el-tab-pane name="equitComRef" label="设备使用"
+              ><EquitCom ref="equitComRef"
+            /></el-tab-pane>
+            <el-tab-pane name="faultComRef" label="报故记录">
+              <FaultCom ref="faultComRef" />
+            </el-tab-pane>
+            <el-tab-pane name="bugComRef" label="缺陷项">缺陷项</el-tab-pane>
+            <el-tab-pane name="imgComRef" label="图片采集"
+              >图片采集</el-tab-pane
+            >
           </el-tabs>
         </el-main>
       </el-container>
@@ -74,6 +88,11 @@ import ButtonPermKeys from "@/common/configs/buttonPermission";
 import { useCommonStoreHook } from "@/store";
 import { getMaterialDetailsByseqNo, getOperationCompent } from "@/api/material";
 import TraceabilityCom from "@/views/pro/traceability/components/traceabilityCom.vue";
+import MaterialsCom from "@/views/pro/traceability/components/materialsCom.vue";
+import RecordCom from "@/views/pro/traceability/components/recordCom.vue";
+import CheckCom from "@/views/pro/traceability/components/checkCom.vue";
+import EquitCom from "@/views/pro/traceability/components/equitCom.vue";
+import FaultCom from "@/views/pro/traceability/components/faultCom.vue";
 
 // 传入一个url,后面不带/
 const { form, data, option, search, page, toDeleteIds, Methords, Utils } =
@@ -88,6 +107,26 @@ const { checkBtnPerm } = Utils; //按钮权限等工具
 const crudRef = ref(null); //crudRef.value 获取avue-crud对象
 
 const traceabilityComRef = ref(null);
+const materialsComRef = ref(null);
+const recordComRef = ref(null);
+const checkComRef = ref(null);
+const equitComRef = ref(null);
+const faultComRef = ref(null);
+let defaultTabName = ref("traceabilityComRef");
+//tab页组件
+const tabNameComRef = new Map([
+  ["traceabilityComRef", traceabilityComRef],
+  ["materialsComRef", materialsComRef],
+  ["recordComRef", recordComRef],
+  ["checkComRef", checkComRef],
+  ["equitComRef", equitComRef],
+  ["faultComRef", faultComRef],
+]);
+let temRow = ref({});
+const tabsEvent = (pane, ev) => {
+  defaultTabName.value = pane.props.name;
+  tabNameComRef.get(pane.props.name)?.value.refreshTra(temRow.value);
+};
 
 const chooseTagType = (row, type) => {
   let daynamicType = "";
@@ -96,7 +135,7 @@ const chooseTagType = (row, type) => {
       ? "订单"
       : row.startsWith("GD")
         ? "工单"
-        : "序列号";
+        : "流转卡号";
   } else {
     daynamicType = row.startsWith("DD")
       ? "success"
@@ -114,12 +153,29 @@ let productReviewInfo = reactive({
   materialModel: "",
   planStartEnd: "",
   workOrderCode: "",
+  outNum: "",
 });
+
 const handleCellClick = (row, column, event) => {
+  //获取出单的数量
+  if (data.value) {
+    for (let topTree of data.value) {
+      if (topTree) {
+        for (let secondTree of topTree.children) {
+          if (row.workOrderCode == secondTree.workOrderCode) {
+            productReviewInfo.outNum = secondTree.children.length;
+          }
+        }
+      }
+    }
+  }
+  temRow.value = row;
   // 点击行时触发的逻辑
   if (!row.children && row.seqNo && row.seqNo.length > 16) {
     if (productReviewInfo.seqNo != row.seqNo) {
-      traceabilityComRef.value.refreshTra(row.seqNo);
+      //物料履历
+      //traceabilityComRef.value.refreshTra(row);
+      tabNameComRef.get(defaultTabName.value)?.value.refreshTra(temRow.value);
     }
     if (row.workOrderCode == productReviewInfo.workOrderCode) {
       productReviewInfo.seqNo = row.seqNo;
@@ -128,6 +184,7 @@ const handleCellClick = (row, column, event) => {
     getMaterialDetailsByseqNo(row.seqNo).then(({ data }) => {
       productReviewInfo = Object.assign(productReviewInfo, data);
       productReviewInfo.workOrderCode = row.workOrderCode;
+      // productReviewInfo.outNum =
     });
   }
 };
@@ -157,7 +214,7 @@ option.value = Object.assign(option.value, {
       hide: true,
     },
     {
-      label: "产品序列号",
+      label: "流转卡号",
       prop: "seqNo",
       search: true,
       searchLabelWidth: "100",

+ 1 - 1
src/views/quality/outsource/index.vue

@@ -76,7 +76,7 @@
                   :data="form.details"
                   highlight-current-row>
                 <el-table-column
-                    label="序列号"
+                    label="流转卡号"
                     align="left"
                     width=350
                     prop="seqNo"

+ 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>

+ 1 - 1
src/views/storage/stock/index.vue

@@ -156,7 +156,7 @@ option.value = Object.assign(option.value, {
       search: true
     },
     {
-      label: "序列号",
+      label: "流转卡号",
       width: 130,
       overHidden: true,
       prop: "seqNo",

+ 2 - 0
src/views/system/dict/components/dict-item.vue

@@ -116,6 +116,8 @@ function openDialog(form?: any) {
     dialog.title = "新增字典";
     dataFormRef.value.label = "";
     dataFormRef.value = "";
+    formData.dictLabel = "";
+    formData.dictValue = ""
   }
 }