From d01242fe06480896c2bdd9511cbaf19323786d46 Mon Sep 17 00:00:00 2001
From: chenlu <1320612696@qq.com>
Date: 星期二, 02 九月 2025 15:53:01 +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                                               |   26 +
 north-glass-erp/src/main/resources/mapper/pp/GlassOptimize.xml                                   |   56 ++-
 north-glass-erp/northglass-erp/src/views/mm/finishedGlassShelf/FinishedGlassShelfInformation.vue |  530 +++++++++++++++++++++++++++++++
 north-glass-erp/northglass-erp/src/views/pp/glassOptimize/OptimizeControl.vue                    |   42 +
 north-glass-erp/northglass-erp/src/views/pp/glassOptimize/page/Compute.vue                       |    2 
 north-glass-erp/northglass-erp/src/views/sd/basicData/CreateBasicData.vue                        |   55 ++
 north-glass-erp/northglass-erp/src/views/mm/finishedGlassShelf/CreateFinishedGlassShelf.vue      |  181 ++++++++++
 north-glass-erp/northglass-erp/src/views/mm/finishedGlassShelf/FinishedGlassShelf.vue            |   73 ++++
 north-glass-erp/northglass-erp/src/views/pp/glassOptimize/OptimizeParms.vue                      |   30 +
 9 files changed, 954 insertions(+), 41 deletions(-)

diff --git a/north-glass-erp/northglass-erp/src/router/index.js b/north-glass-erp/northglass-erp/src/router/index.js
index b219f22..25fbd06 100644
--- a/north-glass-erp/northglass-erp/src/router/index.js
+++ b/north-glass-erp/northglass-erp/src/router/index.js
@@ -1285,6 +1285,32 @@
             }
           ]
         },
