TP5 动态渲染多个Layui表格并批量打印所有表格

news2025/1/2 3:24:09

记录:

  • TP5 动态渲染多个Layui表格
  • 每个表格设置有2行表头,并且第一行表头在页面完成后动态渲染显示内容
  • 每个表格下面显示统计信息
  • 可点击字段排序
  • 一次打印页面上的所有表格
  • 打印页面上多个table时,让每个table单独一页

后端代码示例:

    /**
     * @NodeAnotation(title="批量打印")
     */
    public function mergePrint($id)
    {        
        $rlist = $this->model->where([['id','in',$id]])->select();
        $tablesData = [];
        foreach($rlist as $k=>$row){   
            //拣货商品明细
            $goodsList= $row->boutboundPickGoods; 
            // 排序:首先拣货位正序、其次商品ID正序、最后批次倒序 
            array_multisort(array_column($goodsList, 'jianhuo_location'), SORT_ASC, array_column($goodsList, 'id'), SORT_ASC, array_column($goodsList, 'pici'), SORT_DESC, $goodsList);
            $row['goodsList'] = $goodsList;
            $row['create_time_text'] = date('Y-m-d',$row['create_time']);
            $tablesData[] = $row->toArray();
        }
        $this->assign('tablesData', $tablesData);
        return $this->fetch();
    }

html代码示例:

<style>
    fieldset {
        padding: 0;
        border: none;
        border-top: 1px dashed #eee;
    }

    fieldset legend {
        margin-left: 30px;
        padding: 0 10px;
        font-size: 16px;
        font-weight: 500;
    }
</style>
<div class="layuimini-container">
    <form id="app-form" class="layui-form layuimini-form">

        <fieldset>
            <legend>
                <a name="other">拣货商品详情</a>
                <button type="button" class="layui-btn layui-btn-normal layui-btn-sm print_apple" lay-event="add"><i class="fa fa-print"></i> 批量打印</button>
            </legend>
        </fieldset>
        <!-- 要拣货的商品 -->
        <div class="printContent">
            <div class="tablestyle">
                <style>                
                    .layui-table td, .layui-table th{
                        font-size: 12px;
                        color: #000;
                        padding: 5px;
                    }
                    .printMain{
                        font-size: 12px;
                        color: #000;
                    }
                    .title{
                        background-color: #fff;
                        text-align: left;
                    }
                    /* layui 打印页面上多个table时,让每个table单独一页 */
                    @media print {
                        .layui-card {
                            page-break-after: always;
                        }
                        .layui-card:last-child {
                            page-break-after: auto;
                        }
                        table{
                            width: 100%; 
                            border-collapse: collapse; 
                            border-spacing: 0;
                        }
                    }
                </style>
            </div>
            <div class="printMain">
                {volist name="tablesData" key="index" id="row"}
                <div class="layui-card">
                    <table class="layui-table layui-table-main" id="table-{$row['id']}" style="margin: 0;"></table>
                    <div style='line-height:40px;'>
                        总合计: 
                        出库单数量:{:floatval($row.yck_number)} &nbsp;&nbsp;&nbsp;
                        品种数:{:floatval($row.pre_goods_number)} &nbsp;&nbsp;&nbsp;
                        总重量(kg):{:floatval($row.pre_goods_weight_number)} &nbsp;&nbsp;&nbsp;
                        总体积(m3):{:floatval($row.pre_goods_volumn_number)} &nbsp;&nbsp;&nbsp;
                        总数量:{:floatval($row.pre_goods_account)} &nbsp;&nbsp;&nbsp;
                        总件数:{:floatval($row.pre_goods_jian_number)}
                    </div>
                    <div style="height: 30px;">
                        <div style='float: left;margin-right:120px'>制单人:</div>
                        <div style='float: left;margin-right:120px'>拣货人:</div>
                    </div>
                </div>
                {/volist}
            </div>
        </div>
    </form>
</div>

<script src="__STATIC__/jquery.min.js?v={$version}" charset="utf-8"></script>

