活动介绍

DataTables warning: table id=datalist - Requested unknown parameter 'state' for row 0, column 18. For more information about this error, please see http://datatables.net/tn/4

时间: 2024-03-29 16:34:38 浏览: 315
这个错误提示表明在使用DataTables时,你请求了一个不存在的列("state"),可能是因为你的表格数据源没有该列或者列的名称不同。你可以检查你的表格数据源和表格列名称是否匹配。另外,你也可以使用DataTables提供的调试工具(如开发者工具)来查看更详细的错误信息。详情请参考该链接提供的文档。
相关问题

DataTables warning: table id=dataTable - Cannot reinitialise DataTable. For more information about this error, please see http://datatables.net/tn/3

<think>嗯,用户遇到了DataTables无法重新初始化的问题,也就是那个“Cannot reinitialise DataTable”的错误。我需要根据提供的引用内容来整理解决方案。首先,用户可能是在同一个表格上多次初始化了DataTable,导致冲突。根据引用[1],使用retrieve:true可以解决,因为它允许获取已有的实例而不是重新初始化。但引用[2]提到,有些情况下可能需要先销毁旧的实例,用destroy方法。不过引用[3]指出在模态框中使用destroy可能会有问题,这时候应该用retrieve。引用[4]中的例子用了destroy:true,但可能在某些情况下需要结合其他设置。 所以,我需要总结不同场景下的解决方法。首先检查是否已经存在实例,如果存在,可以选择销毁或者检索。然后,推荐优先使用retrieve,如果不行再尝试destroy。另外,用户可能在动态加载数据,比如通过AJAX,这时候需要正确销毁表格再重新初始化。模态框的情况比较特殊,因为关闭后DOM可能还在,导致多次初始化,这时候retrieve更合适。 还要注意配置参数的正确性,比如在Angular中使用destroy:true,或者在初始化时确保选项一致。用户可能需要根据具体情况选择不同的方案,所以需要分情况说明,并给出示例代码,比如如何销毁再初始化,或者直接使用retrieve。同时,提醒用户参考官方文档的链接,确保解决方案的可靠性。最后,生成相关问题帮助用户进一步排查问题,比如优化AJAX请求或者处理模态框中的表格。</think>针对DataTables的"Cannot reinitialise DataTable"错误,以下是系统级解决方案: ### 核心解决思路 该错误本质是重复初始化同一DOM元素导致的冲突。通过$('#table').DataTable()方法初始化后,DataTables会在内存中保留实例引用[^3] ### 三级解决方案体系 #### 1. 基础方案(推荐) 在初始化配置中加入`retrieve:true`参数: ```javascript $('#example').DataTable({ retrieve: true, // 其他配置... }); ``` `retrieve:true`表示获取已有实例而非新建,允许有限度地重新配置表格[^1] #### 2. 强制销毁重建 当需要完全重置表格时,先检测实例是否存在: ```javascript if ($.fn.dataTable.isDataTable('#example')) { $('#example').DataTable().destroy(true); } // 重新初始化 $('#example').DataTable({/*新配置*/}); ``` `destroy(true)`会清除所有事件监听和DOM残留[^2] #### 3. 动态内容场景优化 对于模态框等动态加载场景,建议结合`destroy`与DOM清理: ```javascript $('#modal').on('hidden.bs.modal', function(){ if ($.fn.dataTable.isDataTable('#modalTable')) { $('#modalTable').DataTable().destroy(); $('#modalTable').empty(); // 清除残留节点 } }); ``` ### 特殊场景处理 * Angular/Vue框架:在组件销毁周期调用`destroy()`[^4] * AJAX刷新数据:使用`ajax.reload()`代替重新初始化 * 多表格共存:确保每个表格有独立ID选择器 ### 配置注意事项 $$ \text{安全初始化条件} = \begin{cases} \text{retrieve:true} & \text{配置不变时} \\ \text{destroy+reinit} & \text{配置变更时} \\ \text{ajax.reload()} & \text{仅数据更新时} \end{cases} $$ [官网技术说明](https://datatables.net/manual/tech-notes/3)建议优先使用`retrieve`参数处理此错误[^1][^3]

data-table.js 报错 DataTables warning: table id=example - Cannot reinitialise DataTable. For more information about this error,

这个错误通常是由于尝试重新初始化 DataTables 插件而引起的。这意味着你的页面上已经有一个 DataTable 实例,而你又尝试对同一个表格进行初始化。要解决这个问题,你需要先销毁现有的 DataTable 实例,然后再初始化一个新的实例。你可以使用以下代码来销毁 DataTable 实例: ```javascript var table = $('#example').DataTable(); table.destroy(); ``` 这将销毁现有的 DataTable 实例。然后,你可以使用以下代码来初始化一个新的 DataTable 实例: ```javascript $('#example').DataTable(); ``` 这样就可以避免出现 "Cannot reinitialise DataTable" 的错误了。
阅读全文

相关推荐

