From 714ed2fda4d83bdc2da48ccfe7e42f220acbee99 Mon Sep 17 00:00:00 2001
From: guoyujie <guoyujie@ng.com>
Date: 星期五, 21 十一月 2025 16:49:06 +0800
Subject: [PATCH] Merge branch 'master' of http://10.153.19.25:10101/r/ERP_override

---
 north-glass-erp/northglass-erp/src/views/pp/glassOptimize/page/ProcessCard.vue |  504 ++++++++++++++++++++++++++++++++++++++++++-------------
 1 files changed, 385 insertions(+), 119 deletions(-)

diff --git a/north-glass-erp/northglass-erp/src/views/pp/glassOptimize/page/ProcessCard.vue b/north-glass-erp/northglass-erp/src/views/pp/glassOptimize/page/ProcessCard.vue
index b244763..d7a6c97 100644
--- a/north-glass-erp/northglass-erp/src/views/pp/glassOptimize/page/ProcessCard.vue
+++ b/north-glass-erp/northglass-erp/src/views/pp/glassOptimize/page/ProcessCard.vue
@@ -1,30 +1,113 @@
 <script setup>
-import {reactive, ref} from "vue";
+import {nextTick, onMounted, reactive, ref, watch} from "vue";
 import {useI18n} from "vue-i18n";
 import {Search} from "@element-plus/icons-vue";
-const { t } = useI18n()
+import request from "@/utils/request";
+import deepClone from "@/utils/deepClone";
+import {ElMessage} from "element-plus";
+import useUserInfoStore from "@/stores/userInfo";
+import {changeFilterEvent, filterChanged} from "@/hook";
+
+const {t} = useI18n()
+const userStore = useUserInfoStore()
+const username = userStore.user.userId
+let rowClickIndex = ref(null)
+
+let props = defineProps({
+  processId: null,
+  technologyNumber: null
+})
+
+//鑶滅郴
+const optionVal = ref()
+//鑶滅郴
+const projectNmae = ref()
+//宸ョ▼缂栧彿涓暟
+let projectId = ref()
+//宸ョ▼缂栧彿
+const Id = ref()
+let oddNumbers = ref()
+
+//瀹氫箟鎺ユ敹鍔犺浇琛ㄥご涓嬫媺鏁版嵁
+const titleSelectJson = ref({
+  processType: [],
+})
+
+const selectGlassType = () => {
+  //鏌ヨ鑶滅郴
+  request.post(`/glassOptimize/selectGlassType`).then((res) => {
+    if (res.code == 200) {
+      titleSelectJson.value.processType = res.data.data
+    } else {
+      ElMessage.warning(res.msg)
+    }
+  })
+}
+//鏌ヨ鏈�鏂板伐绋嬪彿
+const getProjectId = () => {
+  request.post(`/glassOptimize/getProjectId`).then((res) => {
+    if (res.code == 200) {
+      projectId = res.data.data[0].project_no
+      // 鑾峰彇瀛楃涓茬殑鏈�鍚庝袱浣嶆暟瀛�
+      let maximum = projectId.slice(-2);
+      let lastTwoInteger = parseInt(maximum, 10);
+       // 璁剧疆涓や綅涓嶅琛�0
+      let formattedNumber = (lastTwoInteger + 1).toString().padStart(2, '0');
+      // 鏍煎紡鍖栧綋鍓嶆棩鏈熶负 "yyMMdd"
+      let currentDate = new Date();
+      let formattedDate = currentDate.getFullYear().toString().slice(-2) +
+          (currentDate.getMonth() + 1).toString().padStart(2, '0') +
+          currentDate.getDate().toString().padStart(2, '0');
+
+      // 鎷兼帴鎴愭渶缁堢殑瀛楃涓�
+      oddNumbers.value = 'P' + formattedDate + formattedNumber;
+
+    } else {
+      ElMessage.warning(res.msg)
+    }
+  })
+}
+
+
+onMounted(() => {
+  console.log(userStore.user);
+  getProjectId();
+  selectGlassType();
+
+})
 
 const xGrid = ref()
 
