From 636bd027a92d4bf669410ee550a5ca6324f72c88 Mon Sep 17 00:00:00 2001
From: zhoushihao <zsh19950802@163.com>
Date: 星期一, 27 十月 2025 17:30:03 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 UI-Project/src/views/EngineerScheduling/engineerScheduling.vue |  670 ++++++++++++++++++++++++++++++++++++++++++-------------
 1 files changed, 507 insertions(+), 163 deletions(-)

diff --git a/UI-Project/src/views/EngineerScheduling/engineerScheduling.vue b/UI-Project/src/views/EngineerScheduling/engineerScheduling.vue
index 683aa1b..ee56256 100644
--- a/UI-Project/src/views/EngineerScheduling/engineerScheduling.vue
+++ b/UI-Project/src/views/EngineerScheduling/engineerScheduling.vue
@@ -1,161 +1,201 @@
 <script lang="ts" setup>
-import { ref, computed, watch, onMounted } from 'vue'
-import { useI18n } from 'vue-i18n'
-import { ElMessage, ElTransfer, ElTabs, ElTabPane, ElButton } from 'element-plus'
+import {ref, computed, watch, onMounted} from 'vue'
+import {useI18n} from 'vue-i18n'
+import {ElMessage, ElTransfer, ElTabs, ElTabPane, ElButton} from 'element-plus'
 import request from '@/utils/request'
 
-const { t } = useI18n()
+const {t} = useI18n()
 
 const activeTab = ref('cutting1')
 
 // Transfer缁勪欢鎵�闇�鐨勬暟鎹牸寮�
 interface TransferDataItem {
-    key: string
-    label: string
-    projectNo: string
-    projectName: string
+  key: string
+  label: string
+  projectNo: string
+  projectName: string
 }
 
-// 鎵�鏈夊彲閫夋暟鎹紙宸︿晶锛�
+// Transfer缁勪欢鎵�闇�鐨勬暟鎹牸寮� - 瀹屽杽瀛楁瀹氫箟
+interface TransferDataItem {
+  key: string
+  projectNo: string
+  projectName: string
+  state?: number
+  type?: number
+  glassThickness?: string  // 鐜荤拑鍘氬害
+  glassType?: string       // 鐜荤拑绫诲瀷
+  glassTotal?: number      // 鐜荤拑鎬绘暟
+  glassTotalArea?: number  // 鐜荤拑鎬婚潰绉�
+}
+
+// 鎵�鏈夊彲閫夋暟鎹紙宸︿晶琛ㄦ牸锛�
 const dataSource = ref<TransferDataItem[]>([])
