<extend name="Public/base" /> <block name="body"> <link rel="stylesheet" type="text/css" href="__CSS__/admin_table.css" media="all"> <link href="__STATIC__/datetimepicker/css/datetimepicker.css" rel="stylesheet" type="text/css"> <php>if(C('COLOR_STYLE')=='blue_color') echo ' <link href="__STATIC__/datetimepicker/css/datetimepicker_blue.css" rel="stylesheet" type="text/css">';</php> <link href="__STATIC__/datetimepicker/css/dropdown.css" rel="stylesheet" type="text/css"> <style> .tabcon1711 td:first-child { width: auto; } </style> <div class="cf main-place top_nav_list navtab_list"> <h3 class="page_title">新增excel导入</h3> <p class="description_text">说明:导入预付款数据</p> </div> <!-- 标签页导航 --> <div class="tab-wrap" style="display: flex;"> <div class="tab-content tabcon1711" style="min-width:700px;"> <!-- 基础文档模型 --> <div id="tab1" class="tab-pane in tab1"> <table border="0" cellspacing="0" cellpadding="0"> <tbody> <tr> <td class="l">本次批次号:</td> <td class="r"> <div class="input-list" id="batch" style="margin-left: 0;line-height: 30px;font-size: 16px;"> </div> <span class="notice-text" style="margin-left: 20px;">用于检索使用</span> </td> </tr> <tr> <td class="l"><i class="mustmark" style="margin-left:-7px">*</i>结算时间:</td> <td class="r"> <div class="input-list" style="margin-left: 0;"> <input type="text" readonly id="time_start" name="time_start" class="" value="{:I('time_start')}" placeholder="开始时间" /> - <div class="input-append date" id="datetimepicker" style="display:inline-block"> <input type="text" readonly id="time_end" name="time_end" class="" value="{:I('time_end')}" placeholder="结束时间" /> <span class="add-on"><i class="icon-th"></i></span> </div> </div> <span class="notice-text" style="margin-left: 0;">用于检索及唯一值检验</span> </td> </tr> <tr> <td class="l"><i class="mustmark" style="margin-left:-7px">*</i>文件上传:</td> <td class="r"> <div class="input-list" style="margin-left: 0;"> <input type="file" id="fileinput" name="file"> </div> <span class="notice-text" style="margin-left: 0;">暂只支持.xls .xlsx 格式文件</span> </td> </tr> </tbody> </table> </div> <div class="form-item cf"> <button class="submit_btn" id="submit_btn"> 保存 </button> <a class="submit_btn " alt="返回上一页" title="返回上一页" href="javascript:window.history.back();"> 返回 </a> </div> </div> </div> <div style="margin-top: 60px;" id="firle"> <div style="width: 100%;height: 45px;font-size: 16px;"> 文件格式参考:<span style="color: #777;font-size: 12px;margin-left: 20px;">请严格按此格式,文件的第一行必须是字段名,且字段名不允许修改</span> </div> <style> #firle td,#firle th{ padding: 10px 5px; } </style> <table id="cktable" style="width: 100%;margin: 0;padding: 0;text-align: center;border: 1px solid #777;" border="1px"> <thead> <tr> <th>序号</th> <th>下游名称</th> <th>会长账号</th> <th>下游类型</th> <th>市场员</th> <th>下游性质</th> <th>产品</th> <th>结算时间</th> <th>推广流水</th> <th>分成比例</th> <th>补点</th> <th>奖励</th> <th>罚款</th> <th>结算金额</th> <th>支付宝真实姓名</th> <th>支付宝账号</th> <th>备注</th> </tr> </thead> <tbody> <tr> <td>1</td> <td>海南万盟天下科技</td> <td>leilihua</td> <td>外团开发</td> <td>小明</td> <td>个人</td> <td>秦汉风云</td> <td>策略</td> <td>2020.6.22-2020.6.28 5626</td> <td>1%</td> <td>0%</td> <td>0</td> <td>0</td> <td>56.26</td> <td>小花</td> <td>12345678910</td> <td>不重要的备注</td> </tr> </tbody> </table> </div> <div style="width: 100vw;height: 100vh;padding: 0;position: absolute;top: 0;z-index: 9999;display: none;" id="creat_msg"> <div class="layui-layer layui-layer-dialog layui-layer-border layui-layer-msg layui-layer-hui" type="dialog" times="1" showtime="50000" contype="string" style="z-index: 19891015; top:30%; left:30%;"> <div class="layui-layer-content" style="padding: 15px 0 5px;font-size: 20px;font-weight: 600;">执行进度</div> <div id="tip_msg" class="layui-layer-content">开始时间与结束时间都不允许为空</div> <div class="layui-layer-content" style="padding: 5px 10px 15px;font-size: 10px;color: #BBB;">TIP:未执行完成之前请勿刷新或关闭此页面</div> <span class="layui-layer-setwin"></span> </div> </div> </block> <block name="script"> <script type="text/javascript" src="__STATIC__/xlsx.core.min.js" charset="UTF-8"></script> <script type="text/javascript" src="__STATIC__/datetimepicker/js/bootstrap-datetimepicker.min.js"></script> <script type="text/javascript" src="__STATIC__/datetimepicker/js/locales/bootstrap-datetimepicker.zh-CN.js" charset="UTF-8"></script> <script type="text/javascript" src="__STATIC__/layer3/layer.js"></script> <script type="text/javascript"> //导航高亮 highlight_subnav("{:U('lists')}"); var MSG={ showmsg:function(str){ $("#creat_msg").show(); $("#tip_msg").html(str); }, hidemsg:function(){ $("#creat_msg").hide(); $("#tip_msg").html(''); } } var COMPARE={ publiucAjax:function(url,senddata,callback){ $.ajax({ type: 'post', url: url, data:senddata, success: function(data) { if(data.status == 1){ callback(); }else{ MSG.hidemsg(); layer.alert(data.msg); return false; } }, error:function(){ MSG.hidemsg(); layer.alert("网络错误或超时"); return false; } }); }, //循环比较 loopCheck:function(page,callback){ if(page > sendDefaultData.check_page){ MSG.showmsg("添加成功,执行跳转中"); callback(); return; } var senddata = { statement_begin_time:sendDefaultData.begin_time, statement_end_time:sendDefaultData.end_time, batch:sendDefaultData.batch, checkarr:sendDefaultData.filedata.splice(0,check_size) } COMPARE.publiucAjax("{:U('loopAdd')}",senddata,function(data){ var checkok = page*check_size > sendDefaultData.filedata_count ? sendDefaultData.filedata_count : page*check_size; MSG.showmsg("数据插入 ["+checkok+"/"+sendDefaultData.filedata_count+"] ......"); page++; COMPARE.loopCheck(page,callback) }); } } </script> <script type="text/javascript"> var isfile = false; var rABS = false; //是否将文件读取为二进制字符串 var check_size = 10;//每次验证的数量 var batch = getNowDate(); var sendDefaultData = { "filedata_count": 0, "check_page":0, "filedata":[], "pay_way":-1, "begin_time":0, "end_time":0, "batch":batch } $("#batch").html(batch); $(function () { $("#submit_btn").on("click", function () { var start = $("#time_start").val(); var end = $("#time_end").val(); var sdate = Date.parse(start) / 1000; var edate = Date.parse(end) / 1000; if (start == '' || end == '') { layer.msg('开始时间与结束时间都不允许为空'); return false; } if (sdate > edate) { layer.msg('开始时间必须小于等于结束时间'); return false; } //获取文件 if (!isfile) { layer.msg('excel文件不能为空'); return false; } sendDefaultData.begin_time = start; sendDefaultData.end_time = end; //执行 readFileInput(function () { if(sendDefaultData.filedata_count == 0){ MSG.hidemsg(); layer.msg('excel内容不能为空'); return false; } //获取需要循环的次数 sendDefaultData.check_page = Math.ceil(sendDefaultData.filedata_count/check_size); sendDefaultData.begin_time = start; sendDefaultData.end_time = end; COMPARE.loopCheck(1,function(){ }) }) }) $("#fileinput").change(function () { var p = $(this).val(); var ext = p.substr(p.lastIndexOf(".")).toLowerCase(); if (ext != ".xls" && ext != ".xlsx") { layer.msg("文件仅支持excel文件格式"); $(this).val(''); p = ''; } if (p != '') { isfile = true; } else { isfile = false; } }) }); function readFileInput(callback) { MSG.showmsg("读取excle中。。。"); var wb;//读取完成的数据 var f = $("#fileinput")[0].files[0]; var reader = new FileReader(); if (rABS) { reader.readAsArrayBuffer(f); } else { reader.readAsBinaryString(f); } reader.onload = function (e) { MSG.showmsg("文件读取完成,比较命令初始化。。。"); var data = e.target.result; if (rABS) { wb = XLSX.read(btoa(fixdata(data)), { type: 'base64' }); } else { wb = XLSX.read(data, { type: 'binary' }); } // console.log(wb); try { var filedata = XLSX.utils.sheet_to_json(wb.Sheets[wb.SheetNames[0]]); sendDefaultData.filedata = resetCount(filedata); sendDefaultData.filedata_count = sendDefaultData.filedata.length; callback(); } catch (error) { MSG.hidemsg(); isfile = false; layer.msg('excel内容不符或不能为空'); return false; } // document.getElementById("demo").innerHTML= JSON.stringify( XLSX.utils.sheet_to_json(wb.Sheets[wb.SheetNames[0]]) ); }; } function resetCount(fdata){ var titleKey={ "序号": "sort", "下游名称": "company_name", "会长账号": "account", "下游类型": "company_relation_str", "市场员": "nickname", "下游性质": "company_type_str", "产品": "game_name", "产品类型": "game_type_name", "结算时间": "statement_time", "推广流水": "pay_amount", "分成比例": "ratio", "补点": "increment_ratio", "奖励": "reward", "罚款": "fine", "结算金额":"sum_money", "账户名": "payee_name", "银行卡号": "bank_account", "开户支行": "opening_bank", "账户类型": "bank_type", "支付宝真实姓名": "ali_user", "支付宝账号": "ali_account", "备注": "remark", } var data = []; //临时公司 var temp ={ statement_money:0, platform_amount:0, fine:0, reward:0, statement_info:[], company_info:{} }; var game_name = ''; var game_type= ''; for (let index = 0; index < fdata.length; index++) { const e = fdata[index]; //全量公司 if (e.hasOwnProperty("序号")) { if(index != 0){ temp.statement_money = temp.statement_money/100; temp.platform_amount = temp.platform_amount/100; temp.fine = temp.fine/100; temp.reward = temp.reward/100; data.push(temp);//上次的走掉 temp ={ statement_money:0, platform_amount:0, fine:0, reward:0, statement_info:[], company_info:{} };//重置 } var acc = { game_list:[] }; var gamet = {} for (const k in e) { if(k == "会长账号"){ acc[titleKey[k]] = e[k]; }else if(k=="产品" || k=="产品类型" || k == "结算时间" || k == "推广流水" || k == "分成比例" || k == "补点" || k == "奖励" || k == "罚款" || k == "结算金额"){ if(k=="产品") game_name = e[k]; if(k=="产品类型") game_type = e[k]; if(k=="奖励") temp.reward += Math.round(e[k]*100); if(k=="罚款") temp.fine += Math.round(e[k]*100); if(k=="推广流水") temp.platform_amount +=Math.round(e[k]*100); if(k=="结算金额") temp.statement_money += Math.round(e[k]*100); if(k == "推广流水" || k == "奖励" || k == "罚款" || k == "结算金额"){ e[k] = Math.round(e[k]*100)/100; } gamet[titleKey[k]] = e[k]; }else if(k=="市场员" || k=="下游性质" || k == "账户名" || k == "银行卡号" || k == "开户支行" || k == "账户类型" || k == "支付宝真实姓名" || k == "支付宝账号"){ temp.company_info[titleKey[k]] = e[k]; }else{ temp[titleKey[k]] = e[k]; } } if(!gamet.hasOwnProperty("game_name")){ gamet.game_name =game_name; } if(!gamet.hasOwnProperty("game_type_name")){ gamet.game_type_name =game_type; } acc.game_list.push(gamet); temp.statement_info.push(acc); continue; } //含会长信息 if (e.hasOwnProperty("会长账号")) { var acc = { game_list:[] }; var gamet = {} for (const k in e) { if(k == "会长账号"){ acc[titleKey[k]] = e[k]; }else if(k=="产品" || k=="产品类型" || k == "结算时间" || k == "推广流水" || k == "分成比例" || k == "补点" || k == "奖励" || k == "罚款" || k == "结算金额"){ if(k=="产品") game_name = e[k]; if(k=="产品类型") game_type = e[k]; if(k=="奖励") temp.reward += Math.round(e[k]*100); if(k=="罚款") temp.fine += Math.round(e[k]*100); if(k=="推广流水") temp.platform_amount += Math.round(e[k]*100); if(k=="结算金额") temp.statement_money += Math.round(e[k]*100); if(k == "推广流水" || k == "奖励" || k == "罚款" || k == "结算金额"){ e[k] = Math.round(e[k]*100)/100; } gamet[titleKey[k]] = e[k]; }else if(k=="市场员" || k=="下游性质" || k == "账户名" || k == "银行卡号" || k == "开户支行" || k == "账户类型" || k == "支付宝真实姓名" || k == "支付宝账号"){ temp.company_info[titleKey[k]] = e[k]; }else{ temp[titleKey[k]] = e[k]; } } if(!gamet.hasOwnProperty("game_name")){ gamet.game_name =game_name; } if(!gamet.hasOwnProperty("game_type_name")){ gamet.game_type_name =game_type; } acc.game_list.push(gamet); temp.statement_info.push(acc); continue; } //只含有游戏的信息 var gamet = {} for (const k in e) { if(k == "会长账号"){ acc[titleKey[k]] = e[k]; }else if(k=="产品" || k=="产品类型" || k == "结算时间" || k == "推广流水" || k == "分成比例" || k == "补点" || k == "奖励" || k == "罚款" || k == "结算金额"){ if(k=="产品") game_name = e[k]; if(k=="产品类型") game_type = e[k]; if(k=="奖励") temp.reward += Math.round(e[k]*100); if(k=="罚款") temp.fine += Math.round(e[k]*100); if(k=="推广流水") temp.platform_amount +=Math.round(e[k]*100); if(k=="结算金额") temp.statement_money += Math.round(e[k]*100); if(k == "推广流水" || k == "奖励" || k == "罚款" || k == "结算金额"){ e[k] = Math.round(e[k]*100)/100; } gamet[titleKey[k]] = e[k]; }else if(k=="市场员" || k=="下游性质" || k == "账户名" || k == "银行卡号" || k == "开户支行" || k == "账户类型" || k == "支付宝真实姓名" || k == "支付宝账号"){ temp.company_info[titleKey[k]] = e[k]; }else{ temp[titleKey[k]] = e[k]; } } if(!gamet.hasOwnProperty("game_name")){ gamet.game_name =game_name; } if(!gamet.hasOwnProperty("game_type_name")){ gamet.game_type_name =game_type; } temp.statement_info[temp.statement_info.length-1].game_list.push(gamet); } //判断 temp.statement_money = temp.statement_money/100; temp.platform_amount = temp.platform_amount/100; temp.fine = temp.fine/100; temp.reward = temp.reward/100; data.push(temp);//最后一次 return data; } function getNowDate(){ var da = new Date(); var trade =da.getFullYear(); var mt =da.getMonth() + 1 >10 ? da.getMonth() + 1 : "0"+(da.getMonth() + 1); var dt =da.getDate() >=10 ? da.getDate() : "0"+da.getDate(); var dh =da.getHours() >=10 ? da.getHours() : "0"+da.getHours(); var dm =da.getMinutes() >=10 ? da.getMinutes() : "0"+da.getMinutes(); var ds =da.getSeconds() >=10 ? da.getSeconds() : "0"+da.getSeconds(); var dms =(Array(3).join(0) + da.getMilliseconds()).slice(-3); return trade+=""+mt+""+dt+""+dh+""+dm+""+ds+''+dms; } function fixdata(data) { //文件流转BinaryString var o = "", l = 0, w = 10240; for (; l < data.byteLength / w; ++l) o += String.fromCharCode.apply(null, new Uint8Array(data.slice(l * w, l * w + w))); o += String.fromCharCode.apply(null, new Uint8Array(data.slice(l * w))); return o; } $('#time_start').datetimepicker({ format: 'yyyy-mm-dd', language: "zh-CN", minView: 2, autoclose: true }); $('#datetimepicker').datetimepicker({ format: 'yyyy-mm-dd', language: "zh-CN", minView: 2, autoclose: true, pickerPosition: 'bottom-left' }) </script> </block>