<script>
    //JavaScript代码区域
    layui.use(['element', 'table', 'form'], function () {
        var element = layui.element,
            table = layui.table
            , form = layui.form
            ,laydate = layui.laydate;

        var tablesData = {:json_encode($tablesData)};
        // 循环渲染每个表格
        tablesData.forEach(function(tableInfo) {
            // 初始化表格
            table.render({
                elem: '#table-' + tableInfo.id,
                toolbar: '#toolbar',
                defaultToolbar: ['filter'], //开启右边按钮
                cols: [
                    // 第一行表头
                    [
                        {field: 'fdsf', title: '标题'+tableInfo.id, colspan:14},
                    ],
                    // 第二行表头
                    [
                        {field: 'id', width: 90, title: '商品ID', sort: true},
                        {field: 'xuhao', width: 80, title: '序号', sort: true},
                        {field: 'title_en', minWidth: 120, title: '英文简称', sort: true},
                        {field: 'title', minWidth: 120, title: '商品名称', sort: true},
                        {field: 'tuo_guige', minWidth: 100, title: '码托件数', sort: true},
                        {field: 'ji_guige', minWidth: 110, title: '件计量规格', sort: true},
                        {field: 'ware_location', minWidth: 100, title: '库位', sort: true},
                        {field: 'is_jianhuo_location', minWidth: 110, title: '是否拣货位', sort: true,
                            templet: function (d) {
                                if(d.is_jianhuo_location == 1){
                                    return '<span style="color:#1e9fff;">是</span>';
                                }else{
                                    return '<span >否</span>';
                                }
                            }
                        },
                        {field: 'is_zhengban', minWidth: 100, title: '整板', sort: true,
                            templet: function (d) {
                                if(d.is_zhengban == 1){
                                    return '<span style="color:#1e9fff;">是</span>';
                                }else{
                                    return '<span >否</span>';
                                }
                            }
                        },
                        {field: 'pici', minWidth: 100, title: '批次号', sort: true},
                        {field: 'actual_number', minWidth: 100, title: '数量', sort: true},
                        {field: 'jian_number', minWidth: 100, title: '件数', sort: true},
                        {field: 'jianhuo_location', minWidth: 100, title: '拣货位', sort: true},
                        {field: 'jianhuo_area', minWidth: 110, title: '拣货位库区', sort: true},
                    ]
                ],
                data:tableInfo.goodsList,
                page: false, // 如果需要分页   
                limit: Number.MAX_VALUE,
                done: function (res, curr, count) {
                    // 组合第一行表头显示的内容
                    var htmltext = '拣货单号:' + tableInfo.jh_order + '&nbsp;&nbsp;&nbsp;' +
                                    '拣货单日期:' + tableInfo.create_time_text + '&nbsp;&nbsp;&nbsp;' +
                                    '收货单位(人):' + tableInfo.delivery_people + '&nbsp;&nbsp;&nbsp;' +
                                    '送货地址:' + tableInfo.provice +'&nbsp;&nbsp;&nbsp;' + tableInfo.city + '&nbsp;&nbsp;&nbsp;' + tableInfo.area + '&nbsp;&nbsp;&nbsp;' + tableInfo.delivery_address;
                    // 赋值第一行表头显示的内容
                    $("[lay-id=\"table-" + tableInfo.id + "\"] .layui-table-box .layui-table-header tr:first-child").find('th').html(htmltext);
                    // 更换第一行表头样式
                    $("[lay-id=\"table-" + tableInfo.id + "\"] .layui-table-box .layui-table-header tr:first-child").css({
                        "background-color":"#fff",
                    });
                    $("[lay-id=\"table-" + tableInfo.id + "\"] .layui-table-box .layui-table-header tr:first-child").find('th').css({
                        "text-align":"left",
                    });
                    // 设置tool的层级,不被下面的table遮盖,注意上面的table的层级要高于下面table的层级
                    $("[lay-id=\"table-" + tableInfo.id + "\"] .layui-table-tool").css({
                        "position":"relative",
                        "z-index":9999-tableInfo.id,
                        "width":"100%",
                        "min-height":"50px",
                        "line-height":"30px",
                        "padding":"10px 15px",
                        "border-width":"0",
                        "border-bottom-width":"1px",
                    });
                },
            });
        })

        // 打印页面上所有表格table
        $('.print_apple').click(function(){
            // 定义一个DIV存放打印的内容
            let v = document.createElement("div");
            // 为DIV定义一个class名字
            v.className = 'printMain';
            // 向DIV中增加样式内容(打印页面上多个table时,让每个table单独一页)
            $(v).append($(".tablestyle").html());
            // 循环每个表格
            tablesData.forEach(function(tableInfo) {
                // 组合一个表格要打印的内容
                var tablelayid = 'table-' + tableInfo.id;
                var card = document.createElement("div");
                card.className = 'layui-card';
                $(card).append($("[lay-id=\"" + tablelayid + "\"] .layui-table-box").find(".layui-table-header").html());
                $(card).find("thead").after($("[lay-id=\"" + tablelayid + "\"] .layui-table-body.layui-table-main table").html()); 
                $(card).find("th.layui-table-patch").remove();
                $(card).find(".layui-table-col-special").remove();
                $(card).append($("[lay-id=\"" + tablelayid + "\"]").next().html()+$("[lay-id=\"" + tablelayid + "\"]").next().next().html());
                // 向打印DIV中增加打印表格内容
                $(v).append(card);
            });  
            // 页眉
            let f = [`<head>`,
                "<style>", "body{font-size: 12px; color: #000;}", "table{width: 100%; border-collapse: collapse; border-spacing: 0;}",
                "th,td{line-height: 18px; padding: 5px 5px; border: 1px solid #ccc; text-align: center;}",
                "a{color: #666; text-decoration:none;}", "*.layui-hide{display: none}",
                "</style>", "</head>"].join("");
            //页脚展示
            let footer = [`<footer></footer >`].join("");
            // 打印
            let h = window.open("打印窗口", "_blank");
            h.document.write(f + $(v).prop("outerHTML") + footer);
            h.document.close();
            h.print();
            h.close();
        });
        
    })
