From a597d9c7d1975ab9fe0f01d1a3608497288eafe0 Mon Sep 17 00:00:00 2001
From: chenlu <1320612696@qq.com>
Date: 星期五, 06 六月 2025 08:44:41 +0800
Subject: [PATCH] Merge branch 'master' of http://10.153.19.25:10105/r/ERP_override

---
 north-glass-erp/northglass-erp/src/router/index.js                |   33 +
 north-glass-erp/northglass-erp/src/views/sd/order/SelectOrder.vue |    2 
 north-glass-erp/northglass-erp/src/lang/en.js                     |    4 
 north-glass-erp/northglass-erp/src/views/sd/bom/ProductBomAdd.vue |   62 ++
 north-glass-erp/northglass-erp/src/views/sd/bom/OrderBOM.vue      |  709 +++++++++++++++++++++++
 north-glass-erp/northglass-erp/src/lang/ar.js                     |    4 
 north-glass-erp/northglass-erp/src/lang/ru.js                     |    4 
 north-glass-erp/northglass-erp/src/views/sd/bom/ProductBOM.vue    |  398 +++++++++++++
 north-glass-erp/northglass-erp/src/hook/footSum.js                |    4 
 north-glass-erp/northglass-erp/src/lang/zh.js                     |    4 
 north-glass-erp/northglass-erp/src/views/sd/bom/BOM.vue           |   64 ++
 north-glass-erp/northglass-erp/src/views/sd/bom/MaterialBOM.vue   |  456 +++++++++++++++
 12 files changed, 1,734 insertions(+), 10 deletions(-)

diff --git a/north-glass-erp/northglass-erp/src/hook/footSum.js b/north-glass-erp/northglass-erp/src/hook/footSum.js
index e4b64f0..4afe05d 100644
--- a/north-glass-erp/northglass-erp/src/hook/footSum.js
+++ b/north-glass-erp/northglass-erp/src/hook/footSum.js
@@ -3,9 +3,9 @@
     list.forEach(item => {
         if(field.indexOf('.')>-1){
             let  array = field.split('.')
-            count += Number(item[array[0]][array[1]])
+            count += Number(item[array[0]][array[1]]) || 0
         }else {
-            count += Number(item[field])
+            count += Number(item[field])  || 0
         }
     })
     return count.toFixed(2)
diff --git a/north-glass-erp/northglass-erp/src/lang/ar.js b/north-glass-erp/northglass-erp/src/lang/ar.js
index fa1bcb4..2ec0643 100644
--- a/north-glass-erp/northglass-erp/src/lang/ar.js
+++ b/north-glass-erp/northglass-erp/src/lang/ar.js
@@ -312,6 +312,7 @@
             isOptimize:'姝よ鍗曞凡杞紭鍖栵紝鍥為��澶辫触锛�',
             isReportingWork:'姝よ鍗曞凡鎶ュ伐锛屽洖閫�澶辫触锛�',
             isStorage:'姝よ鍗曞凡鍏ュ簱锛屽洖閫�澶辫触锛�',
+            BackSure:"纭畾涓�閿��鍥炵浉搴旀祦绋�?"
         },
         updateOrderId:"淇敼璁㈠崟鍙�",
         reportingTransfer:'鎶ュ伐杞Щ'
@@ -1170,7 +1171,8 @@
         user :'賯丕卅賲丞 丕賱賲爻鬲禺丿賲賷賳',
         role :'兀匕賵賳丕鬲 丕賱丿賵乇',
         userPassWord :'鬲睾賷賷乇 賰賱賲丞 丕賱賲乇賵乇',
-        glassPrice:'鐜荤拑浠锋牸'
+        glassPrice:'鐜荤拑浠锋牸',
+        glassOptimize:'鐜荤拑浼樺寲'
     },
 
     glassPrice:{
diff --git a/north-glass-erp/northglass-erp/src/lang/en.js b/north-glass-erp/northglass-erp/src/lang/en.js
index d1c76b9..db8d88a 100644
--- a/north-glass-erp/northglass-erp/src/lang/en.js
+++ b/north-glass-erp/northglass-erp/src/lang/en.js
@@ -312,6 +312,7 @@
             isOptimize:'姝よ鍗曞凡杞紭鍖栵紝鍥為��澶辫触锛�',
             isReportingWork:'姝よ鍗曞凡鎶ュ伐锛屽洖閫�澶辫触锛�',
             isStorage:'姝よ鍗曞凡鍏ュ簱锛屽洖閫�澶辫触锛�',
+            BackSure:"纭畾涓�閿��鍥炵浉搴旀祦绋�?"
         },
         updateOrderId:"淇敼璁㈠崟鍙�",
         reportingTransfer:'鎶ュ伐杞Щ'
@@ -1170,7 +1171,8 @@
         user :'User',
         role :'Role',
         userPassWord :'User Pass Word',
-        glassPrice:'Glass Price'
+        glassPrice:'Glass Price',
+        glassOptimize:'鐜荤拑浼樺寲'
     },
 
     glassPrice:{
diff --git a/north-glass-erp/northglass-erp/src/lang/ru.js b/north-glass-erp/northglass-erp/src/lang/ru.js
index 1920d13..dbf9c67 100644
--- a/north-glass-erp/northglass-erp/src/lang/ru.js
+++ b/north-glass-erp/northglass-erp/src/lang/ru.js
@@ -312,6 +312,7 @@
             isOptimize:'姝よ鍗曞凡杞紭鍖栵紝鍥為��澶辫触锛�',
             isReportingWork:'姝よ鍗曞凡鎶ュ伐锛屽洖閫�澶辫触锛�',
             isStorage:'姝よ鍗曞凡鍏ュ簱锛屽洖閫�澶辫触锛�',
+            BackSure:"纭畾涓�閿��鍥炵浉搴旀祦绋�?"
         },
         updateOrderId:"淇敼璁㈠崟鍙�",
         reportingTransfer:'鎶ュ伐杞Щ'
@@ -1169,7 +1170,8 @@
         user :'小锌懈褋芯泻 锌芯谢褜蟹芯胁邪褌械谢械泄',
         role :'袩褉邪胁邪 薪邪 褉芯谢褜',
         userPassWord :'袠蟹屑械薪懈褌褜 锌邪褉芯谢褜',
-        glassPrice:'笑械薪邪 褋褌械泻谢邪.'
+        glassPrice:'笑械薪邪 褋褌械泻谢邪.',
+        glassOptimize:'鐜荤拑浼樺寲'
     },
 
     glassPrice:{
diff --git a/north-glass-erp/northglass-erp/src/lang/zh.js b/north-glass-erp/northglass-erp/src/lang/zh.js
index 76de2fe..cf94a6f 100644
--- a/north-glass-erp/northglass-erp/src/lang/zh.js
+++ b/north-glass-erp/northglass-erp/src/lang/zh.js
@@ -321,6 +321,7 @@
             isOptimize:'姝よ鍗曞凡杞紭鍖栵紝鍥為��澶辫触锛�',
             isReportingWork:'姝よ鍗曞凡鎶ュ伐锛屽洖閫�澶辫触锛�',
             isStorage:'姝よ鍗曞凡鍏ュ簱锛屽洖閫�澶辫触锛�',
+            BackSure:"纭畾涓�閿��鍥炵浉搴旀祦绋�?"
         },
         updateOrderId:"淇敼璁㈠崟鍙�",
         reportingTransfer:'鎶ュ伐杞Щ'
@@ -1180,7 +1181,8 @@
         user :'鐢ㄦ埛鍒楄〃',
         role :'瑙掕壊鏉冮檺',
         userPassWord :'淇敼瀵嗙爜',
-        glassPrice:'鐜荤拑浠锋牸'
+        glassPrice:'鐜荤拑浠锋牸',
+        glassOptimize:'鐜荤拑浼樺寲'
     },
 
     glassPrice:{
diff --git a/north-glass-erp/northglass-erp/src/router/index.js b/north-glass-erp/northglass-erp/src/router/index.js
index ee32200..b39a685 100644
--- a/north-glass-erp/northglass-erp/src/router/index.js
+++ b/north-glass-erp/northglass-erp/src/router/index.js
@@ -111,7 +111,34 @@
             }
           ]
         },
-
+          //bom妯″潡
+        {
+          path:'bom',
+          name: 'bom',
+          component: () => import('../views/sd/bom/BOM.vue'),
+          children:[
+            {
+              path: 'materialBOM',
+              name: 'materialBOM',
+              component: () => import('../views/sd/bom/MaterialBOM.vue')
+            },
+            {
+              path: 'productBOM',
+              name: 'productBOM',
+              component: () => import('../views/sd/bom/ProductBOM.vue')
+            },
+            {
+              path: 'orderBOM',
+              name: 'orderBOM',
+              component: () => import('../views/sd/bom/OrderBOM.vue')
+            },
+            {
+              name: 'bom1',
+              path: '',
+              redirect:'/main/bom/orderBOM'
+            }
+          ]
+        },
 
           //sd妯″潡
         {
@@ -655,7 +682,7 @@
             }
           ]
         },