<!DOCTYPE html> <html> <head> <title></title> <meta charset="UTF-8"> <script type="text/javascript" src="../../../js/date.format.js"></script> <script src="../js/jquery.min.js"></script> <script type="text/javascript" src="../../../js/jquery.datetimepicker.full.js"></script> <script src="../js/jquery.form.min.js"></script> <script src="../js/bootstrap.bundle.min.js"></script> <script src="../../js/datatables.min.js"></script> <script type="text/javascript" src="../../../js/buttons.html5.min.js"></script> <script src="../../js/datav.min.vue.js"></script> <style> .search-span { background-color: LightSteelBlue; } .row-div-20 { margin: 20px; } .row-div-10 { margin: 10px; } .row-div-5 { margin: 5px; } .custom-tooltip { --bs-tooltip-bg: var(--bs-secondary); } </style> </head> <body> <form id="search_form" action="../Controller/getTraceabilityList.ashx" method="post" enctype="application/x-www-form-urlencoded" onsubmit="loadDataTable();return false;"> 生產單號 <input id="base-id" name="base-id" type="text" class="form-control" /> 出貨單號 <input type="text" class="form-control" disabled /> 日期 <input id="start-time" name="start-time" type="text" class="form-control" autocomplete="off" /> <input id="end-time" name="end-time" type="text" class="form-control" autocomplete="off" /> 料號 <input id="parn-no" name="parn-no" type="text" class="form-control" /> 批號 <input name="batch-no" type="text" class="form-control" /> DC <input name="dc" type="text" class="form-control" /> 版本 <input name="version" type="text" class="form-control" /> 客戶料號 <input type="text" class="form-control" disabled /> 客戶批號 <input type="text" class="form-control" disabled /> 機臺編號 <input name="machine-no" type="text" class="form-control" /> 站別 <input id="station" name="station" type="text" readonly class="form-control" autocomplete="off" /> <button type="button" onclick="showStationModal()" class="btn btn-outline-primary"> 選擇站別</button> WPNL 號 <input name="wpnl-no" type="text" class="form-control" disabled /> SPNL 號 <input name="spnl-no" type="text" class="form-control" disabled /> PCS 號 <input name="pcs-no" type="text" class="form-control" disabled /> Bacode <input id="Code-no" name="Code-no" type="text" class="form-control" /> <button id="search-btn" class="btn btn-primary">查詢</button> <input id="reject" name="checkColumn" type="checkbox" title="test" class="btn-check" onchange="checkboxChange($(this))" autocomplete="off" /> <label for="reject" class="btn btn-outline-success" data-bs-toggle="tooltip" data-bs-placement="top" data-bs-custom-class="custom-tooltip" data-bs-title="AOI / OS / VI"> 不良率</label> <input name="reject" type="text" value="N" style="display: none" /> <input id="scrap" name="checkColumn" type="checkbox" class="btn-check" onchange="checkboxChange($(this))" autocomplete="off" /> <label for="scrap" class="btn btn-outline-success" data-bs-toggle="tooltip" data-bs-placement="top" data-bs-custom-class="custom-tooltip" data-bs-title="AOI / OS / VI"> 報廢率</label> <input name="scrap" type="text" value="N" style="display: none" /> <input id="ipqc" name="checkColumn" type="checkbox" class="btn-check" onchange="checkboxChange($(this))" autocomplete="off" disabled /> <label for="ipqc" class="btn btn-outline-success"> IPQC</label> <input name="ipqc" type="text" value="N" style="display: none" /> <input id="oqc" name="checkColumn" type="checkbox" class="btn-check" onchange="checkboxChange($(this))" autocomplete="off" /> <label for="oqc" class="btn btn-outline-success"> OQC 批退率</label> <input name="oqc" type="text" value="N" style="display: none" /> <input id="mrb" name="checkColumn" type="checkbox" class="btn-check" onchange="checkboxChange($(this))" autocomplete="off" /> <label for="mrb" class="btn btn-outline-success"> MRB 報廢率</label> <input name="mrb" type="text" value="N" style="display: none" /> <input id="materiel" name="checkColumn" type="checkbox" class="btn-check" onchange="checkboxChange($(this))" autocomplete="off" disabled /> <label for="materiel" class="btn btn-outline-success">原物料異常</label> <input name="materiel" type="text" value="N" style="display: none" /> <input id="eim" name="checkColumn" type="checkbox" class="btn-check" onchange="checkboxChange($(this))" autocomplete="off" /> <label for="eim" class="btn btn-outline-success">設備 A 級告警數</label> <input name="eim" type="text" value="N" style="display: none" /> <input id="mes" name="checkColumn" type="checkbox" class="btn-check" onchange="checkboxChange($(this))" autocomplete="off" /> <label for="mes" class="btn btn-outline-success">MES 設備維修記錄</label> <input name="mes" type="text" value="N" style="display: none" /> <input id="potion-oos" name="checkColumn" type="checkbox" class="btn-check" onchange="checkboxChange($(this))" autocomplete="off" disabled /> <label for="potion-oos" class="btn btn-outline-success">藥水 OOS 異常點數</label> <input name="potion-oos" type="text" value="N" style="display: none" /> <input id="potion-ooc" name="checkColumn" type="checkbox" class="btn-check" onchange="checkboxChange($(this))" autocomplete="off" disabled /> <label for="potion-ooc" class="btn btn-outline-success">藥水 OOC 異常點數</label> <input name="potion-ooc" type="text" value="N" style="display: none" /> <input id="product-oos" name="checkColumn" type="checkbox" class="btn-check" onchange="checkboxChange($(this))" autocomplete="off" disabled /> <label for="product-oos" class="btn btn-outline-success">產品 OOS 異常點數</label> <input name="product-oos" type="text" value="N" style="display: none" /> <input id="product-ooc" name="checkColumn" type="checkbox" class="btn-check" onchange="checkboxChange($(this))" autocomplete="off" disabled /> <label for="product-ooc" class="btn btn-outline-success">產品 OOC 異常點數</label> <input name="product-ooc" type="text" value="N" style="display: none" /> <input id="great-exception" name="checkColumn" type="checkbox" class="btn-check" onchange="checkboxChange($(this))" autocomplete="off" /> <label for="great-exception" class="btn btn-outline-success">重大異常</label> <input name="great-exception" type="text" value="N" style="display: none" /> <input id="rework" name="checkColumn" type="checkbox" class="btn-check" onchange="checkboxChange($(this))" autocomplete="off" disabled /> <label for="rework" class="btn btn-outline-success">重工</label> <input name="rework" type="text" value="N" style="display: none" /> <input id="exception-handle" name="checkColumn" type="checkbox" class="btn-check" onchange="checkboxChange($(this))" autocomplete="off" disabled /> <label for="exception-handle" class="btn btn-outline-success">異常處置</label> <input name="exception-handle" type="text" value="N" style="display: none" /> <input id="complaint" name="checkColumn" type="checkbox" class="btn-check" onchange="checkboxChange($(this))" autocomplete="off" disabled /> <label for="complaint" class="btn btn-outline-success">客訴</label> <input name="complaint" type="text" value="N" style="display: none" /> <input id="only-exception" name="checkColumn" type="checkbox" class="btn-check" onchange="checkboxChange($(this))" autocomplete="off" /> <label for="only-exception" class="btn btn-outline-success">只看異常</label> <input name="only-exception" type="text" value="N" style="display: none" /> <input id="all" type="checkbox" class="btn-check" onchange="changeAll($(this))" autocomplete="off" /> <label for="all" class="btn btn-outline-success">ALL</label> <input name="type" type="text" value="list" style="display: none" /> <input id="isSearching" type="text" value="N" style="display: none" /> <button id="submit-btn" type="submit" class="btn btn-primary" onclick="return submit-btn_onclick()">查詢</button> </form> 站別選擇 <input type="text" placeholder="站別名稱" onkeyup="screenStation($(this))" class="form-control" />
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal"> 關閉</button> <button type="button" onclick="clearStation()" class="btn btn-danger"> 清除</button> <button type="button" onclick="confirmStation()" class="btn btn-primary" data-bs-dismiss="modal"> 確認</button>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"> </button> <button type="button" class="btn btn-secondary" data-bs-dismiss="modal"> Close</button> <script type="text/javascript"> var table; const tooltipTriggerList = document.querySelectorAll('[data-bs-toggle="tooltip"]'); const tooltipList = [...tooltipTriggerList].map(tooltipTriggerEl => new bootstrap.Tooltip(tooltipTriggerEl)); $(function () { //得到当前时间 var now = new Date(); var endDate = now.format('Y-m-d H:i'); now.setTime(now.getTime() - 60 * 60 * 1000); var startDate = now.format("Y-m-d H:i"); $('#start-time').datetimepicker({ format: 'Y-m-d H:i', step: 1, value: startDate }); $('#end-time').datetimepicker({ format: 'Y-m-d H:i', step: 1, value: endDate }); $.datetimepicker.setLocale('zh'); initStation(); //给行绑定选中事件 $('#table_id tbody').on('click', 'tr', function () { if ($(this).hasClass('selected')) { $(this).removeClass('selected'); } else { $('#table_id tbody > tr').removeClass('selected'); $(this).addClass('selected'); } }); }); function initStation() { $.ajax({ url: '../Controller/getTraceabilityList.ashx', data: { 'type': 'station' }, success: function(result) { $.each(result.data.list, function(i, n) { $('#station-div').append( '' + '' + '<input id="' + n + '" value="' + n + '" type="checkbox" class="btn-check" />' + '<label for="' + n + '" class="btn btn-outline-success btn-sm">' + n + '</label>' + '' + '' ); }); } }); } // code輸入後查詢 function getSampleBoardData() { var data; var codeNo = document.getElementById("Code-no").value; $.ajax({ url: '../Controller/getTraceabilityList.ashx?type=codeNo', data: { 'codeNo': codeNo }, async: false, success: function (result) { data = result; } }); return data; }; document.getElementById("search-btn").addEventListener("click", function() { var codeNo = document.getElementById("Code-no").value; var date = getSampleBoardData() document.getElementsByName('base-id')[0].value = date.list; document.getElementsByName('batch-no')[0].value = date.list1; document.getElementsByName('parn-no')[0].value = date.list2; // error: function() { // alert('查询失败,请重试'); // } }); function showStationModal() { clearStation(); var stationStr = $('#station').val(); var stationArr if (stationStr != '') { stationArr = stationStr.split(','); } $.each(stationArr, function(i, n) { $(eval(n)).prop('checked', true); }); var stationModal = new bootstrap.Modal($("#station-modal")); stationModal.show(); } function screenStation(input) { var str = input.val().toUpperCase(); $('#station-div > div').hide(); if (str == "") { $('#station-div > div').show(); } else { $('[id*="' + str + '"]').parent().parent().show(); } } function clearStation() { $('#station-div input').prop('checked', false); } function confirmStation() { var str = ""; $('#station-div input:checked').each(function (i, e) { str += ($(e).attr('id') + ','); }); $('#station').val(str.substring(0, str.length - 1)); } function checkboxChange(checkbox) { $('[name="' + checkbox.attr('id') + '"]').val(checkbox.prop('checked') ? 'Y' : 'N'); } function changeAll(checkbox) { var checkboxes = $('[name="checkColumn"]'); if (checkbox.prop('checked')) { checkboxes.prop('checked', true); } else { checkboxes.prop('checked', false); } checkboxes.each(function (i, e) { checkboxChange($(e)); }); } function loadDataTable() { if ($('#isSearching').val() === 'Y') { alert('系統查詢中,請稍等···'); return; } $('#isSearching').val('Y'); if (!$('#reject').prop('checked') && !$('#scrap').prop('checked') && !$('#oqc').prop('checked') && !$('#mrb').prop('checked') && !$('#eim').prop('checked') && !$('#mes').prop('checked') && !$('#great-exception').prop('checked') && $('#only-exception').prop('checked')) { $('#isSearching').val('N'); alert('未選擇異常項,無法只看異常。'); return; } let startTime = Date.parse($('#start-time').val()); let endTime = Date.parse($('#end-time').val()); let diffMin = Math.floor((endTime - startTime) / 60000); if (diffMin > 3 * 24 * 60) { $('#isSearching').val('N'); alert('只能查询三天内数据。'); return; } if ($('#base-id').val() == '' && $('#parn-no').val() == '' && ($('#reject').prop('checked') || $('#scrap').prop('checked') || $('#oqc').prop('checked') || $('#mrb').prop('checked') || $('#eim').prop('checked') || $('#mes').prop('checked') || $('#great-exception').prop('checked'))) { $('#isSearching').val('N'); alert('查询额外字段,请添加生产单号或批号条件进行筛选。') return; } $('#submit-btn').append(' '); $('#search_form').ajaxSubmit({ success: function (result) { if (table != null) { table.destroy(); } $('#table_head_id').empty(); $('#tbody_id').empty(); $.each(result.data.head, function (i, n) { $('#table_head_id').append('' + n + ''); }); table = $('#table_id').DataTable({ data: result.data.list, fixedHeader: true, autoWidth: false, scrollX: true, scrollY: 700, searching: 5000, destroy: true, deferRender: true, //延遲渲染 lengthMenu: [ [25, 50, -1], [25, 50, 'All'] ], dom: "<'row'<'col-sm-12 col-md-2'B><'col-sm-12 col-md-1'l><'col-sm-12 col-md-9'f>>" + "<'row'<'col-sm-12'tr>>" + "<'row'<'col-sm-12 col-md-5'i><'col-sm-12 col-md-7'p>>", buttons: ['copy', 'excel'], ordering: false }); $('#submit-btn').text('查詢'); $('#isSearching').val('N'); } }); } function showEIM(count, partId, lotId, machineNo, inDate, outDate) { if (count <= 0) { shwoInfoModal('設備 A 級告警明細', '該機臺告警數為 0'); return; } $.ajax({ async: false, url: '../Controller/getTraceabilityList.ashx', data: { 'type': 'eim', 'partId': partId, 'lotId': lotId, 'machineNo': machineNo, 'inDate': inDate, 'outDate': outDate }, success: function (result) { var content = '<span>' + '' + '設備名稱' + '告警編碼' + '告警信息' + '時間' + '' + '' $.each(result.data.list, function (i, n) { content += '' + '' + n.eqName + '' + '' + n.eventCode + '' + '' + n.eventMessage + '' + '' + n.insertTime + '' + '' }); content += '
' shwoInfoModal('設備 A 級告警明細', content); } }); } function showMES(count, machineNo, inDate, outDate) { if (count <= 0) { shwoInfoModal('MES 設備維修記錄', '該機臺維修記錄為 0。'); return; } $.ajax({ async: false, url: '../Controller/getTraceabilityList.ashx', data: { 'type': 'mes', 'machineNo': machineNo, 'inDate': inDate, 'outDate': outDate }, success: function (result) { var content = '<span>' + '' + '設備名稱' + '記錄 1' + '記錄 2' + '記錄 3' + '記錄 4' + '記錄 5' + '申請時間' + '維修開始時間' + '維修結束時間' + '' + '' $.each(result.data.list, function (i, n) { content += '' + '' + n.deptName + '' + '' + n.notepad1 + '' + '' + n.notepad4 + '' + '' + n.notepad5 + '' + '' + n.notepad6 + '' + '' + n.notepad7 + '' + '' + n.entDate + '' + '' + n.startRepairDate + '' + '' + n.endRepairDate + '' + '' }); content += '
' shwoInfoModal('設備 A 級告警明細', content); } }); }; function shwoInfoModal(title, content) { $('#modal-head-id').text(title) $('#modal-content-id').empty(); $('#modal-content-id').append(content); var infoModal = new bootstrap.Modal($("#info-modal")); infoModal.show(); } function submit-btn_onclick() { } </script> </body> </html> 为什么不在原界面直接显示查询结果,而是直接跳转到ashx文件

<!DOCTYPE html> <html> <head> <title></title> <meta charset="UTF-8"> <script type="text/javascript" src="../js/date.format.js"></script> <script src="../js/jquery.min.js"></script> <script type="text/javascript" src="../js/jquery.datetimepicker.full.js"></script> <script src="../js/jquery.form.min.js"></script> <script src="../js/bootstrap.bundle.min.js"></script> <script src="../js/datatables.min.js"></script> <script type="text/javascript" src="../js/buttons.html5.min.js"></script> <script src="../js/datav.min.vue.js"></script> <style> .search-span { background-color: LightSteelBlue; } .row-div-20 { margin: 20px; } .row-div-10 { margin: 10px; } .row-div-5 { margin: 5px; } .custom-tooltip { --bs-tooltip-bg: var(--bs-secondary); } </style> </head> <body> <form id="search_form" action="../Controller/getTraceabilityList.ashx" method="post" enctype="application/x-www-form-urlencoded" onsubmit="loadDataTable();return false;"> 生產單號 <input id="base-id" name="base-id" type="text" class="form-control" /> 出貨單號 <input type="text" class="form-control" disabled /> 日期 <input id="start-time" name="start-time" type="text" class="form-control" autocomplete="off" /> <input id="end-time" name="end-time" type="text" class="form-control" autocomplete="off" /> 料號 <input id="parn-no" name="parn-no" type="text" class="form-control" /> 批號 <input name="batch-no" type="text" class="form-control" /> DC <input name="dc" type="text" class="form-control" /> 版本 <input name="version" type="text" class="form-control" /> 客戶料號 <input type="text" class="form-control" disabled /> 客戶批號 <input type="text" class="form-control" disabled /> 機臺編號 <input name="machine-no" type="text" class="form-control" /> 站別 <input id="station" name="station" type="text" readonly class="form-control" autocomplete="off" /> <button type="button" onclick="showStationModal()" class="btn btn-outline-primary"> 選擇站別</button> WPNL 號 <input name="wpnl-no" type="text" class="form-control" disabled /> SPNL 號 <input name="spnl-no" type="text" class="form-control" disabled /> PCS 號 <input name="pcs-no" type="text" class="form-control" disabled /> Bacode <input id="Code-no" name="Code-no" type="text" class="form-control" /> <button id="search-btn" class="btn btn-primary">查詢</button> <input id="reject" name="checkColumn" type="checkbox" title="test" class="btn-check" onchange="checkboxChange($(this))" autocomplete="off" /> <label for="reject" class="btn btn-outline-success" data-bs-toggle="tooltip" data-bs-placement="top" data-bs-custom-class="custom-tooltip" data-bs-title="AOI / OS / VI"> 不良率</label> <input name="reject" type="text" value="N" style="display: none" /> <input id="scrap" name="checkColumn" type="checkbox" class="btn-check" onchange="checkboxChange($(this))" autocomplete="off" /> <label for="scrap" class="btn btn-outline-success" data-bs-toggle="tooltip" data-bs-placement="top" data-bs-custom-class="custom-tooltip" data-bs-title="AOI / OS / VI"> 報廢率</label> <input name="scrap" type="text" value="N" style="display: none" /> <input id="ipqc" name="checkColumn" type="checkbox" class="btn-check" onchange="checkboxChange($(this))" autocomplete="off" disabled /> <label for="ipqc" class="btn btn-outline-success"> IPQC</label> <input name="ipqc" type="text" value="N" style="display: none" /> <input id="oqc" name="checkColumn" type="checkbox" class="btn-check" onchange="checkboxChange($(this))" autocomplete="off" /> <label for="oqc" class="btn btn-outline-success"> OQC 批退率</label> <input name="oqc" type="text" value="N" style="display: none" /> <input id="mrb" name="checkColumn" type="checkbox" class="btn-check" onchange="checkboxChange($(this))" autocomplete="off" /> <label for="mrb" class="btn btn-outline-success"> MRB 報廢率</label> <input name="mrb" type="text" value="N" style="display: none" /> <input id="materiel" name="checkColumn" type="checkbox" class="btn-check" onchange="checkboxChange($(this))" autocomplete="off" disabled /> <label for="materiel" class="btn btn-outline-success">原物料異常</label> <input name="materiel" type="text" value="N" style="display: none" /> <input id="eim" name="checkColumn" type="checkbox" class="btn-check" onchange="checkboxChange($(this))" autocomplete="off" /> <label for="eim" class="btn btn-outline-success">設備 A 級告警數</label> <input name="eim" type="text" value="N" style="display: none" /> <input id="mes" name="checkColumn" type="checkbox" class="btn-check" onchange="checkboxChange($(this))" autocomplete="off" /> <label for="mes" class="btn btn-outline-success">MES 設備維修記錄</label> <input name="mes" type="text" value="N" style="display: none" /> <input id="potion-oos" name="checkColumn" type="checkbox" class="btn-check" onchange="checkboxChange($(this))" autocomplete="off" disabled /> <label for="potion-oos" class="btn btn-outline-success">藥水 OOS 異常點數</label> <input name="potion-oos" type="text" value="N" style="display: none" /> <input id="potion-ooc" name="checkColumn" type="checkbox" class="btn-check" onchange="checkboxChange($(this))" autocomplete="off" disabled /> <label for="potion-ooc" class="btn btn-outline-success">藥水 OOC 異常點數</label> <input name="potion-ooc" type="text" value="N" style="display: none" /> <input id="product-oos" name="checkColumn" type="checkbox" class="btn-check" onchange="checkboxChange($(this))" autocomplete="off" disabled /> <label for="product-oos" class="btn btn-outline-success">產品 OOS 異常點數</label> <input name="product-oos" type="text" value="N" style="display: none" /> <input id="product-ooc" name="checkColumn" type="checkbox" class="btn-check" onchange="checkboxChange($(this))" autocomplete="off" disabled /> <label for="product-ooc" class="btn btn-outline-success">產品 OOC 異常點數</label> <input name="product-ooc" type="text" value="N" style="display: none" /> <input id="great-exception" name="checkColumn" type="checkbox" class="btn-check" onchange="checkboxChange($(this))" autocomplete="off" /> <label for="great-exception" class="btn btn-outline-success">重大異常</label> <input name="great-exception" type="text" value="N" style="display: none" /> <input id="rework" name="checkColumn" type="checkbox" class="btn-check" onchange="checkboxChange($(this))" autocomplete="off" disabled /> <label for="rework" class="btn btn-outline-success">重工</label> <input name="rework" type="text" value="N" style="display: none" /> <input id="exception-handle" name="checkColumn" type="checkbox" class="btn-check" onchange="checkboxChange($(this))" autocomplete="off" disabled /> <label for="exception-handle" class="btn btn-outline-success">異常處置</label> <input name="exception-handle" type="text" value="N" style="display: none" /> <input id="complaint" name="checkColumn" type="checkbox" class="btn-check" onchange="checkboxChange($(this))" autocomplete="off" disabled /> <label for="complaint" class="btn btn-outline-success">客訴</label> <input name="complaint" type="text" value="N" style="display: none" /> <input id="only-exception" name="checkColumn" type="checkbox" class="btn-check" onchange="checkboxChange($(this))" autocomplete="off" /> <label for="only-exception" class="btn btn-outline-success">只看異常</label> <input name="only-exception" type="text" value="N" style="display: none" /> <input id="all" type="checkbox" class="btn-check" onchange="changeAll($(this))" autocomplete="off" /> <label for="all" class="btn btn-outline-success">ALL</label> <input name="type" type="text" value="list" style="display: none" /> <input id="isSearching" type="text" value="N" style="display: none" /> <button id="submit-btn" type="submit" class="btn btn-primary">查詢</button> </form> 站別選擇 <input type="text" placeholder="站別名稱" onkeyup="screenStation($(this))" class="form-control" />
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal"> 關閉</button> <button type="button" onclick="clearStation()" class="btn btn-danger"> 清除</button> <button type="button" onclick="confirmStation()" class="btn btn-primary" data-bs-dismiss="modal"> 確認</button>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"> </button> <button type="button" class="btn btn-secondary" data-bs-dismiss="modal"> Close</button> <script type="text/javascript"> var table; const tooltipTriggerList = document.querySelectorAll('[data-bs-toggle="tooltip"]'); const tooltipList = [...tooltipTriggerList].map(tooltipTriggerEl => new bootstrap.Tooltip(tooltipTriggerEl)); $(function () { //得到当前时间 var now = new Date(); var endDate = now.format('Y-m-d H:i'); now.setTime(now.getTime() - 60 * 60 * 1000); var startDate = now.format("Y-m-d H:i"); $('#start-time').datetimepicker({ format: 'Y-m-d H:i', step: 1, value: startDate }); $('#end-time').datetimepicker({ format: 'Y-m-d H:i', step: 1, value: endDate }); $.datetimepicker.setLocale('zh'); initStation(); //给行绑定选中事件 $('#table_id tbody').on('click', 'tr', function () { if ($(this).hasClass('selected')) { $(this).removeClass('selected'); } else { $('#table_id tbody > tr').removeClass('selected'); $(this).addClass('selected'); } }); }); function initStation() { $.ajax({ url: '../Controller/getTraceabilityList.ashx', data: { 'type': 'station' }, success: function(result) { $.each(result.data.list, function(i, n) { $('#station-div').append( '' + '' + '<input id="' + n + '" value="' + n + '" type="checkbox" class="btn-check" />' + '<label for="' + n + '" class="btn btn-outline-success btn-sm">' + n + '</label>' + '' + '' ); }); } }); } // code輸入後查詢 function getSampleBoardData() { var data; var codeNo = document.getElementById("Code-no").value; $.ajax({ url: '../Controller/getTraceabilityList.ashx?type=codeNo', data: { 'codeNo': codeNo }, async: false, success: function (result) { data = result; } }); return data; }; document.getElementById("search-btn").addEventListener("click", function() { var codeNo = document.getElementById("Code-no").value; var date = getSampleBoardData() document.getElementsByName('base-id')[0].value = date.list; document.getElementsByName('batch-no')[0].value = date.list1; document.getElementsByName('parn-no')[0].value = date.list2; // error: function() { // alert(‘查询失败,请重试’); // } }); function showStationModal() { clearStation(); var stationStr = $('#station').val(); var stationArr if (stationStr != '') { stationArr = stationStr.split(','); } $.each(stationArr, function(i, n) { $(eval(n)).prop('checked', true); }); var stationModal = new bootstrap.Modal($("#station-modal")); stationModal.show(); } function screenStation(input) { var str = input.val().toUpperCase(); $('#station-div > div').hide(); if (str == "") { $('#station-div > div').show(); } else { $('[id*="' + str + '"]').parent().parent().show(); } } function clearStation() { $('#station-div input').prop('checked', false); } function confirmStation() { var str = ""; $('#station-div input:checked').each(function (i, e) { str += ($(e).attr('id') + ','); }); $('#station').val(str.substring(0, str.length - 1)); } function checkboxChange(checkbox) { $('[name="' + checkbox.attr('id') + '"]').val(checkbox.prop('checked') ? 'Y' : 'N'); } function changeAll(checkbox) { var checkboxes = $('[name="checkColumn"]'); if (checkbox.prop('checked')) { checkboxes.prop('checked', true); } else { checkboxes.prop('checked', false); } checkboxes.each(function (i, e) { checkboxChange($(e)); }); } function loadDataTable() { if ($('#isSearching').val() === 'Y') { alert('系統查詢中,請稍等···'); return; } $('#isSearching').val('Y'); if (!$('#reject').prop('checked') && !$('#scrap').prop('checked') && !$('#oqc').prop('checked') && !$('#mrb').prop('checked') && !$('#eim').prop('checked') && !$('#mes').prop('checked') && !$('#great-exception').prop('checked') && $('#only-exception').prop('checked')) { $('#isSearching').val('N'); alert('未選擇異常項,無法只看異常。'); return; } let startTime = Date.parse($('#start-time').val()); let endTime = Date.parse($('#end-time').val()); let diffMin = Math.floor((endTime - startTime) / 60000); if (diffMin > 3 * 24 * 60) { $('#isSearching').val('N'); alert('只能查询三天内数据。'); return; } if ($('#base-id').val() == '' && $('#parn-no').val() == '' && ($('#reject').prop('checked') || $('#scrap').prop('checked') || $('#oqc').prop('checked') || $('#mrb').prop('checked') || $('#eim').prop('checked') || $('#mes').prop('checked') || $('#great-exception').prop('checked'))) { $('#isSearching').val('N'); alert('查询额外字段,请添加生产单号或批号条件进行筛选。') return; } $('#submit-btn').append(' '); $('#search_form').ajaxSubmit({ success: function (result) { if (table != null) { table.destroy(); } $('#table_head_id').empty(); $('#tbody_id').empty(); $.each(result.data.head, function (i, n) { $('#table_head_id').append('' + n + ''); }); table = $('#table_id').DataTable({ data: result.data.list, fixedHeader: true, autoWidth: false, scrollX: true, scrollY: 700, searching: 5000, destroy: true, deferRender: true, //延遲渲染 lengthMenu: [ [25, 50, -1], [25, 50, 'All'] ], dom: "<'row'<'col-sm-12 col-md-2'B><'col-sm-12 col-md-1'l><'col-sm-12 col-md-9'f>>" + "<'row'<'col-sm-12'tr>>" + "<'row'<'col-sm-12 col-md-5'i><'col-sm-12 col-md-7'p>>", buttons: ['copy', 'excel'], ordering: false }); $('#submit-btn').text('查詢'); $('#isSearching').val('N'); } }); } function showEIM(count, partId, lotId, machineNo, inDate, outDate) { if (count <= 0) { shwoInfoModal('設備 A 級告警明細', '該機臺告警數為 0'); return; } $.ajax({ async: false, url: '../Controller/getTraceabilityList.ashx', data: { 'type': 'eim', 'partId': partId, 'lotId': lotId, 'machineNo': machineNo, 'inDate': inDate, 'outDate': outDate }, success: function (result) { var content = '<span>' + '' + '設備名稱' + '告警編碼' + '告警信息' + '時間' + '' + '' $.each(result.data.list, function (i, n) { content += '' + '' + n.eqName + '' + '' + n.eventCode + '' + '' + n.eventMessage + '' + '' + n.insertTime + '' + '' }); content += '
' shwoInfoModal('設備 A 級告警明細', content); } }); } function showMES(count, machineNo, inDate, outDate) { if (count <= 0) { shwoInfoModal('MES 設備維修記錄', '該機臺維修記錄為 0。'); return; } $.ajax({ async: false, url: '../Controller/getTraceabilityList.ashx', data: { 'type': 'mes', 'machineNo': machineNo, 'inDate': inDate, 'outDate': outDate }, success: function (result) { var content = '<span>' + '' + '設備名稱' + '記錄 1' + '記錄 2' + '記錄 3' + '記錄 4' + '記錄 5' + '申請時間' + '維修開始時間' + '維修結束時間' + '' + '' $.each(result.data.list, function (i, n) { content += '' + '' + n.deptName + '' + '' + n.notepad1 + '' + '' + n.notepad4 + '' + '' + n.notepad5 + '' + '' + n.notepad6 + '' + '' + n.notepad7 + '' + '' + n.entDate + '' + '' + n.startRepairDate + '' + '' + n.endRepairDate + '' + '' }); content += '
' shwoInfoModal('設備 A 級告警明細', content); } }); }; function shwoInfoModal(title, content) { $('#modal-head-id').text(title) $('#modal-content-id').empty(); $('#modal-content-id').append(content); var infoModal = new bootstrap.Modal($("#info-modal")); infoModal.show(); } </script> </body> </html> 切换中英文页面

/** * 生产消耗管理页面 * 根据代码规范,所有数据交互都通过 DataManager 进行 */ class ShengchanXiaohaoManager { constructor(dataManager) { this.dataManager = dataManager; this.currentUser = null; this.consumptionRecords = []; this.init(); } async init() { try { // 检查用户权限 await this.checkUserPermission(); // 注册数据管理器回调 this.registerDataCallbacks(); // 初始化页面数据 await this.initPageData(); // 绑定事件 this.bindEvents(); console.log('生产消耗管理页面初始化完成'); } catch (error) { console.error('初始化失败:', error); alert('页面初始化失败,请刷新重试'); } } async checkUserPermission() { try { // 通过 DataManager 获取当前用户信息 this.currentUser = await this.dataManager.getCurrentUser(); if (!this.currentUser || this.currentUser.role < 2) { alert('权限不足,无法访问此页面'); window.location.href = '../index.html'; return; } } catch (error) { console.error('权限检查失败:', error); window.location.href = '../index.html'; } } /** * 注册数据管理器回调 */ registerDataCallbacks() { // 注册生产消耗相关回调 this.dataManager.registerCallback('shengchan_xiaohao', (operation, data) => { if (operation === 'add') { this.onConsumptionAdded(data); } else if (operation === 'add_error') { this.onConsumptionError(data); } }); // 注册数据刷新回调 this.dataManager.registerCallback('all', (operation, entity, data) => { if (operation === 'refresh') { this.refreshConsumptionData(); } }); } /** * 初始化页面数据 */ async initPageData() { try { // 确保数据已加载 await this.dataManager.fetchAll(); // 刷新消耗数据 this.refreshConsumptionData(); // 加载统计信息 this.loadStatistics(); // 初始化下拉框数据 this.initSelectOptions(); } catch (error) { console.error('初始化页面数据失败:', error); } } /** * 刷新消耗数据 */ refreshConsumptionData() { // 从 DataManager 获取生产消耗记录 this.consumptionRecords = this.dataManager.getShengchanXiaohaoRecords(); // 更新表格显示 this.updateConsumptionTable(); } /** * 更新消耗表格 */ updateConsumptionTable() { const tableBody = document.getElementById('productionRecordsTable'); if (!tableBody) return; if (this.consumptionRecords.length === 0) { tableBody.innerHTML = '暂无生产记录'; return; } const rows = this.consumptionRecords.map(record => { const dingdanBancai = record.dingdan_bancai || {}; const dingdan = dingdanBancai.dingdan || {}; const chanpin = dingdanBancai.chanpin || {}; const zujian = dingdanBancai.zujian || {}; const bancai = dingdanBancai.bancai || {}; const user = record.user || {}; return ${new Date(record.date).toLocaleString('zh-CN')} ${dingdan.number || '未指定'} ${chanpin.bianhao || '未指定'} ${zujian.name || '未指定'} ${Math.abs(record.shuliang)} ${this.getBancaiName(bancai)} ${user.name || '未知'} 正常 <button class="btn btn-sm btn-info" onclick="shengchanXiaohaoManager.viewRecord(${record.id})" title="查看详情"> </button> ; }).join(''); tableBody.innerHTML = rows; } /** * 获取板材名称 */ getBancaiName(bancai) { if (!bancai) return '未知板材'; const caizhi = bancai.caizhi || {}; const mupi1 = bancai.mupi1 || {}; const mupi2 = bancai.mupi2 || {}; return ${caizhi.name || ''}${bancai.houdu || ''}mm ${mupi1.name || ''}/${mupi2.name || ''}; } /** * 初始化下拉框选项 */ initSelectOptions() { // 初始化订单下拉框 this.updateDingdanSelect(); // 绑定订单变化事件 const dingdanSelect = document.getElementById('dingdanSelect'); if (dingdanSelect) { dingdanSelect.addEventListener('change', () => { this.onDingdanChange(); }); } // 绑定产品变化事件 const chanpinSelect = document.getElementById('chanpinSelect'); if (chanpinSelect) { chanpinSelect.addEventListener('change', () => { this.onChanpinChange(); }); } // 绑定组件变化事件 const zujianSelect = document.getElementById('zujianSelect'); if (zujianSelect) { zujianSelect.addEventListener('change', () => { this.onZujianChange(); }); } } /** * 更新订单下拉框 */ updateDingdanSelect() { const select = document.getElementById('dingdanSelect'); if (!select) return; const dingdans = this.dataManager.getDingdans(); select.innerHTML = '<option value="">请选择订单</option>'; dingdans.forEach(dingdan => { if (!dingdan.deleted) { const option = document.createElement('option'); option.value = dingdan.id; option.textContent = dingdan.number; select.appendChild(option); } }); } /** * 订单变化处理 */ onDingdanChange() { const dingdanSelect = document.getElementById('dingdanSelect'); const chanpinSelect = document.getElementById('chanpinSelect'); const zujianSelect = document.getElementById('zujianSelect'); const productionQuantity = document.getElementById('productionQuantity'); if (!dingdanSelect.value) { chanpinSelect.disabled = true; zujianSelect.disabled = true; productionQuantity.disabled = true; return; } // 更新产品下拉框 const chanpins = this.dataManager.getChanpinsForDingdan(dingdanSelect.value); chanpinSelect.innerHTML = '<option value="">请选择产品</option>'; chanpins.forEach(chanpin => { const option = document.createElement('option'); option.value = chanpin.id; option.textContent = chanpin.bianhao; chanpinSelect.appendChild(option); }); chanpinSelect.disabled = false; zujianSelect.disabled = true; productionQuantity.disabled = true; } /** * 产品变化处理 */ onChanpinChange() { const chanpinSelect = document.getElementById('chanpinSelect'); const zujianSelect = document.getElementById('zujianSelect'); const productionQuantity = document.getElementById('productionQuantity'); if (!chanpinSelect.value) { zujianSelect.disabled = true; productionQuantity.disabled = true; return; } // 更新组件下拉框 const zujians = this.dataManager.getZujiansForChanpin(chanpinSelect.value); zujianSelect.innerHTML = '<option value="">请选择组件</option>'; zujians.forEach(zujian => { const option = document.createElement('option'); option.value = zujian.id; option.textContent = zujian.name; zujianSelect.appendChild(option); }); zujianSelect.disabled = false; productionQuantity.disabled = true; } /** * 组件变化处理 */ onZujianChange() { const zujianSelect = document.getElementById('zujianSelect'); const productionQuantity = document.getElementById('productionQuantity'); if (!zujianSelect.value) { productionQuantity.disabled = true; return; } productionQuantity.disabled = false; // 启用计算按钮 const calculateBtn = document.getElementById('calculateConsumption'); if (calculateBtn) { calculateBtn.disabled = false; } } columns: [ { data: 'id', title: 'ID', width: '60px' }, { data: null, title: '订单信息', render: function(data, type, row) { let html = ''; if (row.dingdan_name) { html += 订单: ${row.dingdan_name}; } if (row.chanpin_name) { html += 产品: ${row.chanpin_name}; } if (row.zujian_name) { html += 组件: ${row.zujian_name}; } return html || '未指定'; } }, { data: 'bancai_name', title: '板材', render: function(data, type, row) { return data || '未知板材'; } }, { data: 'shengchan_shuliang', title: '生产数量', className: 'text-center', render: function(data, type, row) { return ${data || 0}; } }, { data: 'xiaohao_shuliang', title: '消耗数量', className: 'text-center', render: function(data, type, row) { return ${data || 0}; } }, { data: 'shijian', title: '时间', render: function(data, type, row) { if (data) { const date = new Date(data); return date.toLocaleString('zh-CN'); } return ''; } }, { data: 'caozuoyuan_name', title: '操作员', render: function(data, type, row) { return data || '未知'; } }, { data: 'zhuangtai', title: '状态', className: 'text-center', render: function(data, type, row) { const statusClass = data === '正常' ? 'success' : 'secondary'; return ${data || '正常'}; } }, { data: null, title: '操作', orderable: false, className: 'text-center', width: '120px', render: function(data, type, row) { return <button class="btn btn-sm btn-info view-btn" data-id="${row.id}" title="查看详情"> </button> <button class="btn btn-sm btn-primary edit-btn" data-id="${row.id}" title="编辑"> </button> <button class="btn btn-sm btn-danger delete-btn" data-id="${row.id}" title="删除"> </button> ; } } ], order: [[0, 'desc']], pageLength: 25, responsive: true, language: { url: '//cdn.datatables.net/plug-ins/1.10.24/i18n/Chinese.json' }, dom: '<"row"<"col-sm-12 col-md-6"l><"col-sm-12 col-md-6"f>>' + '<"row"<"col-sm-12"tr>>' + '<"row"<"col-sm-12 col-md-5"i><"col-sm-12 col-md-7"p>>', drawCallback: (settings) => { // 重新绑定按钮事件 $('.view-btn').off('click').on('click', (e) => { const id = $(e.currentTarget).data('id'); this.viewRecord(id); }); $('.edit-btn').off('click').on('click', (e) => { const id = $(e.currentTarget).data('id'); this.editRecord(id); }); $('.delete-btn').off('click').on('click', (e) => { const id = $(e.currentTarget).data('id'); this.deleteRecord(id); }); } }); } bindEvents() { // 计算消耗按钮 const calculateBtn = document.getElementById('calculateConsumption'); if (calculateBtn) { calculateBtn.addEventListener('click', () => { this.calculateConsumption(); }); } // 确认生产按钮 const confirmBtn = document.getElementById('confirmProduction'); if (confirmBtn) { confirmBtn.addEventListener('click', () => { this.confirmProduction(); }); } // 刷新按钮 const refreshBtn = document.getElementById('refreshBtn'); if (refreshBtn) { refreshBtn.addEventListener('click', () => { this.refreshData(); }); } // 新增订单按钮 const addDingdanBtn = document.getElementById('addDingdanBtn'); if (addDingdanBtn) { addDingdanBtn.addEventListener('click', () => { this.showAddDingdanModal(); }); } // 添加产品按钮 const addChanpinBtn = document.getElementById('addChanpinBtn'); if (addChanpinBtn) { addChanpinBtn.addEventListener('click', () => { this.showAddChanpinModal(); }); } // 添加组件按钮 const addZujianBtn = document.getElementById('addZujianBtn'); if (addZujianBtn) { addZujianBtn.addEventListener('click', () => { this.showAddZujianModal(); }); } } /** * 计算消耗 */ async calculateConsumption() { try { const dingdanId = document.getElementById('dingdanSelect').value; const chanpinId = document.getElementById('chanpinSelect').value; const zujianId = document.getElementById('zujianSelect').value; const shengchanShuliang = parseInt(document.getElementById('productionQuantity').value); if (!dingdanId || !chanpinId || !zujianId || !shengchanShuliang) { alert('请完整填写生产信息'); return; } // 获取组件的板材消耗信息 const bancais = this.dataManager.getBancaisForZujian(zujianId); const consumptionDetails = document.getElementById('consumptionDetails'); const consumptionList = document.getElementById('consumptionList'); if (bancais.length === 0) { alert('该组件没有配置板材信息'); return; } // 显示消耗明细 consumptionDetails.style.display = 'block'; consumptionList.innerHTML = ''; bancais.forEach(bancai => { // 从 chanpin_zujians 中获取消耗比例 const chanpinZujian = this.dataManager.data.chanpin_zujians.find(cz => cz.chanpin?.id == chanpinId && cz.zujian?.id == zujianId && cz.bancai?.id == bancai.id ); const oneHowMany = chanpinZujian ? chanpinZujian.one_howmany : 1; const xiaohaoShuliang = Math.ceil(shengchanShuliang * oneHowMany); const itemHtml = 板材: ${this.getBancaiName(bancai)} 单位消耗: ${oneHowMany} 总消耗: ${xiaohaoShuliang} 张 ; consumptionList.innerHTML += itemHtml; }); // 启用确认生产按钮 const confirmBtn = document.getElementById('confirmProduction'); if (confirmBtn) { confirmBtn.disabled = false; } } catch (error) { console.error('计算消耗失败:', error); alert('计算消耗失败,请重试'); } } /** * 确认生产 */ async confirmProduction() { try { const dingdanId = document.getElementById('dingdanSelect').value; const chanpinId = document.getElementById('chanpinSelect').value; const zujianId = document.getElementById('zujianSelect').value; const shengchanShuliang = parseInt(document.getElementById('productionQuantity').value); const consumptionItems = document.querySelectorAll('.consumption-item'); if (consumptionItems.length === 0) { alert('请先计算消耗'); return; } if (!confirm('确认执行生产消耗操作?此操作将扣减库存。')) { return; } // 处理每个板材的消耗 for (const item of consumptionItems) { const bancaiId = parseInt(item.dataset.bancaiId); const xiaohaoShuliang = parseInt(item.dataset.xiaohao); const consumptionData = { dingdan: { id: parseInt(dingdanId) }, chanpin: { id: parseInt(chanpinId) }, zujian: { id: parseInt(zujianId) }, bancai: { id: bancaiId }, shengchan_shuliang: shengchanShuliang, xiaohao_shuliang: xiaohaoShuliang, caozuoyuan: { id: this.currentUser.id }, shijian: new Date().toISOString(), beizhu: 生产${shengchanShuliang}个${document.getElementById('chanpinSelect').selectedOptions[0].text} }; // 通过 DataManager 处理生产消耗事务 await this.dataManager.processShengchanXiaohao(consumptionData); } alert('生产消耗处理完成'); this.resetForm(); } catch (error) { console.error('确认生产失败:', error); alert('生产消耗处理失败: ' + error.message); } } /** * 重置表单 */ resetForm() { document.getElementById('dingdanSelect').value = ''; document.getElementById('chanpinSelect').innerHTML = '<option value="">请选择产品</option>'; document.getElementById('zujianSelect').innerHTML = '<option value="">请选择组件</option>'; document.getElementById('productionQuantity').value = ''; document.getElementById('chanpinSelect').disabled = true; document.getElementById('zujianSelect').disabled = true; document.getElementById('productionQuantity').disabled = true; document.getElementById('calculateConsumption').disabled = true; document.getElementById('confirmProduction').disabled = true; document.getElementById('consumptionDetails').style.display = 'none'; } /** * 显示添加订单弹窗 */ showAddDingdanModal() { if (window.CustomFormModal) { window.CustomFormModal.show('dingdan', { title: '添加订单', onSuccess: () => { this.refreshData(); } }); } } /** * 显示添加产品弹窗 */ showAddChanpinModal() { const dingdanId = document.getElementById('dingdanSelect').value; if (!dingdanId) { alert('请先选择订单'); return; } if (window.CustomFormModal) { window.CustomFormModal.show('chanpin', { title: '添加产品', onSuccess: () => { this.refreshData(); this.onDingdanChange(); // 刷新产品列表 } }); } } /** * 显示添加组件弹窗 */ showAddZujianModal() { const chanpinId = document.getElementById('chanpinSelect').value; if (!chanpinId) { alert('请先选择产品'); return; } if (window.CustomFormModal) { window.CustomFormModal.show('zujian', { title: '添加组件', onSuccess: () => { this.refreshData(); this.onChanpinChange(); // 刷新组件列表 } }); } } /** * 查看记录详情 */ viewRecord(recordId) { const record = this.consumptionRecords.find(r => r.id === recordId); if (!record) { alert('记录不存在'); return; } const dingdanBancai = record.dingdan_bancai || {}; const dingdan = dingdanBancai.dingdan || {}; const chanpin = dingdanBancai.chanpin || {}; const zujian = dingdanBancai.zujian || {}; const bancai = dingdanBancai.bancai || {}; const user = record.user || {}; const content = 记录ID: ${record.id} 订单: ${dingdan.number || '未指定'} 产品: ${chanpin.bianhao || '未指定'} 组件: ${zujian.name || '未指定'} 板材: ${this.getBancaiName(bancai)} 消耗数量: ${Math.abs(record.shuliang)} 张 消耗时间: ${new Date(record.date).toLocaleString('zh-CN')} 操作员: ${user.name || '未知'} 操作类型: 生产消耗 备注: ${record.text || '无'} ; // 显示在模态框中 if (window.CustomFormModal) { const modal = document.createElement('div'); modal.className = 'modal fade'; modal.innerHTML = 生产消耗记录详情 <button type="button" class="btn-close" data-bs-dismiss="modal"></button> ${content} <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">关闭</button> ; document.body.appendChild(modal); const bootstrapModal = new bootstrap.Modal(modal); bootstrapModal.show(); modal.addEventListener('hidden.bs.modal', () => { document.body.removeChild(modal); }); } } /** * 刷新数据 */ async refreshData() { try { await this.dataManager.refreshData(); this.loadStatistics(); } catch (error) { console.error('刷新数据失败:', error); } } /** * 加载统计信息 */ loadStatistics() { try { const statistics = this.dataManager.getShengchanStatistics(); const todayConsumption = document.getElementById('todayConsumption'); const monthConsumption = document.getElementById('monthConsumption'); const pendingOrders = document.getElementById('pendingOrders'); const lowStockCount = document.getElementById('lowStockCount'); if (todayConsumption) todayConsumption.textContent = ${statistics.today_consumption} 张; if (monthConsumption) monthConsumption.textContent = ${statistics.month_consumption} 张; if (pendingOrders) pendingOrders.textContent = ${statistics.pending_orders} 个; if (lowStockCount) lowStockCount.textContent = ${statistics.low_stock_count} 种; } catch (error) { console.error('加载统计信息失败:', error); } } /** * 生产消耗添加成功回调 */ onConsumptionAdded(data) { console.log('生产消耗添加成功:', data); // 数据会通过 DataManager 的回调自动刷新 } /** * 生产消耗添加失败回调 */ onConsumptionError(data) { console.error('生产消耗处理失败:', data); alert('生产消耗处理失败: ' + data.error); } } // 页面加载完成后初始化 document.addEventListener('DOMContentLoaded', async function() { // 检查必要的依赖 if (typeof DataManager === 'undefined') { console.error('DataManager 未加载'); alert('系统组件未加载完成,请刷新页面'); return; } try { // 导入 DataManager const { DataManager } = await import('../data/DataManager.js'); // 创建 DataManager 实例 const dataManager = new DataManager(); await dataManager.fetchAll(); // 初始化生产消耗管理器 window.shengchanXiaohaoManager = new ShengchanXiaohaoManager(dataManager); console.log('生产消耗管理系统初始化完成'); } catch (error) { console.error('系统初始化失败:', error); alert('系统初始化失败,请刷新页面重试'); } }); showAddModal() { if (window.CustomFormModal) { window.CustomFormModal.show('shengchan-xiaohao', { title: '添加生产消耗', onSuccess: () => { this.refreshData(); } }); } else { console.error('CustomFormModal 未加载'); alert('弹窗组件未加载,请刷新页面重试'); } } async viewRecord(id) { try { const response = await fetch(../php_api/index.php?action=getShengchanXiaohao&id=${id}); const result = await response.json(); if (result.success && result.data) { const record = result.data; let content = ID: ${record.id} 订单: ${record.dingdan_name || '未指定'} 产品: ${record.chanpin_name || '未指定'} 组件: ${record.zujian_name || '未指定'} 板材: ${record.bancai_name || '未知'} 生产数量: ${record.shengchan_shuliang} 消耗数量: ${record.xiaohao_shuliang} 时间: ${new Date(record.shijian).toLocaleString('zh-CN')} 操作员: ${record.caozuoyuan_name || '未知'} 状态: ${record.zhuangtai || '正常'} ; if (record.beizhu) { content += 备注: ${record.beizhu}; } $('#viewModalBody').html(content); $('#viewModal').modal('show'); } else { alert('获取记录详情失败'); } } catch (error) { console.error('查看记录失败:', error); alert('查看记录失败,请重试'); } } editRecord(id) { if (window.CustomFormModal) { window.CustomFormModal.show('shengchan-xiaohao', { title: '编辑生产消耗', mode: 'edit', recordId: id, onSuccess: () => { this.refreshData(); } }); } else { console.error('CustomFormModal 未加载'); alert('弹窗组件未加载,请刷新页面重试'); } } async deleteRecord(id) { if (!confirm('确定要删除这条生产消耗记录吗?此操作不可撤销。')) { return; } try { const response = await fetch('../php_api/index.php?action=deleteShengchanXiaohao', { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ id: id }) }); const result = await response.json(); if (result.success) { alert('删除成功'); this.refreshData(); } else { alert('删除失败: ' + (result.message || '未知错误')); } } catch (error) { console.error('删除记录失败:', error); alert('删除失败,请重试'); } } refreshData() { if (this.dataTable) { this.dataTable.ajax.reload(); } } // 获取统计信息 async loadStatistics() { try { const response = await fetch('../php_api/index.php?action=getShengchanXiaohaoStatistics'); const result = await response.json(); if (result.success && result.data) { const stats = result.data; $('#totalRecords').text(stats.total_records || 0); $('#todayRecords').text(stats.today_records || 0); $('#totalConsumption').text(stats.total_consumption || 0); $('#todayConsumption').text(stats.today_consumption || 0); } } catch (error) { console.error('获取统计信息失败:', error); } } } // 页面加载完成后初始化 $(document).ready(function() { // 检查必要的依赖 if (typeof $ === 'undefined') { console.error('jQuery 未加载'); return; } if (typeof $.fn.DataTable === 'undefined') { console.error('DataTables 未加载'); return; } // 初始化管理器 window.shengchanXiaohaoManager = new ShengchanXiaohaoManager(); // 加载统计信息 window.shengchanXiaohaoManager.loadStatistics(); });------------语法错误

最新推荐

recommend-type

jQuery Datatables表头不对齐的解决办法

在使用jQuery Datatables进行网页数据展示时,可能会遇到表头(thead)与表格内容(tbody)对齐问题,尤其是在浏览器窗口大小变化或者响应式布局中。这个问题通常表现为表头与内容列宽不一致,造成视觉上的错位。...
recommend-type

实例讲解DataTables固定表格宽度(设置横向滚动条)

实例讲解DataTables固定表格宽度(设置横向滚动条) 在使用DataTables时,我们经常会遇到表格宽度的问题,特别是在表格列比较多的情况下。默认的100%宽已经不适应了,我们需要固定表格的宽度以便更好地展示数据。本文...
recommend-type

高维数据流形学习算法研究进展.docx

高维数据流形学习算法研究进展.docx
recommend-type

lettuce-core-5.0.5.RELEASE.jar中文文档.zip

1、压缩文件中包含: 中文文档、jar包下载地址、Maven依赖、Gradle依赖、源代码下载地址。 2、使用方法: 解压最外层zip,再解压其中的zip包,双击 【index.html】 文件,即可用浏览器打开、进行查看。 3、特殊说明: (1)本文档为人性化翻译,精心制作,请放心使用; (2)只翻译了该翻译的内容,如:注释、说明、描述、用法讲解 等; (3)不该翻译的内容保持原样,如:类名、方法名、包名、类型、关键字、代码 等。 4、温馨提示: (1)为了防止解压后路径太长导致浏览器无法打开,推荐在解压时选择“解压到当前文件夹”(放心,自带文件夹,文件不会散落一地); (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以确保这就是你需要的文件。 5、本文件关键字: jar中文文档.zip,java,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,中文API文档,手册,开发手册,使用手册,参考手册。
recommend-type

中国风PPT模板:动态水墨画效果展示

在当今的商业演示和教育培训领域,PPT模板扮演着至关重要的角色。它们不仅能够提升演示的专业性,还能通过视觉效果吸引观众的注意力。针对该模板的介绍,我们可以详细讲解以下几个知识点: 1. PPT模板的定义和作用 PPT模板是一套预设的幻灯片格式和设计,可以包括颜色方案、字体样式、背景图案、布局排版等元素。用户可以利用这些模板快速制作出专业和美观的演示文稿,无需从零开始设计。模板的作用主要体现在节省设计时间、保证演示文稿的一致性和专业性,以及提供统一的视觉美感。 2. 中式动态水墨画的特色和意义 中式动态水墨画是融合了中国传统水墨画艺术与现代动态效果的视觉艺术形式。水墨画以其独特的意境、深邃的文化内涵和富有变化的笔触闻名。动态效果的加入,使得传统艺术形式焕发新生,更加生动和吸引人。使用中式动态水墨画作为PPT模板的主题,可以表现出浓厚的中国传统文化气息,同时给观众带来新颖的视觉体验。 3. 动态水墨画在PPT中的应用 在PPT中应用动态水墨画,可以通过以下几种方式体现:使用水墨流动或扩散的动画效果来模拟真实水墨画的创作过程;利用动态背景来增强画面的动感和艺术氛围;设置水墨元素作为过渡动画,使得幻灯片之间的切换更加自然流畅。需要注意的是,动态效果的使用要适度,过多的动态效果可能会分散观众的注意力,影响信息的传递。 4. 安装特定字体的重要性 标题中提到了“注意安装字体:宋徽宗瘦金体”,这指出了使用特定字体对于保持模板设计原貌的重要性。宋徽宗瘦金体是北宋时期的一种书体,具有很高的艺术价值和历史文化价值。在PPT模板设计中,使用这种字体可以传递出独特的古典韵味。为了确保模板在其他计算机上打开时能够保持原样,设计师通常会在说明中提醒用户安装相应的字体。 5. 排版布局的灵活多变性 “排版布局灵活多变”说明该模板在设计上具有很强的可定制性,用户可以根据演示内容的需要,调整文本、图片等元素的位置和大小,以达到最佳的视觉效果。灵活的布局设计往往包括多个不同样式的幻灯片版式,用户可以根据需要进行选择和修改。 6. 实用性的体现 模板的实用性体现在其能够适应不同场合和主题的需要,同时操作简便、易于编辑。对于用户而言,实用的模板可以快速地转化成高质量的演示文稿,满足特定的演示需求,如公司介绍、产品发布、教育培训等。 总结来说,该“创意中式动态水墨画PPT模板”通过结合中国传统艺术与现代设计元素,既展现了深厚的文化底蕴,又满足了现代商业演示的视觉需求。它不仅为设计师和演讲者提供了一个快速制作演示文稿的平台,也传递出一种现代与传统相结合的美学理念。对于需要制作具有中国特色演示文稿的用户来说,是一个不错的选择。
recommend-type

元宇宙中的智能扩展现实:新兴理论与应用探索

# 元宇宙中的智能扩展现实:新兴理论与应用 ## 1. 元宇宙的特征 元宇宙是一个具有多种独特特征的环境,这些特征使其区别于传统的现实世界和虚拟世界。具体如下: - **协作环境**:人们在元宇宙中协作以实现经济、社会和休闲等不同目标。 - **在线空间**:基于三维的在线环境,人们可以沉浸其中。 - **共享世界**:人们能够分享活动、观点和信息,购物也成为一种网络化体验。 - **增强和科技化场所**:借助增强现实技术,人们可以丰富体验,还能通过虚拟元素、技术和互联网进行社交和互动。 - **多用户环境**:人们可以同时使用相同的技术或进行相同的活动,是现实生活的延伸。 - **无限世界
recommend-type

电阻电容选型

<think>好的,我现在需要为用户介绍电阻和电容的选型。首先,我得确定用户的基础,可能是个电子爱好者或者刚入行的工程师,所以需要从基础开始,但又不能太浅显。用户可能需要知道选型时需要考虑哪些关键参数,以及实际应用中的注意事项。 首先,电阻的选型。我应该想到阻值、功率、精度、温度系数、封装这些基本参数。每个参数都需要解释清楚,比如功率要考虑实际功耗,避免过热。温度系数对高精度电路很重要,比如仪表放大器。封装的话,不同功率对应不同尺寸,比如0805、1206这些常见封装。还有特殊类型电阻,像贴片、金属膜、绕线,各自的应用场景,比如高频用金属膜,大功率用绕线。 然后是电容的选型。电容种类更多,
recommend-type

电教管理系统V2.0:高效在线管理教育资源

电教管理系统是一个基于教育单位需求,特别是针对学校电教资料的在线管理而开发的系统。其核心功能包括资料的在线查询与管理,使管理员能够远程控制电教资料的状态,而用户可以随时查看所需资料的可借状态。该系统还提供新到资料的信息介绍,帮助用户获取最新的电教材料。系统的主要特点如下: 1. 在线管理功能:通过网络连接,管理员能够在任何地点进行电教资料的管理工作,包括更新、编辑资料信息,以及监控资料的借阅状态。 2. 用户查询功能:允许用户在线查询资料的详细信息、借阅状态和位置等,便于用户了解所需资料的当前状态,判断是否需要借阅或者是否有其他资料可供选择。 3. 资料截图显示:增加了资料的直观展示,管理员和用户可以通过上传的资料图片更快速地识别资料内容,增强用户体验。 4. 模糊查询功能:系统支持模糊查询,用户可以通过关键字搜索,快速找到相关资料,提高了查询的效率和便捷性。 5. 查询速度优化:系统通过算法改进,加快了资料的查询速度,为管理员和用户提供更流畅的操作体验。 系统使用.NET 2.0平台进行开发,这表明该系统主要针对Windows操作系统环境。由于.NET 2.0是微软公司开发的一个广泛使用的框架,该系统能够保证良好的兼容性和稳定性,同时能够利用.NET框架提供的强大功能来实现丰富的用户界面和后台处理逻辑。 系统的开发语言很可能是C#,因为它是.NET平台上的主要编程语言。此外,系统还可能使用了SQL Server作为后台数据库管理系统,因为SQL Server与.NET框架的整合非常紧密,并且可以方便地处理大量数据。 从标签“.NET源码-信息管理”来看,该系统还可能提供了源代码开放的特点,允许其他开发者查看和修改源代码,从而对系统进行定制化开发和功能的增强。这有助于学校或教育单位根据自身特点和需求对系统进行调整,进一步提升系统的可用性和针对性。 至于提供的文件名称“downcode.com”,这可能是系统帮助文档、源代码、安装程序或其他相关资源的下载链接。用户通过此链接可能下载到系统软件包,包含各种必要的安装文件和系统使用说明,以方便安装和配置电教管理系统。 总而言之,电教管理系统测试版V2.0为教育单位提供了一个现代化的解决方案,用于有效地管理电教资料,并提高资料的利用率和管理效率。该系统的开发和技术选型体现了当前IT领域在教育信息化建设方面的先进理念和实践。
recommend-type

奢侈品时尚零售中的人工智能与扩展现实

# 奢侈品时尚零售中的人工智能与扩展现实 ## 1. 纳米层面的双重关系 在奢侈品时尚零售领域,纳米层面体现了一线员工与奢侈品时尚消费者之间的双重关系。一线员工不仅包括人类,还涵盖了人工智能代理,如聊天机器人和店内机器人。人类一线员工需依据零售组织文化和身份接受培训,同时享有所在国家法律规定的劳动权利和义务,并遵循时尚奢侈品牌的总体政策。 而人工智能代理在知识和情感方面不断进化,最终可能会更清晰地意识到自身存在,甚至开始主张权利,未来还有可能成为消费者。与此同时,融合纳米技术设备或采用增强能力假肢的混合人类,也能同时扮演员工和顾客的双重角色。 在这种情况下,人类与人工智能代理、不同技术水
recommend-type

电容加交流电还是直流电

<think>嗯,用户问的是电容应该加交流电还是直流电。首先,我得回忆一下电容的基本特性。电容在电路中的作用主要是存储电荷,对吧?它的特性是对直流和交流有不同的响应。 首先,直流电的情况下,当刚接通电源时,电容会充电,电流瞬间流过,但随着电容两端的电压逐渐接近电源电压,电流会减小,直到最后几乎为零。这时候电容相当于开路,所以直流稳态下电容不允许电流通过。这应该是对的,但可能需要确认一下有没有例外情况。 然后是交流电的情况,交流电的方向和大小不断变化,导致电容不断充放电。这样在电路中就会形成持续的电流,所以电容在交流电路中可以导通电流。不过这里需要注意容抗的概念,容抗与频率和电容值有关,公式