+// 娣诲姞鐩戝惉鍣� - 鐩戝惉鑶滅郴閫夋嫨鍙樺寲
+watch(optionVal, (newVal, oldVal) => {
+  if (oldVal !== undefined && newVal !== oldVal) {
+    // 褰撹啘绯绘敼鍙樻椂锛岃嚜鍔ㄥ埛鏂版暟鎹�
+    if (newVal) {
+      selectFlowCardList();
+    }
+  }
+}, { flush: 'post' });
+
+
 const gridOptions = reactive({
 
-  height:'100%',
+  height: '100%',
   loading: false,
-  border:  "full",//琛ㄦ牸鍔犺竟妗�
+  border: "full",//琛ㄦ牸鍔犺竟妗�
   keepSource: true,//淇濇寔婧愭暟鎹�
   align: 'center',//鏂囧瓧灞呬腑
-  stripe:true,//鏂戦┈绾�
-  rowConfig: {isCurrent: true, isHover: true,height: 30, useKey: true},//榧犳爣绉诲姩鎴栭�夋嫨楂樹寒
+  stripe: true,//鏂戦┈绾�
+  rowConfig: {isCurrent: true, isHover: true, height: 30, useKey: true},//榧犳爣绉诲姩鎴栭�夋嫨楂樹寒
   id: 'ProcessCard',
-  scrollX:{enabled: true},
-  scrollY:{ enabled: true ,gt:0},//寮�鍚櫄鎷熸粴鍔�
-  showOverflow:true,
+  scrollX: {enabled: true},
+  scrollY: {enabled: true, gt: 0},//寮�鍚櫄鎷熸粴鍔�
+  showOverflow: true,
   columnConfig: {
     resizable: true,
     useKey: true
   },
   filterConfig: {   //绛涢�夐厤缃」
-    remote: true
+    //remote: true
   },
   customConfig: {
     storage: true
@@ -34,138 +117,321 @@
     mode: 'row',
     showStatus: true
   },
-  /*formConfig: {
-    data: {
-      width: '',
-      height: '',
-      quantity: ''
+  columns: [
+
+    {field: 'select',type:'checkbox',title: t('basicData.check'), width: 80,fixed:"left"},
+    {
+      field: 'process_id',
+      width: 150,
+      title: t('processCard.processId'),
+      filters: [{data: ''}],
+      slots: {filter: 'num1_filter'},
+      sortable: true,
+      filterMethod:filterChanged
     },
-    items: [
-      { field: 'width', title: t('order.width')+':', itemRender: { name: 'VxeInput' } },
-      { field: 'height', title: t('order.height')+':', itemRender: { name: 'VxeInput' } },
-      { field: 'quantity', title: t('order.quantity')+':', itemRender: { name: 'VxeInput' } },
-      {
-        itemRender: {
-          name: 'VxeButtonGroup',
-          options: [
-            { type: 'submit', content: t('craft.sure'), status: 'primary' },
-            { type: 'reset', content: t('product.msg.reset') }
-          ]
-        }
-      }
-    ]
-  },*/
-  columns:[
-    {type:'expand',fixed:"left",slots: { content:'content' },width: 50},
-    {type: 'checkbox', fixed: "left", title: t('basicData.check'), width: 80},
-    {field: 'processId',width: 150, title: t('processCard.processId'),filters:[{ data: '' }],slots: { filter: 'num1_filter' }, sortable: true},
-    {field: 'id',width: 70,  title: '灞�',filters:[{ data: '' }], slots: { default: 'state',filter: 'num2_filter' }},
-    {field: 'id',width: 150, title: '鎬诲眰鏁�',filters:[{ data: '' }],slots: { filter: 'num1_filter' }, sortable: true},
-    {field: 'id',width: 100, title: '瑙勬牸',filters:[{ data: '' }], slots: { default: 'state',filter: 'num2_filter' }},
-    {field: 'quantity',width: 150, title: t('order.quantity'),filters:[{ data: '' }],slots: { filter: 'num1_filter' }, sortable: true},
-    {field: 'id',width: 150, title: t('order.shape'),filters:[{ data: '' }],slots: { filter: 'num1_filter' }, sortable: true},
-    {field: 'orderDetail.productName',width: 150, title: t('order.product'),filters:[{ data: '' }],slots: { filter: 'num1_filter' }, sortable: true},
-    {field: 'order.project', width:150, title: t('order.project'), showOverflow: "ellipsis"},
-    {field: 'orderDetail.computeGrossArea',width: 150, title: t('order.area'),filters:[{ data: '' }],slots: { filter: 'num1_filter' }, sortable: true},
+    {
+      field: 'technology_number',
+      width: 70,
+      title: '灞�',
+      filters: [{data: ''}],
+      slots: {filter: 'num1_filter'},
+      sortable: true,
+      filterMethod:filterChanged
+    },
+    {
+      field: 'TotalFloors',
+      width: 150,
+      title: '鎬诲眰鏁�',
+      filters: [{data: ''}],
+      slots: {filter: 'num1_filter'},
+      sortable: true,
+      filterMethod:filterChanged
+    },
+    {
+      field: 'TotalNumber',
+      width: 150,
+      title: '瑙勬牸',
+      filters: [{data: ''}],
+      slots: {filter: 'num1_filter'},
+      sortable: true,
+      filterMethod:filterChanged
+    },
+    {
+      field: 'quantity',
+      width: 150,
+      title: t('order.quantity'),
+      filters: [{data: ''}],
+      slots: {filter: 'num1_filter'},
+      sortable: true,
+      filterMethod:filterChanged
+    },
+    {
+      field: 'shape',
+      width: 150,
+      title: t('order.shape'),
+      filters: [{data: ''}],
+      slots: {filter: 'num1_filter'},
+      sortable: true,
+      filterMethod:filterChanged
+    },
+    {
+      field: 'glass_child',
+      width: 150,
+      title: t('order.product'),
+      filters: [{data: ''}],
+      slots: {filter: 'num1_filter'},
+      sortable: true,
+      filterMethod:filterChanged
+    },
+    {field: 'project', width: 150, title: t('order.project'), showOverflow: "ellipsis",filterMethod:filterChanged},
+    {
+      field: 'area',
+      width: 150,
+      title: t('order.area'),
+      filters: [{data: ''}],
+      slots: {filter: 'num1_filter'},
+      sortable: true,
+      filterMethod:filterChanged
+    },{
+      field: 'patch_state',
+      width: 100,
+      title: '琛ョ墖鐘舵��'
+    },
 
 
   ],//琛ㄥご鍙傛暟
-  data:null,//琛ㄦ牸鏁版嵁
+  data: null,//琛ㄦ牸鏁版嵁
 
   toolbarConfig: {
     buttons: [],
-    slots:{
+    slots: {
       buttons: "toolbar_buttons"
     },
   },
 
-})
-let emit = defineEmits([
-  'changeDialog'
-])
-//鑶滅郴鍒楄〃
-const optionVal = ref('')
-const options = [
-  {
-    value: '0',
-    label: '鐧界幓',
-  },
-  {
-    value: '1',
-    label: '鐏伴暅',
-  },
-  {
-    value: '2',
-    label: 'Low-e',
-  },
-]
 
+})
+
+const gridEvents = {
+  cellClick({row}) {
+    rowClickIndex.value = row
+    // Emit 浜嬩欢灏嗘洿鏂板悗鐨勫�间紶閫掔粰鐖剁粍浠�
+    emit('updateProcessId', rowClickIndex.value.process_id);
+    emit('updateTechnologyNumber', rowClickIndex.value.technology_number);
+  }
+}
+const emit = defineEmits(['updateProcessId', 'updateTechnologyNumber', 'updateState']);
+
+
+//灏忓渾鐐瑰崟閫夋
+let radio = ref(1);
+let isButtonDisabledAdd = ref(false);
+let isButtonDisabledUpdate = ref(true);
+
+const selectFlowCardList = async () => {
+  request.post(`/glassOptimize/getFlowCardList/${optionVal.value}/${radio.value}`).then((res) => {
+    if (res.code == 200) {
+      getProjectId()
+      isButtonDisabledAdd.value=false
+      isButtonDisabledUpdate.value = true
+      xGrid.value.loadData(res.data.data)
+    } else {
+      ElMessage.warning(res.msg)
+    }
+  })
+}
+
+const getUpdateFlowCardList = async (projectNumber, type, thickness) => {
+  // 閲嶇疆鐘舵��
+  radio.value = 1;
+  isButtonDisabledAdd.value = true;
+  isButtonDisabledUpdate.value = false;
+
+  // 娓呯┖鐜版湁鏁版嵁
+  if (xGrid.value) {
+    xGrid.value.loadData([]);
+  }
+
+  // 寮哄埗鏇存柊琛ㄥ崟瀛楁
+  oddNumbers.value = projectNumber;
+  projectNmae.value = ''; // 鍏堟竻绌哄伐绋嬪悕绉�
+
+  // 鏋勯�犳纭殑鑶滅郴鍊�
+  const glassTypeValue = `${thickness}mm${type}`;
+  optionVal.value = glassTypeValue;
+
+  request.post(`/glassOptimize/getUpdateFlowCardList/${type}/${thickness}/${radio.value}/${projectNumber}`).then((res) => {
+    if (res.code == 200) {
+      // 鏇存柊宸ョ▼缂栧彿
+      oddNumbers.value = projectNumber;
+
+      // 鏇存柊宸ョ▼鍚嶇О锛堝鏋滃悗绔繑鍥烇級
+      if (res.data.projectName) {
+        projectNmae.value = res.data.projectName;
+      }
+
+      // 纭繚鑶滅郴閫夋嫨姝g‘
+      optionVal.value = glassTypeValue;
+
+      isButtonDisabledAdd.value = true;
+      isButtonDisabledUpdate.value = false;
+
+      // 浣跨敤 $nextTick 纭繚DOM鏇存柊鍚庡啀鍔犺浇鏁版嵁
+      nextTick(() => {
+        if (xGrid.value) {
+          xGrid.value.loadData(deepClone(res.data.data));
+          // 璁剧疆閫変腑鐘舵��
+          nextTick(() => {
+            const tableData = xGrid.value.getTableData().fullData;
+            tableData.forEach(item => {
+              if(item.occupyState === 0){
+                xGrid.value.setCheckboxRow(item, true);
+              }
+            });
+          });
+        }
+      });
+    } else {
+      ElMessage.warning(res.msg);
+    }
+  }).catch(error => {
+    ElMessage.error('鑾峰彇娴佺▼鍗℃暟鎹け璐�');
+    console.error(error);
+  });
+};
+
+//鍒涘缓宸ョ▼
+const addProject = (type) => {
+  const $table = xGrid.value
+  if ($table) {
+    const selectRecords = $table.getCheckboxRecords()
+    if($table.getCheckedFilters().length!==0){
+      ElMessage.error(t('order.msg.pleaseCancelTheFilteringFirst'))
+      return
+    }
+    if (selectRecords.length == 0) {
+      ElMessage.warning(t('reportingWorks.selectProcessCardData'))
+      return;
+    }
+
+    let projectData = ref({
+      projectdetail: selectRecords,
+      userName : username,
+      projectType: type
+    })
+    let inputProject = projectNmae.value
+    if (inputProject == undefined) {
+      inputProject = null
+    }
+    request.post(`/glassOptimize/addProject/${optionVal.value}/${oddNumbers.value}/${inputProject}`, projectData.value).then((res) => {
+      if (res.code == 200 && res.data === "true") {
+        emit('updateState', 1);
+        ElMessage.success(t('basicData.msg.saveSuccess'))
+        selectFlowCardList()
+        getProjectId();
+      }else if(res.data === "false1") {
+        ElMessage.warning("宸ョ▼鍙峰凡瀛樺湪璇烽噸鏂板埛鏂扮晫闈�")
+      } else {
+        ElMessage.warning(res.msg)
+      }
+    })
+
+  }
+}
+
+watch(optionVal, (newVal, oldVal) => {
+  if (newVal) {
+    // 褰撹啘绯绘敼鍙樻椂锛屾洿鏂板伐绋嬪悕绉颁负褰撳墠鑶滅郴鍊�
+    projectNmae.value = newVal;
+
+    // 褰撹啘绯绘敼鍙樻椂锛岃嚜鍔ㄥ埛鏂版暟鎹�
+    selectFlowCardList();
+  }
+}, { flush: 'post' });
+
+const handleRowClassName = ({ row, rowIndex }) => {
+  if (row.patch_state === 1) {
+    return 'high-score';
+  }
+  if (row.occupyState === 0) {
+    return 'high-score2';
+  }
+}
+
+//鎶涘嚭鏂规硶鍒扮埗鐣岄潰
+defineExpose({getProjectId,selectFlowCardList,selectGlassType,getUpdateFlowCardList})
 </script>
 
 <template>