+
+        {
+          path: 'finishedGlassShelf',
+          name: 'finishedGlassShelf',
+          component: () => import('../views/mm/finishedGlassShelf/FinishedGlassShelf.vue'),
+          children:[
+            {
+              // 鏂欐灦搴撳瓨
+              path: 'finishedGlassShelfInformation',
+              name: 'finishedGlassShelfInformation',
+              component: () => import('../views/mm/finishedGlassShelf/FinishedGlassShelfInformation.vue'),
+            },
+            {
+              // 鏂欐灦搴撳瓨
+              path: 'createFinishedGlassShelf',
+              name: 'createFinishedGlassShelf',
+              component: () => import('../views/mm/finishedGlassShelf/CreateFinishedGlassShelf.vue'),
+            },
+
+
+            {
+              path: '',
+              redirect:'/main/finishedGlassShelf/finishedGlassShelfInformation'
+            }
+          ]
+        },
         /*{
           //绗笁鏂圭幓鐠冧紭鍖�
           path: 'glassOptimizeThirdParty',
diff --git a/north-glass-erp/northglass-erp/src/views/mm/finishedGlassShelf/CreateFinishedGlassShelf.vue b/north-glass-erp/northglass-erp/src/views/mm/finishedGlassShelf/CreateFinishedGlassShelf.vue
new file mode 100644
index 0000000..dbb7b5c
--- /dev/null
+++ b/north-glass-erp/northglass-erp/src/views/mm/finishedGlassShelf/CreateFinishedGlassShelf.vue
@@ -0,0 +1,181 @@
+<script lang="ts" setup>
+import request from "@/utils/request"
+import deepClone from "@/utils/deepClone"
+import {ElMessage} from "element-plus"
+import {computed, onMounted, ref} from "vue"
+import {useRoute, useRouter} from "vue-router"
+import  useUserInfo from "@/stores/userInfo"
+import GlassType from "@/components/sd/product/GlassType.vue"
+import useProductGlassTypeStore from "@/stores/sd/product/productGlassType"
+import {useI18n} from "vue-i18n";
+import useUserInfoStore from "@/stores/userInfo";
+
+const { t } = useI18n()
+const router = useRouter()
+const route = useRoute()
+const value = ref('')
+const userStore = useUserInfoStore()
+
+let BasicData = ref([])
+
+let ruleForm = ref({
+  id:0,
+  glassShelfNumber: null,
+  glassShelfName: null,
+  availableQuantity: null,
+  totalQuantity: null,
+  price: null,
+  money: null,
+  unit: null,
+  maxWeight: null,
+  maxWidth: null,
+  maxHeight: null,
+  remarks: null,
+})
+
+
+const resetForm = () => {
+  ruleForm.value.glassShelfNumber=null
+  ruleForm.value.glassShelfName=null
+  ruleForm.value.availableQuantity=null
+  ruleForm.value.totalQuantity=null
+  ruleForm.value.price=null
+  ruleForm.value.money=null
+  ruleForm.value.unit=null
+  ruleForm.value.maxWeight=null
+  ruleForm.value.maxWidth=null
+  ruleForm.value.maxHeight=null
+  ruleForm.value.remarks=null
+}
+
+const submitForm = () => {
+  let filterData=ref({
+    data:ruleForm.value,
+    userName:userStore.user.userName,
+    userId:userStore.user.userId
+  })
+  console.log(filterData.value)
+  /*request.post("/materialStore/saveMaterialStore", filterData.value).then((res) => {
+    if(res.code==200 && res.data==="true"){
+      resetForm()
+      ElMessage.success(t('basicData.msg.saveSuccess'))
+    }else if(res.data==="false1"){
+      ElMessage.warning("璇ユ枡鏋跺凡瀛樺湪")
+    }else{
+      ElMessage.warning(t('basicData.msg.saveFail'))
+    }
+  }).catch((err)=>{
+    ElMessage.error(t('basicData.msg.ServerConnectionError'))
+    router.push("/login")
+  })*/
+
+}
+
+
+  //鑾峰彇浼犺繃鏉ョ殑鏁版嵁杩涜鍒ゆ柇
+  const str = route.query.id
+  if (typeof str != 'undefined' && str != null && str !== '' && str !== '\n' && str !== '\r'){
+    ruleForm.value.id = Number(str)
+
+    request.post(`/materialStore/getSelectMaterialStore`,ruleForm.value).then((res) => {
+      if(res.code==200){
+        ruleForm.value=deepClone(res.data.data)
+      }else{
+        ElMessage.warning(res.msg)
+        router.push("/login")
+      }
+    })
+  }
+
+
+
+</script>
+<template>
+
+ <div class="center-box">
+   <el-card class="form-card">
+   <el-form  size="medium" >
+     <el-divider ></el-divider> <!-- 娣诲姞鍒嗛殧绾� -->
+
+     <el-row gutter="20" >
+       <el-col :span="10" >
+         鏂欐灦缂栧彿锛�<el-input v-model="ruleForm.glassShelfNumber"  :placeholder="$t('ingredients.pleaseEnterData')" style="width: 150px; height: 30px;" />
+       </el-col>
+       <el-col :span="10" >
+         鏂欐灦鍚嶇О锛�<el-input  v-model="ruleForm.glassShelfName" :placeholder="$t('ingredients.pleaseEnterData')" style="width: 150px; height: 30px;" />
+       </el-col>
+       <el-divider ></el-divider> <!-- 娣诲姞鍒嗛殧绾� -->
+     </el-row>
+
+     <el-row gutter="20" >
+       <el-col :span="10" >
+         鐜版湁鏁伴噺锛�<el-input  v-model="ruleForm.availableQuantity" :placeholder="$t('ingredients.pleaseEnterData')" style="width: 150px; height: 30px;" />
+       </el-col>
+       <el-col :span="10" >
+         鎬绘暟閲忥細<el-input v-model="ruleForm.totalQuantity"  :placeholder="$t('ingredients.pleaseEnterData')" style="width: 150px; height: 30px;" />
+       </el-col>
+       <el-divider ></el-divider> <!-- 娣诲姞鍒嗛殧绾� -->
+     </el-row>
+
+     <el-row gutter="20" >
+       <el-col :span="10" >
+         鍗曚环锛�<el-input v-model="ruleForm.price"  :placeholder="$t('ingredients.pleaseEnterData')" style="width: 150px; height: 30px;" />
+       </el-col>
+       <el-col :span="10" >
+         鍗曚綅锛�<el-input v-model="ruleForm.unit"  :placeholder="$t('ingredients.pleaseEnterData')" style="width: 150px; height: 30px;" />
+       </el-col>
+       <el-divider ></el-divider> <!-- 娣诲姞鍒嗛殧绾� -->
+     </el-row>
+
+     <el-row gutter="20" >
+       <el-col :span="10" >
+         鏈�澶у锛�<el-input v-model="ruleForm.maxWidth"  :placeholder="$t('ingredients.pleaseEnterData')" style="width: 150px; height: 30px;" />
+       </el-col>
+       <el-col :span="10" >
+         鏈�澶ч珮锛�<el-input  v-model="ruleForm.maxHeight" :placeholder="$t('ingredients.pleaseEnterData')" style="width: 150px; height: 30px;" />
+       </el-col>
+       <el-divider ></el-divider> <!-- 娣诲姞鍒嗛殧绾� -->
+     </el-row>
+
+     <el-row gutter="20" >
+       <el-col :span="10" >
+         鏈�澶ф壙閲嶏細<el-input v-model="ruleForm.maxWeight"  :placeholder="$t('ingredients.pleaseEnterData')" style="width: 150px; height: 30px;" />
+       </el-col>
+       <el-col :span="10" >
+         澶囨敞锛�<el-input  v-model="ruleForm.remarks" :placeholder="$t('ingredients.pleaseEnterData')" style="width: 150px; height: 30px;" />
+       </el-col>
+       <el-divider ></el-divider> <!-- 娣诲姞鍒嗛殧绾� -->
+     </el-row>
+
+
+     <el-row  gutter="20" justify="center" >
+       <el-col span="10">
+         <el-button id="searchButton" type="primary" @click="resetForm" >{{$t('basicData.empty')}}</el-button>
+       </el-col>
+       <el-col span="10">
+         <el-button id="searchButton" type="primary" @click="submitForm" >{{$t('basicData.save')}}</el-button>
+       </el-col>
+     </el-row>
+   </el-form>
+   </el-card>
+ </div>
+
+</template>
+<style>
+.centered-box {
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  height: 100vh;
+}
+
+.form-card {
+  width: 1000px;
+  padding: 30px 30px;
+}
+.button-row {
+  display: flex;
+  justify-content: center;
+  margin-top: 20px;
+}
+</style>
\ No newline at end of file
diff --git a/north-glass-erp/northglass-erp/src/views/mm/finishedGlassShelf/FinishedGlassShelf.vue b/north-glass-erp/northglass-erp/src/views/mm/finishedGlassShelf/FinishedGlassShelf.vue
new file mode 100644
index 0000000..eb7f6ba
--- /dev/null
+++ b/north-glass-erp/northglass-erp/src/views/mm/finishedGlassShelf/FinishedGlassShelf.vue
@@ -0,0 +1,73 @@
+<!--  鐗╂枡搴撳瓨 -->
+
+
+<script setup>
+import {ref} from "vue";
+import {ArrowLeftBold, ArrowRight, Search} from "@element-plus/icons-vue";
+import request from "@/utils/request";
+import deepClone from "@/utils/deepClone";
+import {ElMessage} from "element-plus";
+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 id="div-title">
+      <el-breadcrumb :separator-icon="ArrowRight">
+        <el-breadcrumb-item @click="changeRouter(1)" :class="indexFlag===1?'indexTag':''" :to="{ path: '/main/finishedGlassShelf/finishedGlassShelfInformation' }">{{$t('鏂欐灦搴撳瓨')}}</el-breadcrumb-item>
+        <el-breadcrumb-item @click="changeRouter(2)" :class="indexFlag===2?'indexTag':''" :to="{ path: '/main/finishedGlassShelf/materialOutbound' }">{{$t('鏂欐灦鍑哄簱')}}</el-breadcrumb-item>
+        <el-breadcrumb-item @click="changeRouter(3)" :class="indexFlag===3?'indexTag':''" :to="{ path: '/main/finishedGlassShelf/returnToStorage' }">{{$t('鏂欐灦鍏ュ簱')}}</el-breadcrumb-item>
+        <el-breadcrumb-item @click="changeRouter(4)" :class="indexFlag===4?'indexTag':''" :to="{ path: '/main/finishedGlassShelf/createFinishedGlassShelf' }">{{$t('鏂欐灦鏂板')}}</el-breadcrumb-item>
+        <el-breadcrumb-item @click="changeRouter(6)" :class="indexFlag===6?'indexTag':''" :to="{ path: '/main/finishedGlassShelf/selectSurplusMaterials' }">{{$t('鏂欐灦鎶ヨ〃')}}</el-breadcrumb-item>
+        <el-breadcrumb-item v-show="false" :to="{ path: '/main/order/orderReport' }">{{$t('ingredientsStock.returnToStorage')}}</el-breadcrumb-item>
+      </el-breadcrumb>
+
+    </div>
+
+    <div id="main-body">
+      <router-view  :key="route.fullPath" />
+    </div>
+  </div>
+</template>
+
+<style scoped>
+#main{
+  width: 100%;
+  height: 100%;
+}
+#div-title{
+  height: 5%;
+  width: 100%;
+}
+#searchButton{
+  margin-top: -5px;
+  margin-left: 1rem;
+}
+#searchButton1{
+//margin-left: 10rem;
+}
+/*main-body鏍峰紡*/
+#main-body{
+  width: 99%;
+  height: 92%;
+  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/mm/finishedGlassShelf/FinishedGlassShelfInformation.vue b/north-glass-erp/northglass-erp/src/views/mm/finishedGlassShelf/FinishedGlassShelfInformation.vue
new file mode 100644
index 0000000..9713032
--- /dev/null
+++ b/north-glass-erp/northglass-erp/src/views/mm/finishedGlassShelf/FinishedGlassShelfInformation.vue
@@ -0,0 +1,530 @@
+<script setup>
+
+import {onMounted, reactive, ref} from "vue";
+import {useRouter} from  'vue-router'
+import request from "@/utils/request";
+import deepClone from "@/utils/deepClone";
+import useUserInfoStore from "@/stores/userInfo";
+import {ElMessage, ElMessageBox} from "element-plus";
+import {Search} from "@element-plus/icons-vue";
+import { useI18n } from 'vue-i18n'
+import {addListener, toolbarButtonClickEvent} from "@/hook/mouseMove";
+import {changeFilterEvent,filterChanged,filterChangeds} from "@/hook"
+import {divideAuto, multiply} from "@/utils/decimal";
+import companyInfo from "@/stores/sd/companyInfo";
+import footSum from "@/hook/footSum";
+import {copyTableCellValue} from "@/hook/copyTableCellValue";
+
+//璇█鑾峰彇
+const { t } = useI18n()
+const userStore = useUserInfoStore()
+const company = companyInfo()
+const router = useRouter()
+let produceList = ref([])
+let sheetIndex = ref(-1)
+let rowIndexData = ref(null)
+
+let dialogTableVisible = ref(false)
+let refMaterialAddition=ref()
+const getTableRow = (row,type) =>{
+  switch (type) {
+    case 'edit' :{
+      //alert('鎴戞帴鏀跺埌瀛愮粍浠朵紶閫佺殑缂栬緫淇℃伅')
+      router.push({path: '/main/trader/CreateTrader', query: { id: row.id }})
+      break
+    }
+    case 'delete':{
+      alert('鎴戞帴鏀跺埌瀛愮粍浠朵紶閫佺殑鍒犻櫎淇℃伅')
+      break
+    }
+  }
+}
+
+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 : 100
+})
+
+let filterData = ref({
+
+})
+
+const values = ref('')
+
+
+let selectDate = ref(["",""])
+let BasicData = ref([])
+let materialStore= ref([])
+
+
+
+
+
+onMounted(() => {
+  addListener(xGrid.value,gridOptions)
+
+  //绗竴娆¤皟鐢�
+  // request.get(`/BasicWarehouse/BasicWarehouseType/`+t('ingredients.originalFilm')+'|'+t('ingredients.accessories')).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=null
+  //       if(BasicData.value[i].OperateType==="name"){
+  //         aa={field: "json."+BasicData.value[i].OperateType, width: '150',title: BasicData.value[i].OperateTypeName, sortable: true,showOverflow:'ellipsis' ,filters:[{ data: '' }],slots: { filter: 'num1_filter' },filterMethod:filterChangeds}
+  //       }else{
+  //         aa={field: "json."+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)
+  //
+  //     }
+  //     values.value=t('ingredientsStock.inventory')
+  //     getInventoryWorks()
+  //
+  //   }else{
+  //     ElMessage.warning(res.msg)
+  //   }
+  // })
+})
+
+
+
+
+
+
+
+
+
+
+
+const getInventoryEngineeringWork = () => {
+
+    request.post(`/materialInventory/getSelectMaterialInventoryEngineeringDate/${pageNum.value}/${total.pageSize}/${selectDate.value}`,filterData.value).then((res) => {
+
+      if(res.code==200){
+        materialStore.value=[]
+        for (let i=0;i<res.data.data.length;i++){
+          materialStore.value[i]=(res.data.data[i])
+          materialStore.value[i].json=(JSON.parse(res.data.data[i].json))
+
+        }
+
+        total.dataTotal = res.data.total.total*1
+        total.pageTotal= res.data.total.pageTotal
+        pageNum.value=1
+        selectDate.value = res.data.selectDate
+        gridOptions.toolbarConfig.buttons[2].disabled = true
+        produceList = deepClone(materialStore.value)
+        xGrid.value.loadData(produceList)
+        gridOptions.loading=false
+      }else{
+        ElMessage.warning(res.msg)
+        router.push("/login")
+      }
+    })
+
+
+}
+
+
+
+const selectOrderList = ()=>{
+  request.get(`/BasicWarehouse/BasicWarehouseType/`+t('ingredients.originalFilm')+'|'+t('ingredients.accessories')).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=null
+        if(BasicData.value[i].OperateType==="model"){
+           aa={field: "json."+BasicData.value[i].OperateType, width: '150',title: BasicData.value[i].OperateTypeName, sortable: true,showOverflow:'ellipsis' ,filters:[{ data: '' }],slots: { filter: 'num1_filter' },filterMethod:filterChanged}
+        }else{
+           aa={field: "json."+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)
+
+      }
+      if(values.value===t('ingredientsStock.inventory')){
+        getInventoryWorkPaging()
+      }else{
+        getInventoryEngineeringWork()
+      }
+
+    }else{
+      ElMessage.warning(res.msg)
+    }
+  })
+}
+
+const changeDate =  ()=>{
+  selectOrderList()
+}
+
+//椤佃剼璺宠浆
+const handlePageChange = ({ currentPage, pageSize }) => {
+  selectOrderList()
+  total.pageTotal = pageSize
+  pageNum.value=currentPage
+}
+
+
+
+//瀛愮粍浠舵帴鏀跺弬鏁�
+const xGrid = ref()
+const gridOptions = reactive({
+  border:  "full",//琛ㄦ牸鍔犺竟妗�
+  keepSource: true,//淇濇寔婧愭暟鎹�
+  align: 'center',//鏂囧瓧灞呬腑
+  stripe:true,//鏂戦┈绾�
+  rowConfig: {isCurrent: true, isHover: true,height: 30},//榧犳爣绉诲姩鎴栭�夋嫨楂樹寒
+  id: 'SelectIngredientsStock',
+  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:[
+    { type: 'checkbox',fixed:"left", title: t('basicData.check'), width: '80' },
+    {title: t('basicData.operate'), width: '110', slots: { default: 'button_slot' },fixed:'left'},
+    { type: 'seq',fixed:"left", title: t('basicData.Number'), width: '80' },
+    {field: 'inventoryOrganization', width:'150', title: t('鏂欐灦缂栧彿'), sortable: true,filters:[{ data: '' }],slots: { filter: 'num1_filter' },filterMethod:filterChanged },
+    {field: 'materialCode', width: '150',title: t('鏂欐灦鍚嶇О'), sortable: true,showOverflow:"ellipsis" ,filters:[{ data: '' }],slots: { filter: 'num1_filter' },filterMethod:filterChanged},
+    {field: 'producer', width: '120',title: t('鐜版湁鏁伴噺'), sortable: true,filters:[{ data: '' }],slots: { filter: 'num1_filter' },filterMethod:filterChanged},
+    {field: 'id',width: '100', title: t('鎬绘暟閲�'), sortable: true,showOverflow:"ellipsis",filters:[{ data: '' }],slots: { filter: 'num1_filter' },filterMethod:filterChanged},
+    {field: 'projectNo',width: '100', title: t('鍗曚环'), sortable: true,showOverflow:"ellipsis",filters:[{ data: '' }],slots: { filter: 'num1_filter' },filterMethod:filterChanged},
+
+    {field: 'inventoryQuantity',width: '100', title: t('閲戦'), sortable: true,filters:[{ data: '' }],slots: { filter: 'num1_filter' },filterMethod:filterChanged},
+    {field: 'availableQuantity', width: '100',title: t('鍗曚綅'), sortable: true,filters:[{ data: '' }],slots: { filter: 'num1_filter' },filterMethod:filterChanged},
+    {field: 'planQuantity', width: '100',title: t('鏈�澶ф壙閲�'), sortable: true,filters:[{ data: '' }],slots: { filter: 'num1_filter' },filterMethod:filterChanged},
+    {field: 'totalArea',width: '100', title: t('鏈�澶ч珮'), sortable: true,filters:[{ data: '' }],slots: { filter: 'num1_filter' },filterMethod:filterChanged},
+    {field: 'dateOfManufacture',width: '100', title: t('鏈�澶у'), sortable: true},
+    {field: 'qualityGuaranteePeriod',width: '100', title: t('澶囨敞'), sortable: true,filters:[{ data: '' }],slots: { filter: 'num1_filter' },filterMethod:filterChanged},
+    {field: 'createTime',width: '100', title: t('鍒涘缓鏃堕棿'), sortable: true},
+
+  ],//琛ㄥご鎸夐挳
+  toolbarConfig: {
+    buttons: [
+      {'code': 'add', 'name': t('娣诲姞'),status: 'primary'},
+      {'code': 'out', 'name': t('鍑哄簱'),status: 'primary'}
+    ],
+    /*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')
+        }
+        const List = ["inventoryQuantity",'availableQuantity','totalArea']
+        if (List.includes(column.field)) {
+          return footSum(data, column.field)
+        }
+        return ''
+      })
+    ]
+  }
+
+})
+
+
+const gridEvents = {
+  async toolbarButtonClick({code}) {
+    const $grid = xGrid.value
+    if ($grid) {
+      switch (code) {
+        case 'out': {
+          $grid.clearFilter()
+          const selectRecords = $grid.getCheckboxRecords()
+
+
+          if (selectRecords.length === 0) {
+            ElMessage.warning(t('productStock.unselectedData'))
+            return
+          }
+          let id = ""
+          const array = [];
+          if (values.value===t('ingredientsStock.inventory')){
+            for (let i = 0; i < selectRecords.length; i++) {
+              array.push(selectRecords[i].id)
+              if (i + 1 === selectRecords.length) {
+                id += selectRecords[i].id
+              } else {
+                id += selectRecords[i].id + "|"
+              }
+            }
+          }else{
+            for (let i = 0; i < selectRecords.length; i++) {
+              array.push(selectRecords[i].useId)
+              if (i + 1 === selectRecords.length) {
+                id += selectRecords[i].useId
+              } else {
+                id += selectRecords[i].useId + "|"
+              }
+            }
+          }
+
+
+
+
+          router.push({path: '/main/ingredientsStock/CreateOutbound', query: {id: id,type:values.value}})
+          break
+
+
+        }
+        case 'add': {
+          dialogTableVisible.value=true
+          rowIndexData.value=null
+          sheetIndex.value=1
+          break
+        }
+
+        case 'update': {
+
+          $grid.clearFilter()
+          const selectRecords = $grid.getCheckboxRecords()
+          if (selectRecords.length === 1) {
+            dialogTableVisible.value=true
+            rowIndexData.value=selectRecords[0]
+            sheetIndex.value=2
+          }else{
+            ElMessage.warning(t('璇烽�変腑涓�琛屾暟鎹�'))
+            return
+          }
+
+
+          break
+        }
+
+        case 'delete': {
+          $grid.clearFilter()
+          const selectRecords = $grid.getCheckboxRecords()
+          if (selectRecords.length === 0) {
+            ElMessage.warning(t('productStock.unselectedData'))
+            return
+          }
+          ElMessageBox.confirm("纭鍒犻櫎锛�",
+              {
+                confirmButtonText: t('basicData.confirmButtonText'),
+                cancelButtonText: t('basicData.cancelButtonText'),
+                distinguishCancelAndClose: true,
+                type: 'warning',
+              }
+          ).then(()=>{
+            let id = ""
+            const array = [];
+            if (values.value===t('ingredientsStock.inventory')){
+              for (let i = 0; i < selectRecords.length; i++) {
+                array.push(selectRecords[i].id)
+                if (i + 1 === selectRecords.length) {
+                  id += selectRecords[i].id
+                } else {
+                  id += selectRecords[i].id + "|"
+                }
+              }
+            }else{
+              for (let i = 0; i < selectRecords.length; i++) {
+                array.push(selectRecords[i].useId)
+                if (i + 1 === selectRecords.length) {
+                  id += selectRecords[i].useId
+                } else {
+                  id += selectRecords[i].useId + "|"
+                }
+              }
+            }
+            let flowData = ref({
+              materialInventory: selectRecords,
+              ids: id,
+              creator: userStore.user.userName
+
+            })
+            request.post(`/materialInventory/deleteMaterialInventory`,flowData.value).then((res) => {
+              if(res.code==200 && res.data===true){
+                ElMessage.success(t('searchOrder.msgDeleteSuccess'))
+                router.push({path:'/main/ingredientsStock/selectIngredientsStock', query:{random:Math.random()}})
+              }else{
+                ElMessage.warning(res.msg)
+              }
+            })
+          }).catch((action)=>{
+          })
+          break
+
+
+        }
+      }
+    }
+  },
+  cellDblclick ({row,column}) {
+    copyTableCellValue(row,column)
+  }
+}
+
+
+
+
+
+
+</script>
+
+<template>
+  <div class="main-div-customer">
+    <div class="head">
+      <el-date-picker
+          v-model="selectDate"
+          type="daterange"
+          :start-placeholder="$t('basicData.startDate')"
+          :end-placeholder="$t('basicData.endDate')"
+          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>
+    </div>
+
+    <div class="main-table">
+      <vxe-grid
+          height="100%"
+          class="mytable-scrollbar"
+          ref="xGrid"
+          v-bind="gridOptions"
+          v-on="gridEvents"
+
+      >
+        <!--      @toolbar-button-click="toolbarButtonClickEvent"-->
+        <!--      涓嬫媺鏄剧ず鎵�鏈変俊鎭彃妲�-->
+        <template #content="{ row }">
+          <ul class="expand-wrapper">
+            <li  v-for="(item,index) in gridOptions.columns" v-show="item.field!=undefined ">
+              <span style="font-weight: bold">{{item.title+':  '}}</span>
+              <span v-if="hasDecimal(item.field)">{{ hasDecimalhtml(item.field,row) }}</span>
+              <span v-else>{{ row[item.field] }}</span>
+            </li>
+          </ul>
+        </template>
+
+        <!--宸﹁竟鍥哄畾鏄剧ず鐨勬彃妲�-->
+        <template #button_slot="{ row }">
+          <el-button @click="getTableRow(row,'edit')"
+                     link type="primary" size="small">{{$t('basicData.edit')}}</el-button>
+          <el-button @click="getTableRow(row,'delete')" link type="primary" size="small">{{$t('basicData.delete')}}</el-button>
+        </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 #pager>
+          &lt;!&ndash;浣跨敤 pager 鎻掓Ы&ndash;&gt;
+          <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 v-model="dialogTableVisible" :title="$t('ingredients.materialAddition')" style="width: 70%;height:75% ">-->
+<!--      <material-addition v-if="sheetIndex===1" ref="refMaterialAddition" style="width: 100%;height: 100%"-->
+<!--                         :data=rowIndexData :type=1-->
+<!--                         :close-on-click-modal="false"-->
+<!--                         :close-on-press-escape="false"-->
+<!--      />-->
+<!--      <material-addition v-if="sheetIndex===2" ref="refMaterialAddition" style="width: 100%;height: 100%"-->
+<!--                         :data=rowIndexData :type=2-->
+<!--                         :close-on-click-modal="false"-->
+<!--                         :close-on-press-escape="false"-->
+<!--      />-->
+<!--    </el-dialog>-->
+  </div>
+</template>
+
+<style scoped>
+.main-div-customer{
+  width: 99%;
+  height: 100%;
+}
+.main-div-customers{
+  width: 99%;
+  height: 100%;
+}
+.el-col{
+  margin-left: 15px;
+  margin-bottom: 5px;
+}
+.order-primary{
+  width: 100%;
+}
+.head{
+  width: 100%;
+  height: 35px;
+}
+
+.main-table{
+  width: 100%;
+  height: calc(100% - 35px);
+}
+.vxe-grid {
+  /* 绂佺敤娴忚鍣ㄩ粯璁ら�変腑 */
+  -webkit-user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
+}
+</style>
\ No newline at end of file
diff --git a/north-glass-erp/northglass-erp/src/views/pp/glassOptimize/OptimizeControl.vue b/north-glass-erp/northglass-erp/src/views/pp/glassOptimize/OptimizeControl.vue
index 2cbb30d..0e81b0d 100644
--- a/north-glass-erp/northglass-erp/src/views/pp/glassOptimize/OptimizeControl.vue
+++ b/north-glass-erp/northglass-erp/src/views/pp/glassOptimize/OptimizeControl.vue
@@ -12,17 +12,6 @@
   
     </div>
 
-
-  <div style="position: fixed; top: 93px; right: 120px; display: flex; align-items: center;">
-    <label style="margin-right: 10px; color: #333;">鏂囦欢淇濆瓨妯″紡:</label>
-    <select
-        v-model="fileSaveMode"
-        style="padding: 8px; border: 1px solid #ccc; border-radius: 4px;"
-    >
-      <option value="1">鍗曟枃浠�</option>
-      <option value="2">澶氭枃浠�</option>
-    </select>
-  </div>
     <button @click="submitLayouts" style="position: fixed; top: 90px; right: 20px; padding: 10px; background: #4CAF50; color: white; border: none; border-radius: 5px; cursor: pointer;">
       淇濆瓨OPT
     </button>
@@ -34,6 +23,7 @@
 import { useI18n } from "vue-i18n";
 import { ElMessage } from "element-plus";
 import requestOptimize from "@/utils/requestOptimize";
+import useUserInfoStore from "@/stores/userInfo";
 
 const { t } = useI18n();
 
@@ -48,6 +38,10 @@
 const optimizeLayouts = ref(null);
 
 const fileSaveMode = ref(1);
+const fileMode = ref();
+
+const userStore = useUserInfoStore()
+const username = userStore.user.userName;
 
 // 浠� localStorage 璇诲彇搴撳瓨鏁版嵁
 const loadInventoryData = () => {
@@ -103,7 +97,26 @@
       });
 };
 