</script>

页面效果图示:
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2267764.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【笔记】linux虚拟机与windows的文件共享之Samba服务基本配置

做完之后的总结写在最前面便于复习&#xff1a; 虚拟机上要共享的资源通过samba的操作 允许window通过网络去访问其共享资源 防止以后看不懂放在最前面 &#xff08;一&#xff09;虚拟机操作部分 下载 samba smbclient samba-common 在根目录/新建一个samba专用文件夹&…

PyTorch Instance Normalization介绍

Instance Normalization(实例归一化) 是一种标准化技术,与 Batch Normalization 类似,但它对每个样本独立地对每个通道进行归一化,而不依赖于小批量数据的统计信息。这使得它非常适合小批量训练任务以及图像生成任务(如风格迁移)。 Instance Normalization 的原理 对每…

攻防世界web新手第五题supersqli

这是题目&#xff0c;题目看起来像是sql注入的题&#xff0c;先试一下最常规的&#xff0c;输入1&#xff0c;回显正常 输入1‘&#xff0c;显示错误 尝试加上注释符号#或者–或者%23&#xff08;注释掉后面语句&#xff0c;使1后面的单引号与前面的单引号成功匹配就不会报错…

机器视觉中的单线程、多线程与跨线程:原理与应用解析

在机器视觉应用中&#xff0c;程序的运行效率直接影响到系统的实时性和稳定性。随着任务复杂度的提高&#xff0c;单线程处理往往无法满足高性能需求&#xff0c;多线程技术因此被广泛应用。此外&#xff0c;跨线程操作&#xff08;如在多线程中更新界面或共享资源&#xff09;…

JAVA学习笔记第二阶段开始 Day11 五种机制---机制1:泛型机制

JAVA基础进阶版链接 https://pdai.tech/md/java/basic/java-basic-x-generic.html 五种机制 泛型机制 用处&#xff0c;提高类型安全性和代码重用 泛型在编写代码中使用【类型占位符】&#xff0c;而不是具体的类型&#xff0c;泛型是通过“类型擦除”来实现的类型安全性&…

ZLG嵌入式笔记 | 电源设计避坑(上)

产品上量后&#xff0c;通常都会有降成需求。多年来&#xff0c;接触过不少产品降成案例&#xff0c;在电源上下刀过猛&#xff0c;引发了产品偶发性问题&#xff0c;带来了很不好的负面影响。本文将对这些案例进行总结&#xff0c;提供电源设计参考&#xff0c;确保产品降成不…

全面了解 SQL Server:功能、优势与最佳实践

SQL Server 是微软公司推出的一款关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;广泛应用于企业级数据存储、数据分析、应用开发等领域。作为全球最受欢迎的数据库管理系统之一&#xff0c;SQL Server 提供了强大的功能和工具&#xff0c;支持从小型应用到大型…

WPF TextBox 输入限制 详解

总目录 前言 通常对于WPF输入框 输入的控制无非以下方式 1 直接禁止输入(包括粘贴) 不符合要求的字符 如只可输入数字的输入框&#xff0c;当你输入字母的时候是无法输入的 2 输入后&#xff0c;校验内容是否符合要求&#xff0c;然后提示错误&#xff0c;禁止提交信息 如只可…

从0入门自主空中机器人-4-【PX4与Gazebo入门】

前言: 从上一篇的文章 从0入门自主空中机器人-3-【环境与常用软件安装】 | MGodmonkeyの世界 中我们的机载电脑已经安装了系统和常用的软件&#xff0c;这一篇文章中我们入门一下无人机常用的开源飞控PX4&#xff0c;以及ROS中无人机的仿真 1. PX4的安装 1.1 PX4固件代码的下载…

Android笔记(四十一):TabLayout内的tab不滚动问题