-  <div style="width: 100%;height: 100%">
-    <h1>娴佺▼鍗″垪琛�</h1>
+  <div style="width: 100%;height: 110%; margin-top: -36px">
+    <div>
+      娴佺▼鍗″垪琛�
+      <span style="margin-left: 140px;font-size: 14px">宸ョ▼缂栧彿锛�</span>
+<!--      <span>{{oddNumbers}}</span>-->
+      <el-input disabled v-model="oddNumbers" style="width: 100px"></el-input>
+<!--      <vxe-input :disabled="isDisabled" placeholder="" v-model="oddNumbers" size="small" style="color:black;"></vxe-input>&nbsp;-->
+      <span style="font-size: 14px">宸ョ▼鍚嶇О锛�</span>
+      <el-input style="width: 150px" placeholder="" v-model="projectNmae" size="small"></el-input>
+      <el-button style="margin-left: 20px" type="primary" :disabled="isButtonDisabledAdd" @click="addProject(1)">鍒涘缓</el-button>
+      <el-button style="margin-left: 20px;" type="primary"  :disabled="isButtonDisabledUpdate"  @click="addProject(2)">淇敼</el-button>
+    </div>
     <vxe-grid
-          size="small"
-          @filter-change="filterChanged"
-          height="100%"
-          class="mytable-scrollbar"
-          ref="xGrid"
-          v-bind="gridOptions"
-          v-on="gridEvents"
-      >
-        <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>
+        ref="xGrid"
+        class="mytable-scrollbar"
+        height="100%"
+        size="small"
+        v-bind="gridOptions"
+        v-on="gridEvents"
+        :row-class-name="handleRowClassName"
+    >
+      <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 :label="$t('basicData.unchecked')" value="0"></vxe-option>
+              <vxe-option :label="$t('basicData.selected')" value="1"></vxe-option>
+            </vxe-select>
           </div>