-
+const fetchSettings = async (username) => {
+  try {
+    const response = await request.post(`/glassOptimize/selectOptimizeParms/${username}`);
+    if (response.code == 200) {
+      if (!response.data) {
+        console.error('鍝嶅簲鏁版嵁涓虹┖');
+        return;
+      }
+      const parsedData = JSON.parse(response.data);
+      console.log('璁剧疆鍐呭:', parsedData);
+      if (parsedData.server && parsedData.server.fileMode) {
+        fileMode.value = parsedData.server.fileMode;
+      }
+    } else {
+      console.error('璇锋眰澶辫触锛岀姸鎬佺爜:', response.code);
+    }
+  } catch (error) {
+    console.error('璇锋眰鍙戠敓閿欒:', error);
+  }
+};
 
 
 const selectOptimizeInfo = () => {
@@ -134,10 +147,11 @@
 };
 
 onMounted(() => {
-  // 璇诲彇搴撳瓨鏁版嵁
+  // 璇诲彇搴撳瓨鏁版嵁鍜屽弬鏁拌缃�
   loadInventoryData();
   selectLayout();
   selectOptimizeInfo();
+  fetchSettings(username);
 });
 
 const submitLayouts = async () => {
@@ -154,7 +168,7 @@
       glassType:inventoryData.value[0].model,
       quantity: inventoryData.value[0].processingQuantity,
       fileType:"OPT",
-      fileSaveMode:fileSaveMode.value,
+      fileSaveMode:fileMode.value,
       glassIdMode:1,
       layouts: optimizeLayouts.value.layouts
     }, {
diff --git a/north-glass-erp/northglass-erp/src/views/pp/glassOptimize/OptimizeParms.vue b/north-glass-erp/northglass-erp/src/views/pp/glassOptimize/OptimizeParms.vue
index db26dc0..a1a2143 100644
--- a/north-glass-erp/northglass-erp/src/views/pp/glassOptimize/OptimizeParms.vue
+++ b/north-glass-erp/northglass-erp/src/views/pp/glassOptimize/OptimizeParms.vue
@@ -43,6 +43,12 @@
         return;
       }
       const parsedData = JSON.parse(response.data);
