Ver código fonte

批量导入发票收款功能

徐滕 9 horas atrás
pai
commit
fc8ba33749

+ 142 - 0
src/main/webapp/WEB-INF/tags/table/importInvoiceBatchExcel.tag

@@ -0,0 +1,142 @@
+<%@ tag language="java" pageEncoding="UTF-8"%>
+<%@ include file="/webpage/include/taglib.jsp"%>
+<%@ attribute name="url" type="java.lang.String" required="true"%>
+<c:set var="basePath" value="${pageContext.request.contextPath}" />
+
+<!-- 导入按钮,原样保留 -->
+<button id="btnImport" class="layui-btn layui-btn-sm layui-bg-blue" data-toggle="tooltip" data-placement="left" title="导入">
+    导入
+</button>
+
+<!-- 弹窗内容,仅保留文件选择,删除form的action、method,彻底禁用传统表单提交 -->
+<div id="importBox" class="hide">
+    <div style="padding-left:20px;text-align:center;margin-top:20px;">
+        <input id="uploadFile" name="file" type="file" style="width:330px"/>
+        <br/>
+        导入文件不能超过5M,仅允许导入“xls”或“xlsx”格式文件!
+    </div>
+</div>
+
+<script type="text/javascript">
+    $(document).ready(function() {
+        // 导入按钮点击
+        $("#btnImport").click(function(){
+            // 打开弹窗,纯弹窗,无表单提交关联
+            top.layer.open({
+                type: 1,
+                area: [500, 300],
+                title:"导入数据",
+                skin: 'three-btns with-demo',
+                content: $("#importBox").html(),
+                btn: ['下载模板','确定', '关闭'],
+                // 下载模板,原样
+                btn1: function(index, layero){
+                    window.location.href = '${url}/invoiceBatchTemplate';
+                },
+                // 确定按钮:【纯AJAX提交,彻底禁用同步表单,无任何页面跳转】
+                btn2: function(index, layero){
+                    // 1. 获取文件对象
+                    var fileObj = top.$("#uploadFile")[0].files[0];
+                    // 2. 前端校验
+                    if (!fileObj) {
+                        top.layer.msg("请选择要导入的Excel文件!", {icon: 2, time: 3000});
+                        return false;
+                    }
+                    if (fileObj.size > 5 * 1024 * 1024) {
+                        top.layer.msg("导入文件不能超过5M,请更换文件!", {icon: 2, time: 3000});
+                        return false;
+                    }
+                    var suffix = fileObj.name.substring(fileObj.name.lastIndexOf(".")).toLowerCase();
+                    if (suffix !== ".xls" && suffix !== ".xlsx") {
+                        top.layer.msg("仅允许导入xls/xlsx格式文件!", {icon: 2, time: 3000});
+                        return false;
+                    }
+
+                    // 3. 构建AJAX上传参数,唯一提交方式,无同步表单
+                    var formData = new FormData();
+                    formData.append("file", fileObj);
+
+                    // 4. 开启加载层
+                    top.layer.load(1, {shade: 0.3, title: "正在导入,请稍等..."});
+
+                    // 5. 纯AJAX异步提交,【绝对无页面跳转,绝对不打印JSON】
+                    $.ajax({
+                        url: "${url}", // 你的后端接口:importReceiptDataFile,直接用传入的url即可
+                        type: "POST",
+                        data: formData,
+                        // 核心:上传文件必须配置,禁止处理数据、禁止设置请求头
+                        processData: false,
+                        contentType: false,
+                        dataType: "json", // 强制接收JSON,不走页面渲染
+                        // 成功回调:【原页面弹框,不跳页,不打印JSON】
+                        success: function(res) {
+                            // 关闭加载层
+                            top.layer.closeAll("loading");
+                            // 关闭导入弹窗
+                            top.layer.close(index);
+
+                            // ============== 核心:原页面弹出提示框,绝不跳页 ==============
+                            if(res.success){
+                                // 成功/有问题:绿色/黄色提示
+                                top.layer.msg(res.msg, {icon: 1, time: 4000, shade: 0.2});
+
+                                // 如果有Excel文件,弹出下载确认框(原页面弹,不跳页)
+                                if(res.excelFileName && res.excelFileName != ""){
+                                    top.layer.confirm("导入数据存在问题,是否下载错误详情Excel?",{
+                                        title: "下载提示",icon: 3,btn: ['下载','取消']
+                                    },function(confirmIdx){
+                                        // 1. 触发Excel下载
+                                        var downUrl = "${ctx}/workinvoiceAll/workInvoiceAll/downloadExcel?fileName="+encodeURIComponent(res.excelFileName);
+                                        var a = document.createElement("a");
+                                        a.href = downUrl;
+                                        a.style.display="none";
+                                        document.body.appendChild(a);
+                                        a.click();
+                                        document.body.removeChild(a);
+
+                                        // 2. 核心新增:刷新父节点页面(加100ms延迟,确保下载请求先发送)
+                                        setTimeout(function(){
+                                            // 刷新当前激活的父Tab页面(和你项目原有刷新逻辑一致)
+                                            top.getActiveTab()[0].contentWindow.location.reload();
+                                            // 如果上面这行无效,可替换为:parent.location.reload(); // 通用刷新父页面
+                                        }, 100);
+
+                                        // 3. 关闭下载确认框 + 提示
+                                        top.layer.close(confirmIdx);
+                                        top.layer.msg("开始下载导入结果文件,页面已刷新",{icon:1,time:2000});
+                                    },function(confirmIdx){
+                                        // 取消下载时:可选也刷新(如果需要),不需要则保留原逻辑
+                                        top.layer.close(confirmIdx);
+                                        // 若取消下载也想刷新,添加这行:top.getActiveTab()[0].contentWindow.location.reload();
+                                    });
+                                }
+                            }else{
+                                // 业务失败:红色错误提示,原页面弹出
+                                top.layer.msg(res.msg, {icon: 2, time: 5000, shade: 0.2});
+                            }
+
+                            // 可选:导入完成后刷新列表(仅刷新列表,不跳页,不用表单提交)
+                            /*setTimeout(function(){
+                                top.getActiveTab()[0].contentWindow.location.reload();
+                            },1000);*/
+                        },
+                        // 接口失败:原页面弹错误提示
+                        error: function(xhr,status,err){
+                            top.layer.closeAll("loading");
+                            top.layer.close(index);
+                            top.layer.msg("导入请求失败,网络或服务异常!",{icon:2,time:4000});
+                            console.error("导入异常:",err);
+                        }
+                    });
+
+                    // 核心:阻止按钮默认行为,**绝对不触发同步表单提交**
+                    return false;
+                },
+                // 关闭按钮
+                btn3: function(index){
+                    top.layer.close(index);
+                }
+            });
+        });
+    });
+</script>