背景 假设二级页面是上面图片的布局&#xff0c;当进来时TabLayout和ViewPager2绑定完就马上调setCustomItem&#xff0c;跳转到最后一个tab页面时&#xff0c;会发现tab不滚动&#xff0c;手动滑一下ViewPager2时才会滚动tab到正确的位置 原因分析 调用TabLayoutMediator.at…

Pandas04

Pandas01 Pandas02 Pandas03 文章目录 内容回顾1 数据的合并和变形1.1 df.append (了解)1.2 pd.concat1.3 merge 连接 类似于SQL的join1.4 join (了解) 2 变形2.1 转置2.2 透视表 3 MatPlotLib数据可视化3.1 MatPlotLib API 套路 &为什么要可视化3.2 单变量可视化3.3 双变量…

idea 禁用/关闭 sonarlint 后台自动分析(默认开启可能会引起idea卡顿)

idea 的 SonarLint 插件安装后&#xff0c;idea的使用经常出现卡顿&#xff0c;并且运行内存使用非常高&#xff0c;出现的原因之一就可能是 SonarLint 正在进行自动扫描&#xff0c;所以一般情况我们可以选择关闭 SonarLint 自动扫描功能&#xff0c;在需要对代码进行规范检查…

“鼎和财险一体化数据安全管控实践”入选信通院金融领域优秀案例

近日&#xff0c;由中国信通院举办的深度观察报告会系列论坛在京召开。在数字生态治理分论坛上&#xff0c;2024年度首期“磐安”优秀案例——六大行业应用优秀案例遴选结果发布&#xff0c;由北京原点数安科技有限公司与鼎和财产保险股份有限公司联合申报的“鼎和财险一体化数…

音视频入门基础:MPEG2-TS专题(24)——FFmpeg源码中,显示TS流每个packet的pts、dts的实现

音视频入门基础&#xff1a;MPEG2-TS专题系列文章&#xff1a; 音视频入门基础&#xff1a;MPEG2-TS专题&#xff08;1&#xff09;——MPEG2-TS官方文档下载 音视频入门基础&#xff1a;MPEG2-TS专题&#xff08;2&#xff09;——使用FFmpeg命令生成ts文件 音视频入门基础…

小白考研历程:跌跌撞撞,起起伏伏,五个月备战历程!!!

说真的&#xff0c;7月前我都没有想过我自己要考研&#xff0c;属于前期都是在大学中准备比赛&#xff0c;证书&#xff0c;直到参加蓝桥杯获得国赛三等奖&#xff0c;我问自己&#xff0c;再继续参加比赛吗&#xff1f;已经没有并肩同行的同学&#xff08;他们都准备考公考研啦…

企业架构学习笔记-数字化转型

1. 企业数字化发展阶段 案例1.业务部门“点菜”&#xff0c;IT部门叫苦 随着企业信息化进程的不断推进&#xff0c;IT部门的角色和面临的挑战也在发生显著变化。在信息化建设的初级阶段&#xff0c;确实存在IT部门需要积极引导和说服业务部门重视信息技术价值的情况。当时&am…

【js】记录预览pdf文件

接口调用拿到pdf的文件流&#xff0c;用blob处理这个文件流拿到url&#xff0c;使用window.open跳转新的窗口进行预览 api({dataType: blob, }).then(res >{if(res.code 0){this.previewPDF(res,application/pdf;charsetutf-8,pdf文件名)} })previewPDF (res, type, fname…

Vue3中的自定义指令与合成API

Vue3中的自定义指令与合成API 一、什么是自定义指令&#xff1f; 自定义指令是 Vue.js 中一项强大特性&#xff0c;它允许我们直接操作 DOM。自定义指令有两个主要用途&#xff1a;作为组件的辅助性工具或者操作 DOM。在 Vue.js 2.x 中&#xff0c;自定义指令的基本定义方式是通…

Java的list中状态属性相同返回true的实现方案

文章目录 项目背景方案一、for循环实现实现思路 方案二、stream实现实现思路 项目背景 在项目中会遇到list中多个状态判断&#xff0c;状态值相等时&#xff0c;总体返回为true。 方案一、for循环实现 实现思路 遍历list&#xff0c;当出现不一致时&#xff0c;直接跳出循环…

新服务器ubuntu系统相关操作

1、查看驱动:驱动版本535.216.01能够支持cuda12.2,下面直接使用默认安装的cuda。 2、赋予用户管理员权限。 首先有超级用户(root)权限来编辑 /etc/sudoers 文件,visudo 是一个命令,用于安全地编辑 /etc/sudoers 文件。运行: sudo visudo 在 visudo 编辑器中,找到类似…