+      if (!parsedData.server) {
+        parsedData.server = {};
+      }
+      if (!parsedData.server.fileMode) {
+        parsedData.server.fileMode = '1'; // 榛樿涓哄崟鏂囦欢妯″紡
+      }
       Object.assign(settings, parsedData);
       console.log('璁剧疆宸叉洿鏂�:', settings);
     } else {
@@ -237,6 +243,28 @@
         <div class="display-settings">
           <h2>缁撴灉杈撳嚭璁剧疆</h2>
           <div class="form-group">
+            <label>鍒囧壊鏂囦欢淇濆瓨妯″紡</label>
+            <div style="margin-left: 3px;"></div>
+            <div class="radio-group">
+              <input
+                  type="radio"
+                  id="singleFile"
+                  value="1"
+                  v-model="settings.server.fileMode"
+              />
+              <label for="singleFile">鍗曟枃浠�</label>
+
+              <input
+                  type="radio"
+                  id="multiFile"
+                  value="2"
+                  v-model="settings.server.fileMode"
+                  style="margin-left: 20px;"
+              />
+              <label for="multiFile">澶氭枃浠�</label>
+            </div>
+          </div>
+          <div class="form-group">
             <label>宸ョ▼鏂囦欢淇濆瓨璺緞</label>
             <input type="text" v-model="settings.server.output_format" />
           </div>
@@ -387,7 +415,7 @@
   background-color: white;
   padding: 15px;
   border-radius: 8px;
-  box-shadow: 0 2px 4 rgba(0, 0, 0, 0.1);
+  box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
 }
 
 .sidebar-item {
diff --git a/north-glass-erp/northglass-erp/src/views/pp/glassOptimize/page/Compute.vue b/north-glass-erp/northglass-erp/src/views/pp/glassOptimize/page/Compute.vue
index b1a64ab..8517fb6 100644
--- a/north-glass-erp/northglass-erp/src/views/pp/glassOptimize/page/Compute.vue
+++ b/north-glass-erp/northglass-erp/src/views/pp/glassOptimize/page/Compute.vue
@@ -47,7 +47,7 @@
 const optionVal = ref(50)
 
 // 瀹氫箟瑁呰浇鐜�
-const percentage1 = ref(80)
+const percentage1 = ref(50)
 const percentage2 = ref(50)
 
 // 瀹氫箟鍏朵粬琛ㄥ崟鏁版嵁
diff --git a/north-glass-erp/northglass-erp/src/views/sd/basicData/CreateBasicData.vue b/north-glass-erp/northglass-erp/src/views/sd/basicData/CreateBasicData.vue
index 1e8c904..c718f49 100644
--- a/north-glass-erp/northglass-erp/src/views/sd/basicData/CreateBasicData.vue
+++ b/north-glass-erp/northglass-erp/src/views/sd/basicData/CreateBasicData.vue
@@ -1,18 +1,21 @@
 <script setup>
 import request from "@/utils/request"
-import {onMounted, ref, watch} from "vue";
+import {onMounted, ref} from "vue";
 import {useI18n} from "vue-i18n"
 import {ElMessage} from "element-plus"
-import {useRouter,useRoute} from "vue-router"
+import {useRoute, useRouter} from "vue-router"
+
 const { t } = useI18n()
 const router = useRouter()
 const route = useRoute()
 
+let iconWidth=ref(null)
+let iconHeight=ref(null)
 
 let basic = ref({
   basicType : ['',''],
   input:'',
-  nickname:''
+  nickname:null
 })
 let options=ref([
   { "label": t('orderBasicData.order'),
@@ -128,8 +131,16 @@
   if(props.rowIndex){
     basic.value.basicType[0] =  props.rowIndex.basicType
     basic.value.basicType[1] =  props.rowIndex.basicCategory
-    basic.value.input =  props.rowIndex.basicName
-    basic.value.nickname =  props.rowIndex.nickname
+    if(basic.value.basicType[1]==="icon"){
+      basic.value.input =  props.rowIndex.basicName
+      basic.value.nickname =  JSON.parse(props.rowIndex.nickname).data
+      iconWidth.value=JSON.parse(props.rowIndex.nickname).width
+      iconHeight.value=JSON.parse(props.rowIndex.nickname).height
+    }else{
+      basic.value.input =  props.rowIndex.basicName
+      basic.value.nickname =  props.rowIndex.nickname
+    }
+
   }
 })
 
@@ -139,6 +150,15 @@
     if(!basic.value.input.includes("mm")){
       basic.value.input=basic.value.input+"mm"
     }
+  }
+  if(basic.value.basicType[1]==="icon"){
+    let nickname=basic.value.nickname
+    let data={
+      width: iconWidth.value,
+      height: iconHeight.value,
+      data: nickname
+    }
+    basic.value.nickname=JSON.stringify(data)
   }
   basic.value.input=basic.value.input.trim()
   request.post(`/basicData/addBasicData`, basic.value).then(res => {
@@ -153,6 +173,15 @@
     if(!basic.value.input.includes("mm")){
       basic.value.input=basic.value.input+"mm"
     }
+  }
+  if(basic.value.basicType[1]==="icon"){
+    let nickname=basic.value.nickname
+    let data={
+      width: iconWidth.value,
+      height: iconHeight.value,
+      data: nickname
+    }
+    basic.value.nickname=JSON.stringify(data)
   }
   let submitArr  = props.rowIndex
   submitArr.basicType = basic.value.basicType[0]
@@ -238,6 +267,22 @@
       </el-col>
     </el-row>
     <el-row v-if="basic.basicType.length!==0 && basic.basicType[1]==='icon'" >
+      <el-col :span="4">
+        {{ $t('order.width') }}:
+      </el-col>
+      <el-col :span="12">
+        <el-input  v-model="iconWidth"/>
+      </el-col>
+    </el-row>
+    <el-row v-if="basic.basicType.length!==0 && basic.basicType[1]==='icon'" >
+      <el-col :span="4">
+        {{ $t('order.height') }}:
+      </el-col>
+      <el-col :span="12">
+        <el-input  v-model="iconHeight"/>
+      </el-col>
+    </el-row>
+    <el-row v-if="basic.basicType.length!==0 && basic.basicType[1]==='icon'" >
       <el-col :span="4"></el-col>
       <el-col :span="12">
         <el-upload
diff --git a/north-glass-erp/src/main/resources/mapper/pp/GlassOptimize.xml b/north-glass-erp/src/main/resources/mapper/pp/GlassOptimize.xml
index 544545d..ea8cf33 100644
--- a/north-glass-erp/src/main/resources/mapper/pp/GlassOptimize.xml
+++ b/north-glass-erp/src/main/resources/mapper/pp/GlassOptimize.xml
@@ -1711,7 +1711,10 @@
                     p.creater = a.Id
                     )))
         WHERE
