فهرست منبع

Merge remote-tracking branch 'origin/qingban' into qingban

lupeng 6 ماه پیش
والد
کامیت
0e0638701b

+ 1 - 1
public/version.json

@@ -1,3 +1,3 @@
 {
-  "version": "3.1"
+  "version": "3.2"
 }

+ 9 - 0
src/common/configs/buttonPermission.ts

@@ -63,6 +63,15 @@ const ButtonPermKeys = {
       filtersheet_del: "plan:filtersheet:del",
     },
   },
+  // 基础数据
+  BasicData: {
+    CATALOG: "base",
+    MENUS: {},
+    BTNS: {
+      picture_del: "base:picture:del",
+      picture_edit: "base:picture:edit",
+    },
+  },
   //设备管理
   DEVICE: {
     MENUS: {

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

@@ -144,6 +144,7 @@ onMounted(() => {
     height: "500",
     overHidden: true,
     indexWidth: "120px",
+    searchLabelWidth: "120px",
     column: tableConfig[props.tableType].column,
   });
   // 列处理
@@ -165,6 +166,7 @@ watch(
       addBtn: false,
       height: "500",
       overHidden: true,
+      searchLabelWidth: "120px",
       column: tableConfig[props.tableType].column,
     });
     // 列处理

+ 1 - 0
src/directive/permission/index.ts

@@ -6,6 +6,7 @@ import { Directive, DirectiveBinding } from "vue";
  */
 export const hasPerm: Directive = {
   mounted(el: HTMLElement, binding: DirectiveBinding) {
+    console.log("hasPerm mounted", binding);
     // 「超级管理员」拥有所有的按钮权限
     const { roles, perms } = useUserStoreHook().user;
     if (roles.includes("ROOT")) {

+ 103 - 116
src/views/base/bom/components/version-page.vue

@@ -1,14 +1,11 @@
 <template>
-
-
   <div class="mainContentBox">
     <avue-form
       ref="formRef"
       v-model="form"
       :option="option"
       @submit="rowSave"
-    >
-    </avue-form>
+    />
     <avue-crud
       ref="crudRef"
       v-model:search="search"
@@ -25,129 +22,119 @@
       @size-change="dataList"
       @current-change="dataList"
       search-option="false"
-    >
-
-
-    </avue-crud>
+    />
     <div class="detail-footer">
       <el-button type="primary" @click="onSelected"> 确定 </el-button>
       <el-button @click="cancelWindow">取消</el-button>
-
     </div>
   </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 { useDictionaryStore } from "@/store";
-  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 commonTableEmits = defineEmits(["selectedSure"]);
-  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) {
-    form.value.materialCode=props.materialCode;
-    createRow(form,done,done);
-
-  }
-
-
-
-  const crudRef = ref(null); //crudRef.value 获取avue-crud对象
-
-  onMounted(() => {
-    console.log(props)
-    search.value.materialCode=props.materialCode;
-    dataList();
-  });
-
-
-  const uploadFinished = () => {
-    // 上传完成后的刷新操作
-    page.currentPage = 1;
-    dataList();
-  };
-
-
-
-
-  // 设置表格列或者其他自定义的option
-  option.value = Object.assign(option.value, {
-    highlightCurrentRow: true,
-    align:'center',
-    menuAlign:'center',
-    editBtn:false,
-    column: [
-      {
-        label: "版本号",
-        prop: "bomVersion",
-        type:"number",
-        controlsPosition: '',
-        min:1.0,
-        precision: 1,
-      },
-      { label: "物料编码", prop: "materialCode", width: 130,overHidden: true,display:false,hide:true},
-
-
-
-      ],
-    viewBtn: false,
-    addBtn:false,
+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 { useDictionaryStore } from "@/store";
+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 props = defineProps({
-    materialCode: {
-      type: String,
-      default: () => {
-        return 0;
-      }
+const commonTableEmits = defineEmits(["selectedSure"]);
+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) {
+  form.value.materialCode = props.materialCode;
+  createRow(form, done, done);
+}
+
+const crudRef = ref(null); //crudRef.value 获取avue-crud对象
+
+onMounted(() => {
+  console.log(props);
+  search.value.materialCode = props.materialCode;
+  dataList();
+});
+
+const uploadFinished = () => {
+  // 上传完成后的刷新操作
+  page.currentPage = 1;
+  dataList();
+};
+
+// 设置表格列或者其他自定义的option
+option.value = Object.assign(option.value, {
+  highlightCurrentRow: true,
+  align: "center",
+  menuAlign: "center",
+  editBtn: false,
+  column: [
+    {
+      label: "版本号",
+      prop: "bomVersion",
+      type: "number",
+      controlsPosition: "",
+      min: 1.0,
+      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 {};
     },
-    dialog:{
-      type:Object,
-      default:()=>{
-        return {};
-      }
-    }
-  })
-  const selectRowValue = ref({});
-  const rowClick = (row) => {
-    selectRowValue.value = row;
-  };
-  const onSelected = () => {
-    commonTableEmits("selectedSure", selectRowValue.value);
-    props.dialog.visible = false;
-  };
-  const cancelWindow=()=>{
-    props.dialog.visible = false;
-  }
+  },
+});
+const selectRowValue = ref({});
+const rowClick = (row) => {
+  selectRowValue.value = row;
+};
+const onSelected = () => {
+  commonTableEmits("selectedSure", selectRowValue.value);
+  props.dialog.visible = false;
+};
+const cancelWindow = () => {
+  props.dialog.visible = false;
+};
 </script>
 
 <style>
-  .detail-footer{
-    float: right;
-  }
+.detail-footer {
+  float: right;
+}
 </style>

+ 77 - 36
src/views/base/bom/index.vue

@@ -9,13 +9,14 @@
       <div class="title-detail">
         物料属性 : {{ dataDetail.attributeDictValue }}
       </div>
-      <div class="title-detail">物料规格 : {{ dataDetail.spec }}</div>
+
       <div class="title-detail">单位 : {{ dataDetail.unitDictValue }}</div>
       <div class="title-detail">物料级别 : {{ dataDetail.levelDictValue }}</div>
       <div class="title-detail">产品阶段 : {{ dataDetail.stageDictValue }}</div>
       <div class="title-detail">生产厂家 : {{ dataDetail.manufacturer }}</div>
       <div class="title-detail">创建时间 : {{ dataDetail.created }}</div>
-      <div class="title-detail">备注 : {{ dataDetail.remark }}</div>
+      <div class="title-text">物料规格 : {{ dataDetail.spec }}</div>
+      <div class="title-text">备注 : {{ dataDetail.remark }}</div>
     </div>
     <avue-crud
       ref="crudRef"
@@ -37,8 +38,10 @@
           <el-select
             v-model="version"
             placeholder="请选择BOM版本"
+            ref="selectBom"
             style="width: 150px; margin-left: 15px"
             @click="openBomVersion"
+            @focus="openBomVersion"
           >
             <el-option
               v-for="item in options"
@@ -51,12 +54,12 @@
         </div>
       </template>
 
-      <CommonTable
+      <!--<CommonTable
         ref="ctableRef"
         tableTitle="物料选择"
         tableType="BOM"
         @selected-sure="onSelectedFinish"
-      />
+      />-->
       <template #footer>
         <div class="detail-footer">
           <el-button type="primary" @click="onSelected"> 保存 </el-button>
@@ -86,6 +89,7 @@
     <CommonTable
       ref="ctableRef"
       tableTitle="BOM添加"
+      :multipleRow="multipleRow"
       tableType="MARTERIAL"
       @selected-sure="onSelectedFinish"
     />
@@ -101,6 +105,7 @@
         @selected-sure="selectedFinish"
       />
     </el-dialog>
+
   </div>
 </template>
 <script setup>
@@ -117,12 +122,13 @@ const { isShowTable, tableType } = toRefs(useCommonStoreHook());
 const { dicts } = useDictionaryStore();
 const router = useRouter();
 const route = useRoute();
-
+const selectBom = ref({});
 const dataDetail = ref({});
 const test = () => {
   isShowTable.value = true;
   tableType.value = tableType.value == 1 ? 2 : 1;
 };
+const multipleRow = ref(true);
 const openMaterial = () => {
   if (
     version.value.value === 0 ||
@@ -136,10 +142,12 @@ const openMaterial = () => {
     return;
   }
   if (ctableRef.value) {
+    startCreat();
     ctableRef.value.startSelect();
   }
 };
 const openBomVersion = () => {
+  selectBom.value.blur();
   dialog.visible = true;
 };
 const version = ref({
@@ -153,17 +161,24 @@ const dataBomLists = () => {
   dataNoPageList();
 };
 
-const ctableRef = ref(null);
+const ctableRef = ref({});
 const dialog = reactive({
   title: "BOM版本",
   visible: false,
 });
+//defineExpose({ startCreat });
 const material = ref(null);
 const binding = (row) => {
   if (ctableRef.value) {
     ctableRef.value.startSelect();
   }
 };
+const startCreat = () =>{
+  ctableRef.value?.mergeOption({
+    selection: true,
+    reserveSelection : true,
+  });
+}
 const onSelected = () => {
   for (var i = 0; i < data.value.length; i++) {
     if (data.value[i].bomMaterialNumber <= 0) {
@@ -222,8 +237,6 @@ const { checkBtnPerm, downloadTemplate, exportData } = Utils; //按钮权限等
 const crudRef = ref(null); //crudRef.value 获取avue-crud对象
 
 onMounted(() => {
-  // console.log("crudRef", crudRef)
-  console.info("1111", dicts);
   getBomVersion(route.params.materialCode).then((data) => {
     version.value.value = data.data;
     search.value.bomVersion = data.data;
@@ -256,7 +269,7 @@ const importExcelData = () => {
 
 // 设置表格列或者其他自定义的option
 option.value = Object.assign(option.value, {
-  selection: true,
+  selection: false,
   addBtn: false,
   viewBtn: false,
   editBtn: false,
@@ -312,40 +325,61 @@ option.value = Object.assign(option.value, {
 const routeBack = () => {
   router.back();
 };
-const onSelectedFinish = (selectedValue) => {
-  for (let i = 0; i < data.value.length; i++) {
-    if (data.value[i].bomMaterialCode === selectedValue.materialCode) {
-      ElMessage({
-        message: data.value[i].bomMaterialName + "已经添加过了",
-        type: "error",
-      });
-      return;
-    }
-  }
-  if (selectedValue.materialCode == dataDetail.value.materialCode) {
+const onSelectedFinish = (selectedValueList) => {
+  if (Object.keys(selectedValueList).length === 0 || selectedValueList == undefined || selectedValueList == null || selectedValueList.length <= 0) {
     ElMessage({
-      message: selectedValue.materialCode + "自己不能添加自己为BOM",
+      message: "没有选择任何物料",
       type: "error",
     });
-    return;
+    return false;
   }
-  if (version.value.value === 0 || version.value.value === null) {
-    ElMessage({
-      message: "没有选择BOM版本",
-      type: "error",
-    });
+  const flag = ref(true);
+  selectedValueList?.forEach((selectedValue, index) => {
+      if (selectedValue.materialCode == dataDetail.value.materialCode) {
+        ElMessage({
+          message: selectedValue.materialCode + "自己不能添加自己为BOM",
+          type: "error",
+        });
+        flag.value=false;
+        return;
+      }
+      for (var i = 0; i < data.value.length; i++) {
+        if (data.value[i].bomMaterialCode === selectedValue.materialCode) {
+          ElMessage({
+            message: selectedValue.materialCode + "的" + data.value[i].bomMaterialName + "已经添加过了",
+            type: "error",
+          });
+          flag.value=false;
+          return;
+        }
+      }
+      if (version.value.value === 0 || version.value.value === null) {
+        ElMessage({
+          message: "没有选择BOM版本",
+          type: "error",
+        });
+        flag.value=false;
+        return;
+      }
+
+    }
+  );
+  if(!flag.value){
     return;
   }
-  const bom = ref({
-    materialCode: route.params.materialCode,
-    bomMaterialCode: selectedValue.materialCode,
-    bomMaterialName: selectedValue.materialName,
-    bomVersion: version.value.value,
-    bomMaterialAttribute: selectedValue.attributeDictValue,
-    bomMaterialNumber: 0,
-    $cellEdit: true,
+  selectedValueList?.forEach((selectedValue, index) => {
+    const bom = ref({
+      materialCode: route.params.materialCode,
+      bomMaterialCode: selectedValue.materialCode,
+      bomMaterialName: selectedValue.materialName,
+      bomVersion: version.value.value,
+      bomMaterialAttribute: selectedValue.attributeDictValue,
+      bomMaterialNumber: 0,
+      $cellEdit: true,
+    });
+    data.value.push(bom.value);
   });
-  data.value.push(bom.value);
+
 };
 const queryMaterialDetail = () => {
   getMaterialDetails(route.params.materialCode).then(({ data }) => {
@@ -423,6 +457,13 @@ const selectedFinish = (selectedValue) => {
   margin: 5px 20px 5px 0;
   float: left;
 }
+.title-text{
+  width: 100%;
+  height: 30px;
+  line-height: 50px;
+  margin: 5px 20px 5px 0;
+  float: left;
+}
 .detail {
   margin: 0 auto 30px;
   width: 100%;

+ 1 - 1
src/views/base/craftManagement/route/components/configs.ts

@@ -364,7 +364,7 @@ export const comTypes: comType[] = [
     compentType: "operationExcel",
   },
   {
-    compentName: "测试数据",
+    compentName: "设备数据",
     compentType: "ceshishuju",
   },
   // {

+ 2 - 0
src/views/base/craftManagement/route/index.vue

@@ -181,6 +181,7 @@ const { dicts } = useDictionaryStore();
 const sureCancelProductManager = () => {
   productManagerVisible.value = false;
   dataList();
+  form.value = {};
 };
 // 传入一个url,后面不带/
 const { form, data, option, search, page, toDeleteIds, Methords, Utils } =
@@ -220,6 +221,7 @@ const sureToEditProductManager = () => {
   editRouteWith(currentPMRow.value).then(() => {
     dataList();
     productManagerVisible.value = false;
+    form.value = {};
   });
 };
 

+ 19 - 8
src/views/base/information/index.vue

@@ -7,6 +7,7 @@
       :data="data"
       :option="option"
       v-model:page="page"
+      :permission="permission"
       @row-save="createRow"
       @row-update="updateRow"
       @row-del="deleteRow"
@@ -47,10 +48,18 @@
           :is-link="true"
           :pdf-source="filePath + row.pdfPath"
         />
-        <el-button @click="deleteRecord(row, index, done)" text type="primary"
+        <el-button
+          v-hasPerm="[buttonPermission.BasicData.BTNS.picture_del]"
+          @click="deleteRecord(row, index, done)"
+          text
+          type="primary"
           >删除</el-button
         >
-        <el-button @click="doEdit(row, index)" text type="primary"
+        <el-button
+          @click="doEdit(row, index)"
+          text
+          type="primary"
+          v-hasPerm="[buttonPermission.BasicData.BTNS.picture_edit]"
           >编辑</el-button
         >
       </template>
@@ -81,6 +90,8 @@ import { useCommonStoreHook, useDictionaryStore } from "@/store";
 import { updateDrawaing } from "@/api/drawing";
 import dictDataUtil from "@/common/configs/dictDataUtil";
 import PDFView from "@/components/PDFView/index.vue";
+import { checkPerm } from "@/directive/permission";
+import buttonPermission from "@/common/configs/buttonPermission";
 const { isShowTable, tableType } = toRefs(useCommonStoreHook());
 // 数据字典相关
 const { dicts } = useDictionaryStore();
@@ -137,12 +148,12 @@ const {
 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 permission = reactive({
+  delBtn: checkPerm(buttonPermission.BasicData.BTNS.picture_del),
+  editBtn: checkPerm(buttonPermission.BasicData.BTNS.picture_edit),
+  addBtn: false,
+  menu: true,
+});
 
 const crudRef = ref(null); //crudRef.value 获取avue-crud对象
 const router = useRouter?.();

+ 187 - 147
src/views/plan/prepare/index.vue

@@ -1,42 +1,57 @@
 <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"
-        @tree-load="treeLoad"
-        @search-change="searchChange"
-        @search-reset="resetChange"
-        @size-change="dataList"
-        @current-change="dataList"
-        @selection-change="selectionChange"
-        :span-method="spanMethod"
+      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"
+      @tree-load="treeLoad"
+      @search-change="searchChange"
+      @search-reset="resetChange"
+      @size-change="dataList"
+      @current-change="dataList"
+      @selection-change="selectionChange"
+      :span-method="spanMethod"
     >
       <template #orderCode="{ row }">
-        <el-text v-if="row.orderCode">{{row.orderCode}}</el-text>
-        <div style="width: 100%; height: 100%;display: flex" v-if="!row.orderCode && row.operationDetails">
-          <div style="width: 120px;height: 100%"  v-for="item in row.operationDetails">
+        <el-text v-if="row.orderCode">{{ row.orderCode }}</el-text>
+        <div
+          style="width: 100%; height: 100%; display: flex"
+          v-if="!row.orderCode && row.operationDetails"
+        >
+          <div
+            style="width: 120px; height: 100%"
+            v-for="item in row.operationDetails"
+            :key="item"
+          >
             <el-progress
-                :text-inside="true"
-                :stroke-width="35"
-                :font-color="'#ff0000'"
-                :percentage="item.completeNum/row.workOrderNum * 100"
-                status="success"
-            >{{item.operationName}}(完成{{item.completeNum}})
+              :text-inside="true"
+              :stroke-width="35"
+              :font-color="'#ff0000'"
+              :percentage="(item.completeNum / row.workOrderNum) * 100"
+              status="success"
+              >{{ item.operationName }}(完成{{ item.completeNum }})
             </el-progress>
           </div>
         </div>
-        <el-tag v-if="row.workOrderCode === '-' && row.stockNum > 0" type="primary">库存数量:{{ row.stockNum }}</el-tag>
-        <el-tag v-if="row.workOrderCode === '-' && row.stockNum === '0'" type="danger">库存数量:{{ row.stockNum }}</el-tag>
+        <el-tag
+          v-if="row.workOrderCode === '-' && row.stockNum > 0"
+          type="primary"
+          >库存数量:{{ row.stockNum }}</el-tag
+        >
+        <el-tag
+          v-if="row.workOrderCode === '-' && row.stockNum === '0'"
+          type="danger"
+          >库存数量:{{ row.stockNum }}</el-tag
+        >
       </template>
-      <template #menu="{size,row,index}">
-<!--        <el-button
+      <template #menu="{ size, row, index }">
+        <!--        <el-button
             type="primary"
             link
             v-if="row.bom === '0' || row.dataFile === '0'|| row.routeId === '0'|| row.craftFile === '0'"
@@ -45,23 +60,28 @@
         ><i-ep-edit />编辑
         </el-button>-->
         <el-button
-            type="primary"
-            link
-            v-if="row.frockState === '0'"
-            size="small"
-            @click="frockStateChange(row)"
-        ><i-ep-edit />工装齐套
+          type="primary"
+          link
+          v-if="row.frockState === '0'"
+          size="small"
+          @click="frockStateChange(row)"
+          ><i-ep-edit />工装齐套
         </el-button>
         <el-button
-            type="primary"
-            link
-            v-if="row.deviceState === '0' || row.bom === '-' || row.craftFile === '-' || row.materialState === '0'"
-            size="small"
-            @click="handleRefresh(row.workOrderCode)"
-        ><i-ep-edit />刷新
+          type="primary"
+          link
+          v-if="
+            row.deviceState === '0' ||
+            row.bom === '-' ||
+            row.craftFile === '-' ||
+            row.materialState === '0'
+          "
+          size="small"
+          @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'"
@@ -70,7 +90,7 @@
         ><i-ep-edit />删除
         </el-button>-->
       </template>
-<!--      <template #menu-left="{ size }">
+      <!--      <template #menu-left="{ size }">
         <el-button
           :disabled="toDeleteIds.length < 1"
           type="danger"
@@ -82,12 +102,12 @@
       </template>-->
     </avue-crud>
     <el-dialog
-        v-model="dialog.visible"
-        :title="dialog.title"
-        width="80%"
-        @close="dialog.visible = false"
+      v-model="dialog.visible"
+      :title="dialog.title"
+      width="80%"
+      @close="dialog.visible = false"
     >
-      <work-order-page queryType="1"  @orderInfo="orderInfo"/>
+      <work-order-page queryType="1" @order-info="orderInfo" />
     </el-dialog>
   </div>
 </template>
@@ -95,22 +115,21 @@
 <script setup>
 import { ref, getCurrentInstance } from "vue";
 import { useCrud } from "@/hooks/userCrud";
-import {prepareCheckInfo,refreshPrepareCheckInfo,frockState} from "@/api/order"
-import {queryChildrenInfo} from "@/api/process"
+import {
+  prepareCheckInfo,
+  refreshPrepareCheckInfo,
+  frockState,
+} from "@/api/order";
+import { queryChildrenInfo } from "@/api/process";
 import { useCommonStoreHook } from "@/store";
 const { isShowTable, tableType } = toRefs(useCommonStoreHook());
-const router = useRouter();
-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/plan/prepare",
   });
-const { dataList, createRow, updateRow, deleteRow, searchChange, resetChange } = Methords; //增删改查
+const { dataList, createRow, updateRow, deleteRow, searchChange, resetChange } =
+  Methords; //增删改查
 const { selectionChange, multipleDelete } = Methords; //选中和批量删除事件
 const { checkBtnPerm, downloadTemplate, exportData } = Utils; //按钮权限等工具
 
@@ -119,17 +138,17 @@ const dialog = reactive({
   title: "订单选择",
   visible: false,
 });
-const merginState = ref(false)
-const spanMethod = ({ row, column, rowIndex, columnIndex })=>{
-  if(row.hasParent){
-    if(columnIndex === 6){
-      merginState.value = true
-      return [1, 11]
-    }else if(columnIndex > 6 && merginState){
-      return [0,0]
+const merginState = ref(false);
+const spanMethod = ({ row, column, rowIndex, columnIndex }) => {
+  if (row.hasParent) {
+    if (columnIndex === 6) {
+      merginState.value = true;
+      return [1, 11];
+    } else if (columnIndex > 6 && merginState) {
+      return [0, 0];
     }
-  }else{
-    merginState.value = false
+  } else {
+    merginState.value = false;
   }
   /*if (rowIndex % 2 === 0) {
     if (columnIndex === 0) {
@@ -138,73 +157,70 @@ const spanMethod = ({ row, column, rowIndex, columnIndex })=>{
       return [0, 0]
     }
   }*/
-}
-const checkInfo = (code) =>{
-  prepareCheckInfo(code).then((data)=>{
-    form.value.deviceStr = data.data.deviceStr
-    form.value.deviceState = data.data.deviceState
-    form.value.materialState = data.data.materialState
-    form.value.materialStr = data.data.materialStr
-  })
-}
-const treeLoad = (tree, treeNode, resolve) =>{
-  queryChildrenInfo(tree.workOrderCode).then((data)=>{
-    resolve(data.data)
-  })
-}
-const handleEdit =(row,index)=>{
-  crudRef.value && crudRef.value.rowEdit(row,index);
-}
-const handleRefresh =(code)=>{
-  refreshPrepareCheckInfo(code).then((data)=>{
-    if(data.code === '200'){
-      ElMessage.success("刷新成功")
-      dataList()
-    }else{
-      ElMessage.error(data.msg)
+};
+const checkInfo = (code) => {
+  prepareCheckInfo(code).then((data) => {
+    form.value.deviceStr = data.data.deviceStr;
+    form.value.deviceState = data.data.deviceState;
+    form.value.materialState = data.data.materialState;
+    form.value.materialStr = data.data.materialStr;
+  });
+};
+const treeLoad = (tree, treeNode, resolve) => {
+  queryChildrenInfo(tree.workOrderCode).then((data) => {
+    resolve(data.data);
+  });
+};
+const handleEdit = (row, index) => {
+  crudRef.value && crudRef.value.rowEdit(row, index);
+};
+const handleRefresh = (code) => {
+  refreshPrepareCheckInfo(code).then((data) => {
+    if (data.code === "200") {
+      ElMessage.success("刷新成功");
+      dataList();
+    } else {
+      ElMessage.error(data.msg);
     }
-  })
-}
-const frockStateChange =(code)=>{
+  });
+};
+const frockStateChange = (code) => {
   code.frockState = 1;
-  frockState(code).then((data)=>{
-    if(data.code === '200'){
-      ElMessage.success("刷新成功")
-      dataList()
-    }else{
-      ElMessage.error(data.msg)
+  frockState(code).then((data) => {
+    if (data.code === "200") {
+      ElMessage.success("刷新成功");
+      dataList();
+    } else {
+      ElMessage.error(data.msg);
     }
-  })
-}
+  });
+};
 const orderInfo = (value) => {
-  form.value.workOrderCode = value.workOrderCode
-  form.value.orderCode = value.orderCode
-  form.value.orderName = value.orderName
-  form.value.materialCode = value.materialCode
-  form.value.materialName = value.materialName
-  form.value.materialModel = value.materialModel
-  dialog.visible = false
-}
+  form.value.workOrderCode = value.workOrderCode;
+  form.value.orderCode = value.orderCode;
+  form.value.orderName = value.orderName;
+  form.value.materialCode = value.materialCode;
+  form.value.materialName = value.materialName;
+  form.value.materialModel = value.materialModel;
+  dialog.visible = false;
+};
 // 设置表格列或者其他自定义的option
 option.value = Object.assign(option.value, {
   delBtn: false,
   selection: false,
   editBtn: false,
-  tree: true,
   viewBtn: false,
-  lazy: true,
-  menuBtn:false,
+  menu: true,
   menuWidth: 100,
-  rowKey: 'workOrderCode',
   addBtn: false,
-  dialogWidth: '45%', // 设置编辑弹窗的宽度为50%
+  dialogWidth: "45%", // 设置编辑弹窗的宽度为50%
   column: [
     {
-      label: "工单号",
+      label: "工单号",
       prop: "workOrderCode",
       search: true,
       minWidth: 200,
-      editDisabled : true,
+      editDisabled: true,
       rules: [
         {
           required: true,
@@ -213,15 +229,15 @@ option.value = Object.assign(option.value, {
         },
       ],
       click: ({ value, column }) => {
-        if(column.boxType){
-          dialog.visible = true
+        if (column.boxType) {
+          dialog.visible = true;
         }
       },
-      change:({ value, column }) =>{
-        if(value){
-          checkInfo(value)
-        }
-      }
+      // change: ({ value, column }) => {
+      //   if (value) {
+      //     checkInfo(value);
+      //   }
+      // },
     },
     {
       label: "产品编码",
@@ -315,8 +331,12 @@ option.value = Object.assign(option.value, {
       editDisplay: false,
       html: true,
       formatter: (val) => {
-        if (val.craftFile !== '-') {
-          return '<b class="el-tag el-tag--success el-tag--light">'+val.craftFile+'</b>';
+        if (val.craftFile !== "-") {
+          return (
+            '<b class="el-tag el-tag--success el-tag--light">' +
+            val.craftFile +
+            "</b>"
+          );
         }
         return '<b class="el-tag el-tag--danger el-tag--light">-</b>';
       },
@@ -331,8 +351,12 @@ option.value = Object.assign(option.value, {
       editDisplay: false,
       html: true,
       formatter: (val) => {
-        if (val.bom !== '-') {
-          return '<b class="el-tag el-tag--success el-tag--light">'+val.bom+'</b>';
+        if (val.bom !== "-") {
+          return (
+            '<b class="el-tag el-tag--success el-tag--light">' +
+            val.bom +
+            "</b>"
+          );
         }
         return '<b class="el-tag el-tag--danger el-tag--light">-</b>';
       },
@@ -347,8 +371,12 @@ option.value = Object.assign(option.value, {
       prop: "routeId",
       html: true,
       formatter: (val) => {
-        if (val.routeId !== '-') {
-          return '<b class="el-tag el-tag--success el-tag--light">'+val.routeId+'</b>';
+        if (val.routeId !== "-") {
+          return (
+            '<b class="el-tag el-tag--success el-tag--light">' +
+            val.routeId +
+            "</b>"
+          );
         }
         return '<b class="el-tag el-tag--danger el-tag--light">-</b>';
       },
@@ -361,68 +389,80 @@ option.value = Object.assign(option.value, {
       overHidden: true,
       html: true,
       formatter: (val) => {
-        if (val.deviceState === '1') {
+        if (val.deviceState === "1") {
           return '<b class="el-tag el-tag--success el-tag--light">已齐套</b>';
         }
-        return '<b class="el-tag el-tag--danger el-tag--light">'+val.deviceStr+'</b>';
+        return (
+          '<b class="el-tag el-tag--danger el-tag--light">' +
+          val.deviceStr +
+          "</b>"
+        );
       },
     },
     {
       label: "物料状态",
-      prop: 'materialStr',
+      prop: "materialStr",
       disabled: true,
       width: 200,
       overHidden: true,
       span: 24,
       html: true,
       formatter: (val) => {
-        if (val.materialState === '1') {
+        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">'+val.materialStr+'</b>';
+        return (
+          '<b class="el-tag el-tag--danger el-tag--light">' +
+          val.materialStr +
+          "</b>"
+        );
       },
     },
     {
       label: "工装状态",
-      prop: 'frockStr',
+      prop: "frockStr",
       disabled: true,
       width: 200,
       overHidden: true,
       span: 24,
       html: true,
       formatter: (val) => {
-        if (val.frockState === '1') {
+        if (val.frockState === "1") {
           return '<b class="el-tag el-tag--success el-tag--light">已齐套</b>';
         }
-        return '<b class="el-tag el-tag--danger el-tag--light">'+val.frockStr+'</b>';
+        return (
+          '<b class="el-tag el-tag--danger el-tag--light">' +
+          val.frockStr +
+          "</b>"
+        );
       },
     },
     {
       label: "创建时间",
       prop: "created",
       width: 200,
-      display: false
+      display: false,
     },
     {
       label: "创建人",
       width: 200,
       prop: "creator",
-      display: false
+      display: false,
     },
   ],
 });
 
-
 onMounted(() => {
-  form.value.routeId = "1"
-  form.value.materialState = 1
-  let url = window.location.href
-  if(url.includes("workOrderCode")){
-    search.value.workOrderCode = url.substring(url.indexOf("workOrderCode")+ 14)
+  form.value.routeId = "1";
+  form.value.materialState = 1;
+  let url = window.location.href;
+  if (url.includes("workOrderCode")) {
+    search.value.workOrderCode = url.substring(
+      url.indexOf("workOrderCode") + 14
+    );
   }
   dataList();
 });
-
 </script>
 <style scoped>
 :deep(.el-progress-bar__innerText) {

+ 1 - 0
src/views/plan/track/index.vue

@@ -53,6 +53,7 @@ option.value = Object.assign(option.value, {
   selection: true,
   menu: false,
   menuWidth: 160,
+  searchLabelWidth: 120,
   addBtn: false,
   filterBtn: false,
   searchShowBtn: false,

+ 16 - 2
src/views/plan/workOrder/components/work-order-page.vue

@@ -40,7 +40,7 @@ const props = defineProps({
   queryType: {
     type: String,
     default: () => {
-      return "0";
+      return null;
     },
   },
   opType: {
@@ -49,6 +49,12 @@ const props = defineProps({
       return null;
     },
   },
+  queryComplete: {
+    type: String,
+    default: () => {
+      return null;
+    },
+  },
   workOrderState: {
     type: String,
     default: () => {
@@ -268,7 +274,15 @@ option.value = Object.assign(option.value, {
 
 onMounted(() => {
   multipleKeyVal.value = props.multipleKey;
-  search.value.queryType = String(props.queryType);
+  if (props.queryComplete != null) {
+    search.value.queryComplete = String(props.queryComplete);
+  }
+  if (props.opType != null) {
+    search.value.opType = String(props.opType);
+  }
+  if (props.queryType != null) {
+    search.value.queryType = String(props.queryType);
+  }
   if (props.workOrderState != null) {
     search.value.workOrderState = String(props.workOrderState);
   }

+ 13 - 6
src/views/pro/traceability/index.vue

@@ -171,10 +171,10 @@
               </template>
               <ExcelCom ref="excelComRef"
             /></el-tab-pane>
-            <el-tab-pane name="cssjComRef" label="测试数据"
+            <el-tab-pane name="cssjComRef" label="设备数据"
               ><template #label>
                 <span
-                  >测试数据
+                  >设备数据
                   <el-badge
                     :value="tabCount.testData"
                     class="item"
@@ -224,9 +224,17 @@ const { form, data, option, search, page, toDeleteIds, Methords, Utils } =
   useCrud({
     src: "/api/v1/process/web/traceability",
   });
-
-const { dataList, createRow, updateRow, deleteRow, searchChange, resetChange } =
-  Methords; //增删改查
+const searchChange = (params, done) => {
+  if (params.seqNo) {
+    option.value.defaultExpandAll = true;
+  } else {
+    option.value.defaultExpandAll = false;
+  }
+  search.value = params;
+  search.value.currentPage = 1;
+  dataList({ done: done });
+};
+const { dataList, createRow, updateRow, deleteRow, resetChange } = Methords; //增删改查
 const { selectionChange, multipleDelete } = Methords; //选中和批量删除事件
 const { checkBtnPerm } = Utils; //按钮权限等工具
 
@@ -259,7 +267,6 @@ const tabNameComRef = new Map([
 let temRow = ref({});
 const tabsEvent = (pane, ev) => {
   defaultTabName.value = pane.props.name;
-  console.log(temRow.value,'22')
   if (temRow.value.seqNo) {
     tabNameComRef.get(pane.props.name)?.value.refreshTra(temRow.value);
   }

+ 2 - 2
src/views/quality/reject/components/show.vue

@@ -37,7 +37,7 @@
                       }}
                     </td>
                     <td class="titlesmall">工单号</td>
-                    <td class="titleVal">{{ tableData.orderNo }}</td>
+                    <td class="titleVal">{{ tableData.workOrderCode }}</td>
                     <td class="titlesmall">数量</td>
                     <td class="titleVal">
                       {{ tableData.num ? tableData.num : "/" }}
@@ -46,7 +46,7 @@
                   <tr>
                     <td class="titlesmall">管号</td>
                     <td colspan="5">
-                      {{ tableData.code ? tableData.code : "/" }}
+                      {{ tableData.seqs ? tableData.seqs : "/" }}
                     </td>
                   </tr>
                   <tr>

+ 25 - 7
src/views/quality/rework/index.vue

@@ -66,6 +66,15 @@
           >返工完成</el-button
         >
       </template>
+
+      <template #menu-right="{}">
+        <el-button
+          class="ml-3"
+          @click="exportData('/api/v1/rework/record/export')"
+        >
+          <template #icon> <i-ep-download /> </template>导出
+        </el-button>
+      </template>
     </avue-crud>
     <el-dialog
       v-model="dialog.visible"
@@ -203,6 +212,21 @@ option.value = Object.assign(option.value, {
       display: false,
     },
     {
+      label: "返工原因",
+      prop: "reason",
+      width: 160,
+      search: true,
+      overHidden: true,
+      type: "textarea",
+    },
+    {
+      label: "产品规格",
+      prop: "materialModel",
+      width: 160,
+      search: true,
+      overHidden: true,
+    },
+    {
       label: "返工内容",
       prop: "remark",
       width: 160,
@@ -229,13 +253,7 @@ option.value = Object.assign(option.value, {
         },
       ],
     },
-    {
-      label: "返工原因",
-      prop: "reason",
-      width: 160,
-      overHidden: true,
-      type: "textarea",
-    },
+
     {
       label: "返工提出者",
       prop: "creator",

+ 37 - 0
src/views/storage/semi/components/details.vue

@@ -47,8 +47,35 @@
           />
         </el-select>
       </el-form-item>
+      <el-form-item
+        label="出库工单号"
+        prop="outWorkOrderCode"
+        :rules="[
+          {
+            required: true,
+            trigger: 'blur',
+          },
+        ]"
+      >
+        <el-select
+          v-model="formData.outWorkOrderCode"
+          @click="dialog1.visible = true"
+        />
+      </el-form-item>
     </el-form>
     <el-button type="primary" @click="submit">出库</el-button>
+    <el-dialog
+      v-model="dialog1.visible"
+      :title="dialog1.title"
+      width="950px"
+      @close="dialog1.visible = false"
+    >
+      <work-order-page
+        :queryComplete="0"
+        :opType="1"
+        @order-info="materialInfo1"
+      />
+    </el-dialog>
   </div>
 </template>
 <script setup>
@@ -57,9 +84,18 @@ import { useDictionaryStore } from "@/store";
 const { dicts } = useDictionaryStore();
 const emits = defineEmits(["close"]);
 const ruleFormRef = ref(null);
+const dialog1 = reactive({
+  title: "工单号选择",
+  visible: false,
+});
+const materialInfo1 = (value) => {
+  formData.value.outWorkOrderCode = value.workOrderCode;
+  dialog1.visible = false;
+};
 const formData = ref({
   stockId: "",
   stockType: "2",
+  inWorkOrderCode: "",
   workOrderSeqNos: [],
 });
 const props = defineProps({
@@ -72,6 +108,7 @@ const tableData = ref([]);
 const getData = async () => {
   const { data } = await getSemi(props.id);
   detailsData.value = data;
+  formData.value.inWorkOrderCode = data.inWorkOrderCode;
   tableData.value = detailsData.value.detailsList;
 };
 const submit = async () => {

+ 3 - 6
src/views/storage/semi/index.vue

@@ -36,11 +36,7 @@
       width="950px"
       @close="dialog1.visible = false"
     >
-      <work-order-page
-        :queryType="2"
-        :workOrderState="6"
-        @order-info="materialInfo1"
-      />
+      <work-order-page :opType="0" @order-info="materialInfo1" />
     </el-dialog>
     <el-dialog
       v-model="dialog2.visible"
@@ -200,7 +196,7 @@ option.value = Object.assign(option.value, {
       label: "出入库类型",
       prop: "stockType",
       editDisabled: true,
-
+      disabled: true,
       addDisplay: true,
       rules: [
         {
@@ -219,6 +215,7 @@ option.value = Object.assign(option.value, {
           value: "2",
         },
       ],
+      value: "1",
     },
     {
       label: "入库工单",