-// 宸查�夋暟鎹殑keys锛堝彸渚э級
-const targetKeys = ref<string[]>([])
-
-// 鏍规嵁褰撳墠鏍囩椤佃幏鍙栧彸渚у垪琛ㄦ爣棰�
-const getRightListTitle = computed(() => {
-    switch (activeTab.value) {
-        case 'cutting1':
-            return t('large.countOutOne')
-        case 'cutting2':
-            return t('large.countOutTwo')
-        case 'tempered':
-            return t('large.temp')
-        default:
-            return '宸叉帓浜�'
+// 宸查�夋暟鎹紙鍙充晶琛ㄦ牸锛�
+const rightDataSource = ref<TransferDataItem[]>([])
+// 宸︿晶琛ㄦ牸閫変腑椤�
+const selectedLeft = ref<TransferDataItem[]>([])
+// 鍙充晶琛ㄦ牸閫変腑椤�
+const selectedRight = ref<TransferDataItem[]>([])
+// 璇︽儏鏁版嵁鐘舵�侊紙鏀逛负鏁扮粍绫诲瀷锛岄�傚簲鍒楄〃杩斿洖锛�
+const detailData = ref<any[]>([]);
+const showDetail = ref(false);
+// 鑾峰彇椤圭洰璇︽儏鎺ュ彛锛堟洿鏂颁负瀹為檯鎺ュ彛锛�
+const fetchProjectDetail = async (projectNo: string) => {
+  try {
+    const response = await request.post('/loadGlass/optimizeProject/selectProgress', {
+      projectNo: projectNo  // 浼犲叆宸ョ▼ID锛坧rojectNo锛�
+    });
+    if (response.code === 200) {
+      detailData.value = response.data;  // 鍋囪杩斿洖鏁扮粍
+      showDetail.value = true;
+    } else {
+      ElMessage.error(`鑾峰彇璇︽儏澶辫触: ${response.message || '鏈煡閿欒'}`);
     }
-})
+  } catch (error) {
+    console.error('鑾峰彇椤圭洰璇︽儏澶辫触:', error);
+    ElMessage.error('鑾峰彇璇︽儏澶辫触锛岃绋嶅悗閲嶈瘯');
+  }
+};
 
-// 鑾峰彇宸︿晶鏁版嵁婧�
+// 鑾峰彇宸︿晶鏁版嵁婧� - 鏇存柊鏄犲皠閫昏緫锛堝寘鍚墍鏈夊瓧娈碉級
 const fetchDataSource = async () => {
-    try {
-        // 鏍规嵁褰撳墠鏍囩椤甸�夋嫨涓嶅悓鐨勬帴鍙�
-        const apiUrl = activeTab.value === 'tempered'
-            ? '/cacheVerticalGlass/bigStorageCageDetails/queryEngineer'
-            : '/loadGlass/optimizeProject/queryEngineer';
+  try {
+    const apiUrl = activeTab.value === 'tempered'
+        ? '/cacheVerticalGlass/bigStorageCageDetails/queryEngineer'
+        : '/loadGlass/optimizeProject/queryEngineer';
 
-        const response = await request.post(apiUrl)
+    const response = await request.post(apiUrl)
 
-        if (response.code === 200) {
-            dataSource.value = response.data.map((item: any) => {
-                const projectNo = activeTab.value === 'tempered' ? item.engineerId : item.projectNo
-                const name = activeTab.value === 'tempered' ? item.engineerId : (item.projectNo + "-" + item.projectName)
-
-                return {
-                    key: projectNo,
-                    label: name,
-                    projectNo: projectNo,
-                    projectName: activeTab.value === 'tempered' ? '' : item.projectName
-                }
-            })
-        } else {
-            ElMessage.error(`鑾峰彇鏁版嵁澶辫触: ${response.message || '鏈煡閿欒'}`)
-        }
-    } catch (error) {
-        console.error('鑾峰彇宸︿晶鏁版嵁澶辫触:', error)
-        ElMessage.error('璇风◢鍚庨噸璇�')
+    if (response.code === 200) {
+      dataSource.value = response.data.map((item: any) => ({
+        key: activeTab.value === 'tempered' ? item.engineerId : item.projectNo,
+        projectNo: activeTab.value === 'tempered' ? item.engineerId : item.projectNo,
+        projectName: item.projectName || '',
+        state: item.state,
+        type: item.type,
+        glassThickness: item.glassThickness || '',
+        glassType: item.glassType || '',
+        glassTotal: item.glassTotal || 0,
+        glassTotalArea: item.glassTotalArea || 0
+      }))
+    } else {
+      ElMessage.error(`鑾峰彇鏁版嵁澶辫触: ${response.message || '鏈煡閿欒'}`)
     }
+  } catch (error) {
+    console.error('鑾峰彇宸︿晶鏁版嵁澶辫触:', error)
+    ElMessage.error('璇风◢鍚庨噸璇�')
+  }
 }
 
-// 鑾峰彇鍙充晶宸查�夋暟鎹�
+// 鑾峰彇鍙充晶宸查�夋暟鎹� - 鐩存帴濉厖鍙充晶琛ㄦ牸
 const fetchTargetKeys = async () => {
-    try {
-        // 鏍规嵁褰撳墠鏍囩椤电‘瀹歵ype鍙傛暟
-        let type = 1; // 榛樿鍒囧壊涓�绾�
-        if (activeTab.value === 'cutting2') {
-            type = 2; // 鍒囧壊浜岀嚎
-        } else if (activeTab.value === 'tempered') {
-            type = 3; // 閽㈠寲
-        }
-
-        const response = await request.post('/loadGlass/optimizeProject/engineerScheduling', {
-            type: type
-        })
-
-        if (response.code === 200) {
-            // 瀵逛簬鎵�鏈夋爣绛鹃〉锛屼娇鐢╬rojectNo浣滀负key
-            targetKeys.value = response.data.map((item: any) => item.projectNo)
-
-            // 灏嗗彸渚ф暟鎹坊鍔犲埌dataSource涓紝纭繚Transfer缁勪欢鑳芥壘鍒板搴旂殑椤�
-            response.data.forEach((item: any) => {
-                // 妫�鏌ataSource涓槸鍚﹀凡瀛樺湪璇ラ」
-                const exists = dataSource.value.some(dataItem => dataItem.key === item.projectNo)
-                if (!exists) {
-                    // 濡傛灉涓嶅瓨鍦紝娣诲姞鍒癲ataSource涓�
-                    const newItem: TransferDataItem = {
-                        key: item.projectNo,
-                        label: `${item.projectNo}-${item.projectName || 'null'}`,
-                        projectNo: item.projectNo,
-                        projectName: item.projectName || ''
-                    }
-                    dataSource.value.push(newItem)
-                }
-            })
-        } else {
-            ElMessage.error(`鑾峰彇鏁版嵁澶辫触: ${response.message || '鏈煡閿欒'}`)
-        }
-    } catch (error) {
-        console.error('鑾峰彇鍙充晶鏁版嵁澶辫触:', error)
-        ElMessage.error('璇风◢鍚庨噸璇�')
+  try {
+    let type = 1;
+    let response;
+    if (activeTab.value === 'cutting2') {
+      type = 2;
+      response = await request.post('/loadGlass/optimizeProject/engineerScheduling', {type})
+    } else if (activeTab.value === 'tempered') {
+      type = 3;
+      response = await request.post('/cacheVerticalGlass/bigStorageCageDetails/queryTemperingOrder')
+    } else {
+      response = await request.post('/loadGlass/optimizeProject/engineerScheduling', {type})
     }
+    if (response.code === 200) {
+      // 鍙充晶琛ㄦ牸鏁版嵁
+      rightDataSource.value = response.data.map((item: any) => ({
+        key: item.projectNo,
+        projectNo: item.projectNo,
+        projectName: item.projectName || '',
+        state: item.state,
+        type: item.type,
+        glassThickness: item.glassThickness || '',
+        glassType: item.glassType || '',
+        glassTotal: item.glassTotal || 0,
+        glassTotalArea: item.glassTotalArea || 0
+      }))
+
+      // 浠庡乏渚ф暟鎹簮绉婚櫎鍙充晶宸查�夋暟鎹�
+      dataSource.value = dataSource.value.filter(
+          item => !rightDataSource.value.some(rightItem => rightItem.key === item.key)
+      )
+    } else {
+      ElMessage.error(`鑾峰彇鏁版嵁澶辫触: ${response.message || '鏈煡閿欒'}`)
+    }
+  } catch (error) {
+    console.error('鑾峰彇鍙充晶鏁版嵁澶辫触:', error)
+    ElMessage.error('璇风◢鍚庨噸璇�')
+  }
 }
 
-// 淇濆瓨鎺掍骇淇℃伅
+// 淇敼锛氭敮鎸佸崟琛屾暟鎹Щ鍔ㄥ埌鍙充晶琛ㄦ牸鏈熬
+const moveToRight = (row: TransferDataItem) => {
+  if (!row) return;
+  // 浠庡乏渚ц〃鏍肩Щ闄ゅ綋鍓嶈
+  dataSource.value = dataSource.value.filter(item => item.key !== row.key);
+  // 娣诲姞鍒板彸渚ц〃鏍兼湯灏�
+  rightDataSource.value.push(row);
+  ElMessage.success(`宸叉坊鍔犻」鐩� ${row.projectNo}`);
+}
+
+
+// 淇敼锛氭敮鎸佸崟琛屾暟鎹粠鍙充晶琛ㄦ牸绉诲洖宸︿晶琛ㄦ牸
+const moveToLeft = (row: TransferDataItem) => {
+  if (!row) return;
+
+  // 浠庡彸渚ц〃鏍肩Щ闄ゅ綋鍓嶈
+  rightDataSource.value = rightDataSource.value.filter(item => item.key !== row.key);
+
+  // 娣诲姞鍒板乏渚ц〃鏍�
+  dataSource.value.push(row);
+
+  ElMessage.success(`宸茬Щ闄ら」鐩� ${row.projectNo}`);
+}
+
+// 鏇存柊淇濆瓨閫昏緫 - 浣跨敤鍙充晶琛ㄦ牸鏁版嵁
 const saveScheduling = async () => {
-    try {
-        // 鏍规嵁褰撳墠鏍囩椤电‘瀹歵ype鍙傛暟
-        let type = 1; // 榛樿鍒囧壊涓�绾�
-        if (activeTab.value === 'cutting2') {
-            type = 2; // 鍒囧壊浜岀嚎
-        } else if (activeTab.value === 'tempered') {
-            type = 3; // 閽㈠寲
-        }
+  try {
+    let type = 1;
+    if (activeTab.value === 'cutting2') type = 2;
+    else if (activeTab.value === 'tempered') type = 3;
 
-        const engineerList = targetKeys.value.map(projectNo => {
-            const dataItem = dataSource.value.find(item => item.key === projectNo)
-            return {
-                projectNo: projectNo,
-                projectName: dataItem ? dataItem.projectName : ''
-            }
-        })
+    // 鍙充晶琛ㄦ牸鏁版嵁鍗充负闇�瑕佷繚瀛樼殑鎺掍骇鏁版嵁
+    const engineerList = rightDataSource.value.map(item => ({
+      projectNo: item.projectNo,
+      projectName: item.projectName
+    }))
 
-        const response = await request.post(`/loadGlass/optimizeProject/updateEngineerScheduling?type=${type}`, engineerList)
+    const response = await request.post(
+        `/loadGlass/optimizeProject/updateEngineerScheduling?type=${type}`,
+        engineerList
+    )
 
-        if (response.code === 200) {
-            ElMessage.success('淇濆瓨鎴愬姛')
-            // 閲嶆柊鍔犺浇鏁版嵁
-            await fetchDataSource()
-            await fetchTargetKeys()
-        } else {
-            ElMessage.error(`淇濆瓨澶辫触: ${response.message || '鏈煡閿欒'}`)
-        }
-    } catch (error) {
-        console.error('淇濆瓨鎺掍骇淇℃伅澶辫触:', error)
-        ElMessage.error('璇风◢鍚庨噸璇�')
+    if (response.code === 200) {
+      ElMessage.success('淇濆瓨鎴愬姛')
+      await fetchDataSource()
+      await fetchTargetKeys()
+    } else {
+      ElMessage.error(`淇濆瓨澶辫触: ${response.message || '鏈煡閿欒'}`)
     }
+  } catch (error) {
+    console.error('淇濆瓨鎺掍骇淇℃伅澶辫触:', error)
+    ElMessage.error('璇风◢鍚庨噸璇�')
+  }
 }
 
 // 閲嶇疆鎺掍骇淇℃伅
 const resetScheduling = async () => {
-    await fetchDataSource()
-    await fetchTargetKeys()
-    ElMessage.info(t('宸插彇娑�'))
+  await fetchDataSource()
+  await fetchTargetKeys()
+  ElMessage.info(t('scheduling.cancelled'))
 }
 
 // 鐩戝惉鏍囩椤靛垏鎹紝鏍规嵁涓嶅悓鏍囩椤靛姞杞藉搴旂殑鏁版嵁
 watch(activeTab, async (newTab) => {
-    // 閲嶆柊鑾峰彇鏁版嵁
-    await fetchDataSource()
-    await fetchTargetKeys()
+  // 閲嶆柊鑾峰彇鏁版嵁
+  await fetchDataSource()
+  await fetchTargetKeys()
 })
 
 
@@ -164,85 +204,389 @@
 
 // 缁勪欢鎸傝浇鏃惰幏鍙栨暟鎹�
 onMounted(async () => {
-    await fetchDataSource()
-    await fetchTargetKeys()
+  await fetchDataSource()
+  await fetchTargetKeys()
 })
+
+// 鍒ゆ柇鏄惁涓虹涓�琛�
+const isFirstRow = (row: TransferDataItem) => {
+  const index = rightDataSource.value.findIndex(item => item.key === row.key);
+  return index === 0;
+};
+
+// 鍒ゆ柇鏄惁涓烘渶鍚庝竴琛�
+const isLastRow = (row: TransferDataItem) => {
+  const index = rightDataSource.value.findIndex(item => item.key === row.key);
+  return index === rightDataSource.value.length - 1;
+};
+
+// 鍒ゆ柇涓婃柟鏄惁鏈夎繘琛屼腑鐨勮锛堜慨澶嶏細浣跨敤姝g‘鐨勭姸鎬佸��1锛�
+const hasInProgressAbove = (row: TransferDataItem) => {
+  const index = rightDataSource.value.findIndex(item => item.key === row.key);
+  // 鏌ユ壘褰撳墠琛屼笂鏂规槸鍚︽湁杩涜涓殑浠诲姟
+  return rightDataSource.value.some((item, i) => i < index && item.state === 1);
+};
+
+// 鍚戜笂绉诲姩涓�琛�
+const moveUp = (row: TransferDataItem) => {
+  const index = rightDataSource.value.findIndex(item => item.key === row.key);
+  if (index > 0) {
+    // 妫�鏌ユ槸鍚︿細瓒呰繃杩涜涓殑浠诲姟
+    const prevItem = rightDataSource.value[index - 1];
+    if (prevItem.state === 1) {
+      // 鐩存帴涓婃柟鏄繘琛屼腑浠诲姟锛屾彁绀虹敤鎴蜂笉鍙秴杩�
+      ElMessage.warning('鎿嶄綔涓嶅彲瓒呰繃杩涜涓殑浠诲姟');
+      return;
+    }
+    // 浜ゆ崲浣嶇疆
+    [rightDataSource.value[index], rightDataSource.value[index - 1]] =
+        [rightDataSource.value[index - 1], rightDataSource.value[index]];
+    // 瑙﹀彂鍝嶅簲寮忔洿鏂�
+    rightDataSource.value = [...rightDataSource.value];
+  }
+};
+
+// 鍚戜笅绉诲姩涓�琛�
+const moveDown = (row: TransferDataItem) => {
+  const index = rightDataSource.value.findIndex(item => item.key === row.key);
+  if (index < rightDataSource.value.length - 1) {
+    // 浜ゆ崲浣嶇疆
+    [rightDataSource.value[index], rightDataSource.value[index + 1]] =
+        [rightDataSource.value[index + 1], rightDataSource.value[index]];
+    // 瑙﹀彂鍝嶅簲寮忔洿鏂�
+    rightDataSource.value = [...rightDataSource.value];
+  }
+};
+
+// 鍒ゆ柇鏄惁鍙互缃《锛堝嵆鏄惁鏈夊彲缃《鐨勪綅缃級
+const canMoveToTop = (row: TransferDataItem) => {
+  // 杩涜涓换鍔′笉鑳界疆椤�
+  if (row.state === 1) return false;
+
+  const index = rightDataSource.value.findIndex(item => item.key === row.key);
+  // 宸茬粡鏄涓�琛岀殑涓嶈兘缃《
+  if (index === 0) return false;
+
+  // 鏌ユ壘绗竴涓潪杩涜涓换鍔$殑浣嶇疆
+  const firstNonProgressIndex = rightDataSource.value.findIndex(item => item.state !== 1);
+
+  // 濡傛灉褰撳墠琛屽凡缁忓湪绗竴涓潪杩涜涓换鍔$殑浣嶇疆鎴栦箣鍓嶏紝鍒欎笉鑳界疆椤�
+  return index > firstNonProgressIndex;
+};
+
+// ... existing code (moveUp鍜宮oveDown鍑芥暟淇濇寔涓嶅彉)
+
+// 缃《锛堢Щ鍔ㄥ埌鎵�鏈夐潪杩涜涓换鍔$殑鏈�鍓嶉潰锛�
+const moveToTop = (row: TransferDataItem) => {
+  const index = rightDataSource.value.findIndex(item => item.key === row.key);
+  if (index > 0) {
+    // 绉婚櫎褰撳墠琛�
+    const newList = rightDataSource.value.filter(item => item.key !== row.key);
+
+    // 鏌ユ壘鎵�鏈夐潪杩涜涓换鍔$殑浣嶇疆
+    const nonProgressIndices = newList
+        .map((item, i) => ({ item, index: i }))
+        .filter(item => item.item.state !== 1)
+        .map(item => item.index);
+
+    if (nonProgressIndices.length > 0) {
+      // 鏈夐潪杩涜涓换鍔★紝娣诲姞鍒扮涓�涓潪杩涜涓换鍔$殑浣嶇疆
+      newList.splice(nonProgressIndices[0], 0, row);
+    } else {
+      // 鍏ㄩ儴閮芥槸杩涜涓换鍔★紝娣诲姞鍒板紑澶�
+      newList.unshift(row);
+    }
+
+    // 鏇存柊鏁版嵁婧�
+    rightDataSource.value = newList;
+  }
+};
+// 鍒涘缓璁$畻灞炴�э紝鏍规嵁鏍囩椤佃繑鍥炰笉鍚岀殑琛ㄥご閰嶇疆
+const tableHeaders = computed(() => {
+  const baseHeaders = {
+    serial: t('scheduling.serial'),
+    projectNo: t('scheduling.projectNo'),
+    thickness: t('scheduling.thickness'),
+    glassType: t('scheduling.glassType'),
+    totalCount: t('scheduling.totalCount'),
+    totalArea: t('scheduling.totalArea'),
+    operate: t('scheduling.operate')
+  };
+  // 鏍规嵁涓嶅悓鏍囩椤佃繑鍥炰笉鍚岀殑琛ㄥご閰嶇疆
+  if (activeTab.value === 'tempered') {
+    return {
+      ...baseHeaders,
+      // 鏇存敼閽㈠寲鏍囩椤电殑鐗瑰畾琛ㄥご
+      totalCount: t('scheduling.totalFireCount'),
+      totalArea: t('scheduling.fullFireCount')
+    };
+  }
+
+  return baseHeaders;
+});
+// 鐘舵�佹牸寮忓寲鍑芥暟
+const stateFormatter = (row: any) => {
+  return row.state === 1 ? '杩涜涓�' : '鏈紑濮�';
+};
+
 </script>
 
 <template>
-    <div class="engineer-scheduling-container">
-        <el-tabs v-model="activeTab" class="custom-tabs">
-            <el-tab-pane :label="t('large.countOutOne')" name="cutting1" />
-            <el-tab-pane :label="t('large.countOutTwo')" name="cutting2" />
-            <el-tab-pane :label="t('large.temp')" name="tempered" />
-        </el-tabs>
+  <div class="engineer-scheduling-container">
+    <el-tabs v-model="activeTab" class="custom-tabs">
+      <el-tab-pane :label="t('large.countOutOne')" name="cutting1"/>
+      <el-tab-pane :label="t('large.countOutTwo')" name="cutting2"/>
+      <el-tab-pane :label="t('large.temp')" name="tempered"/>
+    </el-tabs>
 
-        <div class="transfer-wrapper">
-            <el-transfer v-model="targetKeys" class="custom-transfer" filterable :data="dataSource"
-                :titles="['寰呮帓浜�', getRightListTitle]" :button-texts="['', '']">
-                <template #right-empty>
-                    <el-empty :image-size="80" description="No data" />
-                </template>
-            </el-transfer>
+    <!-- 琛ㄦ牸甯冨眬瀹瑰櫒 -->
+    <div class="table-container">
+      <!-- 宸︿晶琛ㄦ牸锛氬緟鎺掍骇 -->
+      <div class="table-wrapper" v-if="activeTab !== 'tempered'">
+        <h3 class="table-title">{{ t('scheduling.unfinished') }} ({{ dataSource.length }})</h3>
+        <el-table
+            :data="dataSource"
+            border
+            class="custom-table"
+            height="400"
+            row-key="key"
+        >
+          <el-table-column type="index" :label="$t('scheduling.serial')" width="55"/>
+          <el-table-column prop="projectNo" :label="$t('scheduling.projectNo')" width="150"/>
+          <el-table-column prop="glassThickness" :label="$t('scheduling.thickness')" width="120"/>
+          <el-table-column prop="glassType" :label="$t('scheduling.glassType')" width="120"/>
+          <el-table-column prop="glassTotal" :label="$t('scheduling.totalCount')" width="90"/>
+          <el-table-column prop="glassTotalArea" :label="$t('scheduling.totalArea')" width="100"/>
+          <el-table-column :label="$t('scheduling.operate')" width="90" align="center">
+            <template #default="{ row }">
+              <el-button type="primary" @click="moveToRight(row)">
+                {{ t('scheduling.add') }}
+              </el-button>
+            </template>
+          </el-table-column>
+        </el-table>
+      </div>
 
 
-            <div class="transfer-save">
-                <el-button type="primary" @click="saveScheduling">
-                    {{ t('searchOrder.makesure') }}
+      <!-- 鍙充晶琛ㄦ牸锛氬凡鎺掍骇 -->
+      <div class="table-wrapper">
+        <h3 class="table-title">{{ t('scheduling.completed') }} ({{ rightDataSource.length }})</h3>
+        <el-table
+            :data="rightDataSource"
+            border
+            class="custom-table"
+            height="400"
+            row-key="key"
+            @row-click="(row) => fetchProjectDetail(row.key)"
+            highlight-current-row
+        >
+          <el-table-column type="index" :label="tableHeaders.serial" width="55"/>
+          <el-table-column prop="projectNo" :label="tableHeaders.projectNo" width="120"/>
+          <el-table-column prop="glassThickness" :label="tableHeaders.thickness" width="120"/>
+          <el-table-column prop="glassType" :label="tableHeaders.glassType" width="120"/>
+          <el-table-column prop="glassTotal" :label="tableHeaders.totalCount" width="90"/>
+          <el-table-column prop="glassTotalArea" :label="tableHeaders.totalArea" width="120"/>
+          <el-table-column
+              prop="state"
+              :label="t('scheduling.state')"
+              width="90"
+              :formatter="stateFormatter"
+          />
+          <el-table-column :label="t('scheduling.operate')" :width="activeTab === 'tempered' ? 200 : 300" :align="center">
+            <template #default="{ row }">
+              <div style="display: flex; gap: 5px; align-items: center;">
+                <el-button
+                    v-if="activeTab !== 'tempered'"
+                    type="default"
+                    size="small"
+                    @click="moveToLeft(row)"
+                    :disabled="row.state === 1"
+                    style="background: #ff4d4f; color: white; border-radius: 8px; min-width: 60px; display: inline-flex; justify-content: center; align-items: center;"
+                >
+                  {{ t('scheduling.remove') }}
                 </el-button>
-                <el-button type="primary" @click="resetScheduling">
-                    {{ t('delivery.cancel') }}
+                <el-button
+                    type="default"
+                    size="small"
+                    @click="moveUp(row)"
+                    :disabled="row.state === 1 || isFirstRow(row)"
+                    style="background: #E6F4FF; color: #1890FF; border-radius: 8px; min-width: 40px; display: inline-flex; justify-content: center; align-items: center;"
+                >
+                  鈫�
                 </el-button>
-            </div>
-        </div>
+                <el-button
+                    type="default"
+                    size="small"
+                    @click="moveDown(row)"
+                    :disabled="row.state === 1 || isLastRow(row)"
+                    style="background: #E6F4FF; color: #1890FF; border-radius: 8px; min-width: 40px; display: inline-flex; justify-content: center; align-items: center;"
+                >
+                  鈫�
+                </el-button>
+                <el-button
+                    size="small"
+                    @click="moveToTop(row)"
+                    :disabled="row.state === 1 || isFirstRow(row) || !canMoveToTop(row)"
+                    style="background: #E6F4FF; color: #1890FF; border-radius: 8px; min-width: 60px; display: inline-flex; justify-content: center; align-items: center;"
+                >
+                  {{ t('scheduling.top') }}
+                </el-button>
+              </div>
+            </template>
+          </el-table-column>
+        </el-table>
+      </div>
     </div>
+
+    <!-- 淇濆瓨鍜岄噸缃寜閽� -->
+    <div class="transfer-save">
+      <el-button type="primary" @click="saveScheduling">
+        {{ t('searchOrder.makesure') }}
+      </el-button>
+      <el-button type="primary" @click="resetScheduling">
+        {{ t('delivery.cancel') }}
+      </el-button>
+    </div>
+  </div>
+  <!-- 璇︽儏灞曠ず鍖哄煙锛堟敼涓鸿〃鏍煎睍绀哄垪琛ㄦ暟鎹級 -->
+  <div v-if="showDetail" class="project-detail">
+    <!--    <h3 class="detail-title">宸ョ▼璇︽儏鍒楄〃 ({{ detailData.length }})</h3>-->
+    <el-table
+        :data="detailData"
+        border
+        class="detail-table"
+        height="230"
+    >
+      <el-table-column prop="engineerId" :label="$t('scheduling.projectNo')" width="120"/>
+      <el-table-column prop="flowCardId" :label="$t('scheduling.flowCardId')" width="150"/>
+      <el-table-column prop="layer" :label="$t('scheduling.layerCount')" width="80"/>
+      <el-table-column prop="glassType" :label="$t('scheduling.serial')" width="80"/>
+      <el-table-column prop="thickness" :label="$t('scheduling.thickness')" width="100"/>
+      <el-table-column prop="filmsid" :label="$t('scheduling.coatingType')" width="120"/>
+      <el-table-column prop="width" :label="$t('scheduling.width')" width="90"/>
+      <el-table-column prop="height" :label="$t('scheduling.height')" width="90"/>
+      <el-table-column prop="glassIdCount" :label="$t('scheduling.glassCount')" width="80"/>
+      <el-table-column prop="cuttingCount" :label="$t('scheduling.cuttingCount')" width="80"/>
+      <el-table-column prop="edgingCount" :label="$t('scheduling.edgingCount')" width="80"/>
+      <el-table-column prop="temperingCount" :label="$t('scheduling.temperingCount')" width="80"/>
+      <el-table-column prop="insulatingCount" :label="$t('scheduling.insulatingCount')" width="80"/>
+    </el-table>
+  </div>
 </template>
 
+
 <style scoped>
+/* 琛ㄦ牸甯冨眬瀹瑰櫒 */
+.table-container {
+  display: flex;
+  align-items: center;
+  gap: 20px;
+  margin-bottom: 20px;
+}
+
+/* 璇︽儏琛ㄦ牸鏍峰紡 */
+.project-detail {
+  margin-top: 0px;
+  padding: 15px;
+  border: 1px solid #dcdfe6;
+  border-radius: 4px;
+  width: 100%;
+  box-sizing: border-box;
+  height: auto; /* 纭繚瀹瑰櫒楂樺害鑷�傚簲 */
+}
+
+.detail-title {
+  margin-bottom: 15px;
+  font-size: 16px;
+  font-weight: bold;
+  color: #303133;
+}
+
+.detail-table {
+  width: 100%;
+  font-size: 14px;
+}
+
+/* 寮哄埗琛ㄦ牸鍐呭鍖哄煙婊氬姩 */
+::v-deep(.detail-table .el-table__body-wrapper) {
+  overflow-y: auto !important; /* 浼樺厛纭繚鍨傜洿婊氬姩 */
+  max-height: calc(230px - 50px); /* 閫傞厤琛ㄦ牸楂樺害锛堥渶涓巈l-table height鍖归厤锛� */
+}
+
+.table-wrapper {
+  flex: 1;
+}
+
+.table-title {
+  margin-bottom: 10px;
+  font-size: 18px;
+  font-weight: bold;
+  color: #303133;
+}
+
+.custom-table {
+  width: 100%;
+  font-size: 14px;
+}
+
+/* 杞Щ鎸夐挳鏍峰紡 */
+.transfer-buttons {
+  display: flex;
+  flex-direction: column;
+}
+
+/* 璋冩暣鎸夐挳鍖哄煙浣嶇疆 */
+.transfer-save {
+  display: flex;
+  justify-content: center;
+  gap: 10px;
+  margin-top: 20px;
+}
+
 .engineer-scheduling-container {
-    padding: 20px;
-    border: 1px solid #dcdfe6;
-    border-radius: 4px;
-    background-color: #fff;
+  padding: 20px;
+  border: 1px solid #dcdfe6;
+  border-radius: 4px;
+  background-color: #fff;
 }
 
 .custom-tabs {
-    margin-bottom: 20px;
+  margin-bottom: 20px;
 }
 
 ::v-deep(.custom-tabs .el-tabs__item) {
-    font-size: 20px;
+  font-size: 20px;
 }
 
 .transfer-wrapper {
-    display: flex;
-    flex-direction: column;
-    align-items: center;
-    gap: 20px;
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  gap: 20px;
 }
 
 .transfer-save {
-    display: flex;
-    gap: 10px;
+  display: flex;
+  gap: 10px;
 }
 
 /* 鑷畾涔塗ransfer缁勪欢鐨勬牱寮� */
 ::v-deep(.el-transfer-panel) {
-    font-size: 16px;
-    width: 350px;
-    height: 440px;
+  font-size: 16px;
+  width: 350px;
+  height: 440px;
 }
 
 .custom-transfer {
-    --el-transfer-panel-body-height: 400px;
+  --el-transfer-panel-body-height: 400px;
 }
 
 ::v-deep(.el-transfer-panel__header) {
-    font-weight: bold;
-    font-size: 18px;
+  font-weight: bold;
+  font-size: 18px;
 }
 
 ::v-deep(.el-checkbox__label) {
-    font-size: 16px;
+  font-size: 16px;
 }
 </style>

--
Gitblit v1.8.0