-            ( p.state = 1 ) and p.tempering_state=0 and optimize_state=0 and p.project_no = #{projectNo}
+            ( p.state = 1 ) and
+#             p.tempering_state=0 and
+#             optimize_state=0 and
+            p.project_no = #{projectNo}
         ORDER BY
             p.create_time DESC,
             p.project_no
@@ -1881,27 +1884,40 @@
     </select>
     <select id="getOptimizeDetailsInfo" resultType="java.util.Map">
         SELECT
-            0 As isRemain,
-            width AS realWidth,
-            height AS realHeight,
-            p_width AS width,
-            p_height AS height,
-            process_id AS processId,
-            layer,
-            total_layer AS totalLayer,
-            order_sort As orderSort,
-            stock_id AS layoutId,
-            stock_number AS glassSort,
-            x_axis AS x,
-            y_axis AS y,
-            mark_icon AS markIcon,
-            isRotate,
-            glass_point AS glassPoint,
-            rack_no As rackNo
+            0 AS isRemain,
+            od.width AS realWidth,
+            od.height AS realHeight,
+            od.p_width AS width,
+            od.p_height AS height,
+            od.process_id AS processId,
+            od.layer,
+            od.total_layer AS totalLayer,
+            od.order_sort AS orderSort,
+            od.stock_id AS layoutId,
+            od.stock_number AS glassSort,
+            od.x_axis AS x,
+            od.y_axis AS y,
+            od.mark_icon AS markIcon,
+            od.isRotate,
+            od.glass_point AS glassPoint,
+            fc.order_id AS orderNo,
+            ogd.process,
+            o.customer_name AS customerName,
+            o.processing_note AS processingNote,
+            o.project AS projectName,
+            ord.product_name AS productName,
+            ord.building_number AS buildingNumber,
+            COALESCE(h.layout_id, 0) as heatLayoutId,
+            od.rack_no AS rackNo
         FROM
-            pp.optimize_detail
+            pp.optimize_detail od
+                LEFT JOIN pp.flow_card fc on od.process_id = fc.process_id
+                LEFT JOIN sd.order_glass_detail ogd ON fc.order_id = ogd.order_id
+                LEFT JOIN sd.ORDER o ON o.order_id = fc.order_id
+                LEFT JOIN sd.order_detail ord ON fc.order_id = ord.order_id
+                LEFT JOIN pp.optimize_heat_detail h ON h.process_id = fc.process_id
         WHERE
-            project_no = #{projectId}
+            od.project_no =  #{projectId}
     </select>
     <select id="getOptimizeOffsetsInfo" resultType="java.util.Map">
         SELECT

--
Gitblit v1.8.0