m0_70156489 2 days ago
parent
commit
ae1ea6489b

+ 154 - 27
src/view/performance/WorkScoreReporting/gongfenbaogong.vue

@@ -13,8 +13,9 @@
                   @keyup.enter="add_onSubmit"
                   id="searchInput"
                   class="gongfen-order-search-input"
+                  :disabled="workScoreDialogVisible"
                 />
-                <el-button type="primary" icon="search" class="gongfen-search-btn" @click="add_onSubmit">查询</el-button>
+                <el-button type="primary" icon="search" class="gongfen-search-btn" :disabled="workScoreDialogVisible" @click="add_onSubmit">查询</el-button>
                 <span class="gongfen-toolbar-label">机台号</span>
                 <el-input v-model="add_formData['机台号']" readonly class="gongfen-toolbar-field" />
                 <span class="gongfen-toolbar-label">工序</span>
@@ -41,7 +42,7 @@
             
               <div class="gongfen-report-tabs">
                 <!-- 表格数据 -->
-                  <el-tabs v-model="activeName" @tab-change="relayoutGongfenHistoryTable">
+                  <el-tabs v-model="activeName" @tab-click="onGongfenTabClick">
                       <el-tab-pane label="当天报工记录" name="first">
                         <el-table
                           ref="gongfenHistoryTableRef"
@@ -676,6 +677,8 @@ const getGongfenHistorySummaries = ({ columns, data }) => {
 const _code = ref('裁剪')
 //全局接口接受的物理地址
 const Machine = ref('')
+/** 机台 MAC 映射是否就绪;失败时禁止报工,避免静默落入测试机台 */
+const machineReady = ref(false)
 //全局获取UniqId
 const UniqId = ref('')
 
@@ -686,33 +689,39 @@ const selectedEmployee = ref('')
 //物理地址获取机台编号
 const getMachineMacdata = async () => {
   try {
-    const data  = await getMachineMac({sys_sbID:Machine.value});
+    const data = await getMachineMac({ sys_sbID: Machine.value })
     if (data.data === null) {
-        // ElMessage({
-        // 	type: 'error',
-        // 	message: '未获取到机台编号请确认MAC地址或与管理员联系'
-        // })
-        add_formData['机台号'] = '测试机台'
-        add_formData['工序'] = _code.value
-        add_formData['组别'] = "测试"
-        add_formData['人员'] = "测试"
-        return;
+      machineReady.value = false
+      add_formData['机台号'] = ''
+      add_formData['工序'] = ''
+      add_formData['组别'] = ''
+      add_formData['人员'] = ''
+      employees.value = []
+      ElMessage.error('未获取到机台编号,请确认 MAC 地址或与管理员联系')
+      return
     }
     add_formData['机台号'] = data.data['机台号']
     add_formData['工序'] = data.data['生产工序']
     add_formData['组别'] = data.data['组别']
     add_formData['人员'] = data.data['组长']
     _code.value = data.data['生产工序']
-    // 获取员工数据
+    machineReady.value = true
     getEmployeeData(data.data['机台号'])
     setTimeout(() => {
-        const inputElement = document.getElementById('searchInput');
-        if (inputElement) {
-            inputElement.focus();
-        }
-    }, 100); // 延迟100毫秒
+      const inputElement = document.getElementById('searchInput')
+      if (inputElement) {
+        inputElement.focus()
+      }
+    }, 100)
   } catch (error) {
     console.error(error)
+    machineReady.value = false
+    add_formData['机台号'] = ''
+    add_formData['工序'] = ''
+    add_formData['组别'] = ''
+    add_formData['人员'] = ''
+    employees.value = []
+    ElMessage.error('获取机台信息失败,请检查本机服务后刷新页面')
   }
 }
 
@@ -926,6 +935,11 @@ const openWorkScoreDialog = async () => {
     warningres('请先查询订单信息');
     return;
   }
+  const machineNo = String(add_formData['机台号'] || '').trim()
+  if (!machineReady.value || !machineNo) {
+    warningres('未获取到机台信息,请确认本机 MAC 服务或与管理员联系后再报工')
+    return
+  }
 
   resetWorkScoreDialogState()
   const hasData = await loadProcessParts()
