TP5 动态渲染多个Layui表格并批量打印所有表格
记录:
- 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)} 品种数:{:floatval($row.pre_goods_number)} 总重量(kg):{:floatval($row.pre_goods_weight_number)} 总体积(m3):{:floatval($row.pre_goods_volumn_number)} 总数量:{:floatval($row.pre_goods_account)} 总件数:{: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 + ' ' +'拣货单日期:' + tableInfo.create_time_text + ' ' +'收货单位(人):' + tableInfo.delivery_people + ' ' +'送货地址:' + tableInfo.provice +' ' + tableInfo.city + ' ' + tableInfo.area + ' ' + 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>
页面效果图示:
相关文章:

TP5 动态渲染多个Layui表格并批量打印所有表格
记录: TP5 动态渲染多个Layui表格每个表格设置有2行表头,并且第一行表头在页面完成后动态渲染显示内容每个表格下面显示统计信息可点击字段排序一次打印页面上的所有表格打印页面上多个table时,让每个table单独一页 后端代码示例: /*** Nod…...

spring专题笔记(六):bean的自动装配(自动化注入)-根据名字进行自动装配、根据类型进行自动装配。代码演示,通俗易懂。
目录 一、根据名字进行自动装配--byName 二、根据类型进行自动装配 byType 本文章主要是介绍spring的自动装配机制, 用代码演示spring如何根据名字进行自动装配、如何根据类型进行自动装配。代码演示,通俗易懂。 一、根据名字进行自动装配--byName Us…...

监听器listener
文章目录 监听器( listener)对Application内置对象监听的语法和配置对session内置对象监听的语法和配置 监听器( listener) 对象与对象的关系: 继承关联 tomcat一启动创建的顺序:监听器,config,application(全局初始化参数)&am…...

重温设计模式--10、单例模式
文章目录 单例模式(Singleton Pattern)概述单例模式的实现方式及代码示例1. 饿汉式单例(在程序启动时就创建实例)2. 懒汉式单例(在第一次使用时才创建实例) 单例模式的注意事项应用场景 C代码懒汉模式-经典…...
Flutter动画学习二
如何在 Flutter 中使用自定义动画和剪裁(clipping)实现一个简单的动画效果。 前置知识点学习 AnimationController AnimationController 是 Flutter 动画框架中的一个核心类,用于控制动画的生命周期和状态。它提供了一种灵活的方式来定义动…...
讯飞语音听写WebApi(流式)【React Native版】
假设已有 Base64 编码的音频文件(16kHz, s16le, pcm) 1、获取websocket url import * as CryptoJS from crypto-js;/*** 获取websocket url*/ const getWebSocketUrl () > {const config {// 请求地址hostUrl: "wss://iat-api.xfyun.cn/v2/iat",host: "i…...
【Linux编程】一个基于 C++ 的 TCP 客户端异步(epoll)框架(一))
TcpClient 类的设计与实现:一个基于 C 的 TCP 客户端框架 在现代网络编程中,TCP(传输控制协议)客户端是实现网络通信的基础组件之一。本文将详细介绍一个基于 C 的 TcpClient 类的设计与实现,该类提供了创建 TCP 连接…...
PG备份恢复--pg_dump
pg_dump pg_dump 是一个逻辑备份工具。使用 pg_dump 可以在数据库处于使用状态下进行一致 性的备份,它不会阻塞其他用户对数据库的访问 。 一致性备份是 pg_dump 开始运行时,给数据库打了一个快照,且在 pg_dump 运行过程 中发生的更新将不会被备份。 …...

pikachu靶场搭建详细步骤
一、靶场下载 点我去下载 二、靶场安装 需要的环境: mysqlApaches(直接使用小皮面板Phpstudy:https://www.xp.cn/),启动他们 设置网站,把靶场的路径对应过来 对应数据库的信息 由于没有核对数据库的信…...
HarmonyOS NEXT开发进阶(五):装饰器讲解
一、Provide Consume 父组件与子组件的子组件(官方叫法:后代组件)双向同步数据(即,父组件与后代组件可以相互操作 Provide 修饰的数据) 注意:Provide 与 Consume声明的变量名必须一致。 import {TestChild } from .…...

【编译原理】往年题汇总(山东大学软件学院用)
🌈 个人主页:十二月的猫-CSDN博客 🔥 系列专栏: 🏀编译原理_十二月的猫的博客-CSDN博客 💪🏻 十二月的寒冬阻挡不了春天的脚步,十二点的黑夜遮蔽不住黎明的曙光 目录 1. 前言 2. …...
【漏洞复现】F5 BIG-IP Next Central Manager SQL注入漏洞(CVE-2024-26026)
免责声明 请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,作者不为此承担任何责任。工具来自网络,安全性自测,如有侵权请联系删除。本次测试仅供学习使用,如若非法他用,与平台和本文作…...
设计模式-创建型-单例模式
1. 单例模式简介 单例模式(Singleton Pattern)是一种常见的创建型设计模式,它确保一个类只有一个实例,并提供全局访问点。在很多情况下,我们只希望某个类在整个应用程序中有一个唯一的实例,且该实例需要在…...

VBA技术资料MF243:利用第三方软件复制PDF数据到EXCEL
我给VBA的定义:VBA是个人小型自动化处理的有效工具。利用好了,可以大大提高自己的工作效率,而且可以提高数据的准确度。“VBA语言専攻”提供的教程一共九套,分为初级、中级、高级三大部分,教程是对VBA的系统讲解&#…...

【2024最新】基于Python+Mysql+django的水果销售系统Lw+PPT
作者:计算机搬砖家 开发技术:SpringBoot、php、Python、小程序、SSM、Vue、MySQL、JSP、ElementUI等,“文末源码”。 专栏推荐:SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:Java精选实战项…...

一种寻路的应用
应用背景 利用长途车进行货物转运的寻路计算。例如从深圳到大连。可以走有很多条长途车的路线。需要根据需求计算出最合适路线。不同的路线的总里程数、总价、需要的时间不一样。客户根据需求进行选择。主要有一些细节: 全国的长途车车站的数据的更新: …...

编译openssl遇到错误Parse errors: No plan found in TAP output的解决方法
在编译openssl时 tar -zxvf openssl-1.1.1p.tar.gz cd openssl-1.1.1p ./config --prefix/usr --openssldir/etc/ssl --shared zlib make make test 遇到错误 Parse errors: No plan found in TAP output 解决方法: yum install perl-Test-Simple...
一文大白话讲清楚防抖和节流,设计封装防抖和节流,以及防抖和节流的应用场景
文章目录 一文大白话讲清楚防抖和节流,设计封装防抖和节流,以及防抖和节流的应用场景1. 防抖和节流的背景2. 节流3. 节流的应用场景4. 防抖5. 防抖应用场景 一文大白话讲清楚防抖和节流,设计封装防抖和节流,以及防抖和节流的应用场…...

Windows开启IIS后依然出现http error 503.the service is unavailable
问题背景 已启用IIS服务,配置步骤可以参考Windows10 IIS Web服务器安装配置 问题描述 在这一步浏览网站时,并没有出现默认首页,而是 http error 503 the service is unavailable 问题解决 参考 成功解决http error 503.the service is un…...
C++的封装(十四):《设计模式》这本书
很多C学习者学到对C语言有一定自信后,会去读一下《设计模式》这本书。希望能够提升自己的设计水平。 据我所知,围绕C语言出了很多书。因为正好赶上泡沫经济时代。大家一拥而上,自己半懂不懂就出书,抢着出书收割读者,出…...

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式
一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明:假设每台服务器已…...
内存分配函数malloc kmalloc vmalloc
内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...

2025年能源电力系统与流体力学国际会议 (EPSFD 2025)
2025年能源电力系统与流体力学国际会议(EPSFD 2025)将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会,EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...

UE5 学习系列(三)创建和移动物体
这篇博客是该系列的第三篇,是在之前两篇博客的基础上展开,主要介绍如何在操作界面中创建和拖动物体,这篇博客跟随的视频链接如下: B 站视频:s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...
Objective-C常用命名规范总结
【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名(Class Name)2.协议名(Protocol Name)3.方法名(Method Name)4.属性名(Property Name)5.局部变量/实例变量(Local / Instance Variables&…...
Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务
通过akshare库,获取股票数据,并生成TabPFN这个模型 可以识别、处理的格式,写一个完整的预处理示例,并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务,进行预测并输…...
Golang dig框架与GraphQL的完美结合
将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用,可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器,能够帮助开发者更好地管理复杂的依赖关系,而 GraphQL 则是一种用于 API 的查询语言,能够提…...
Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!
一、引言 在数据驱动的背景下,知识图谱凭借其高效的信息组织能力,正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合,探讨知识图谱开发的实现细节,帮助读者掌握该技术栈在实际项目中的落地方法。 …...

NFT模式:数字资产确权与链游经济系统构建
NFT模式:数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新:构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议:基于LayerZero协议实现以太坊、Solana等公链资产互通,通过零知…...

自然语言处理——Transformer
自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效,它能挖掘数据中的时序信息以及语义信息,但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN,但是…...