-        {
+        /*{
           //BOM绠$悊
           path: 'BOM',
           name: 'BOM',
@@ -696,7 +723,7 @@
               redirect:'/main/BOM/SelectBOM'
             }
           ]
-        },
+        },*/
         {
           //璁惧绠$悊
           path: 'machine',
diff --git a/north-glass-erp/northglass-erp/src/views/sd/bom/BOM.vue b/north-glass-erp/northglass-erp/src/views/sd/bom/BOM.vue
new file mode 100644
index 0000000..d120a12
--- /dev/null
+++ b/north-glass-erp/northglass-erp/src/views/sd/bom/BOM.vue
@@ -0,0 +1,64 @@
+<script setup>
+import {ArrowLeftBold, ArrowRight, Search} from "@element-plus/icons-vue"
+import {useRouter,useRoute,onBeforeRouteUpdate} from "vue-router"
+import {useI18n} from "vue-i18n"
+const { t } = useI18n()
+const router = useRouter()
+const route = useRoute()
+let indexFlag=$ref(1)
+function changeRouter(index){
+  indexFlag=index
+
+}
+
+
+
+
+</script>
+
+<template>
+  <div id="main-div">
+    <div id="div-title">
+      <el-breadcrumb :separator-icon="ArrowRight">
+        <el-breadcrumb-item @click="changeRouter(1)" :class="indexFlag===1?'indexTag':''" :to="{ path: '/main/bom/orderBOM' }">璁㈠崟BOM</el-breadcrumb-item>
+        <el-breadcrumb-item @click="changeRouter(2)" :class="indexFlag===2?'indexTag':''" :to="{ path: '/main/bom/productBOM' }">浜у搧BOM</el-breadcrumb-item>
+        <el-breadcrumb-item @click="changeRouter(3)" :class="indexFlag===3?'indexTag':''" :to="{ path: '/main/bom/materialBOM' }">鐗╂枡BOM</el-breadcrumb-item>
+        <el-breadcrumb-item v-show="false" :to="{ path: '/main/order/orderReport' }"></el-breadcrumb-item>
+      </el-breadcrumb>
+    </div>
+
+    <div id="main-body">
+      <router-view :key="route.fullPath" />
+    </div>
+  </div>
+</template>
+
+<style scoped>
+#main-div{
+  width: 99%;
+  height: 100%;
+}
+#div-title{
+  height: 2%;
+  width: 100%;
+}
+#searchButton{
+  margin-top: -5px;
+  margin-left: 1rem;
+}
+#searchButton1{
+//margin-left: 10rem;
+}
+/*main-body鏍峰紡*/
+#main-body{
+  width: 100%;
+  height: 95%;
+  margin-top: 1%;
+}
+#select{
+  margin-left:0.5rem;
+}
+:deep(.indexTag .el-breadcrumb__inner){
+  color: #5CADFE !important;
+}
+</style>
\ No newline at end of file
diff --git a/north-glass-erp/northglass-erp/src/views/sd/bom/MaterialBOM.vue b/north-glass-erp/northglass-erp/src/views/sd/bom/MaterialBOM.vue
new file mode 100644
index 0000000..a7439f7
--- /dev/null
+++ b/north-glass-erp/northglass-erp/src/views/sd/bom/MaterialBOM.vue
@@ -0,0 +1,456 @@
+<script setup>
+
+import request from "@/utils/request"
+import deepClone from "@/utils/deepClone"
+import {ElMessage} from "element-plus"
+import {computed, onMounted, reactive, ref} from "vue"
+import {useRoute, useRouter} from "vue-router"
+import {changeFilterEvent,filterChanged} from "@/hook"
+import { useI18n } from 'vue-i18n'
+import useUserInfoStore from "@/stores/userInfo";
+
+//璇█鑾峰彇
+const { t } = useI18n()
+const userStore = useUserInfoStore()
+const router = useRouter()
+const route = useRoute()
+let produceList = ref([])
+const dialogTableVisible = ref(false)
+
+//琛ㄥ崟楠岃瘉
+const ruleFormRef = ref()
+const ruleForm = reactive({
+  type: '',
+  consume: '',
+  price: '',
+})
+
+const validatePass = (rule, value, callback) => {
+  if (value === '') {
+    callback(new Error('Please input the password'))
+  } else {
+    if (ruleForm.checkPass !== '') {
+      if (!ruleFormRef.value) return
+      ruleFormRef.value.validateField('checkPass')
+    }
+    callback()
+  }
+}
+
+const rules = reactive({
+  type: [{ validator: validatePass, trigger: 'blur' }],
+  /*checkPass: [{ validator: validatePass2, trigger: 'blur' }],
+  age: [{ validator: checkAge, trigger: 'blur' }],*/
+})
+
+const submitForm = (formEl) => {
+  if (!formEl) return
+  formEl.validate((valid) => {
+    if (valid) {
+      console.log('submit!')
+    } else {
+      console.log('error submit!')
+    }
+  })
+}
+
+
+const resetForm = (formEl) => {
+  if (!formEl) return
+  formEl.resetFields()
+}
+
+
+
+const getTableRow = (row,type) =>{
+  switch (type) {
+    case 'edit' :{
+      dialogTableVisible.value = true
+      return
+    }
+  }
+}
+
+const value = ref('')
+const options = [
+  {
+    value: t('ingredients.originalFilm'),
+    label: t('ingredients.originalFilm')
+  },
+  {
+    value: t('ingredients.accessories'),
+    label: t('ingredients.accessories'),
+  }
+]
+
+const hasDecimal=(value)=>{
+  const regex=/\./ // 瀹氫箟姝e垯琛ㄨ揪寮忥紝鏌ユ壘灏忔暟鐐�
+  return regex.test(value) //杩斿洖true/false
+}
+
+const hasDecimalhtml=(item,row)=>{
+  let aa=item.split('.').length
+  if (aa===2){
+    return row[item.split('.')[0]][item.split('.')[1]]
+  }else if(aa===3){
+    return row[item.split('.')[0]][item.split('.')[1]][item.split('.')[2]]
+  }
+
+
+}
+
+let pageNum=ref(1)
+let total = reactive({
+  pageTotal : 0,
+  dataTotal : 0,
+  pageSize : 1000
+})
+
+let filterData = ref({
+  type:''
+
+})
+let BasicData = ref([])
+
+let materialStore= ref([])
+
+let arr = [
+  {title: t('basicData.operate'), width: '110', slots: { default: 'button_slot' },fixed:'left'},
+  { type: 'seq',fixed:'left', title: t('basicData.Number'), width: '80' },
+  {field: 'id', width: '150',title: t('ingredients.materialCode'), sortable: true,showOverflow:'ellipsis' ,filters:[{ data: '' }],slots: { filter: 'num1_filter' },filterMethod:filterChanged}
+]
+const bomTitle = [
+  {field: 'type',title: '绫诲瀷', showOverflow:'ellipsis' },
+  {field: 'consume',title: '娑堣�楅噺',showOverflow:'ellipsis' },
+  {price: '浣跨敤浠锋牸',title: '浣跨敤浠锋牸',showOverflow:'ellipsis' }
+]
+
+//绗竴娆″姞杞介粯璁�
+value.value=t('ingredients.originalFilm')
+filterData.value.type=t('ingredients.originalFilm')
+request.get(`/BasicWarehouse/BasicWarehouseType/${value.value}`).then((res) => {
+  if(res.code==200){
+    gridOptions.columns.splice(0,gridOptions.columns.length)
+    BasicData.value = res.data
+    //娣诲姞鍒�
+    gridOptions.columns=arr.slice()
+    for (let i=0;i<BasicData.value.length;i++){
+      let aa={field: BasicData.value[i].OperateType, width: '150',title: BasicData.value[i].OperateTypeName, sortable: true,showOverflow:'ellipsis' ,filters:[{ data: '' }],slots: { filter: 'num1_filter' },filterMethod:filterChanged}
+      gridOptions.columns.push(aa)
+    }
+    bomTitle.forEach((item) => {
+      gridOptions.columns.push(item)
+    })
+
+    getWorks()
+
+  }else{
+    ElMessage.warning(res.msg)
+  }
+})
+
+
+//鍒楁煡璇�
+const getWork = () => {
+  filterData.value.type=value.value
+  request.get(`/BasicWarehouse/BasicWarehouseType/${value.value}`).then((res) => {
+    if(res.code==200){
+      gridOptions.columns=[]
+      BasicData.value = res.data
+      //娣诲姞鍒�
+      gridOptions.columns=arr.slice()
+
+      for (let i=0;i<BasicData.value.length;i++){
+        let column={field: BasicData.value[i].OperateType,
+          width: '150',title: BasicData.value[i].OperateTypeName,
+          sortable: true,showOverflow:'ellipsis' ,
+          filters:[{ data: '' }],
+          slots: { filter: 'num1_filter' },
+          filterMethod:filterChanged}
+
+        gridOptions.columns.push(column)
+
+      }
+      bomTitle.forEach((item) => {
+        gridOptions.columns.push(item)
+      })
+      getWorks()
+
+    }else{
+      ElMessage.warning(res.msg)
+    }
+  })
+}
+
+
+//鏁版嵁缁戝畾
+const getWorks = () => {
+  request.post(`/materialStore/getSelectMaterialStore/1/${total.pageSize}`,filterData.value).then((res) => {
+
+    if(res.code==200){
+      materialStore.value=[]
+      for (let i=0;i<res.data.data.length;i++){
+        materialStore.value[i]= JSON.parse(res.data.data[i].json)
+        materialStore.value[i].id= res.data.data[i].id
+      }
+
+      total.dataTotal = res.data.total.total*1
+      total.pageTotal= res.data.total.pageTotal
+      pageNum.value=1
+
+      produceList = deepClone(materialStore.value)
+      xGrid.value.loadData(produceList)
+      gridOptions.loading=false
+    }else{
+      ElMessage.warning(res.msg)
+      router.push("/login")
+    }
+  })
+}
+
+//鍒嗛〉鏌ヨ
+const getWorkPaging = () => {
+  request.post(`/materialStore/getSelectMaterialStore/${pageNum.value}/${total.pageSize}`,filterData.value).then((res) => {
+
+    if(res.code==200){
+      materialStore.value=[]
+      for (let i=0;i<res.data.data.length;i++){
+        materialStore.value[i]= JSON.parse(res.data.data[i].json)
+        materialStore.value[i].id= res.data.data[i].id
+      }
+
+
+      produceList = deepClone(materialStore.value)
+      xGrid.value.loadData(produceList)
+      gridOptions.loading=false
+    }else{
+      ElMessage.warning(res.msg)
+      router.push("/login")
+    }
+  })
+}
+
+//鍒嗛〉鏌ヨ
+const selectOrderList = ()=>{
+  filterData.value.type=value.value
+  request.get(`/BasicWarehouse/BasicWarehouseType/${value.value}`).then((res) => {
+    if(res.code==200){
+      gridOptions.columns.splice(0,gridOptions.columns.length)
+      BasicData.value = res.data
+      //娣诲姞鍒�
+      gridOptions.columns=arr.slice()
+
+      for (let i=0;i<BasicData.value.length;i++){
+        let aa={field: BasicData.value[i].OperateType, width: '150',title: BasicData.value[i].OperateTypeName, sortable: true,showOverflow:'ellipsis' ,filters:[{ data: '' }],slots: { filter: 'num1_filter' },filterMethod:filterChanged}
+        gridOptions.columns.push(aa)
+
+      }
+      bomTitle.forEach((item) => {
+        gridOptions.columns.push(item)
+      })
+      if (res.data.total!=null){
+        total.dataTotal = res.data.total.total*1
+        total.pageTotal= res.data.total.pageTotal
+      }
+      getWorkPaging()
+
+    }else{
+      ElMessage.warning(res.msg)
+    }
+  })
+}
+//椤佃剼璺宠浆
+const handlePageChange = ({ currentPage, pageSize }) => {
+  total.pageTotal = pageSize
+  pageNum.value=currentPage
+
+  selectOrderList();
+}
+
+
+
+//瀛愮粍浠舵帴鏀跺弬鏁�
+const xGrid = ref()
+const gridOptions = reactive({
+  border:  "full",//琛ㄦ牸鍔犺竟妗�
+  keepSource: true,//淇濇寔婧愭暟鎹�
+  align: 'center',//鏂囧瓧灞呬腑
+  stripe:true,//鏂戦┈绾�
+  rowConfig: {isCurrent: true, isHover: true,height: 30},//榧犳爣绉诲姩鎴栭�夋嫨楂樹寒
+  id: 'SelectIngredients',
+  showFooter: true,//鏄剧ず鑴�
+  printConfig: {},
+  importConfig: {},
+  exportConfig: {},
+  scrollY:{ enabled: true },//寮�鍚櫄鎷熸粴鍔�
+  showOverflow:true,
+  columnConfig: {
+    resizable: true,
+    useKey: true
+  },
+  filterConfig: {   //绛涢�夐厤缃」
+                    //remote: true
+  },
+  customConfig: {
+    storage: true
+  },
+  editConfig: {
+    trigger: 'click',
+    mode: 'row',
+    showStatus: true
+  },//琛ㄥご鍙傛暟
+  columns:[
+
+
+
+
+  ],//琛ㄥご鎸夐挳
+  toolbarConfig: {
+
+    /*import: false,
+    export: true,
+    print: true,*/
+    export: true,
+    zoom: true,
+    custom: true
+  },
+  footerMethod ({ columns, data }) {//椤佃剼鍑芥暟
+    return[
+      columns.map((column, columnIndex) => {
+        if (columnIndex === 0) {
+          return t('basicData.total')
+        }
+
+        return ''
+      })
+    ]
+  }
+
+})
+
+
+
+</script>
+
+<template>
+
+
+  <div class="main-div-customer">
+    <div class="head">
+      <el-row>
+        <el-col :span="4">
+          <el-select v-model="value" :placeholder="$t('ingredients.pleaseSelectACategory')" @change="getWork">
+            <el-option
+                v-for="item in options"
+                :key="item.value"
+                :label="item.label"
+                :value="item.value"
+            />
+          </el-select>
+        </el-col>
+      </el-row>
+    </div>
+
+    <div class="main-table">
+      <vxe-grid
+          max-height="100%"
+          class="mytable-scrollbar"
+          ref="xGrid"
+          v-bind="gridOptions"
+
+      >
+
+
+        <template #num1_filter="{ column, $panel }">
+          <div>
+            <div v-for="(option, index) in column.filters" :key="index">
+              <input type="type" v-model="option.data" @keyup.enter.native="$panel.confirmFilter()" @input="changeFilterEvent($event, option, $panel)"/>
+            </div>
+          </div>
+        </template>
+
+        <!--宸﹁竟鍥哄畾鏄剧ず鐨勬彃妲�-->
+        <template #button_slot="{ row }">
+          <el-button @click="getTableRow(row,'edit')"
+
+                     link type="primary" size="small">{{ $t('basicData.edit') }}</el-button>
+
+        </template>
+
+
+        <template #pager>
+          <!--浣跨敤 pager 鎻掓Ы-->
+          <vxe-pager
+              @page-change="handlePageChange"
+              :layouts="[  'PrevPage', 'Jump','PageCount', 'NextPage',  'Total']"
+              v-model:current-page="pageNum"
+              v-model:page-size="total.pageSize"
+              v-model:pager-count="total.pageTotal"
+              :total="total.dataTotal"
+          >
+          </vxe-pager>
+        </template>
+      </vxe-grid>
+    </div>
+  </div>
+
+  <el-dialog
+      :key="dialogKey"
+      id="print"
+      v-model="dialogTableVisible"
+      destroy-on-close
+      style="width: 40%;height:40%;"
+      :close-on-click-modal="false"
+      :close-on-press-escape="false"
+  >
+    <el-form
+        ref="ruleFormRef"
+        style="max-width: 600px"
+        :model="ruleForm"
+        status-icon
+        :rules="rules"
+        label-width="auto"
+        class="demo-ruleForm"
+    >
+      <el-form-item label="浣跨敤绫诲瀷" prop="type">
+        <el-select v-model="ruleForm.type" autocomplete="off">
+          <el-option label="闈㈢Н" :value="1" />
+          <el-option label="鍛ㄩ暱" :value="2" />
+          <el-option label="鏁伴噺" :value="3" />
+        </el-select>
+      </el-form-item>
+
+      <el-form-item label="娑堣�楅噺" prop="consume">
+        <el-input v-model="ruleForm.consume" autocomplete="off" />
+      </el-form-item>
+
+      <el-form-item label="浠锋牸" prop="price">
+        <el-input v-model="ruleForm.price" autocomplete="off" />
+      </el-form-item>
+
+      <el-form-item>
+        <el-button type="primary" @click="submitForm(ruleFormRef)">
+          鎻愪氦
+        </el-button>
+        <el-button @click="resetForm(ruleFormRef)">閲嶇疆</el-button>
+      </el-form-item>
+    </el-form>
+
+  </el-dialog>
+</template>
+
+<style scoped>
+.main-div-customer{
+  width: 99%;
+  height: 100%;
+}
+.head{
+  width: 100%;
+  height: 35px;
+}
+
+.main-table{
+  width: 100%;
+  height: calc(100% - 35px);
+}
+</style>
\ No newline at end of file
diff --git a/north-glass-erp/northglass-erp/src/views/sd/bom/OrderBOM.vue b/north-glass-erp/northglass-erp/src/views/sd/bom/OrderBOM.vue
new file mode 100644
index 0000000..6e29133
--- /dev/null
+++ b/north-glass-erp/northglass-erp/src/views/sd/bom/OrderBOM.vue
@@ -0,0 +1,709 @@
+<script setup>
+import {Check, Search} from "@element-plus/icons-vue"
+import {useRouter} from "vue-router"
+import {computed, onMounted, reactive, ref} from "vue"
+import request from "@/utils/request"
+import deepClone from "@/utils/deepClone"
+import {ElMessage, ElMessageBox} from "element-plus"
+import { VXETable} from "vxe-table"
+import  useUserInfoStore from '@/stores/userInfo'
+import companyInfo from "@/stores/sd/companyInfo"
+import footSum from "@/hook/footSum"
+import OrderDetail from "@/components/sd/order/OrderDetail.vue"
+import OrderCraftDetail from "@/components/sd/order/OrderCraftDetail.vue"
+import OrderProcess from "@/components/sd/order/OrderProcess.vue"
+import PrintSheet1 from "@/components/sd/order/PrintSheet1.vue"
+import PrintSheet2 from "@/components/sd/order/PrintSheet2.vue"
+import {useI18n} from "vue-i18n"
+import useOrderInfoStore from "@/stores/sd/order/orderInfo"
+import {CircleCheck, Download, Printer} from "@element-plus/icons-vue/global"
+import { saveAs } from "file-saver"
+import PrintSheet3 from "@/components/sd/order/PrintSheet3.vue"
+import PrintSheet4 from "@/components/sd/order/PrintSheet4.vue"
+import PrintSheet5 from "@/components/sd/order/PrintSheet5.vue"
+const { t } = useI18n()
+const orderInfo = useOrderInfoStore()
+const userStore = useUserInfoStore()
+const company = companyInfo()
+const tabsValue=ref('1')
+const router = useRouter()
+let rowClickIndex = ref(null)
+let reviewDisabled = ref(true)
+const dialogTableVisible = ref(false)
+let dialogKey = ref(0)
+let sheetIndex = ref(-1)
+let orderType = ref("2")
+let filterData = ref({})
+let sortData = ref({
+  field:'id',
+  order:null
+})
+let orderList = ref([])
+let pageNum=ref(1)
+let total = ref({
+  pageTotal : 0,
+  dataTotal : 0,
+  pageSize : 50
+})
+
+
+const xGrid = ref()
+const gridOptions = reactive({
+  border:  "full",//琛ㄦ牸鍔犺竟妗�
+  keepSource: true,//淇濇寔婧愭暟鎹�
+  align: 'center',//鏂囧瓧灞呬腑
+  stripe:true,//鏂戦┈绾�
+  rowConfig: {isCurrent: true, isHover: true,height: 30},//榧犳爣绉诲姩鎴栭�夋嫨楂樹寒
+  id: 'OrderList',
+  showFooter: true,//鏄剧ず鑴�
+  printConfig: {},
+  importConfig: {},
+  exportConfig: {},
+  scrollY:{ enabled: true },//寮�鍚櫄鎷熸粴鍔�
+  showOverflow:true,
+  columnConfig: {
+    resizable: true,
+    useKey: true
+  },
+  filterConfig: {   //绛涢�夐厤缃」
+    remote: true
+  },
+  sortConfig: {   //鎺掑簭閰嶇疆椤�
+    remote: true//鏄惁鏈嶅姟绔帓搴�
+  },
+  customConfig: {
+    storage: true
+  },
+  editConfig: {
+    trigger: 'click',
+    mode: 'row',
+    showStatus: true
+  },
+ /* menuConfig: {
+    body: {
+      options: [
+        [
+          { code: 'copy', name: t('searchOrder.copy'), prefixIcon: 'vxe-icon-copy', visible: true},
+          { code: 'copyTitle', name: t('searchOrder.copyTitle'), prefixIcon: 'vxe-icon-copy', visible: true},
+          {
+            prefixIcon: 'vxe-icon-print',
+            name: t('order.processingOrder'),
+            children: [
+              // { code: 'sheet1', name: '妯増-鏅��' },
+              { code: 'sheet2', name: t('order.sheet2') },
+              { code: 'sheet4', name: t('order.sheet4') },
+              { code: 'sheet3', name: t('order.sheet3') },
+              { code: 'sheet5', name: t('order.sheet5')},
+
+            ]
+          },
+          {
+            prefixIcon: 'vxe-icon-repeat',
+            name: t('order.oneClickReturn'),
+            children: [
+              // { code: 'sheet1', name: '妯増-鏅��' },
+              { code: 'back1', name: t('searchOrder.createOrder'),disabled:true },
+              { code: 'back2', name: t('order.technology'),disabled:true  },
+              { code: 'back3', name: t('basicData.review'),disabled:true  },
+              { code: 'back4', name: t('searchOrder.production'),disabled:true },
+
+            ]
+          },
+          { code: 'oneClickStorage', name: t('order.oneClickStorage'), prefixIcon: 'vxe-icon-copy', visible: true},
+          // { code: 'getProcessList', name: t('searchOrder.processFlows'), prefixIcon: 'vxe-icon-file-txt', visible: true}
+        ]
+      ]
+    }
+  },*/
+  //琛ㄥご鍙傛暟
+  columns:[
+    {title: t('basicData.operate'), width: 110, slots: { default: 'button_slot' },fixed:"left",},
+    {type: 'seq', title: t('basicData.Number'), width: 80 ,fixed:"left",},
+
+    {field:'createOrder',title: t('searchOrder.createOrder'), width: 40, slots: { default: 'state' }},
+    {field:'processReview',title: t('order.technology'), width: 40, filters:[{ data: '' }], slots: { default: 'state',filter: 'num2_filter' }},
+    {field:'orderReview',title: t('basicData.review'), width: 40, filters:[{ data: '' }], slots: { default: 'state',filter: 'num2_filter' }},
+    {field:'productionOrder',title: t('searchOrder.production'), width: 40, filters:[{ data: '' }], slots: { default: 'state',filter: 'num2_filter' }},
+    {field:'processingCard',title: t('searchOrder.process'), width: 40, filters:[{ data: '' }], slots: { default: 'state',filter: 'num2_filter' }},
+    {field:'warehousing',title: t('searchOrder.storage'), width: 40, filters:[{ data: '' }], slots: { default: 'state',filter: 'num2_filter' }},
+    {field:'delivery',title: t('searchOrder.delivery'), width: 40,filters:[{ data: '' }], slots: { default: 'state',filter: 'num2_filter' }},
+
+
+    {field: 'orderId',width:120,  title: t('order.orderId'),filters:[{ data: '' }],slots: { filter: 'num1_filter' }, sortable: true},
+    {field: 'customerId',width:120,  title: t('customer.customerNumber'),filters:[{ data: '' }],slots: { filter: 'num1_filter' }, sortable: true},
+    {field: 'customerName',width:120,  title: t('customer.customerName'),filters:[{ data: '' }],slots: { filter: 'num1_filter' }, sortable: true},
+    {field: 'project',width:120,  title: t('order.project'),filters:[{ data: '' }],slots: { filter: 'num1_filter' }, sortable: true},
+    {field: 'batch',width:120,  title: t('order.batch'),filters:[{ data: '' }],slots: { filter: 'num1_filter' }, sortable: true},
+    {field: 'quantity',width:120,  title: t('order.quantity'),filters:[{ data: '' }],slots: { filter: 'num1_filter' }, sortable: true},
+    {field: 'goodsQuantity',width:120,  title: t('searchOrder.inventoryNum'), sortable: true},
+    {field: 'area',width:120,  title: t('order.computeGrossArea'),filters:[{ data: '' }],slots: { filter: 'num1_filter' }, sortable: true},
+    {field: 'money',width:120,  title: t('order.money'),filters:[{ data: '' }],slots: { filter: 'num1_filter' }, sortable: true},
+    {field: 'createTime',width:120,filters:[{ data: '' }],slots: { filter: 'num1_filter' },   title: t('basicData.reportData'), sortable: true},
+    {field: 'updateTime',width:120,   title: t('productStock.approvedDate'), sortable: true},
+    {field: 'packType',width:120,  title: t('order.packType'),filters:[{ data: '' }],slots: { filter: 'num1_filter' }, sortable: true},
+    {field: 'orderType',width:120,  title: t('order.orderType'),filters:[{ data: '' }],slots: { filter: 'num1_filter' }, sortable: true},
+    {field: 'salesman',width:120,  title: t('order.salesman'),filters:[{ data: '' }],slots: { filter: 'num1_filter' }, sortable: true},
+    {field: 'creator',width:120,  title: t('product.creator'),filters:[{ data: '' }],slots: { filter: 'num1_filter' }, sortable: true},
+    {field: 'verifier',width:120,  title: t('basicData.review'),filters:[{ data: '' }],slots: { filter: 'num1_filter' }, sortable: true},
+    {field: 'perimeter',width:120,  title: t('searchOrder.perimeter'),filters:[{ data: '' }],slots: { filter: 'num1_filter' }, sortable: true},
+    {field: 'deliveryDate',width:120,  title: t('order.deliveryDate'), sortable: true},
+    {field: 'customerBatch',width:120,  title: t('order.customerBatch'),filters:[{ data: '' }],slots: { filter: 'num1_filter' }, sortable: true},
+
+    //{field: '14',width:120,  title: '澶囨敞',filters:[{ data: '' }],slots: { filter: 'num1_filter' }, sortable: true},
+    {field: 'deliveryAddress',width:120,  title: t('order.deliveryAddress'),filters:[{ data: '' }],slots: { filter: 'num1_filter' }, sortable: true},
+    {field: 'processingNote',width:120,  title: t('order.processingNote'),filters:[{ data: '' }],slots: { filter: 'num1_filter' }, sortable: true}
+
+  ],
+  mouseConfig:{selected: true},//榧犳爣閫変腑
+  keyboardConfig:{
+    isArrow: true
+  },
+  //琛ㄥご鎸夐挳
+  toolbarConfig: {
+    buttons: [
+
+    ],
+    slots:{
+      buttons: "toolbar_buttons"
+    },
+
+    // import: false,
+    // export: true,
+    // print: true,
+    zoom: true,
+    custom: true
+  },
+
+  footerMethod ({ columns, data }) {//椤佃剼鍑芥暟
+    return[
+      columns.map((column, columnIndex) => {
+        if (columnIndex === 0) {
+          return t('basicData.total')
+        }
+        const List = ["quantity",'goodsQuantity','area','perimeter','money']
+        if (List.includes(column.field)) {
+          //return footSum(data, column.field)
+          return total.value[column.field]
+        }
+        return ''
+      })
+    ]
+  }
+
+})
+const gridEvents = {
+  toolbarButtonClick ({ code }) {
+    const $grid = xGrid.value
+    if ($grid) {
+      switch (code) {
+        case 'checkList': {
+          if($grid.getCheckboxRecords().length===0){
+            VXETable.modal.message( t('searchOrder.msg'))
+            return
+          }
+          break
+        }
+
+      }
+    }
+  },
+  menuClick ({ menu, row, column }) {
+    const $grid = xGrid.value
+    if ($grid) {
+      switch (menu.code) {
+        case 'sheet1': {
+          if(rowClickIndex.value===null){
+            ElMessage.warning(t('searchOrder.msgList.checkOrder'))
+            return
+          }
+          dialogTableVisible.value = true
+          sheetIndex.value=1
+          if(rowClickIndex.value.processReview===2 && rowClickIndex.value.orderReview===0){
+            reviewDisabled.value=false
+          }
+          break
+        }
+        case 'sheet2': {
+          if(rowClickIndex.value===null){
+            ElMessage.warning(t('searchOrder.msgList.checkOrder'))
+            return
+          }
+          dialogTableVisible.value = true
+          sheetIndex.value=2
+          if(rowClickIndex.value.processReview===2 && rowClickIndex.value.orderReview===0){
+            reviewDisabled.value=false
+          }
+          break
+        }
+        case 'sheet3': {
+          if(rowClickIndex.value===null){
+            ElMessage.warning(t('searchOrder.msgList.checkOrder'))
+            return
+          }
+          dialogTableVisible.value = true
+          sheetIndex.value=3
+          if(rowClickIndex.value.processReview===2 && rowClickIndex.value.orderReview===0){
+            reviewDisabled.value=false
+          }
+          break
+        }
+        case 'sheet4': {
+          if(rowClickIndex.value===null){
+            ElMessage.warning(t('searchOrder.msgList.checkOrder'))
+            return
+          }
+          ElMessage.warning(t('order.printingNumber')+rowClickIndex.value.printingNumber)
+          dialogTableVisible.value = true
+          sheetIndex.value=4
+          if(rowClickIndex.value.processReview===2 && rowClickIndex.value.orderReview===0){
+            reviewDisabled.value=false
+          }
+          break
+        }
+        case 'sheet5': {
+          if(rowClickIndex.value===null){
+            ElMessage.warning(t('searchOrder.msgList.checkOrder'))
+            return
+          }
+          ElMessage.warning(t('order.printingNumber')+rowClickIndex.value.printingNumber)
+          dialogTableVisible.value = true
+          sheetIndex.value=5
+          if(rowClickIndex.value.processReview===2 && rowClickIndex.value.orderReview===0){
+            reviewDisabled.value=false
+          }
+          break
+        }
+        case 'back1': {
+          backProcess(1)
+          break
+        }
+        case 'back2': {
+          backProcess(2)
+          break
+        }
+        case 'back3': {
+          backProcess(3)
+          break
+        }
+        case 'back4': {
+          backProcess(4)
+          break
+        }
+
+        case 'copy': {
+          if(rowClickIndex.value===null){
+            ElMessage.warning(t('searchOrder.msgList.checkOrder'))
+            return
+          }
+          router.push({path:'/main/order/createOrder',
+            state:{
+              orderId:rowClickIndex.value.orderId,
+              type:'copy'
+            }})
+          break
+        }
+        case 'copyTitle': {
+          if(rowClickIndex.value===null){
+            ElMessage.warning(t('searchOrder.msgList.checkOrder'))
+            return
+          }
+          router.push({path:'/main/order/createOrder',
+            state:{
+              orderId:rowClickIndex.value.orderId,
+              type:'copyTitle'
+            }})
+          break
+        }
+        case 'print':{
+
+          break
+        }
+        case 'oneClickStorage': {
+          if(rowClickIndex.value.processReview===0||rowClickIndex.value.orderReview===0){
+            ElMessage.warning(t('order.orderNotApproved'))
+            return
+          }
+          if(rowClickIndex.value.warehousing==2){
+            ElMessage.warning(t('order.orderHasBeenReceived'))
+            return
+          }
+          request.post(`/finishedGoodsInventory/oneClickStorage/${rowClickIndex.value.orderId}/${userStore.user.userName}`).then((res) => {
+            if(res.code==200 && res.data===true){
+              ElMessage.success(t('productStock.receivedSuccessfully'))
+              router.push({path:'/main/order/selectOrder',query:{random:Math.random()}})
+            }else{
+              ElMessage.warning(res.msg)
+            }
+          })
+          break
+        }
+
+      }
+    }
+  },
+  cellClick({ row }){
+    rowClickIndex.value = row
+    xGrid.value.menuConfig.body.options[0][3].children.forEach((item)=>{
+      item.disabled=true
+    })
+    //鍒ゆ柇鏄惁鍏ュ簱
+    if(row.warehousing>0){
+      return
+    }
+    if(row.processReview===2){
+      xGrid.value.menuConfig.body.options[0][3].children[0].disabled=false
+    }
+    if(row.orderReview===2){
+      xGrid.value.menuConfig.body.options[0][3].children[1].disabled=false
+    }
+    if(row.productionOrder>0){
+      xGrid.value.menuConfig.body.options[0][3].children[2].disabled=false
+    }
+    if(row.processingCard>0){
+      xGrid.value.menuConfig.body.options[0][3].children[3].disabled=false
+    }
+  },
+  sortChange ({ field, order }) {
+    sortData.value = {field,order}
+    selectOrderList()
+  }
+}
+
+
+
+const getOrderList = async () => {
+  //鍔犺浇璇锋眰
+  const config = {
+    filter: filterData.value,
+    sort: sortData.value
+  }
+  await request.post(`/order/getOrderList/1/${total.value.pageSize}/${orderType.value}/${orderInfo.selectDate}`,config).then((res) => {
+    if(res.code==200){
+      total.value = res.data.total
+      /*total.dataTotal = res.data.total.dataTotal*1
+      total.pageTotal= res.data.total.pageTotal*/
+      orderInfo.selectDate = res.data.selectDate
+      orderList.value = deepClone(res.data.data)
+      xGrid.value.loadData(orderList.value)
+    }else{
+      ElMessage.warning(res.msg)
+    }
+  })
+}
+onMounted(async () => {
+  filterData.value = orderInfo.searchOrderFilter.data
+  await getOrderList()
+  orderInfo.searchOrderFilter.list.forEach(item =>{
+    xGrid.value.getColumnByField(item.field).filters = item.column.filters
+  })
+})
+
+const changeFilterEvent = (event, option, $panel) => {
+  // 鎵嬪姩瑙﹀彂绛涢��
+  $panel.changeOption(event, !!option.data, option)
+}
+
+function filterChanged(column){
+  gridOptions.loading=true
+  //绛涢�夋潯浠跺彂鐢熷彉鍖栨潯浠跺彂鐢熷彉鍖�
+  let value = column.datas[0]!=undefined?column.datas[0]:''
+  value = value.trim()
+  //鍒ゆ柇鏄惁瀛樺湪澶栭敭
+  if (column.property.indexOf('.')>-1){
+    const  columnArr = column.property.split('.')
+    filterData.value[columnArr[0]] = {
+      [columnArr[1]]:value
+    }
+  }else{
+    filterData.value[column.property] = value
+  }
+  const config = {
+    filter: filterData.value,
+    sort: sortData.value
+  }
+  request.post(`/order/getOrderList/${pageNum.value}/${total.value.pageSize}/${orderType.value}/${orderInfo.selectDate}`,config).then((res) => {
+    if(res.code==200){
+      total.value = res.data.total
+      /*total.dataTotal = res.data.total.total*1
+      total.pageTotal=parseInt(res.data.total)*/
+      pageNum.value=1
+      orderList.value = deepClone(res.data.data)
+      xGrid.value.loadData(orderList.value)
+      gridOptions.loading=false
+      orderInfo.searchOrderFilter.list = xGrid.value.getCheckedFilters()
+      orderInfo.searchOrderFilter.data = filterData.value
+    }else{
+      ElMessage.warning(res.msg)
+    }
+  })
+}
+
+//鍙屽嚮琛ㄦ牸琛�
+
+const selectOrderList = ()=>{
+  const config = {
+    filter: filterData.value,
+    sort: sortData.value
+  }
+  request.post(`/order/getOrderList/${pageNum.value}/${total.value.pageSize}/${orderType.value}/${orderInfo.selectDate}`
+      ,config).then((res) => {
+    if(res.code==200){
+      total.value = res.data.total
+      /*total.dataTotal = res.data.total.total*1
+      total.pageTotal = res.data.total.pageTotal*/
+      orderInfo.selectDate=res.data.selectDate
+      orderList.value = deepClone(res.data.data)
+      xGrid.value.loadData(orderList.value)
+
+    }else{
+      ElMessage.warning(res.msg)
+    }
+  })
+}
+
+const changeOrderType = ()=>{
+  pageNum.value=1
+  selectOrderList()
+}
+const changeDate =  ()=>{
+  pageNum.value=1
+  selectOrderList()
+}
+
+//椤佃剼璺宠浆
+const handlePageChange = ({ currentPage, pageSize }) => {
+  pageNum.value=currentPage
+  total.pageTotal    = pageSize
+  selectOrderList()
+}
+
+//椤甸潰璺宠浆鏇存柊鎴栬�呭垹闄よ鍗�
+const getTableRow =  (row,type) => {
+  switch (type) {
+    case 'edit': {
+      dialogTableVisible.value = true
+      break
+    }
+
+  }
+}
+
+const showCheckbox = computed(()=>(item)=>{ //璁$畻灞炴�т紶閫掑弬鏁�
+  return 2 === item
+})
+
+
+
+const printContent = ref({
+  id: 'child',
+
+})
+
+
+
+
+const printingNumber = ()=>{
+  if(sheetIndex.value===4){
+    request.post(`/order/updateOrderPrintNumber/${rowClickIndex.value.orderId}`).then(res =>{
+
+    })
+  }
+
+}
+
+const closeDialog = ()=>{
+  /*selectOrderList()
+  console.log(xGrid.value.getTableData())*/
+
+}
+
+const handleKeyDown = (evnt) =>{
+
+  if(evnt.$event.keyCode === 38 ){
+    let nextRowIndex = xGrid.value.getRowIndex(xGrid.value.getCurrentRecord()) - 1;
+    if (nextRowIndex < xGrid.value.getTableData().fullData.length && nextRowIndex>=0) {
+      xGrid.value.setCurrentRow(xGrid.value.getTableData().fullData[nextRowIndex]);
+      rowClickIndex.value = xGrid.value.getCurrentRecord()
+    }
+
+  }
+  if(evnt.$event.keyCode === 40 ){
+    let nextRowIndex = xGrid.value.getRowIndex(xGrid.value.getCurrentRecord()) + 1;
+    if (nextRowIndex < xGrid.value.getTableData().fullData.length) {
+      xGrid.value.setCurrentRow(xGrid.value.getTableData().fullData[nextRowIndex]);
+      rowClickIndex.value = xGrid.value.getCurrentRecord()
+    }
+
+  }
+}
+//璁㈠崟璺濈灏忎簬涓夊ぉ鍒欐敼鍙榗heckbox class 鏀瑰彉棰滆壊
+const timeOutChangeColor =(row)=>{
+  if(company.timeOut){
+    return row.timeOut
+  }
+}
+
+</script>
+
+<template>
+  <div  style="width: 100%;height: 100% ;">
+    <div style="width: 100%;height: 95%">
+      <el-date-picker
+          v-model="orderInfo.selectDate"
+          type="daterange"
+          :start-placeholder="$t('basicData.startDate')"
+          :end-placeholder="$t('basicData.startDate')"
+          format="YYYY-MM-DD"
+          value-format="YYYY-MM-DD"
+
+      />
+      <el-button @click="changeDate"
+                 style="margin-top: -5px"
+                 id="searchButton"
+                 type="primary"
+                 :icon="Search">
+        {{ $t('basicData.search') }}
+      </el-button>
+      <vxe-grid
+          @filter-change="filterChanged"
+          height="110%"
+          size="mini"
+          class="mytable-scrollbar"
+          ref="xGrid"
+          v-bind="gridOptions"
+          v-on="gridEvents"
+          @keydown="handleKeyDown"
+
+      >
+
+
+        <template #state="{ row,column}">
+          <el-checkbox
+              :class="timeOutChangeColor(row)"
+              v-if="row[column.field] === 2"
+              @click.native.prevent
+              :indeterminate="row[column.field]===1"
+              :checked="true"/>
+          <el-checkbox
+              v-else
+              :class="timeOutChangeColor(row)"
+              @click.native.prevent
+              :indeterminate="row[column.field]===1"
+              :checked="false"/>
+        </template>
+
+        <!--宸﹁竟鍥哄畾鏄剧ず鐨勬彃妲�-->
+        <template #button_slot="{ row }">
+          <el-button @click="getTableRow(row,'edit')"
+                     link
+                     type="primary"
+                     size="small">
+            鐢熸垚BOM
+          </el-button>
+
+        </template>
+
+        <template #num1_filter="{ column, $panel }">
+          <div>
+            <div v-for="(option, index) in column.filters" :key="index">
+              <input
+                  v-model="option.data"
+                  @keyup.enter.native="$panel.confirmFilter()"
+                  @input="changeFilterEvent($event, option, $panel)"/>
+            </div>
+          </div>
+        </template>
+        <template #num2_filter="{ column, $panel }">
+          <div>
+            <div v-for="(option, index) in column.filters" :key="index">
+              <vxe-select
+                  v-model="option.data"
+                  @change="changeFilterEvent($event, option, $panel)"
+                  :placeholder="$t('processCard.pleaseSelect')">
+                <vxe-option value="0" :label="$t('basicData.unchecked')"></vxe-option>
+                <vxe-option value="1" :label="$t('basicData.partiallySelected')"></vxe-option>
+                <vxe-option value="2" :label="$t('basicData.selected')"></vxe-option>
+              </vxe-select>
+            </div>
+          </div>
+        </template>
+
+        <template #toolbar_buttons>
+          <vxe-select @change="changeOrderType" v-model="orderType" :placeholder="$t('searchOrder.orderType')">
+            <vxe-option value="2" :label="$t('searchOrder.regularOrders')"></vxe-option>
+            <vxe-option value="-2" :label="$t('searchOrder.cancelledOrders')"></vxe-option>
+            <vxe-option value="0" :label="$t('searchOrder.allOrders')"></vxe-option>
+          </vxe-select>
+        </template>
+
+        <template #pager>
+          <!--浣跨敤 pager 鎻掓Ы-->
+          <!--        'PrevJump','NextJump', -->
+          <vxe-pager
+              @page-change="handlePageChange"
+              :layouts="[  'PrevPage', 'Jump','PageCount', 'NextPage',  'Total']"
+              v-model:current-page="pageNum"
+              v-model:page-size="total.pageSize"
+              v-model:pager-count="total.pageTotal"
+              :total="total.dataTotal"
+          >
+          </vxe-pager>
+        </template>
+      </vxe-grid>
+
+    </div>
+    <el-dialog
+        :key="dialogKey"
+        id="print"
+        v-model="dialogTableVisible"
+        destroy-on-close
+        style="width: 90%;height:90%;margin-top: 3vh "
+        :close-on-click-modal="false"
+        :close-on-press-escape="false"
+    >
+      <template>
+        <el-card style="max-width: 480px">
+          <template #header>
+            <div class="card-header">
+              <span>浜у搧1</span>
+            </div>
+          </template>
+          <p v-for="o in 4" :key="o" class="text item">{{ '鐢ㄦ枡 ' + o +":xx鍏�" }}</p>
+          <template #footer>Footer content</template>
+        </el-card>
+      </template>
+    </el-dialog>
+
+
+
+
+
+  </div>
+</template>
+
+<style scoped>
+:deep(.el-tabs__content) {
+  width: 100%;
+  height: 86%;
+}
+.el-tab-pane{
+  width: 100%;
+  height: 100%;
+}
+:deep(#print .el-dialog__body){
+  height: 85%;
+  width: 100%;
+  overflow-y: auto;
+}
+#child{
+  width:100%;
+  height: 100%;
+}
+
+:deep(.timeOut.is-checked .el-checkbox__inner) {
+  background-color: orangered;
+  border-color: orangered;
+}
+
+
+</style>
\ No newline at end of file
diff --git a/north-glass-erp/northglass-erp/src/views/sd/bom/ProductBOM.vue b/north-glass-erp/northglass-erp/src/views/sd/bom/ProductBOM.vue
new file mode 100644
index 0000000..1d8bffc
--- /dev/null
+++ b/north-glass-erp/northglass-erp/src/views/sd/bom/ProductBOM.vue
@@ -0,0 +1,398 @@
+<script lang="ts" setup>
+import request from "@/utils/request"
+import deepClone from "@/utils/deepClone"
+import {ElMessage} from "element-plus"
+import useProductGlassTypeStore from "@/stores/sd/product/productGlassType"
+import {nextTick, onUnmounted, reactive, ref, watch} from "vue"
+import GlassType from "@/components/sd/product/GlassType.vue"
+import {useRouter} from 'vue-router'
+import {columnDrop2, sortable2} from "@/hook/columnMove"
+import {useI18n} from "vue-i18n";
+import ProductBomAdd from "@/views/sd/bom/ProductBomAdd.vue";
+
+const { t } = useI18n()
+let productGlassTypeStore = useProductGlassTypeStore()
+let router=useRouter()
+const dialogTableVisible = ref(false)
+//鐩戝惉鐜荤拑绫诲瀷鏀瑰彉
+let productList = ref([])
+let date=ref(['',''])
+productGlassTypeStore.GlassType=['','']
+
+let props = defineProps({
+  rowIndex:{}
+})
+
+let glassType = ref([])
+
+const getProduct = () => {
+  request.post(`/product/1/100/${productGlassTypeStore.GlassType}`,filterData.value).then((res) => {
+    if(res.code==200){
+      pageTotal.value=res.data.total
+      xGrid.value.loadData(res.data.data)
+      gridOptions.loading=false
+    }else{
+      ElMessage.warning(res.msg)
+    }
+  })
+}
+
+
+
+
+
+//瀹氫箟婊氬姩鏉¢珮搴�
+let scrollTop =ref(null)
+let scrollHeight =ref(null)
+let clientHeight =ref(null)
+const  scrollEvnt = (row) => {
+  // 鍐呭楂樺害
+  scrollTop.value = row.$event.target.scrollTop
+  scrollHeight.value = row.$event.target.scrollHeight
+  clientHeight.value = row.$event.target.clientHeight
+}
+//绛涢�夋潯浠讹紝鏈夊閿渶瑕佸厛瀹氫箟鏄庣粏閲岄潰鐨勬暟鎹�
+let filterData = ref({
+  basicGlassType:{
+    typeName:''
+  }
+})
+//瀹氫箟椤甸潰鎬婚〉鏁�
+let pageTotal=ref('')
+//瀹氫箟鏁版嵁杩斿洖缁撴灉
+let produceList = ref([])
+//瀹氫箟褰撳墠椤垫暟
+let pageNum=$ref(1)
+let pageState = null
+//鐩戝惉浜у搧婊氬姩鏉$姸鎬侊紝婊氬姩鍒板簳閮ㄥ悜鍚庣璇锋眰鏁版嵁
+watch(scrollTop,(newVal,oldVal) => {
+  //鍒ゆ柇褰撳墠鐘舵�佹煡璇㈢姸鎬�
+  if(pageState!==null){
+    return;
+  }
+  //鍒ゆ柇婊氬姩鏉′笂涓嬫粴鍔ㄤ笉鏄乏鍙虫粴鍔紝褰撳乏鍙虫粴鍔ㄧ洿鎺ヨ繑鍥�
+  if((newVal === oldVal && newVal===0) || oldVal===null){
+    return;
+  }
+  //鍒ゆ柇鏄惁婊氬埌搴曢儴
+  if ((Math.round(scrollTop.value + clientHeight.value)+5 >= scrollHeight.value ) ) {
+    if(newVal>oldVal){
+      //鍒ゆ柇褰撳墠瀹瑰櫒闀垮害鏄惁涓�500锛屽苟涓斿綋鍓嶉〉灏忎簬瀹瑰櫒鎬绘暟閲�
+      if(produceList.length===500 && pageNum<(produceList.length/100)){
+        pageNum=pageNum+5
+      }else{
+        //鍒ゆ柇鏄惁鏄渶澶ч〉闈�
+        if (pageNum>=pageTotal.value){
+          //ElMessage.warning("娌℃湁鏇村鏁版嵁浜�")
+          return
+        }
+        pageNum=pageNum+1
+
+      }
+      pageState=true
+    }
+  }else if(newVal===0 && oldVal>0 && pageNum>1  ){  //鍒ゆ柇鏄惁婊氬埌椤堕儴骞朵笖澶т簬瀹瑰櫒鏁伴噺
+    //鍒ゆ柇鍚戜笂婊氬姩褰撳墠椤垫暟鏄惁澶т簬瀹瑰櫒鏁板��
+    if(pageNum>5){
+      pageNum=pageNum-5
+    }else if((produceList.length/100)>=5) {
+      pageNum=pageNum-1
+    }else{
+      return
+    }
+    pageState =false
+  }
+  if(pageState!==null){
+    gridOptions.loading=true
+    request.post(`/product/${pageNum}/100/${productGlassTypeStore.GlassType}`,filterData.value).then((res) => {
+      try{
+        if(res.code==200){
+          if(pageState){
+            produceList = produceList.concat(res.data.data)
+            if(produceList.length>500){
+              produceList=produceList.slice(100,600)
+            }
+          }else{
+            produceList = res.data.data.concat(produceList)
+            if(produceList.length>500){
+              produceList=produceList.slice(0,500)
+            }
+          }
+          xGrid.value.reloadData(produceList)
+          pageState=null
+        }else{
+          ElMessage.warning(res.msg)
+        }
+      }finally {
+        gridOptions.loading=false
+      }
+    })
+  }
+
+
+
+
+})
+
+
+//绗竴娆″姞杞芥暟鎹�
+request.post(`/product/1/100/${productGlassTypeStore.GlassType}`,filterData.value).then((res) => {
+  if(res.code==200){
+    pageTotal.value=res.data.total
+    console.log(res.data.data)
+    produceList = produceList.value.concat(deepClone(res.data.data))
+    xGrid.value.reloadData(produceList)
+    gridOptions.loading=false
+  }else{
+    ElMessage.warning(res.msg)
+  }
+})
+//鍒犻櫎涓庣紪杈戞柟娉�
+const getTableRow =  (row,type) => {
+  switch (type) {
+    case 'edit': {
+      dialogTableVisible.value = true
+      break
+    }
+  }
+}
+
+
+
+
+
+
+const xGrid = ref()
+const gridOptions = reactive({
+  height:'100%',
+  loading: true,
+  border:  "full",//琛ㄦ牸鍔犺竟妗�
+  keepSource: true,//淇濇寔婧愭暟鎹�
+  align: 'center',//鏂囧瓧灞呬腑
+  stripe:true,//鏂戦┈绾�
+  rowConfig: {isCurrent: true, isHover: true,height: 30, useKey: true},//榧犳爣绉诲姩鎴栭�夋嫨楂樹寒
+  id: 'SelectProduct',
+  showFooter: true,//鏄剧ず鑴�
+  printConfig: {},
+  importConfig: {},
+  exportConfig: {},
+  scrollX:{enabled: true},
+  scrollY:{ enabled: true ,gt:0},//寮�鍚櫄鎷熸粴鍔�
+  showOverflow:true,
+  columnConfig: {
+    resizable: true,
+    useKey: true
+  },
+  filterConfig: {   //绛涢�夐厤缃」
+    remote: true
+  },
+  customConfig: {
+    storage: true
+  },
+  editConfig: {
+    trigger: 'click',
+    mode: 'row',
+    showStatus: true
+  },
+  columns:[
+    {title: t('basicData.operate'), width: 120, slots: { default: 'button_slot' },fixed:"left"},
+    {field:'state',title: t('basicData.review'), width: 40,filters:[{ data: '' }], slots: { default: 'state',filter: 'num2_filter' }},
+    {type: 'seq',fixed:"left", title: t('basicData.Number'), width: 80 },
+    {field: 'id', title: t('basicData.number'),filters:[{ data: '' }],slots: { filter: 'num1_filter' }, sortable: true},
+    {field: 'productName', title: t('product.productName'),filters:[{ data: '' }],slots: { filter: 'num1_filter' }, sortable: false},
+    {field: 'productAbbreviation', title:t('product.msg.productAbbreviation'),filters:[{ data: '' }],slots: { filter: 'num1_filter' }, sortable: false},
+    {field: 'basicGlassType.typeName', title: t('product.typeName'),filters:[{ data: '' }],slots: { filter: 'num1_filter' }, sortable: false},
+    {field: 'query', title: t('product.query'),filters:[{ data: '' }],slots: { filter: 'num1_filter' }, sortable: false},
+    {field: 'remarks', title: t('basicData.remarks'),filters:[{ data: '' }],slots: { filter: 'num1_filter' }, sortable: false},
+    {field: 'creator', title: t('product.creator'),filters:[{ data: '' }],slots: { filter: 'num1_filter' }, sortable: false},
+    {field: 'createTime', title: t('basicData.creationTime')}
+  ],//琛ㄥご鍙傛暟
+  data:null,//琛ㄦ牸鏁版嵁
+  toolbarConfig: {
+    buttons: [],
+    slots:{
+      buttons: "toolbar_buttons"
+    },
+    // import: false,
+    // export: true,
+    // print: true,
+    zoom: true,
+    custom: true
+  },
+  footerMethod ({ columns, data }) {//椤佃剼鍑芥暟
+    return[
+      columns.map((column, columnIndex) => {
+        if (columnIndex === 0) {
+          return t('basicData.total')
+        }
+
+        return ''
+      })
+    ]
+  }
+
+})
+
+
+/*浣跨敤绛涢�夛紝鍚庣鑾峰彇鏁版嵁*/
+const changeFilterEvent = (event, option, $panel,) => {
+  // 鎵嬪姩瑙﹀彂绛涢��
+  $panel.changeOption(event, !!option.data, option)
+}
+function filterChanged(column){
+  gridOptions.loading=true
+  //绛涢�夋潯浠跺彂鐢熷彉鍖栨潯浠跺彂鐢熷彉鍖�
+  let value = column.datas[0]!=undefined?column.datas[0]:''
+  value = value.trim()
+  //鍒ゆ柇鏄惁瀛樺湪澶栭敭
+  if (column.property.indexOf('.')>-1){
+    const  columnArr = column.property.split('.')
+    filterData.value[columnArr[0]] = {
+      [columnArr[1]]:value
+    }
+  }else{
+    filterData.value[column.property] = value
+  }
+  request.post("/product/1/100/"+productGlassTypeStore.GlassType,filterData.value).then((res) => {
+    if(res.code==200){
+      pageTotal.value=res.data.total
+      pageNum=1
+      produceList = deepClone(res.data.data)
+      xGrid.value.loadData(produceList)
+      gridOptions.loading=false
+    }else{
+      ElMessage.warning(res.msg)
+    }
+  })
+}
+
+let emit = defineEmits([
+  'changePage'
+])
+
+const emitParent = (row,type) => {
+  emit('getProductRow', row,type)
+}
+
+
+
+/*鍚庣杩斿洖缁撴灉澶氬眰宓屽灞曠ず*/
+const hasDecimal = (value) => {
+  const regex = /\./; // 瀹氫箟姝e垯琛ㄨ揪寮忥紝鏌ユ壘灏忔暟鐐�
+  return regex.test(value); // 杩斿洖true/false
+}
+
+
+
+
+
+let initTime = null
+nextTick(() => {
+  // 鍔犺浇瀹屾垚涔嬪悗鍦ㄧ粦瀹氭嫋鍔ㄤ簨浠�
+  initTime = setTimeout(() => {
+    columnDrop2(xGrid.value)
+  }, 500)
+})
+
+onUnmounted(() => {
+  clearTimeout(initTime)
+  if (sortable2) {
+    try{
+      sortable2.destroy()
+    }
+    catch (e){
+    }
+
+  }
+})
+
+
+</script>
+
+<template>
+
+  <div style="width: 100%;height: 100%">
+    <!--      <glass-type   style="float: left" />
+          <el-button
+              @click="getProduct"
+              id="select"
+              type="primary" :icon="Search">{{ $t('basicData.search') }}</el-button>-->
+
+
+
+    <vxe-grid
+        @filter-change="filterChanged"
+        height="100%"
+        class="mytable-scrollbar"
+        ref="xGrid"
+        v-bind="gridOptions"
+        @scroll ="scrollEvnt"
+    >
+
+
+      <!--宸﹁竟鍥哄畾鏄剧ず鐨勬彃妲�-->
+      <template #button_slot="{ row }" >
+        <el-button @click="getTableRow(row,'edit')" link type="primary" size="small">{{ $t('basicData.edit') }}</el-button>
+
+      </template>
+
+      <template #num2_filter="{ column, $panel }">
+        <div>
+          <div v-for="(option, index) in column.filters" :key="index">
+            <vxe-select v-model="option.data" :placeholder="$t('processCard.pleaseSelect')"  @change="changeFilterEvent($event, option, $panel)">
+              <vxe-option value="0" :label="$t('basicData.unchecked')"></vxe-option>
+              <vxe-option value="1" :label="$t('basicData.selected')"></vxe-option>
+            </vxe-select>
+          </div>
+        </div>
+      </template>
+
+      <template #num1_filter="{ column, $panel }">
+        <div>
+          <div v-for="(option, index) in column.filters" :key="index">
+            <input
+                type="type"
+                v-model="option.data"
+                @keyup.enter.native="$panel.confirmFilter()"
+                @input="changeFilterEvent($event, option, $panel)"/>
+          </div>
+        </div>
+      </template>
+      <template #state="{ row,column}">
+        <el-checkbox @click.native.prevent   :checked="row[column.field]===1"/>
+      </template>
+      <template #toolbar_buttons>
+        <glass-type  @getProduct="getProduct"  />
+      </template>
+
+    </vxe-grid>
+
+  </div>
+
+  <el-dialog
+      id="print1"
+      v-model="dialogTableVisible"
+      destroy-on-close
+      style="width: 90%;height:90%;margin-top: 3vh "
+      :close-on-click-modal="false"
+      :close-on-press-escape="false"
+  >
+    <product-bom-add/>
+  </el-dialog>
+
+</template>
+
+<style scoped>
+/*婊氬姩鏉℃暣浣撻儴鍒�*/
+.mytable-scrollbar ::-webkit-scrollbar {
+  width: 10px;
+  height: 10px;
+}
+
+:deep(#print1 .el-dialog__body){
+  height: 85%;
+  width: 100%;
+  overflow-y: auto;
+  background-color: black;
+}
+</style>
\ No newline at end of file
diff --git a/north-glass-erp/northglass-erp/src/views/sd/bom/ProductBomAdd.vue b/north-glass-erp/northglass-erp/src/views/sd/bom/ProductBomAdd.vue
new file mode 100644
index 0000000..dbc2fb6
--- /dev/null
+++ b/north-glass-erp/northglass-erp/src/views/sd/bom/ProductBomAdd.vue
@@ -0,0 +1,62 @@
+<script setup>
+import {reactive, ref} from "vue";
+import {useI18n} from "vue-i18n";
+const { t } = useI18n()
+const xGrid = ref()
+const gridOptions = reactive({
+  border:  "full",//琛ㄦ牸鍔犺竟妗�
+  keepSource: true,//淇濇寔婧愭暟鎹�
+  align: 'center',//鏂囧瓧灞呬腑
+  stripe:true,//鏂戦┈绾�
+  rowConfig: {isCurrent: true, isHover: true,height: 30, useKey: true},//榧犳爣绉诲姩鎴栭�夋嫨楂樹寒
+  id: 'productBOM',
+  showFooter: true,//鏄剧ず鑴�
+  printConfig: {},
+  importConfig: {},
+  exportConfig: {},
+  scrollX:{enabled: true},
+  scrollY:{ enabled: true ,gt:0},//寮�鍚櫄鎷熸粴鍔�
+  showOverflow:true,
+  columnConfig: {
+    resizable: true,
+    useKey: true
+  },
+  customConfig: {
+    storage: true
+  },
+  editConfig: {
+    trigger: 'click',
+    mode: 'row',
+    showStatus: true
+  },
+  columns:[
+    {title: t('basicData.operate'), width: 120, fixed:"left"},
+    {field:'state',title: '绫诲瀷' },
+    {field:'state',title: '鐗╂枡缂栧彿', },
+    {field: 'id', title: '鐗╂枡鍚嶇О'},
+    {field:'state',title: '娑堣�楅噺' },
+    {field:'state',title: '浠锋牸' }
+  ],//琛ㄥご鍙傛暟
+  data:[],//琛ㄦ牸鏁版嵁
+
+
+})
+
+
+</script>
+
+<template>
+  <el-card style="max-width: 480px">
+    <p v-for="o in 4" :key="o" class="text item">{{ '鍗曠墖' + o }}</p>
+  </el-card>
+  <vxe-grid
+      class="mytable-scrollbar"
+      ref="xGrid"
+      v-bind="gridOptions"
+  ></vxe-grid>
+
+</template>
+
+<style scoped>
+
+</style>
\ No newline at end of file
diff --git a/north-glass-erp/northglass-erp/src/views/sd/order/SelectOrder.vue b/north-glass-erp/northglass-erp/src/views/sd/order/SelectOrder.vue
index b1eec60..fa5a544 100644
--- a/north-glass-erp/northglass-erp/src/views/sd/order/SelectOrder.vue
+++ b/north-glass-erp/northglass-erp/src/views/sd/order/SelectOrder.vue
@@ -376,7 +376,7 @@
     }
 
     ElMessageBox.confirm(
-        '纭畾涓�閿��鍥炵浉搴旀祦绋�?',
+        t('searchOrder.msgList.BackSure'),
         'Warning',
         {
           confirmButtonText: t('basicData.confirmButtonText'),

--
Gitblit v1.8.0