案例

gridRef.buttons.splice(0, 0, {
    name: '从 BOM 导入',
    icon: 'el-icon-document',
    type: 'primary',
    plain: true,
    onClick: async () => {
        const productId = gridRef.$store.getters.data().ProductId;
        if (!productId) {
            gridRef.$message.error('请先选中上方主表一行数据');
            return;
        }

        try {
            const { value } = await gridRef.$msgbox.prompt('请输入BOM编码', '从 BOM 导入', {
                confirmButtonText: '导入',
                cancelButtonText: '取消',
                inputPlaceholder: '请输入BOM编码',
            });

            if (!value?.trim()) {
                gridRef.$message.warning('BOM编码不能为空');
                return;
            }

            const bomCode = value.trim();

            const result = await proxy.http.post('/api/mes_orders/GetBomDetailsByCode', { bomCode }, true);

            if (!result.status || !result.rows?.length) {
                gridRef.$message.warning('未找到BOM明细数据');
                return;
            }

            const formattedRows = result.rows.map((item, index) => ({
                serial_no: index + 1,
                big_category: item.MaterialCategory || '',
                material_name: item.MaterialName || '',
                spec: item.Spec || '',
                material: item.Material || '',
                supplier: item.SupplierCode || '',
                unit_qty: Number(item.UsageQty) || 0,
                total_qty: Number(item.TotalQty) || 0,
                unit: item.Unit || '',
                price: Number(item.Price) || 0,
                amount: Number(item.Amount) || 0,
                remark: `来源于BOM:${bomCode}`,
                order_id: productId
            }));

            await gridRef.$confirm(`即将导入 ${formattedRows.length} 条数据并清空现有明细,是否继续?`, '确认导入', {
                type: 'warning'
            });

            // ==================== 多种方式获取明细表(重点) ====================
            let rowData = null;
            //调用后端接口清空订单现有数据
            //await proxy.http.post('/api/mes_orders/ClearOrderDetails', { orderId: productId }, true);
            // 正确调用 getter 函数
            const tableObj = gridRef.getTable(true);
            if (tableObj && typeof tableObj.rowData === 'function') {
                rowData = tableObj.rowData();           // ← 必须加 ()
            } else if (tableObj && Array.isArray(tableObj.rowData)) {
                rowData = tableObj.rowData;
            }

            if (Array.isArray(rowData)) {
                rowData.length = 0;           // 清空
                rowData.push(...formattedRows);
                console.log('✅ 成功写入明细表,当前条数:', rowData.length);
            } else {
                // 兜底方案(主表情况)
                if (gridRef.rowData) {
                    gridRef.rowData.length = 0;
                    gridRef.rowData.push(...formattedRows);
                    console.log('✅ 使用 gridRef.rowData 写入');
                } else if (gridRef.loadData) {
                    gridRef.loadData(formattedRows);
                    console.log('✅ 使用 loadData 方法');
                } else {
                    gridRef.detailData = [...formattedRows];
                    console.log('✅ 使用 detailData 兜底');
                }
            }                // 关键!
            gridRef.internalData = [...formattedRows]; // 部分版本需要
            gridRef.load = false  
            // 刷新
            // if (gridRef.refreshDetail) gridRef.refreshDetail();
            // else if (gridRef.refresh) gridRef.refresh();
            // else if (gridRef.reload) gridRef.reload();

            await gridRef.$nextTick();
            setTimeout(() => gridRef.$forceUpdate && gridRef.$forceUpdate(), 100);

            gridRef.$message.success(`成功导入 ${formattedRows.length} 条数据!`);
        } catch (err) {
            if (err?.action === 'cancel') return;
            console.error(err);
            gridRef.$message.error('导入失败:' + (err.message || err));
        }
        // 不加载数据
        gridRef.load = false
    }
});
posted @ 2026-05-19 16:55  舒然  阅读(11)  评论(0)    收藏  举报