| var pageCurr; | 
| var pageCount = 0; | 
| var treeCond; | 
| var admin; | 
| var planNeedXmlSelData; | 
| layui.config({ | 
|     base: baseUrl + "/static/layui/lay/modules/" | 
| }).extend({ | 
|     steps: 'steps/steps', | 
|     cascader: 'cascader/cascader', | 
| }).use(['table','laydate','layer','upload', 'form', 'admin', 'xmSelect', 'steps', 'element', 'cascader', 'tree', 'dropdown'], function(){ | 
|     var table = layui.table; | 
|     var $ = layui.jquery; | 
|     var layer = layui.layer; | 
|     var layDate = layui.laydate; | 
|     var form = layui.form; | 
|     admin = layui.admin; | 
|     var upload = layui.upload; | 
|     var xmSelect = layui.xmSelect; | 
|     var steps = layui.steps; | 
|     var cascader = layui.cascader; | 
|     var tree = layui.tree; | 
|     var dropdown = layui.dropdown; | 
|     var element = layui.element; | 
|   | 
|     $('#organization').html(localStorage.getItem('nickname') + ' <i class="layui-icon"></i>'); | 
|   | 
|     // 部门人员 筛选 | 
|     dropdown.render({ | 
|         elem: '#organization' | 
|         ,content: ['<div id="organizationTree" style="height: calc(100vh - 525px);border: none"></div>'].join('') | 
|         ,style: 'width: 370px; height: 350px; padding: 0 15px; box-shadow: 1px 1px 30px rgb(0 0 0 / 12%);' | 
|         ,ready: function(){ | 
|             loadTree(); | 
|         } | 
|     }); | 
|   | 
|     // 数据同步 | 
|     dropdown.render({ | 
|         elem: '#data-btn' | 
|         ,align: 'right' | 
|         ,style: 'border-radius: 5px;' | 
|         ,className: 'site-dropdown-demo' | 
|         ,data: [ | 
|             { | 
|                 title: '模板下载' | 
|                 ,templet: '<i class="layui-icon layui-icon-template-1"></i>{{d.title}}' | 
|                 ,id: 1 | 
|             }, | 
|             { | 
|                 title: '导入 Excel' | 
|                 ,templet: '<i class="layui-icon layui-icon-upload"></i>{{d.title}}' | 
|                 ,id: 2 | 
|             }, | 
|             {type: '-'}, //分割线 | 
|             { | 
|                 title: '导出 Excel' | 
|                 ,templet: '<i class="layui-icon layui-icon-export"></i>{{d.title}}' | 
|                 ,id: 3 | 
|             } | 
|         ] | 
|         ,click: async function(item){ | 
|             switch (item.id) { | 
|                 case 1: | 
|                     // 模板下载 | 
|                     layer.load(1, {shade: [0.1,'#fff']}); | 
|                     location.href = baseUrl + "/mould/跟踪项目导入模板.xls"; | 
|                     layer.closeAll('loading'); | 
|                     break | 
|                 case 2: | 
|                     // 导入 Excel | 
|                     $("#importExcel").trigger("click"); | 
|                     break | 
|                 case 3: | 
|                     // 导出 Excel | 
|                     layer.msg("来不及做,等等", {icon: 6}); | 
|                     break | 
|                 default: | 
|                     break | 
|             } | 
|         } | 
|     }); | 
|   | 
|     // 树形图 | 
|     var organizationTree; | 
|     window.loadTree = function(condition){ | 
|         var loadIndex = layer.load(2); | 
|         $.ajax({ | 
|             url: baseUrl+"/dept/user/tree/auth", | 
|             headers: {'token': localStorage.getItem('token')}, | 
|             data: { | 
|                 'condition': condition | 
|             }, | 
|             method: 'POST', | 
|             success: function (res) { | 
|                 layer.close(loadIndex); | 
|                 if (res.code === 200){ | 
|                     organizationTree = tree.render({ | 
|                         elem: '#organizationTree', | 
|                         id: 'organizationTree', | 
|                         onlyIconControl: true, | 
|                         data: res.data, | 
|                         click: function (obj) { | 
|                             treeCond = { | 
|                                 key: obj.data.key, | 
|                                 val: obj.data.id | 
|                             } | 
|                             $('#organization').html(obj.data.title + ' <i class="layui-icon"></i>'); | 
|                             $('#organizationTree').find('.ew-tree-click').removeClass('ew-tree-click'); | 
|                             $(obj.elem).children('.layui-tree-entry').addClass('ew-tree-click'); | 
|                             clearFormVal($('#search-box')); | 
|                             tableIns.reload({ | 
|                                 where: {[obj.data.key]: obj.data.id}, | 
|                                 page: {curr: 1} | 
|                             }); | 
|                         } | 
|                     }); | 
|                     treeData = res.data; | 
|                 } else if (res.code === 403){ | 
|                     top.location.href = baseUrl+"/"; | 
|                 } else { | 
|                     layer.msg(res.msg) | 
|                 } | 
|             } | 
|         }) | 
|     } | 
|   | 
|     // 数据渲染 | 
|     tableIns = table.render({ | 
|         elem: '#plan', | 
|         headers: {token: localStorage.getItem('token')}, | 
|         url: baseUrl+'/plan/page/auth', | 
|         page: true, | 
|         limit: 15, | 
|         limits: [15, 30, 50, 100, 200, 500], | 
|         // cellMinWidth: 100, | 
|         height: 'full-148', | 
|         // size: 'sm', | 
|         skin: 'line', | 
|         cols: [[ | 
|             {type: 'checkbox'} | 
|             // ,{field: 'id', align: 'center',title: 'ID'} | 
|             // ,{field: 'hostId$', align: 'center',title: '所属商户'} | 
|             ,{field: 'userId$', align: 'left',title: '业务员',hide: false, width: 100} | 
|             ,{field: 'planType$', align: 'left',title: '业务类型', width: 150,hide: false} | 
|             ,{field: 'name', align: 'left',title: '售前规划申请单名称', width: 220, style: 'color: #1890ff;cursor:pointer', event: 'more',hide: false} | 
|             ,{field: 'uuid', align: 'left',title: '规划单号', width: 100,hide: false} | 
|             ,{field: 'planNeed$', align: 'left',title: '所需', templet:function(d){return emptyShow(d.planNeed$)},hide: false} | 
|             ,{field: 'deptId$', align: 'left',title: '所属部门',hide: true} | 
|             ,{field: 'planner$', align: 'left',title: '规划员',hide: false, width: 100} | 
|             // ,{field: 'nowHeadman$', align: 'left',title: '规划组长',hide: true} | 
|             ,{field: 'orderId$', align: 'left',title: '跟踪项目', width: 220, style: 'color: #1890ff;cursor:pointer', event: 'orderMore',hide: false} | 
|             // ,{field: 'cstmrId$', align: 'left',title: '甲方单位', width: 220, style: 'color: #1890ff;cursor:pointer', event: 'cstmrMore',hide: true} | 
|             ,{field: 'appleTime$', align: 'left',title: '申请日期', hide: true} | 
|             // ,{field: 'beItem$', align: 'center',title: '立项'} | 
|             // ,{field: 'planner', align: 'left',title: '规划员', templet:function(d){return emptyShow(d.planner)}} | 
|             // ,{field: 'finishTime$', align: 'center',title: '完成时间'} | 
|             // ,{field: 'form', align: 'center',title: '表单内容'} | 
|             // ,{field: 'change$', align: 'center',title: '更改方案'} | 
|             // ,{field: 'changeTime', align: 'center',title: '更改次数'} | 
|             // ,{field: 'changeReason', align: 'center',title: '更改方案原因'} | 
|             // ,{field: 'planBonus', align: 'center',title: '规格奖金'} | 
|             // ,{field: 'planLeaderBonus', align: 'center',title: '规格组长奖金'} | 
|             // ,{field: 'files', align: 'center',title: '附件'} | 
|             ,{field: 'settle$', align: 'center',title: '进度', width: 150} | 
|             // ,{field: 'settleMsg', align: 'center',title: '审核进度'} | 
|             // ,{field: 'comment', align: 'center',title: '评论'} | 
|             // ,{field: 'status$', align: 'center',title: '状态'} | 
|             ,{field: 'createTime$', align: 'left',title: '添加日期', width: 160, hide: false} | 
|             ,{field: 'updateBy$', align: 'left',title: '修改人', width: 100} | 
|             ,{field: 'updateTime$', align: 'left',title: '修改时间', hide: true} | 
|             ,{field: 'memo', align: 'left',title: '注释', hide: true} | 
|   | 
|             ,{fixed: 'right', title:'操作', align: 'center', toolbar: '#operate', width: 280} | 
|         ]], | 
|         request: { | 
|             pageName: 'curr', | 
|             pageSize: 'limit' | 
|         }, | 
|         parseData: function (res) { | 
|             return { | 
|                 'code': res.code, | 
|                 'msg': res.msg, | 
|                 'count': res.data.total, | 
|                 'data': res.data.records | 
|             } | 
|         }, | 
|         response: { | 
|             statusCode: 200 | 
|         }, | 
|         done: function(res, curr, count) { | 
|             if (res.code === 403) { | 
|                 top.location.href = baseUrl+"/"; | 
|             } | 
|             pageCurr=curr;pageCount=count; | 
|             limit(); | 
|         } | 
|     }); | 
|   | 
|     //多文件列表 | 
|     var uploadListIns = upload.render({ | 
|         elem: '#data-btn-file2' | 
|         ,elemList: $('#data-btn-file3') //列表元素对象 | 
|         ,url: '/plan/insert/file/auth' | 
|         ,accept: 'file' | 
|         ,multiple: true | 
|         ,number: 10 | 
|         ,auto: false | 
|         ,bindAction: '#testListAction' | 
|         ,choose: function(obj){ | 
|             // 赋值 | 
|             this.data.planId=$('.layui-layer-title').text() | 
|             var that = this; | 
|             var files = this.files = obj.pushFile(); //将每次选择的文件追加到文件队列 | 
|             //读取本地文件 | 
|             obj.preview(function(index, file, result){ | 
|                 var tr = $(['<tr id="upload-'+ index +'">' | 
|                     ,'<td>'+ file.name +'</td>' | 
|                     ,'<td>'+ (file.size/1014).toFixed(1) +'kb</td>' | 
|                     ,'<td><div class="layui-progress" lay-filter="progress-demo-'+ index +'"><div class="layui-progress-bar" lay-percent=""></div></div></td>' | 
|                     ,'<td>' | 
|                     ,'<button class="layui-btn layui-btn-xs demo-reload layui-hide">重传</button>' | 
|                     ,'<button class="layui-btn layui-btn-xs layui-btn-danger demo-delete">删除</button>' | 
|                     ,'<button id="file-download" class="layui-btn layui-btn-xs demo-reload layui-hide">下载</button>' | 
|                     ,'</td>' | 
|                     ,'</tr>'].join('')); | 
|   | 
|                 //单个重传 | 
|                 tr.find('.demo-reload').on('click', function(){ | 
|                     obj.upload(index, file); | 
|                 }); | 
|   | 
|                 //删除 | 
|                 tr.find('.demo-delete').on('click', function(){ | 
|                     delete files[index]; //删除对应的文件 | 
|                     tr.remove(); | 
|                     uploadListIns.config.elem.next()[0].value = ''; //清空 input file 值,以免删除后出现同名文件不可选 | 
|                 }); | 
|   | 
|                 that.elemList.append(tr); | 
|                 element.render('progress'); //渲染新加的进度条组件 | 
|             }); | 
|         } | 
|         ,done: function(res, index, upload){ //成功的回调 | 
|             var that = this; | 
|             //if(res.code == 0){ //上传成功 | 
|             var tr = that.elemList.find('tr#upload-'+ index) | 
|                 ,tds = tr.children(); | 
|             tds.eq(3).html(''); //清空操作 | 
|             delete this.files[index]; //删除文件队列已经上传成功的文件 | 
|             return; | 
|             //} | 
|             this.error(index, upload); | 
|         } | 
|         ,allDone: function(obj){ //多文件上传完毕后的状态回调 | 
|             console.log(obj) | 
|         } | 
|         ,error: function(index, upload){ //错误回调 | 
|             var that = this; | 
|             var tr = that.elemList.find('tr#upload-'+ index) | 
|                 ,tds = tr.children(); | 
|             tds.eq(3).find('.demo-reload').removeClass('layui-hide'); //显示重传 | 
|         } | 
|         ,progress: function(n, elem, e, index){ | 
|             element.progress('progress-demo-'+ index, n + '%'); //执行进度条。n 即为返回的进度百分比 | 
|         } | 
|     }); | 
|   | 
|     // 添加 | 
|     $("#planAddBtn").click(function () { | 
|         let loadIndex = layer.load(2); | 
|         $.ajax({ | 
|             url: baseUrl+"/planType/list/radio/auth", | 
|             headers: {'token': localStorage.getItem('token')}, | 
|             method: 'POST', | 
|             success: function (res) { | 
|                 if (res.code === 200){ | 
|                     admin.open({ | 
|                         type: 1, | 
|                         area: '300px', | 
|                         title: '新建售前规划申请单', | 
|                         content: $('#addDialogPre').html(), | 
|                         success: function (layero, dIndex) { | 
|                             let template = Handlebars.compile($('#planTypeTpl').html()); | 
|                             $('#planTypeBox').html(template({list: res.data.map(function (d) { | 
|                                     return { | 
|                                         id: d.id, | 
|                                         name: d.name, | 
|                                         checked: d.checked | 
|                                     } | 
|                                 })}) | 
|                             ); | 
|                             element.init();form.render(); | 
|                             layer.close(loadIndex); | 
|                             // 确认规划单类型 | 
|                             form.on('submit(planTypeSubmit)', function (data) { | 
|                                 layer.close(dIndex); | 
|                                 let planTypeId = data.field.planType; | 
|                                 let loadIndex0 = layer.load(2); | 
|                                 $.ajax({ | 
|                                     url: baseUrl + "/planType/" + planTypeId + "/plan/auth", | 
|                                     headers: {'token': localStorage.getItem('token')}, | 
|                                     method: 'GET', | 
|                                     success: function (res0) { | 
|                                         let planType = res0.data.planType; | 
|                                         if (res0.code === 200) { | 
|                                             admin.open({ | 
|                                                 type: 1, | 
|                                                 area: ["95%", "90%"], | 
|                                                 offset: 'auto', | 
|                                                 title: '添加售前规划申请单' + ' - ' + planType.name, | 
|                                                 content: $('#editDialog').html(), | 
|                                                 success: function (layero0, dIndex0) { | 
|                                                     $('#customizeBox').html(planType.html) | 
|   | 
|                                                     layer.close(loadIndex0); | 
|                                                     let orderSel = loadOrderSel(); | 
|                                                     let cstmrSel = loadCstmrSel(); | 
|                                                     let userSel = loadUserSel(); | 
|                                                     userSel.setValue([ | 
|                                                         {name: res0.data.nickName, value: Number(res0.data.userId)}, | 
|                                                     ]) | 
|                                                     let planNeedSel = loadPlanNeedSel(); | 
|                                                     form.val('detail', { | 
|                                                         planTypeName: planType.name | 
|                                                     }); | 
|                                                     layDateRender(); | 
|                                                     form.on('submit(editSubmit)', function (data) { | 
|                                                         data.field.planType = planType.id; | 
|                                                         data.field.orderId = orderSel.getValue()[0] ? orderSel.getValue()[0].value : null; | 
|                                                         data.field.cstmrId = cstmrSel.getValue()[0] ? cstmrSel.getValue()[0].value : null; | 
|                                                         data.field.userId = userSel.getValue()[0] ? userSel.getValue()[0].value : null; | 
|                                                         // data.field.planNeed = planNeedSel.getValue()[0] ? planNeedSel.getValue()[0].value : null; | 
|                                                         var planNeedValue= planNeedSel.getValue()[0] ? planNeedSel.getValue()[0].value : null; | 
|                                                         for (var i=1;i<planNeedSel.getValue().length;i++){ | 
|                                                             planNeedValue =planNeedSel.getValue()[i] ? planNeedValue+"-"+planNeedSel.getValue()[i].value : planNeedValue; | 
|                                                         } | 
|                                                         data.field.planNeed = planNeedValue; | 
|   | 
|                                                         delete data.field.select;delete data.field.planTypeName; | 
|   | 
|                                                         if (!data.field.orderId) { | 
|                                                             layer.msg("跟踪项目不能为空", {icon: 2}); | 
|                                                             top.requireTip($('#orderXmlSel')); | 
|                                                             return false; | 
|                                                         } | 
|                                                         if (!data.field.cstmrId) { | 
|                                                             layer.msg("客户名称不能为空", {icon: 2}); | 
|                                                             top.requireTip($('#cstmrXmlSel')); | 
|                                                             return false; | 
|                                                         } | 
|                                                         if (!data.field.userId) { | 
|                                                             layer.msg("业务员不能为空", {icon: 2}); | 
|                                                             top.requireTip($('#userXmlSel')); | 
|                                                             return false; | 
|                                                         } | 
|                                                         var loadIndex = layer.load(2); | 
|                                                         $.ajax({ | 
|                                                             url: baseUrl+"/plan/add/auth", | 
|                                                             headers: {'token': localStorage.getItem('token')}, | 
|                                                             data: data.field, | 
|                                                             method: 'POST', | 
|                                                             success: function (res) { | 
|                                                                 layer.close(loadIndex); | 
|                                                                 if (res.code === 200){ | 
|                                                                     layer.close(dIndex0); | 
|                                                                     layer.msg(res.msg, {icon: 1}); | 
|                                                                     tableReload(); | 
|                                                                 } else if (res.code === 403){ | 
|                                                                     top.location.href = baseUrl+"/"; | 
|                                                                 } else { | 
|                                                                     layer.msg(res.msg, {icon: 2}); | 
|                                                                 } | 
|                                                             } | 
|                                                         }) | 
|                                                         return false; | 
|                                                     }); | 
|                                                     $(layero).children('.layui-layer-content').css('overflow', 'visible'); | 
|                                                     layui.form.render('select'); | 
|                                                 } | 
|                                             }); | 
|                                         } else if (res0.code === 403) { | 
|                                             top.location.href = baseUrl + "/"; | 
|                                         } else { | 
|                                             layer.msg(res0.msg, {icon: 2}); | 
|                                         } | 
|                                     } | 
|                                 }) | 
|                                 return false; | 
|                             }); | 
|                         } | 
|                     }) | 
|                 } else if (res.code === 403){ | 
|                     top.location.href = baseUrl+"/"; | 
|                 } else { | 
|                     layer.msg(res.msg, {icon: 2}); | 
|                 } | 
|             } | 
|         }) | 
|     }); | 
|   | 
|     // 删除 | 
|     form.on('submit(planDel)', function (data) { | 
|         let checkStatus = layui.table.checkStatus('plan').data; | 
|         if (checkStatus.length === 0) { | 
|             layer.msg('请选择要删除的数据', {icon: 2}); | 
|             return; | 
|         } | 
|         del(checkStatus.map(function (d) { | 
|             return d.id; | 
|         })); | 
|     }); | 
|   | 
|     // 监听排序事件 | 
|     table.on('sort(plan)', function (obj) { | 
|         var searchData = {}; | 
|         $.each($('#search-box [name]').serializeArray(), function() { | 
|             searchData[this.name] = this.value; | 
|         }); | 
|         searchData['orderByField'] = obj.field; | 
|         searchData['orderByType'] = obj.type; | 
|         tableIns.reload({ | 
|             where: searchData, | 
|             page: {curr: 1} | 
|         }); | 
|     }); | 
|   | 
|     // 监听行工具事件 | 
|     table.on('tool(plan)', function(obj){ | 
|         var data = obj.data; | 
|         switch (obj.event) { | 
|             case 'more': | 
|                 top.planByMore = data.id; | 
|                 admin.popupRight({ | 
|                     type: 1, | 
|                     window: "top", | 
|                     area: "1250px", | 
|                     url: "plan_more.html", | 
|                     end: function () { | 
|                         // $(".layui-laypage-btn")[0].click(); | 
|                     } | 
|                 }) | 
|                 break; | 
|             case 'cstmrMore': | 
|                 top.cstmrByMore = data.cstmrId; | 
|                 admin.popupRight({ | 
|                     type: 1, | 
|                     window: "top", | 
|                     area: "1250px", | 
|                     url: "../cstmr/cstmr_more.html", | 
|                     end: function () { | 
|                         // $(".layui-laypage-btn")[0].click(); | 
|                     } | 
|                 }) | 
|                 break; | 
|             case 'orderMore': | 
|                 top.orderByMore = data.orderId; | 
|                 admin.popupRight({ | 
|                     type: 1, | 
|                     window: "top", | 
|                     area: "1250px", | 
|                     url: "../order/order_more.html", | 
|                     end: function () { | 
|                         // $(".layui-laypage-btn")[0].click(); | 
|                     } | 
|                 }) | 
|                 break; | 
|             case 'approval': | 
|                 layer.confirm('审批通过?', { | 
|                     skin: 'layui-layer-admin', | 
|                     shade: .1, | 
|                     offset: '200px', | 
|                     title: data.name | 
|                 }, function (i) { | 
|                     layer.close(i); | 
|                     // 指定规划员 | 
|                     if (data.settle === 2) { | 
|                         admin.open({ | 
|                             type: 1, | 
|                             area: '300px', | 
|                             title: '选择规划员', | 
|                             content: $('#plannerListDialog').html(), | 
|                             success: function (layero, dIndex) { | 
|                                 let plannerSel = xmSelect.render({ | 
|                                     el: '#plannerXmlSel', | 
|                                     autoRow: true, | 
|                                     filterable: true, | 
|                                     remoteSearch: true, | 
|                                     radio: true, | 
|                                     remoteMethod: function (val, cb, show) { | 
|                                         let loadIndex = layer.load(2); | 
|                                         $.ajax({ | 
|                                             url: baseUrl+"/plan/planner/list/auth", | 
|                                             headers: {'token': localStorage.getItem('token')}, | 
|                                             data: { | 
|                                                 planId: data.id | 
|                                             }, | 
|                                             method: 'POST', | 
|                                             success: function (res) { | 
|                                                 layer.close(loadIndex); | 
|                                                 if (res.code === 200) { | 
|                                                     cb(res.data) | 
|                                                 } else { | 
|                                                     layer.close(dIndex); | 
|                                                     layer.msg(res.msg, {icon: 2}); | 
|                                                 } | 
|                                             } | 
|                                         }) | 
|                                     } | 
|                                 }); | 
|   | 
|                                 form.on('submit(editSubmit)', function () { | 
|                                     let plannerId = plannerSel.getValue()[0] ? plannerSel.getValue()[0].value : null; | 
|                                     if (!plannerId) { | 
|                                         layer.msg("请选择规划员", {icon: 2}); | 
|                                         top.requireTip($('#plannerXmlSel')); | 
|                                         return false; | 
|                                     } | 
|                                     approval(data.id, plannerId, dIndex); | 
|                                 }); | 
|   | 
|                                 $(layero).children('.layui-layer-content').css('overflow', 'visible'); | 
|                             } | 
|                         }) | 
|                     } else { | 
|                         approval(data.id); | 
|                     } | 
|                 }); | 
|                 break; | 
|             case 'edit': | 
|                 showEditModel(data); | 
|                 break; | 
|             case "del": | 
|                 del([data.id]); | 
|                 break; | 
|             case "uploadLink": | 
|                 // 打开弹窗 | 
|                 // 构建带参数的内容 | 
|                 layer.open({ | 
|                     type: 1, | 
|                     title: '上传文件-'+data.id, | 
|                     content: $('#myModal') | 
|                 }); | 
|                 // 获取路径下的文件列表,使用 jQuery 的 ajax 方法 | 
|                 $.ajax({ | 
|                     url: '/plan/view/file/auth', | 
|                     data:{ | 
|                         planId:data.id | 
|                     }, | 
|                     success: function(response) { | 
|                         if (response.code==200){ | 
|                             var targetTable = document.getElementById("data-btn-file3"); | 
|                             // var targetTable1 = document.getElementById("layui-layer2"); | 
|                             // // 获取文本内容 | 
|                             // var text = targetTable1.textContent.trim(); | 
|                             // console.log(text); // 输出 '上传文件-20' | 
|                             targetTable.innerHTML = ''; | 
|                             // 将获取到的文件列表添加到文件队列中进行显示 | 
|                             response.data.forEach(function(file,index) { | 
|                                 // 创建tr元素 | 
|                                 var tr = document.createElement("tr"); | 
|                                 tr.id = "upload-"+index; | 
|                                 tr.innerHTML = '<td>' + file.name + '</td>' | 
|                                     + '<td>' + (file.size / 1024).toFixed(1) + 'kb</td>' | 
|                                     // + '<td><div class="layui-progress" lay-filter="progress-demo-' + index ,100 + '%'+ '"><div class="layui-progress-bar" lay-percent=""></div></div></td>' | 
|                                     + '<td>'+'已完成'+'</td>' | 
|                                     + '<td>' | 
|                                     + '<button class="layui-btn layui-btn-xs demo-reload layui-hide">重传</button>' | 
|                                     // + '<button class="layui-btn layui-btn-xs layui-btn-danger demo-delete">删除</button>' | 
|                                     + '<a href="' + file.path + '" download class="layui-btn layui-btn-xs layui-btn-primary">下载</a>' | 
|                                     + '</td>'; | 
|                                 // 将tr元素添加到目标table中 | 
|                                 targetTable.appendChild(tr); | 
|                             }); | 
|                         }else { | 
|                             console.log('Failed to get file list error.'); | 
|                         } | 
|                     }, | 
|                     error: function() { | 
|                         console.log('Failed to get file list.'); | 
|                     } | 
|                 }); | 
|                 break; | 
|         } | 
|     }); | 
|   | 
|     // 点击下载按钮时触发文件下载 | 
|     $('#data-btn-file3').on('click', 'a', function() { | 
|         var downloadUrl = $(this).attr('href'); | 
|         // console.log(downloadUrl) | 
|         // console.log(baseUrl) | 
|         // window.open("/\//"+downloadUrl); | 
|         // return false; | 
|         // var downloadUrl = $(this).attr('href'); | 
|         // console.log(downloadUrl) | 
|         // // 发起 AJAX 请求,获取文件 | 
|         $.ajax({ | 
|             url: '/plan/download/file/auth', | 
|             type: 'POST', | 
|             data: { downloadUrl: downloadUrl },  // 传递下载链接作为参数 | 
|             success: function(response) { | 
|                 console.log(response) | 
|                 layer.msg(response.msg+',已下载至默认路径!详细下载路径:'+response.data, {icon: 1}); | 
|         //         // window.open(baseUrl+response.msg) | 
|         //         // 创建一个Blob对象 | 
|         //         var blob = new Blob([response]); | 
|         //         // 使用FileSaver保存文件 | 
|         //         var fileName = downloadUrl.substring(downloadUrl.lastIndexOf('\\') + 1); | 
|         //         console.log(fileName) | 
|         //         saveAs(blob, fileName); | 
|         //         return false; | 
|             }, | 
|             error: function() { | 
|                 layer.msg('请求文件下载失败'); | 
|             } | 
|         }); | 
|         // var downloadUrl = $(this).attr('href'); | 
|         // console.log(downloadUrl) | 
|         // if (downloadUrl == "" || downloadUrl == null) { | 
|         //     layer.msg('请先上传app文件',{time:1000},() => { | 
|         //         parent.location.reload() | 
|         //     }) | 
|         // }else{ | 
|         //     window.open(downloadUrl); | 
|         // } | 
|         return false;  // 阻止默认的链接跳转行为 | 
|     }); | 
|   | 
|     function approval(planId, plannerId, dIdx) { | 
|         let loadIndex = layer.load(2); | 
|         $.ajax({ | 
|             url: baseUrl+"/plan/approval/auth", | 
|             headers: {'token': localStorage.getItem('token')}, | 
|             data: { | 
|                 planId: planId, | 
|                 plannerId: plannerId | 
|             }, | 
|             method: 'POST', | 
|             success: function (res) { | 
|                 if (dIdx) { | 
|                     layer.close(dIdx); | 
|                 } | 
|                 layer.close(loadIndex); | 
|                 if (res.code === 200){ | 
|                     layer.msg(res.msg, {icon: 1}); | 
|                     tableReload(); | 
|                 } else if (res.code === 403){ | 
|                     top.location.href = baseUrl+"/"; | 
|                 } else { | 
|                     layer.msg(res.msg, {icon: 2}); | 
|                 } | 
|             } | 
|         }) | 
|     } | 
|   | 
|     /* 弹窗 - 新增、修改 */ | 
|     function showEditModel(mData) { | 
|         let loadIndex = layer.load(2); | 
|         $.ajax({ | 
|             url: baseUrl + "/plan/" + mData.id + "/auth", | 
|             headers: {'token': localStorage.getItem('token')}, | 
|             method: 'GET', | 
|             success: function (res) { | 
|                 layer.close(loadIndex); | 
|                 if (res.code === 200){ | 
|                     let plan = res.data; | 
|                     admin.open({ | 
|                         type: 1, | 
|                         area: ["95%", "90%"], | 
|                         offset: 'auto', | 
|                         title: '编辑售前规划申请单 - ' + plan.planType$, | 
|                         content: $('#editDialog').html(), | 
|                         success: function (layero, dIndex) { | 
|                             $('#customizeBox').html(plan.formHtml); | 
|                             let orderSel = loadOrderSel(); | 
|                             let cstmrSel = loadCstmrSel(); | 
|                             let userSel = loadUserSel(); | 
|                             let planNeedSel = loadPlanNeedSel(); | 
|                             if (plan.orderId) { orderSel.setValue([{name: plan.orderId$, value: plan.orderId}]); } | 
|                             if (plan.cstmrId) { cstmrSel.setValue([{name: plan.cstmrId$, value: plan.cstmrId}]); } | 
|                             if (plan.userId) { userSel.setValue([{name: plan.userId$, value: plan.userId}]); } | 
|                             let split = plan.planNeed.split("-"); | 
|                             if (plan.planNeed) { | 
|                                 var data = [] | 
|                                 split.forEach((item,idx) => { | 
|                                     data.push(parseInt(item)) | 
|                                 }) | 
|                                 planNeedXmlSelData = data | 
|                             } | 
|                             layDateRender(plan); | 
|                             plan['planTypeName'] = plan.planType$; | 
|                             form.val('detail', plan); | 
|                             form.on('submit(editSubmit)', function (data) { | 
|                                 data.field.orderId = orderSel.getValue()[0] ? orderSel.getValue()[0].value : null; | 
|                                 data.field.cstmrId = cstmrSel.getValue()[0] ? cstmrSel.getValue()[0].value : null; | 
|                                 data.field.userId = userSel.getValue()[0] ? userSel.getValue()[0].value : null; | 
|                                 // data.field.planNeed = planNeedSel.getValue()[0] ? planNeedSel.getValue()[0].value : null; | 
|                                 var planNeedValue= planNeedSel.getValue()[0] ? planNeedSel.getValue()[0].value : null; | 
|                                 for (var i=1;i<planNeedSel.getValue().length;i++){ | 
|                                     planNeedValue =planNeedSel.getValue()[i] ? planNeedValue+"-"+planNeedSel.getValue()[i].value : planNeedValue; | 
|                                 } | 
|                                 data.field.planNeed = planNeedValue; | 
|                                 delete data.field.select;delete data.field.planTypeName; | 
|   | 
|                                 if (!data.field.orderId) { | 
|                                     layer.msg("跟踪项目不能为空", {icon: 2}); | 
|                                     top.requireTip($('#orderXmlSel')); | 
|                                     return false; | 
|                                 } | 
|                                 if (!data.field.cstmrId) { | 
|                                     layer.msg("客户名称不能为空", {icon: 2}); | 
|                                     top.requireTip($('#cstmrXmlSel')); | 
|                                     return false; | 
|                                 } | 
|                                 let loadIndex = layer.load(2); | 
|                                 $.ajax({ | 
|                                     url: baseUrl+"/plan/update/auth", | 
|                                     headers: {'token': localStorage.getItem('token')}, | 
|                                     data: data.field, | 
|                                     method: 'POST', | 
|                                     success: function (res) { | 
|                                         layer.close(loadIndex); | 
|                                         if (res.code === 200){ | 
|                                             layer.close(dIndex); | 
|                                             layer.msg(res.msg, {icon: 1}); | 
|                                             tableReload(); | 
|                                         } else if (res.code === 403){ | 
|                                             top.location.href = baseUrl+"/"; | 
|                                         }else { | 
|                                             layer.msg(res.msg, {icon: 2}); | 
|                                         } | 
|                                     } | 
|                                 }) | 
|                                 return false; | 
|                             }); | 
|                             $(layero).children('.layui-layer-content').css('overflow', 'visible'); | 
|                             layui.form.render('select'); | 
|                         } | 
|                     }); | 
|                 } else if (res.code === 403){ | 
|                     top.location.href = baseUrl+"/"; | 
|                 } else { | 
|                     layer.msg(res.msg, {icon: 2}); | 
|                 } | 
|             } | 
|         }); | 
|     } | 
|   | 
|     /* 删除 */ | 
|     function del(ids) { | 
|         layer.confirm('确定要删除选中数据吗?', { | 
|             skin: 'layui-layer-admin', | 
|             shade: .1 | 
|         }, function (i) { | 
|             layer.close(i); | 
|             var loadIndex = layer.load(2); | 
|             $.ajax({ | 
|                 url: baseUrl+"/plan/delete/auth", | 
|                 headers: {'token': localStorage.getItem('token')}, | 
|                 data: {ids: ids}, | 
|                 method: 'POST', | 
|                 success: function (res) { | 
|                     layer.close(loadIndex); | 
|                     if (res.code === 200){ | 
|                         layer.msg(res.msg, {icon: 1}); | 
|                         tableReload(); | 
|                     } else if (res.code === 403){ | 
|                         top.location.href = baseUrl+"/"; | 
|                     } else { | 
|                         layer.msg(res.msg, {icon: 2}); | 
|                     } | 
|                 } | 
|             }) | 
|         }); | 
|     } | 
|   | 
|     // 搜索 | 
|     form.on('submit(search)', function (data) { | 
|         pageCurr = 1; | 
|         pageCount = 0; | 
|         tableReload(); | 
|     }); | 
|   | 
|     // 时间选择器 | 
|     function layDateRender(data) { | 
|         setTimeout(function () { | 
|             layDate.render({ | 
|                 elem: '.layui-laydate-range' | 
|                 ,type: 'datetime' | 
|                 ,range: true | 
|             }); | 
|             layDate.render({ | 
|                 elem: '#appleTime\\$', | 
|                 type: 'date', | 
|                 value: data!==undefined?data['appleTime$']:null | 
|             }); | 
|             layDate.render({ | 
|                 elem: '#finishTime\\$', | 
|                 type: 'date', | 
|                 value: data!==undefined?data['finishTime$']:null | 
|             }); | 
|             layDate.render({ | 
|                 elem: '#createTime\\$', | 
|                 type: 'datetime', | 
|                 value: data!==undefined?data['createTime$']:null | 
|             }); | 
|             layDate.render({ | 
|                 elem: '#updateTime\\$', | 
|                 type: 'datetime', | 
|                 value: data!==undefined?data['updateTime$']:null | 
|             }); | 
|   | 
|         }, 300); | 
|     } | 
|     layDateRender(); | 
|   | 
|     window.loadPlanTypeSel = function () { | 
|         return xmSelect.render({ | 
|             el: '#planTypeXmlSel', | 
|             autoRow: true, | 
|             filterable: true, | 
|             remoteSearch: true, | 
|             radio: true, | 
|             remoteMethod: function (val, cb, show) { | 
|                 $.ajax({ | 
|                     url: baseUrl + "/planType/all/get/kv", | 
|                     headers: {'token': localStorage.getItem('token')}, | 
|                     data: { | 
|                         condition: val | 
|                     }, | 
|                     method: 'POST', | 
|                     success: function (res) { | 
|                         if (res.code === 200) { | 
|                             cb(res.data) | 
|                         } else { | 
|                             cb([]); | 
|                             layer.msg(res.msg, {icon: 2}); | 
|                         } | 
|                     } | 
|                 }); | 
|             } | 
|         }); | 
|     } | 
|   | 
|     window.loadOrderSel = function () { | 
|         return xmSelect.render({ | 
|             el: '#orderXmlSel', | 
|             autoRow: true, | 
|             filterable: true, | 
|             remoteSearch: true, | 
|             radio: true, | 
|             remoteMethod: function (val, cb, show) { | 
|                 $.ajax({ | 
|                     url: baseUrl + "/order/all/get/kv", | 
|                     headers: {'token': localStorage.getItem('token')}, | 
|                     data: { | 
|                         condition: val | 
|                     }, | 
|                     method: 'POST', | 
|                     success: function (res) { | 
|                         if (res.code === 200) { | 
|                             cb(res.data) | 
|                         } else { | 
|                             cb([]); | 
|                             layer.msg(res.msg, {icon: 2}); | 
|                         } | 
|                     } | 
|                 }); | 
|             } | 
|         }); | 
|     } | 
|   | 
|     window.loadCstmrSel = function () { | 
|         return xmSelect.render({ | 
|             el: '#cstmrXmlSel', | 
|             autoRow: true, | 
|             filterable: true, | 
|             remoteSearch: true, | 
|             radio: true, | 
|             remoteMethod: function (val, cb, show) { | 
|                 $.ajax({ | 
|                     url: baseUrl + "/cstmr/all/get/kv", | 
|                     headers: {'token': localStorage.getItem('token')}, | 
|                     data: { | 
|                         condition: val | 
|                     }, | 
|                     method: 'POST', | 
|                     success: function (res) { | 
|                         if (res.code === 200) { | 
|                             cb(res.data) | 
|                         } else { | 
|                             cb([]); | 
|                             layer.msg(res.msg, {icon: 2}); | 
|                         } | 
|                     } | 
|                 }); | 
|             } | 
|         }); | 
|     } | 
|   | 
|     window.loadPlanNeedSel = function () { | 
|         var planNeedXmlSel = xmSelect.render({ | 
|             el: '#planNeedXmlSel', | 
|             autoRow: true, | 
|             data: [] | 
|         }); | 
|   | 
|         $.ajax({ | 
|             url: baseUrl + "/planNeed/all/get/kv", | 
|             headers: {'token': localStorage.getItem('token')}, | 
|             data: { | 
|                 condition: "" | 
|             }, | 
|             method: 'POST', | 
|             success: function (res) { | 
|                 if (res.code === 200) { | 
|                     console.log(planNeedXmlSelData) | 
|                     planNeedXmlSel.update({ | 
|                         initValue: planNeedXmlSelData, | 
|                         data: res.data | 
|                     }) | 
|                 } else { | 
|                     cb([]); | 
|                     layer.msg(res.msg, {icon: 2}); | 
|                 } | 
|             } | 
|         }); | 
|   | 
|         return planNeedXmlSel; | 
|     } | 
|   | 
|     window.loadUserSel = function () { | 
|         return xmSelect.render({ | 
|             el: '#userXmlSel', | 
|             autoRow: true, | 
|             filterable: true, | 
|             remoteSearch: true, | 
|             radio: true, | 
|             remoteMethod: function (val, cb, show) { | 
|                 $.ajax({ | 
|                     url: baseUrl + "/user/all/get/kv", | 
|                     headers: {'token': localStorage.getItem('token')}, | 
|                     data: { | 
|                         condition: val | 
|                     }, | 
|                     method: 'POST', | 
|                     success: function (res) { | 
|                         if (res.code === 200) { | 
|                             cb(res.data) | 
|                         } else { | 
|                             cb([]); | 
|                             layer.msg(res.msg, {icon: 2}); | 
|                         } | 
|                     } | 
|                 }); | 
|             } | 
|         }); | 
|     } | 
|   | 
|   | 
| }); | 
|   | 
| // 点击事件 | 
| $(document).on('click','#data-detail-close', function () { | 
|     parent.layer.closeAll(); | 
| }); | 
|   | 
| function tableReload() { | 
|     if (pageCount === 0) { | 
|         let searchData = {}; | 
|         $.each($('#search-box [name]').serializeArray(), function() { | 
|             searchData[this.name] = this.value; | 
|         }); | 
|         if (treeCond) { | 
|             searchData[treeCond.key] = treeCond.val; | 
|         } | 
|         tableIns.reload({ | 
|             where: searchData, | 
|             page: {curr: pageCurr} | 
|         }); | 
|     } else { | 
|         $(".layui-laypage-btn")[0].click(); | 
|     } | 
| } | 
|   | 
| function upload(obj){ | 
|     if(!obj.files) { | 
|         return; | 
|     } | 
|     var file = obj.files[0]; | 
|     admin.confirm('确认同步 [' + file.name +'] 文件吗?', function (index) { | 
|         layer.load(1, {shade: [0.1,'#fff']}); | 
|         var url = baseUrl + "/plan/excel/import/auth"; | 
|         var form = new FormData(); | 
|         form.append("file", file); | 
|         let xhr = new XMLHttpRequest(); | 
|         xhr.open("post", url, true); | 
|         xhr.setRequestHeader('token', localStorage.getItem('token')); | 
|         xhr.onload = uploadComplete; | 
|         xhr.onerror =  uploadFailed; | 
|         xhr.onloadend = function () { | 
|             layer.closeAll('loading'); | 
|         }; | 
|         // xhr.upload.onprogress = progressFunction; | 
|         xhr.upload.onloadstart = function(){ | 
|             ot = new Date().getTime(); | 
|             oloaded = 0; | 
|         }; | 
|         xhr.send(form); | 
|     }, function(index){ | 
|     }); | 
| } | 
| function uploadComplete(evt) { | 
|     let res = JSON.parse(evt.target.responseText); | 
|     if(res.code === 200) { | 
|         layer.msg(res.msg, {icon: 1}); | 
|         tableReload(); | 
|     } else { | 
|         alert(res.msg); | 
|         // layer.msg(res.msg, {icon: 2}); | 
|     } | 
| } | 
| function uploadFailed(evt) { | 
|     let res = JSON.parse(evt.target.responseText); | 
|     alert(res.msg); | 
|     // layer.msg(res.msg, {icon: 2}); | 
| } |