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语言出了很多书。因为正好赶上泡沫经济时代。大家一拥而上,自己半懂不懂就出书,抢着出书收割读者,出…...
如何在不同的机器上运行多个OpenClaw实例?
想让不同机器上的 OpenClaw 一起协作,其实就是搭建一个跨机器的 “小龙虾通信网络”。实现方式分两种:简单直连(适合测试 / 小集群)和远程网关(适合生产 / 稳定协作)。下面给你一套直接能跑的完整方案。一、…...
红外遥控技术原理与工程实践
1. 红外遥控技术基础解析 红外遥控技术自20世纪80年代开始普及,如今已成为家电控制领域最成熟可靠的解决方案之一。作为一名电子工程师,我在多个智能家居项目中都深度应用过红外控制模块。红外技术的核心优势在于其简单可靠的物理层实现和标准化的通信协…...
国内大模型托管平台推荐:四大平台选型指南
随着大模型技术加速落地,模型托管平台已成为开发者不可或缺的基础设施。本文梳理了2025年国内主流的四大大模型托管平台,从核心优势、适用场景到选型建议,为你提供一份实用的选型指南。一、模力方舟:国产开源生态的“基石”推荐指…...
《C 头文件》
《C 头文件》 引言 C 头文件是 C 语言编程中不可或缺的一部分。它们包含了 C 语言标准库中的各种函数、宏定义和类型定义,为程序员提供了丰富的编程工具。本文将详细介绍 C 头文件的作用、分类、常用头文件及其在编程中的应用。 一、C 头文件的作用 C 头文件的主要作用有以…...
Claude Code 开挂指南:这个开源项目让你的 AI 编程助手直接进化
这个项目是什么?everything-claude-code 是一个在 GitHub 上拿到 50,000 star 的开源项目,出自 Anthropic Hackathon 的获奖团队之手,经历了 10 个月的实际生产环境打磨。一句话说清楚它是什么:给 AI 编程助手装「外挂」的全套配置…...
android studio 解决git用户名和用户邮箱不一致的问题
原因:公司git代码提交,应该用的是公司的账号和邮箱,不要使用私人名称和邮箱;1、查看自己本地的git用户名、邮箱配置1.1、在用户目录下,文件名:.gitconfig1.2、打开后:[user]name zhangjian.***…...
2.4.快速排序——先分区再递归,为什么它平均这么快却可能退化?
2.4.快速排序——先分区再递归,为什么它平均这么快却可能退化? 系列:搜索与排序 | 第 4 篇,共 16 篇 难度:⭐⭐⭐☆☆ 中等 标签:排序 快速排序 分治 随机化 三路快排 上一篇:2.3.插入排序——像…...
本科论文AI率高不高影响答辩?这个问题要搞清楚
很多同学AI率超标之后第一个问题就是:这会不会影响我参加答辩? 这个问题的答案取决于你的学校是怎么规定的,也和你超标的程度有关。我来帮你分析清楚。 各高校对AI率的处理方式 目前各高校的处理方式大致分三类: 第一类&#…...
Python-for-Android终极指南:用Python代码打造原生Android应用
Python-for-Android终极指南:用Python代码打造原生Android应用 【免费下载链接】python-for-android Turn your Python application into an Android APK 项目地址: https://gitcode.com/gh_mirrors/py/python-for-android 想要用你最熟悉的Python语言开发An…...
Linux网络诊断工具ping、traceroute等命令实战指南
在Linux系统的网络世界里,网络诊断工具就像是我们手中的“听诊器”,能够帮助我们精准地找出网络中存在的问题。今天,我们就来深入了解ping、traceroute等网络诊断命令的使用,通过实际操作和示例,让你轻松掌握使用这些工…...