@@ -936,14 +950,17 @@ const openWorkScoreDialog = async () => {
 };
 
 const loadOrderAttachments = async (orderNo) => {
+  const seq = ++attachmentQuerySeq
   try {
     const jsOrderAttachments = await OrderAttachments({ order: orderNo, desc: '技术附件' })
     const ddOrderAttachments = await OrderAttachments({ order: orderNo, desc: '订单资料附件' })
+    if (seq !== attachmentQuerySeq) return
     const jsList = jsOrderAttachments?.data?.list || []
     const ddList = ddOrderAttachments?.data?.list || []
     jstableData.splice(0, jstableData.length, ...jsList)
     ddtableData.splice(0, ddtableData.length, ...ddList)
   } catch (error) {
+    if (seq !== attachmentQuerySeq) return
     console.error('获取附件失败:', error)
     jstableData.length = 0
     ddtableData.length = 0
@@ -1556,9 +1573,16 @@ const GetAddr =  () => {
         result += res.macAddress[i]
       }
       Machine.value = result
-    getMachineMacdata(Machine.value)
+      getMachineMacdata(Machine.value)
+    } else if (xmlhttp.readyState == 4) {
+      machineReady.value = false
+      ElMessage.error('无法连接本机 MAC 服务(127.0.0.1:8090),请检查后刷新页面')
     }
   }
+  xmlhttp.onerror = function() {
+    machineReady.value = false
+    ElMessage.error('无法连接本机 MAC 服务(127.0.0.1:8090),请检查后刷新页面')
+  }
   // 3. 打开一个连接
   xmlhttp.open("get", "http://127.0.0.1:8090/init")
   //  5. 发送
@@ -1626,6 +1650,24 @@ const refreshProcessProduction = async () => {
   }
 }
 