-        </template>
+        </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>
+      <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>
-        </template>
+        </div>
+      </template>
 
-        <template #toolbar_buttons>
-          <h1>鑶滅郴绛涢�夛細</h1>
-          <el-select
-              placeholder="閫夋嫨鑶滅郴"
-              style="margin-left:10px; width: 170px "
-              ref="getSelect"
-              v-model="optionVal"
-              clearable
-              class="m-2"
-              @change="getWorkOrder"
-          >
+      <template #toolbar_buttons>
+        <h2>鑶滅郴绛涢�夛細</h2>
+        <el-select v-model="optionVal" clearable default-value="default_city" placeholder="閫夋嫨鑶滅郴"
+                   style="width: 120px">
+          <el-option
+              v-for="item in titleSelectJson['processType']"
+              :key="item.id"
+              :label="item.glassType"
+              :value="item.glassType"
+          />
+        </el-select>
+        <el-button :icon="Search" style="margin-left: 20px" type="primary" @click="selectFlowCardList">鏌ヨ</el-button>
+        <vxe-radio-group v-model="radio" style="margin-left: 20px">
+          <vxe-radio content="鍏ㄩ儴" label="1"></vxe-radio>
+          <vxe-radio content="姝e崟" label="2"></vxe-radio>
+          <vxe-radio content="琛ュ崟" label="3"></vxe-radio>
+        </vxe-radio-group>
+      </template>
 
-            <el-option
-                v-for="item in options"
-                :key="item.value"
-                :label="item.label"
-                :value="item.value"
-            />
-          </el-select>
-          <el-button type="primary" :icon="Search" style="margin-left: 20px">鏌ヨ</el-button>
-          <vxe-select style="margin-left: 40px" placeholder="鍏ㄩ儴娴佺▼鍗�" clearable></vxe-select>
-          <vxe-select style="margin-left: 20px" placeholder="鍏ㄩ儴椤圭洰" clearable></vxe-select>
-          <el-button type="primary" style="margin-left: 10px">绛涢��</el-button>
-        </template>
     </vxe-grid>
   </div>
 </template>
 
-<style scoped>
-
+<style lang="css">
+.high-score {
+  background-color: #d4baba !important;
+}
+.high-score2 {
+  background-color: #a5aec9 !important;
+}
 </style>
\ No newline at end of file

--
Gitblit v1.8.0