From f7a2fcdda7f1120498c5c5f75c5a99955fc54b43 Mon Sep 17 00:00:00 2001
From: 廖井涛 <2265517004@qq.com>
Date: 星期二, 16 十二月 2025 16:54:09 +0800
Subject: [PATCH] Merge branch 'master' of http://10.153.19.25:10105/r/ERP_override

---
 north-glass-erp/northglass-erp/src/views/pp/glassOptimize/ProjectCreate.vue |  403 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 403 insertions(+), 0 deletions(-)

diff --git a/north-glass-erp/northglass-erp/src/views/pp/glassOptimize/ProjectCreate.vue b/north-glass-erp/northglass-erp/src/views/pp/glassOptimize/ProjectCreate.vue
new file mode 100644
index 0000000..eda7c83
--- /dev/null
+++ b/north-glass-erp/northglass-erp/src/views/pp/glassOptimize/ProjectCreate.vue
@@ -0,0 +1,403 @@
+<script setup>
+import ProcessCard from "@/views/pp/glassOptimize/page/ProcessCard.vue";
+import ProcessCardDetail from "@/views/pp/glassOptimize/page/ProcessCardDetail.vue";
+import ProjectList from "@/views/pp/glassOptimize/page/ProjectList.vue";
+
+import {defineEmits, nextTick, onMounted, reactive, ref} from "vue";
+import {useI18n} from "vue-i18n";
+import GlassComputed from "@/views/pp/glassOptimize/GlassComputed.vue";
+import ProjectMange from "@/views/pp/glassOptimize/ProjectMange.vue";
+import request from "@/utils/request";
+import {ElMessage, ElMessageBox} from "element-plus";
+import deepClone from "@/utils/deepClone";
+import {useRouter} from "vue-router";
+import {changeFilterEvent, filterChanged} from "@/hook";
+
+const router = useRouter();
+let projectRow = ref({
+  processId:null,
+  technologyNumber:null
+})
+
+const  processCardRef=ref(null)
+
+const handleProcessIdUpdate = newProcessId => {
+  projectRow.value.processId = newProcessId;
+
+};
+
+const handleTechnologyNumberUpdate = newTechnologyNumber => {
+  projectRow.value.technologyNumber = newTechnologyNumber;
+};
+
+const updateState = state => {
+  getProject();
+
+};
+
+
+const { t } = useI18n()
+
+const xGrid = ref()
+
+
+const gridOptions = reactive({
+  height:'100%',
+  loading: false,
+  border:  "full",//琛ㄦ牸鍔犺竟妗�
+  keepSource: true,//淇濇寔婧愭暟鎹�
+  align: 'center',//鏂囧瓧灞呬腑
+  stripe:true,//鏂戦┈绾�
+  rowConfig: {isCurrent: true, isHover: true,height: 30, useKey: true},//榧犳爣绉诲姩鎴栭�夋嫨楂樹寒
+  id: 'ProjectList',
+  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:[
+    {field: 'id',width: 150, title: 'ID'},
+    {field: 'projectNumber',width: 150, title: '宸ョ▼鍙�',filters:[{ data: '' }],slots: { filter: 'num1_filter' }, sortable: true,filterMethod:filterChanged},
+    {field: 'project_name',width: 150, title: '椤圭洰鍚嶇О',filters:[{ data: '' }],slots: { filter: 'num1_filter' }, sortable: true,filterMethod:filterChanged},
+    {field: 'glass_type',width: 150, title: '鑶滅郴',filters:[{ data: '' }],slots: { filter: 'num1_filter' }, sortable: true,filterMethod:filterChanged},
+    {field: 'glass_thickness',width: 150, title: '鍘氬害',filters:[{ data: '' }],slots: { filter: 'num1_filter' }, sortable: true,filterMethod:filterChanged},
+    {field: 'type',width: 150, title: '绫诲瀷',filters:[{ data: '' }],slots: { filter: 'num1_filter' }, sortable: true,filterMethod:filterChanged},
+    {field: 'state',width: 150, title: '鐘舵��',filters:[{ data: '' }],slots: { filter: 'num1_filter' }, sortable: true,filterMethod:filterChanged},
+    {field: 'quantity',width: 150, title: t('order.quantity')},
+    {field: 'glass_total_area',width: 150, title: t('order.grossArea'),filters:[{ data: '' }],slots: { filter: 'num1_filter' }, sortable: true,filterMethod:filterChanged},
+    {field: 'process_qty',width: 150, title: '娴佺▼鏁伴噺',filters:[{ data: '' }],slots: { filter: 'num1_filter' }, sortable: true,filterMethod:filterChanged},
+    {field: 'process_cards',width: 150, title: '娴佺▼鍗″彿',filters:[{ data: '' }],slots: { filter: 'num1_filter' }, sortable: true,filterMethod:filterChanged},
+
+  ],//琛ㄥご鍙傛暟
+  data:null,//琛ㄦ牸鏁版嵁
+  toolbarConfig: {
+    buttons: [
+    ],
+    import: false,
+    // export: true,
+    // print: true,
+    zoom: true,
+    custom: true
+  },
+  //鍙抽敭鑿滃崟閫夐」
+  menuConfig: {
+    body: {
+      options: [
+        [
+          {code: 'openProject', name: '鎵撳紑宸ョ▼', prefixIcon: 'vxe-icon-folder-open'},
+          {code: 'updateProject', name: '淇敼宸ョ▼', prefixIcon: 'vxe-icon-folder-open'},
+          {code: 'compute', name: '妯℃嫙璁$畻', prefixIcon: 'vxe-icon-subtable'},
+          {code: 'delProject', name: '鍒犻櫎宸ョ▼', prefixIcon: 'vxe-icon-delete'},
+        ],
+        []
+      ]
+    }
+  }
+
+})
+
+// 瀹氫箟鎿嶄綔閰嶇疆瀵硅薄鏁扮粍锛岄泦涓鐞嗕笉鍚屾搷浣滈�夐」瀵瑰簲鐨勫弬鏁�
+const operationConfigs = [
+  {
+    code: 'openProject', // 鎵撳紑宸ョ▼
+    initialState: ['1'], //
+    targetState: null,
+    successMsg: '宸叉墦寮�锛�',
+    checkMessage: '褰撳墠宸ョ▼鐘舵�佷笉绗﹀悎鏉′欢锛岃纭宸ョ▼鐘舵�佸悗鍐嶆搷浣滐紒',
+    requiresRow: true,
+    openFile: async ({row}) => {
+      const projectNumber = row.projectNumber;
+      const thickness = row.glass_thickness;
+      const glassType = row.glass_type;
+      const quantity = row.quantity;
+      const area = row.glass_total_area;
+      const optimizeState = row.optimize_state;
+      await router.push({
+        name: 'optimizeInfo',
+        params: {
+          projectNo: projectNumber,
+          thickNess: thickness,
+          model: glassType,
+          quantity: quantity,
+          area: area,
+          optimizeState:optimizeState
+        }
+      });
+    }
+  },
+  {
+    code: 'compute', // 鎵撳紑妯℃嫙璁$畻鎿嶄綔
+    initialState: ['1'], //
+    targetState: null,
+    successMsg: '妯℃嫙璁$畻宸插惎鍔紒',
+    checkMessage: '褰撳墠宸ョ▼鐘舵�佷笉绗﹀悎妯℃嫙璁$畻鏉′欢锛岃纭宸ョ▼鐘舵�佸悗鍐嶆搷浣滐紒',
+    requiresRow: true,
+    actionFunction: async ({row}) => {
+      const projectNo = row.projectNumber;
+      emit('switch-dialog', row);
+    }
+  },
+  {
+    code: 'delProject',
+    initialState: ['1'],
+    targetState: null,
+    successMsg: '宸ョ▼鍒犻櫎鎴愬姛锛�',
+    checkMessage: '褰撳墠宸ョ▼鐘舵�佷笉绗﹀悎鍒犻櫎鏉′欢锛岃纭宸ョ▼鐘舵�佸悗鍐嶆搷浣滐紒',
+  },
+  {
+    code: 'updateProject',
+        initialState: ['1'],
+      targetState: null,
+      successMsg: '',
+      checkMessage: '褰撳墠宸ョ▼鐘舵�佷笉绗﹀悎鍒犻櫎鏉′欢锛岃纭宸ョ▼鐘舵�佸悗鍐嶆搷浣滐紒',
+  }
+
+];
+
+//瀹氫箟鍒囨崲妯℃嫙璁$畻寮圭獥
+const emit = defineEmits(['switch-dialog']);
+
+onMounted(async () => {
+  getProject();
+})
+
+// 瀹氫箟鏁版嵁杩斿洖缁撴灉锛屼娇鐢╮ef鍒涘缓鍝嶅簲寮忔暟鎹紝鍒濆鍖栦负绌烘暟缁�
+let produceList = ref([])
+
+const getProject = ()=>{
+  request.post(`/glassOptimize/getProjectList`).then((res) => {
+    if(res.code==200){
+      produceList.value = deepClone(res.data.data);
+      xGrid.value.loadData(produceList.value)
+    }else{
+      ElMessage.warning(res.msg)
+    }
+  })
+}
+
+// 鍏叡澶勭悊鍑芥暟锛屽鐞嗙浉鍚屾暟鎹椂鐨勬搷浣滐紝骞惰繑鍥瀟argetRoute瀵硅薄锛堝彸閿彍鍗曞拰鍙屽嚮鎵撳紑锛�
+const handleSameDataOperation = async ({projectNumber, thickness, glassType,quantity,glass_total_area,optimize_state}) => {
+  const targetRoute = {
+    name: 'optimizeInfo',
+    params: {
+      projectNo: projectNumber,
+      thickNess: thickness,
+      model: glassType,
+      quantity: quantity,
+      area: glass_total_area,
+      optimizeState:optimize_state
+    }
+  };
+  const currentRoute = router.currentRoute.value;
+  const isRoutesEqual = currentRoute.name === targetRoute.name &&
+      currentRoute.params.projectNo === targetRoute.params.projectNo &&
+      currentRoute.params.thickNess === targetRoute.params.thickNess &&
+      currentRoute.params.model === targetRoute.params.model;
+  if (isRoutesEqual) {
+    handleConfirm();
+  }
+  return {isRoutesEqual};
+};
+
+//閫変腑鐩稿悓鏁版嵁鏃跺脊绐楁彁绀�
+const handleConfirm = () => {
+  const currentRoute = router.currentRoute.value;
+  const projectNumber = currentRoute.params.projectNo;
+  ElMessageBox.confirm(`褰撳墠宸ョ▼锛堝伐绋嬪彿锛�${projectNumber}锛夊凡鎵撳紑锛屾槸鍚﹂噸鏂版墦寮�锛焋, '纭鎿嶄綔', {
+    confirmButtonText: '纭畾',
+    cancelButtonText: '鍙栨秷',
+    type: 'warning'
+  })
+      .then(() => {
+        emit('close-detail-page');
+        ElMessage.success('宸叉墦寮�锛�');
+      })
+      .catch(() => {
+        ElMessage.info('宸插彇娑堟搷浣�');
+      });
+};
+
+const gridEvents = {
+  menuClick({menu, row}) {
+    const $grid = xGrid.value;
+    if ($grid) {
+      const config = operationConfigs.find(c => c.code === menu.code);
+      if (config) {
+        if (config.requiresRow && !row) {
+          ElMessage.warning('鏈�変腑宸ョ▼锛岃閫変腑宸ョ▼鍚庡啀杩涜褰撳墠鎿嶄綔锛�');
+          return;
+        }
+        if (config.code === 'compute') {
+          config.actionFunction({row});
+          return;
+        }
+        if (config.code === 'updateProject') {
+          if (!row) {
+            ElMessage.warning(config.checkMessage);
+            return;
+          }
+          nextTick(() => {
+            processCardRef.value.getUpdateFlowCardList(row.projectNumber, row.glass_type, row.glass_thickness);
+          });
+          return;
+        }
+        if (config.code === 'openProject') {
+          handleSameDataOperation(row).then(({isRoutesEqual}) => {
+            if (!isRoutesEqual) {
+              config.openFile({row});
+              ElMessage.success(config.successMsg);
+            }
+          });
+          return;
+        }
+        // 娣诲姞纭鎻愮ず寮圭獥锛岃闂敤鎴锋槸鍚﹁繘琛屽綋鍓嶆搷浣�
+        ElMessageBox.confirm('鏄惁杩涜褰撳墠鎿嶄綔锛�', '纭鎿嶄綔', {
+          confirmButtonText: '纭畾',
+          cancelButtonText: '鍙栨秷',
+          type: 'warning'
+        }).then(() => {
+          if (config.code === 'delProject') {
+            if (!row) {
+              ElMessage.warning(config.checkMessage);
+              return;
+            }
+            const isInitialStateMatched = config.initialState.includes(String(row.state));
+            if (!isInitialStateMatched) {
+              ElMessage.warning(config.checkMessage);
+              return;
+            }
+            deleteProject(row.projectNumber, config);
+          }
+        }).catch(() => {
+          // 鐢ㄦ埛鐐瑰嚮鍙栨秷鍚庢墽琛岀殑閫昏緫
+          ElMessage.info('宸插彇娑堟搷浣�');
+        });
+      } else {
+        console.error(`鏈壘鍒版搷浣滈�夐」 ${menu.code} 瀵瑰簲鐨勯厤缃紝璇锋鏌ラ厤缃」`);
+      }
+    }
+  }
+};
+
+
+function deleteProject(projectNumber, config) {
+  request.post(`/glassOptimize/deleteProject/${projectNumber}`, {
+    headers: {
+      'Content-Type': 'application/json'
+    }
+  }).then((res) => {
+    if (res.code==200 && res.data===true) {
+      ElMessage.success(config.successMsg);
+      // 浠庡垪琛ㄤ腑绉婚櫎宸插垹闄ょ殑宸ョ▼鏁版嵁
+      const index = produceList.value.findIndex(item => item.projectNumber === projectNumber);
+      if (index !== -1) {
+        produceList.value.splice(index, 1);
+        xGrid.value.reloadData(produceList.value);
+      }
+      //鍒锋柊宸ョ▼鍙�
+      processCardRef.value.getProjectId();
+      processCardRef.value.selectGlassType();
+      processCardRef.value.selectFlowCardList();
+    } else {
+      console.log('res.code 鐨勫��:', res.code, ', 绫诲瀷:', typeof res.code);
+      console.log('res.msg 鐨勫��:', res.msg, ', 绫诲瀷:', typeof res.msg);
+      const errorMsg = res.data ? res.data.errorMessage : config.failureMsg;
+      ElMessage.error(`鎿嶄綔澶辫触锛屽師鍥�: ${errorMsg}`);
+    }
+  }).catch((error) => {
+    console.error('璇锋眰鍑洪敊锛屽伐绋嬪垹闄ゆ湭瀹屾垚锛岃缁嗛敊璇俊鎭�:', error);
+    ElMessage.error(`璇锋眰鍑洪敊锛屽伐绋嬪垹闄ゆ湭瀹屾垚锛屽師鍥�: ${errorMsg}`);
+  });
+}
+
+</script>
+
+<template>
+  <div style="width: 100%; height: 100%;">
+
+    <div id="processCard">
+      <process-card ref="processCardRef" :process-id="projectRow.processId===null?null:projectRow.processId"
+                    :technology-number="projectRow.technologyNumber===null?null:projectRow.technologyNumber"
+                    @updateProcessId="handleProcessIdUpdate"
+                    @updateTechnologyNumber="handleTechnologyNumberUpdate"
+                    @updateState="updateState"
+      />
+    </div>
+
+    <div id="processCard-detail" >
+      <process-card-detail :process-id="projectRow.processId===null?null:projectRow.processId"
+                           :technology-number="projectRow.technologyNumber===null?null:projectRow.technologyNumber"/>
+    </div>
+
+    <div id="project-list">
+      <div style="width: 100%;height: 100%">
+        <h2>宸ョ▼鍒楄〃</h2>
+        <vxe-grid
+            size="small"
+            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>
+            </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>
+        </vxe-grid>
+      </div>
+    </div>
+
+
+
+  </div>
+</template>
+
+
+<style scoped>
+#processCard{
+  width: 64%;
+  height: 55%;
+  float: left;
+}
+#processCard-detail{
+  margin-left: 1%;
+  float: left;
+  width: 35%;
+  height: 55%;
+}
+#project-list{
+  float: left;
+  margin-top: 2%;
+  width: 100%;
+  height: 30%;
+}
+</style>
\ No newline at end of file

--
Gitblit v1.8.0