+/** 点击「当天报工记录 / 工序产量核查」时重新拉取最新数据(含再次点击当前 Tab) */
+const onGongfenTabClick = async (pane) => {
+  const name = pane?.paneName ?? pane?.props?.name
+  if (name === 'first') {
+    await getGongfenHistory()
+    return
+  }
+  if (name === 'processProduction') {
+    await refreshProcessProduction()
+  }
+  relayoutGongfenHistoryTable()
+}
+
+// 查询请求序号:丢弃过期响应,避免连扫串单
+let orderQuerySeq = 0
+let historyQuerySeq = 0
+let attachmentQuerySeq = 0
+
 // 查询
 /** 子订单号如 DC2605017-0800 转为订单号 DC2605017 再查询 */
 const normalizeOrderSearchInput = (val) => {
@@ -1636,12 +1678,17 @@ const normalizeOrderSearchInput = (val) => {
 }
 
 const add_onSubmit = async ()=>{
+  if (workScoreDialogVisible.value) {
+    warningres('请先关闭工分报工窗口后再查询其他订单,避免报错单')
+    return
+  }
   const searchKey = normalizeOrderSearchInput(add_searchInfo.value)
   if (!searchKey) {
     warningres('请扫描订单二维码')
     return;
   }
   add_searchInfo.value = searchKey
+  const seq = ++orderQuerySeq
 
   try {
     const response = await WorkOrderList({
@@ -1649,6 +1696,7 @@ const add_onSubmit = async ()=>{
       page: 1,
       limit: 10,
     });
+    if (seq !== orderQuerySeq) return
     const list = response.data?.data || []
     const total = response.data?.total ?? list.length
     if (response.code === 0 && response.data) {
@@ -1665,6 +1713,32 @@ const add_onSubmit = async ()=>{
 
         // 获取工分报工历史记录
         await getGongfenHistory();
+        if (seq !== orderQuerySeq) return
+
+        const searchValue = getActiveOrderNo();
+
+        // 附件加载失败不影响查询结果
+        await loadOrderAttachments(searchValue);
+        if (seq !== orderQuerySeq) return
+
+        // 查询成功后清空搜索框,便于继续扫描下一单
+        add_searchInfo.value = '';
+        _searchInput();
+      }
+    } else {
+      warningres(response.msg || '查询失败');
+      orderInfoList.length = 0;
+      currentOrderNo.value = '';
+    }
+  } catch (error) {
+    if (seq !== orderQuerySeq) return
+    console.error('查询订单失败:', error);
+    warningres('网络错误,请稍后重试');
+  }
+};
+
+// 获取工分报工历史记录
+        await getGongfenHistory();
 
         const searchValue = getActiveOrderNo();
 
@@ -1688,11 +1762,13 @@ const add_onSubmit = async ()=>{
 
 // 获取工分报工历史记录
 const getGongfenHistory = async () => {
+  const seq = ++historyQuerySeq
   try {
     const response = await GetReportingWorkRecord({
       date: currentDates,
       machine: add_formData['机台号']
     });
+    if (seq !== historyQuerySeq) return
     if (response.code === 0 && response.data) {
       gongfenHistoryData.value = response.data || [];
     } else {
@@ -1700,6 +1776,7 @@ const getGongfenHistory = async () => {
     }
     relayoutGongfenHistoryTable()
   } catch (error) {
+    if (seq !== historyQuerySeq) return
     console.error('获取工分报工历史记录失败:', error);
     gongfenHistoryData.value = [];
     relayoutGongfenHistoryTable()
@@ -1708,20 +1785,46 @@ const getGongfenHistory = async () => {
 
 const deleteReportingWork = async (row) => {
   try {
-    await ElMessageBox.confirm('确定要删除这条报工记录吗?', '提示', {
-      confirmButtonText: '确定',
-      cancelButtonText: '取消',
-      type: 'warning'
-    });
+    const escapeHtml = (val) => String(val ?? '')
+      .replace(/&/g, '&amp;')
+      .replace(/</g, '&lt;')
+      .replace(/>/g, '&gt;')
+      .replace(/"/g, '&quot;')
+    const processCode = escapeHtml(row?.process_code) || '-'
+    const processName = escapeHtml(row?.process_name) || '-'
+    const staffName = escapeHtml(row?.staff_name) || '-'
+    const number = escapeHtml(row?.number) || '-'
+    await ElMessageBox.confirm(
+      `<div class="gongfen-delete-msg">
+        <div>确定要删除这条报工记录吗?</div>
+        <div class="gongfen-delete-msg__row">工序号:<strong>${processCode}</strong></div>
+        <div class="gongfen-delete-msg__row">工序名称:<strong>${processName}</strong></div>
+        <div class="gongfen-delete-msg__row">员工姓名:<strong>${staffName}</strong></div>
+        <div class="gongfen-delete-msg__row">数量:<strong>${number}</strong></div>
+      </div>`,
+      '提示',
+      {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning',
+        dangerouslyUseHTMLString: true,
+        customClass: 'gongfen-delete-confirm',
+      }
+    );
     
+    const deleteId = row?.id ?? row?.ID
+    if (deleteId === undefined || deleteId === null || deleteId === '') {
+      ElMessage.warning('缺少报工记录ID,无法删除')
+      return
+    }
     const response = await DeleteReportingWork({
-      id: row.id
+      id: deleteId
     });
     
     if (response.code === 0) {
       ElMessage.success('删除成功');
-      // 刷新数据
-      getGongfenHistory();
+      await getGongfenHistory();
+      await refreshProcessProduction();
     } else {
       ElMessage.error(response.msg || '删除失败');
     }
@@ -1872,6 +1975,7 @@ const submitEditReportingQty = async () => {
       ElMessage.success(res.msg || '修改成功')
       editReportingQtyVisible.value = false
       await getGongfenHistory()
+      await refreshProcessProduction()
     } else {
       ElMessage.error(res?.msg || '修改失败')
     }
@@ -3226,4 +3330,27 @@ const warningres = (arr) => {
   margin-right: 0;
   margin-bottom: 6px;
 }
+
+/* 工分报工删除确认:图标顶对齐,工序信息左对齐 */
+.gongfen-delete-confirm .el-message-box__container {
+  align-items: flex-start;
+}
+.gongfen-delete-confirm .el-message-box__status {
+  top: 2px;
+}
+.gongfen-delete-confirm .el-message-box__message {
+  padding-left: 0;
+  text-align: left;
+}
+.gongfen-delete-confirm .gongfen-delete-msg {
+  text-align: left;
+  line-height: 1.7;
+}
+.gongfen-delete-confirm .gongfen-delete-msg__row {
+  margin-top: 6px;
+}
+.gongfen-delete-confirm .gongfen-delete-msg__row strong {
+  color: #f56c6c;
+  font-weight: 600;
+}
 </style>

+ 30 - 12
src/view/performance/chafengbaogong.vue

@@ -452,6 +452,8 @@ const currentDates = `${year}-${month}-${day}`;
 const _code = '车缝'
 //全局接口接受的物理地址
 const Machine = ref('')
+/** 机台 MAC 是否已成功映射;失败时不写入「测试机台」 */
+const machineReady = ref(false)
 //全局获取UniqId
 const UniqId = ref('')
 
@@ -461,14 +463,13 @@ const UniqId = ref('')
 		try {
 			const data = await getMachineMac({sys_sbID: Machine.value});
 			if (data.data === null) {
-				// ElMessage({
-				// 	type: 'error',
-				// 	message: '未获取到机台编号请确认MAC地址或与管理员联系'
-				// })
-				add_formData['机台号'] = '测试机台'
-				add_formData['工序'] = _code
-				add_formData['组别'] = "测试"
-				add_formData['人员'] = "测试"
+				machineReady.value = false
+				add_formData['机台号'] = ''
+				add_formData['工序'] = ''
+				add_formData['工序名称'] = ''
+				add_formData['组别'] = ''
+				add_formData['人员'] = ''
+				ElMessage.error('未获取到机台编号,请确认 MAC 地址或与管理员联系')
 				return;
 			} else {
 				add_formData['机台号'] = data.data['机台号']
@@ -476,6 +477,7 @@ const UniqId = ref('')
 				add_formData['工序名称'] = data.data['生产工序']
 				add_formData['组别'] = data.data['组别']
 				add_formData['人员'] = data.data['组长']
+				machineReady.value = true
 				setTimeout(() => {
 					const inputElement = document.getElementById('searchInput');
 					if (inputElement) {
@@ -485,6 +487,13 @@ const UniqId = ref('')
 			}
 		} catch (error) {
 			console.error(error)
+			machineReady.value = false
+			add_formData['机台号'] = ''
+			add_formData['工序'] = ''
+			add_formData['工序名称'] = ''
+			add_formData['组别'] = ''
+			add_formData['人员'] = ''
+			ElMessage.error('获取机台信息失败,请检查本机服务后刷新页面')
 		}
 	}
 	//自动获取物理地址
@@ -509,8 +518,15 @@ const UniqId = ref('')
 				}
 				Machine.value = result
 				getMachineMacdata(Machine.value)
+			} else if (xmlhttp.readyState == 4) {
+				machineReady.value = false
+				ElMessage.error('无法连接本机 MAC 服务(127.0.0.1:8090),请检查后刷新页面')
 			}
 		}
+		xmlhttp.onerror = function() {
+			machineReady.value = false
+			ElMessage.error('无法连接本机 MAC 服务(127.0.0.1:8090),请检查后刷新页面')
+		}
 		// 3. 打开一个连接
 		xmlhttp.open("get", "http://127.0.0.1:8090/init")
 		// 5. 发送
@@ -638,8 +654,9 @@ const showPdf = async (row) => {
 	
 	//查询
 	const add_onSubmit = async () => {
-		if(add_formData['机台号'] === ''){
-			warningres('未获取到机台')
+		const machineNo = String(add_formData['机台号'] || '').trim()
+		if (!machineReady.value || !machineNo || machineNo === '测试机台') {
+			warningres('未获取到机台,请确认本机 MAC 服务或与管理员联系后再查询')
 			return false;
 		}
 		if(add_searchInfo.value === ''){
@@ -770,8 +787,9 @@ const add_Dialog = async () => {
         isClickable = true;
     }, 2000);
 
-		if(add_formData['机台号'] === '测试机台'){
-			warningres("测试机台禁止报工")
+		const machineNo = String(add_formData['机台号'] || '').trim()
+		if (!machineReady.value || !machineNo || machineNo === '测试机台') {
+			warningres("未获取到机台,禁止报工")
 			return;
 		}
 		sizeDatas.length = 0;