`

jqgrid应用

阅读更多
<%@ page language="java" pageEncoding="UTF-8"%>
<%@ taglib prefix="shiro" uri="http://shiro.apache.org/tags"%>
<!DOCTYPE html>
<html>
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
	<title>开票申请</title>
	<link rel="stylesheet" type="text/css" href="${contextPath}/pc-rs/novatar.frameimpl/scripts/static/css/style.css" />
		<script type="text/javascript" src="${contextPath}/pc-rs/novatar.frameimpl/scripts/static/js/src/fm.selectator.jquery.js"></script>
	<script type="text/javascript" src="${contextPath}/pc-rs/novatar.frameimpl/scripts/p2/output/billingApply.js"></script>
	<style type="text/css">
		#selectTable .tr {
			height:85px;
		}
	</style>
	<script type="text/javascript">
	var _myDialog = null;
	var _myDialogSepareteDialog = null;
	var impData = null;
	
	jQuery(document).ready(function(){
		$(".tab_content").hide(); 
	    $("#con1 div.tab_content:first").show(); 
    	$("#custType").change(function() {
    		$(".tab_content").hide();
    		if($("#custType").val() == '月结账号') {
    		    $("#con1 div.tab_content:first").show(); 
    		} else {
    			$("#con1 #tab_2").show(); 
    		}
    	});
		$("#dataGridTable1").jqGrid({
			datatype: "local",
			multiselect: true,
		   	colModel:[
				{label:'ID', name:'ID',hidden:true,key:true},
				{label:'IS_MAIN', name:'IS_MAIN',hidden:true},
				{label:'月结账号', name:'Z_CUSTOMER_NO',width:80},
				{label:'月结账号名称', name:'Z_CDH_NAME',width:80},
				/* {label:'关联账号名称', name:'',width:80}, */
				{label:'企业名片代码', name:'NAMECARD_ID',width:80},
				{label:'所属期间', name:'BELONG_DATE',width:60},
				{label:'结算网点编码', name:'BILL_PRCTR',width:80},
				{label:'业务类型', name:'BUSINESS_TYPE',width:60},
				{label:'发票类型', name:'INVOICE_TYPE',width:60,formatter:function(cellval, options, row) {
		   			var content = "";
		   			if(row.INVOICE_TYPE == 'V1' || row.INVOICE_TYPE == 'v1') {
		   				content = "专票";
		   			} else if(row.INVOICE_TYPE == 'V2' || row.INVOICE_TYPE == 'v2') {
		   				content = "普票";				
		   			} else if(row.INVOICE_TYPE == 'V3' || row.INVOICE_TYPE == 'v3'){
		   				content = "电子发票";
		   			} else {
		   				content = row.INVOICE_TYPE;
		   			}
		   			return content;
		   		}},
		   		{label:'应收金额', name:'WRBTR',width:60},
				{label:'未开票金额', name:'TSL_MONTH_UNBILL',width:60},
				{label:'开票金额', name:'TSK_MONTH_BILL',width:70,formatter:function(cellval, options, row) {
					if (row.TSK_MONTH_BILL > 0) {
						return row.TSK_MONTH_BILL;
					} else {
						var content = "<input type='text' value='"+row.TSL_MONTH_UNBILL+"' id='TSK_MONTH_BILL_"+row.ID+"' name = 'TSK_MONTH_BILL_" + row.ID +"' onkeypress='keyPress()'/>";
						return content;
					}
				}},
				{label:'差异原因', name:'DIFF_REASON',width:80,formatter:function(cellval, options, row) {
					if (row.DIFF_REASON != null) {
						return row.DIFF_REASON;
					} else {
						var content = "<select id = 'DIFF_REASON_"+row.ID+"' name = 'DIFF_REASON_" + row.ID + 
						"'><option value=''>请选择</option><option value='A'>账单金额或应收金额需调整</option><option value='B'>运单挂错月结号</option><option value='C'>退换票</option><option value='E'>理赔</option></select>";
						// 如果是补开才添加
						if ($("#REBILL_FLAG").val()) {
							 content = "<select id = 'DIFF_REASON_"+row.ID+"' name = 'DIFF_REASON_" + row.ID + 
								"'><option value=''>请选择</option><option value='A'>账单金额或应收金额需调整</option><option value='B'>运单挂错月结号</option><option value='C'>退换票</option><option value='D'>正常补开</option><option value='E'>理赔</option></select>";
						}
						return content;
					}
				}},
				{label:'是否直寄', name:'IS_POST',width:80,formatter:function(cellval, options, row) {
					return row.IS_POST == 'X' ? '是':'否';  
				}},
				{label:'票面备注', name:'TICKETS_BACK',width:80,formatter:function(cellval, options, row) {
					var content = "<input type='text' id = 'TICKETS_BACK_"+row.ID+"' name = 'TICKETS_BACK_" + row.ID + "'/>";
					return content;
				}},
				{label:'税号', name:'Z_TAX_ID',width:80},
				{label:'地址&电话', name:'ADDR_TEL',width:80},
				{label:'开户行&账号', name:'BANK_ACCOUNT',width:80},
				{label:'货物或应税劳务名称', name:'MAKTX',width:80},
				{label:'单位', name:'MEINS',width:50,formatter:function(cellval, options, row) {
					var value =  (row.MEINS === undefined) ? "": row.MEINS;
					var content = "<input type='text' id = 'MEINS_"+row.ID+"' name = 'MEINS_" + row.ID + "' value='"+value+"'/>";
					return content;
				}},
				{label:'单价', name:'UNITPE',width:50,formatter:function(cellval, options, row) {
					var value =  (row.UNITPE === undefined) ? "": row.UNITPE;
					var content = "<input type='text' id = 'UNITPE_"+row.ID+"' name = 'UNITPE_" + row.ID + "' value='"+value+"'/>";
					return content;
				}},
				{label:'数量', name:'FKIMG',width:50,formatter:function(cellval, options, row) {
					var value =  (row.FKIMG === undefined) ? "": row.FKIMG;
					var content = "<input type='text' id = 'FKIMG_"+row.ID+"' name = 'FKIMG_" + row.ID + "' value='"+value+"'/>";
					return content;
				}},
				{label:'规格', name:'MSPEC',width:50,formatter:function(cellval, options, row) {
					var value =  (row.MSPEC === undefined) ? "": row.MSPEC;
					var content = "<input type='text' id = 'MSPEC_"+row.ID+"' name = 'MSPEC_" + row.ID + "' value='"+value+"'/>";
					return content;
				}},
				{label:'申请人员备注', name:'applierBack',width:80,formatter:function(cellval, options, row) {
					var content = "<input type='text' id = 'applierBack_"+row.ID+"' name = 'applierBack_" + row.ID + "'/>";
					return content;
				}},
				{label:'驳回原因', name:'REJECT_REASON'},
		   	],
		   	rowNum:30,
		   	rowList:[10,20,30,50,100],
		   	jsonReader : {
				root : 'expData.page.data',
				page : 'expData.page.index',
				total : 'expData.page.total',
				records : 'expData.page.totalRecord',
				repeatitems : false
			},
		   	rownumbers: true,
		   	pager: '#pgtoolbar1',
		    viewrecords: true,
		    height: 400,
		    shrinkToFit: false,
            autoScroll: true,  
		    subGrid : true,//子表格启用
		    subGridOptions : {//子表格选项
		    plusicon : "ace-icon fa fa-plus center bigger-110 blue",//展开图标
		    minusicon : "ace-icon fa fa-minus center bigger-110 blue",//收缩图标
		    openicon : "ace-icon fa fa-chevron-right center orange"//打开时左侧图标
		    },
		    subGridRowExpanded: function (subgrid_id, rowId) {
		    	var subgrid_table_id;
		        subgrid_table_id = subgrid_id+"_t";
		        jQuery("#"+subgrid_id).html("<table id='"+subgrid_table_id+"' class='scroll'></table>");
		        jQuery("#"+subgrid_table_id).jqGrid({
		        	url : "${contextPath}/service/pageReq?random="+ Math.random(),
					postData : {
						needcontrolprocess : "billingApplyBusiness.querySubAccount",
						content : "headerId:" + rowId //TODO 查询添加纳税主体权限
					},
					colModel:[
								{label:'SUB_XH', name:'SUB_XH',hidden:true,key:true},
								{label:'', name:'',width:80},  
								{label:'', name:'',width:80},  
								{label:'关联账号名称', name:'sub_Z_CDH_NAME',width:80},
								{label:'所属期间', name:'sub_BELONG_DATE',width:60},
								{label:'结算网点编码', name:'sub_BILL_PRCTR',width:80},
								{label:'业务类型', name:'sub_BUSINESS_TYPE',width:60,formatter:function(cellval, options, row) {
									var content = "";
						   			if(row.sub_BUSINESS_TYPE == '01') {
						   				content = "运费";
						   			} else if(row.sub_BUSINESS_TYPE == '07'){
						   				content = "税金";				
						   			} else if(row.sub_BUSINESS_TYPE == '08'){
						   				content = "仓储";
						   			} else if(row.sub_BUSINESS_TYPE == '09'){
						   				content = "租赁";
						   			} else if(row.sub_BUSINESS_TYPE == '10'){
						   				content = "佣金";
						   			} else if(row.sub_BUSINESS_TYPE == '11'){
						   				content = "数据灯塔服务费";
						   			} else if(row.sub_BUSINESS_TYPE == 'A1'){
						   				content = "资产";
						   			} else if(row.sub_BUSINESS_TYPE == 'A2'){
						   				content = "物资";
						   			} else {
						   				content = row.sub_BUSINESS_TYPE;
						   			}
						   			return content;
						   		}},
								{label:'发票类型', name:'sub_INVOICE_TYPE',width:60,formatter:function(cellval, options, row) {
						   			var content = "";
						   			if(row.sub_INVOICE_TYPE == 'V1') {
						   				content = "专票";
						   			} else if(row.sub_INVOICE_TYPE == 'V2') {
						   				content = "普票";				
						   			} else if((row.sub_INVOICE_TYPE == 'V3')){
						   				content = "电子发票";
						   			} else {
						   				content = row.sub_INVOICE_TYPE;
						   			}
						   			return content;
						   		}},
						   		{label:'应收金额', name:'sub_WRBTR',width:60},
								{label:'未开票金额', name:'sub_TSL_MONTH_UNBILL',width:60},
								{label:'开票金额', name:'sub_TSK_MONTH_BILL',width:70,formatter:function(cellval, options, row) {
									var content = "<input type='text' SUB_DATA_ID='"+row.sub_ID+"_"+row.SUB_XH+"' id='SUB_TSK_MONTH_BILL_"+row.sub_ID+"' name = 'SUB_TSK_MONTH_BILL_" + row.sub_ID +"' onkeypress='keyPress()'/>";
									return content;
								}},
								{label:'差异原因', name:'sub_DIFF_REASON',width:80,formatter:function(cellval, options, row) {
									/* var content = "<input type='text' SUB_DATA_ID='"+row.sub_ID+"_"+row.SUB_XH+"' id = 'SUB_DIFF_REASON_"+row.sub_ID+"' name = 'SUB_DIFF_REASON_" + row.sub_ID + "'/>";
									return content; */
									var content = "<select SUB_DATA_ID='"+row.sub_ID+"_"+row.SUB_XH+"' id = 'SUB_DIFF_REASON_"+row.sub_ID+"' name = 'SUB_DIFF_REASON_" + row.sub_ID +
									"'><option value=''>请选择</option><option value='A'>账单金额或应收金额需调整</option><option value='B'>运单挂错月结号</option><option value='C'>退换票</option><option value='E'>理赔</option></select>";
									// 如果是补开才添加
									if ($("#REBILL_FLAG").val()) {
										var content = "<select SUB_DATA_ID='"+row.sub_ID+"_"+row.SUB_XH+"' id = 'SUB_DIFF_REASON_"+row.sub_ID+"' name = 'SUB_DIFF_REASON_" + row.sub_ID +
										"'><option value=''>请选择</option><option value='A'>账单金额或应收金额需调整</option><option value='B'>运单挂错月结号</option><option value='C'>退换票</option><option value='D'>正常补开</option><option value='E'>理赔</option></select>";
									}
									return content;
								}},
								{label:'票面备注', name:'sub_TICKETS_BACK',width:80,formatter:function(cellval, options, row) {
									var content = "<input type='text' SUB_DATA_ID='"+row.sub_ID+"_"+row.SUB_XH+"'  id = 'SUB_TICKETS_BACK_"+row.sub_ID+"' name = 'SUB_TICKETS_BACK_" + row.sub_ID + "'/>";
									return content;
								}},
								{label:'税号', name:'sub_Z_TAX_ID',width:80},
								{label:'地址&电话', name:'sub_ADDR_TEL',width:80},
								{label:'开户行&账号', name:'sub_BANK_ACCOUNT',width:80},
								{label:'货物或应税劳务名称', name:'sub_MAKTX',width:80},
								{label:'单位', name:'sub_MEINS',width:50,formatter:function(cellval, options, row) {
									var value =  (row.sub_MEINS === undefined) ? "": row.sub_MEINS;
									var content = "<input type='text' SUB_DATA_TYPE='"+row.sub_BUSINESS_TYPE+"' id = 'sub_MEINS_"+row.sub_ID+"' name = 'sub_MEINS_" + row.sub_ID + "' value='"+value+"'/>";
									return content;
								}},
								{label:'单价', name:'sub_UNITPE',width:50,formatter:function(cellval, options, row) {
									var value =  (row.sub_UNITPE === undefined) ? "": row.sub_UNITPE;
									var content = "<input type='text' id = 'sub_UNITPE_"+row.sub_ID+"' name = 'sub_UNITPE_" + row.sub_ID + "' value='"+value+"'/>";
									return content;
								}},
								{label:'数量', name:'sub_FKIMG',width:50,formatter:function(cellval, options, row) {
									var value =  (row.sub_FKIMG === undefined) ? "": row.sub_FKIMG;
									var content = "<input type='text' id = 'sub_FKIMG_"+row.sub_ID+"' name = 'sub_FKIMG_" + row.sub_ID + "' value='"+value+"'/>";
									return content;
								}},
								{label:'规格', name:'sub_MSPEC',width:50,formatter:function(cellval, options, row) {
									var value =  (row.sub_MSPEC === undefined) ? "": row.sub_MSPEC;
									var content = "<input type='text' id = 'sub_MSPEC_"+row.sub_ID+"' name = 'sub_MSPEC_" + row.sub_ID + "' value='"+value+"'/>";
									return content;
								}},
								/* {label:'单位', name:'sub_MEINS',width:50},
								{label:'单价', name:'sub_UNITPE',width:50},
								{label:'数量', name:'sub_FKIMG',width:50},
								{label:'规格', name:'sub_MSPEC',width:50}, */
								{label:'申请人员备注', name:'sub_applierBack',width:80,formatter:function(cellval, options, row) {
									var content = "<input type='text' SUB_DATA_ID='"+row.sub_ID+"_"+row.SUB_XH+"' id = 'SUB_applierBack_"+row.sub_ID+"' name = 'SUB_applierBack_" + row.sub_ID + "'/>";
									return content;
								}}
						   	],
					datatype: "json",
		            height: '100%',
		            rowNum: 1000,
		            shrinkToFit: false,
		            autoScroll: true,  
		            //rownumbers: true,
		            jsonReader : {
						root : 'expData.page',
						repeatitems : false
					}
		         });
		    },
		    loadComplete: function(xhr) {
		    	var ids = $("#dataGridTable1").jqGrid('getDataIDs');
		    	for(var i=0; i<ids.length; i++) {
		    		var rowData = $("#dataGridTable1").jqGrid('getRowData',ids[i]);
		    		var IS_MAIN = rowData.IS_MAIN;
		    		if (IS_MAIN < 2) {
		    			 $('#' + ids[i]).find("span").hide();
		    			 $('#' + ids[i]).find("a").attr("onclick", "null");
		    		}
		    	}
		    }
		});
		$("#dataGridTable2").jqGrid({
			datatype: "local",
			multiselect: true,
		   	colModel:[
				{label:'ID', name:'ID',key:true,hidden:true},
				{label:'点部', name:'BRANCH'},
		   		{label:'申请期间', name:'BELONG_DATE'},
		   		{label:'开票名称', name:'CUST_NAME',width:140},
		   		{label:'纳税人识别号', name:'TAXPAY_ID',width:140},
		   		{label:'收票方地址&电话', name:'ADDR'},
		   		{label:'银行名称&账号', name:'ACCOUNT_NO'},
		   		{label:'开票金额', name:'TAXAMT'},
		   		{label:'发票类型', name:'INVOICE_TYPE',formatter:function(cellval, options, row) {
		   			var content = "";
		   			if(row.INVOICE_TYPE == 'V1') {
		   				content = "专票";
		   			} else if(row.INVOICE_TYPE == 'V2') {
		   				content = "普票";				
		   			} else if(row.INVOICE_TYPE == 'V3'){
		   				content = "电子发票";
		   			} else {
		   				content = row.INVOICE_TYPE;
		   			}
		   			return content;
		   		}},
		   		{label:'运单号', name:'BILL_NO'},
		   		{label:'货物或应税劳务名称', name:'DES'},
		   		{label:'规格', name:'SPEC'},
		   		{label:'单位', name:'UNIT'},
		   		{label:'单价', name:'UNIT_PRICE'},
		   		{label:'数量', name:'AMOUNT'},
		   		{label:'收款人', name:'PAYEE'},
		   		{label:'复核', name:'RECHECKER'},
		   		{label:'备注', name:'REMARK'},
		   		{label:'税率', name:'RETE'},
		   		{label:'收件人地址', name:'RECV_ADDR'},
		   		{label:'收件人姓名', name:'RECV_NAME'},
		   		{label:'收件人电话', name:'RECV_TEL'},
		   		{label:'驳回原因', name:'REJECT_REASON'},
		   		{label:'异常备注', name:'EXCEP_REMARK'},
		   		{label:'月结账号', name:'SETTLEMENT'},
		   	],
		   	rowNum:30,
		   	rowList:[10,20,30,50,100],
		   	jsonReader : {
				root : 'expData.page.data',
				page : 'expData.page.index',
				total : 'expData.page.total',
				records : 'expData.page.totalRecord',
				repeatitems : false
			},
		   	rownumbers: true,
		   	pager: '#pgtoolbar2',
		    viewrecords: true,
		    height: 400
		});
		$("#dataForm1").validator({},{
			callback : function(results){
				$('#dataGridTable1').jqGrid('setGridParam', {page:1});
				doSearch('commonSearch');
			}
		});

		$('#reset-btn1').click(function() {
			$("#BUSINESS_TYPE").selectator('destroy');
			$("#BUSINESS_TYPE").val("");
			$("#BUSINESS_TYPE").find("option").attr("selected",false);
			$("#BUSINESS_TYPE").selectator({
				height: '20',
				showAllOptionsOnFocus: true,
				keepOpen: true
			});
			$("#BILL_PRCTR").selectator('destroy');
			$("#BILL_PRCTR").val("");
			$("#BILL_PRCTR").selectator({
				height: '20',
				showAllOptionsOnFocus: true,
				keepOpen: true
			});
			$("#selectTable #startDate #endDate #Z_CUSTOMER_NO").val("");
		});
		
		$("#export-btn1").click(function() {
			var params = $('#params').val();
			if (params) {
				params = "&content=" + params;
				params = "&needcontrolprocess=billingApplyBusiness.exportOuterCust" + params;
				art.dialog({
					title : '消息',
					content: '确定要导出吗?',
					lock : true,
					ok: function () {
						this.title('导出中').content('导出中...');
						var url = '${contextPath}/service/export?random='+ Math.random() + params;
						window.open(url, "_self"); 
						return true;
					},
					cancel: true
				});
			} else {
				art.dialog({
					title : '消息',
					content: '先查询才可以导出',
					lock : true,
					ok: function () {
						return true;
					}
				});
			}
		});
		
		$("#search-btn2").click(function() {
			$("#REBILL_FLAG").val("REBILL");
			$('#dataGridTable1').jqGrid('setGridParam', {page:1});
			doSearch('reBillSearch');
		});
		
		//加载网点
		get_BILL_PRCTR();
		//业务类型
		get_BUSINESS_TYPE();
		
		$("#BUSINESS_TYPE").selectator({
			height: '20',
			showAllOptionsOnFocus: true,
			keepOpen: true
		});
		$("#BILL_PRCTR").selectator({
			height: '20',
			showAllOptionsOnFocus: true,
			keepOpen: true
		});
		// 账期设置默认值
		$("#startDate").val(getBeforeMonth());
	});
	
	function doSearch(searchType) {
		if(searchType != 'reBillSearch') {
			$("#REBILL_FLAG").val("");
		}
		var params = insFormvalue();
		params += "|searchType:" + searchType;
		$('#params').val(params);
		var pageCount = $('#dataGridTable1').jqGrid('getGridParam', 'page');
		$("#dataGridTable1").clearGridData();
		$("#dataGridTable1").jqGrid("setGridParam", {
			url : "${contextPath}/service/pageReq?random="+ Math.random(),
			page : pageCount,
			postData : {
				needcontrolprocess : "billingApplyBusiness.queryUnbilled",
				content : params //TODO 查询添加纳税主体权限
			},
			datatype: "json"
		}).trigger("reloadGrid");
	}
	
	function doSearchDesperse() {
		// 当前查询状态;
		$("#queryStatus").val($("#KP_FLAG").val());
		var params = formValue($("#dataForm2"));
		var pageCount = $('#dataGridTable2').jqGrid('getGridParam', 'page');
		$("#dataGridTable2").clearGridData();
		$("#dataGridTable2").jqGrid("setGridParam", {
			url : "${contextPath}/service/pageReq?random="+ Math.random(),
			page : pageCount,
			postData : {
				needcontrolprocess : "billingApplyBusiness.queryUnbilledDesperse",
				content : params //TODO 查询权限
			},
			datatype: "json"
		}).trigger("reloadGrid");
		$("#allSelect").attr("checked", false);
	}
	
	function showDialog(params, options) {
		_myDialog = art.dialog(options);// 初始化一个带有loading图标的空对话框
		jQuery.ajax({
			url : "${contextPath}/service/page?name=" + params,
			success : function(data) {
				_myDialog.content(data);// 填充对话框内容
			}
		});
	}
	
	function insFormvalue(){
		var param = "";
		param += $("#BILL_PRCTR").attr("name") + ":" + ($("#BILL_PRCTR").val() == null ? "" : $("#BILL_PRCTR").val()) + "|";
		param += $("#Z_CUSTOMER_NO").attr("name") + ":" + $("#Z_CUSTOMER_NO").val() + "|";
		param += $("#BUSINESS_TYPE").attr("name") + ":" + ($("#BUSINESS_TYPE").val() == null ? "" : $("#BUSINESS_TYPE").val()) + "|";
		param += $("#startDate").attr("name") + ":" + $("#startDate").val() + "|";
		param += $("#endDate").attr("name") + ":" + $("#endDate").val() + "|";
		param += $("#REJECT").attr("name") + ":" + $("#REJECT").val() + "|";
		param += $("#ZZPERSR").attr("name") + ":" + $("#ZZPERSR").val() + "|";
		param += $("#BILL_STATUS").attr("name") + ":" + ($("#BILL_STATUS").val() == null ? "" : $("#BILL_STATUS").val());
		return param;
	}
	
	//@ sourceURL=billingApply.js
	</script>
</head>

<body>
<div class="modal">
	<div class="modal-header r_location">
		<i class="r_txtico"></i>税务管理 &gt; 开票申请
	</div>
	<!-- start -->
	<select id="custType" class="form-control" style="width:90px;height:25px;padding:0px;margin-bottom: 0px;">
		<option value="月结账号">月结账号</option>
		<option value="散单">散单</option>
	</select>
	<div id="con1" class="tab_container">
		<div id="tab_1" class="tab_content" style="display: block; ">
			 <form id="dataForm1" class="view vt1">
					<table id="selectTable" class="table">
						<tr>
							<td class="title">网点:</td>
							<td class="content">
								<select class="form-control" name="BILL_PRCTR" id="BILL_PRCTR" style="width:110px;height:25px;padding:0px" multiple>
								</select>
							</td>
							<td class="title">客户:</td>
							<td class="content">
								<input class="form-control" name="Z_CUSTOMER_NO" id="Z_CUSTOMER_NO" style="width:120px;height:25px;padding:0px" placeholder="多个客户,用','分隔"/>
							</td>
							<td class="title">业务类型:</td>
							<td class="content">
								<select class="form-control" name="BUSINESS_TYPE" id="BUSINESS_TYPE" style="width:110px;height:25px;padding:0px" multiple>
								</select>
							</td>
						</tr>
						<tr>
							<td class="title">账期:</td>
							<td class="content">
								<input type="text" class="form-control Wdate" style="width:65px;" id="startDate" name="startDate"
								onclick="WdatePicker({dateFmt:'yyyyMM'})"> - 
							  	<input type="text" class="form-control Wdate" style="width:65px;" id="endDate" name="endDate"
								onclick="WdatePicker({dateFmt:'yyyyMM',minDate:'#F{$dp.$D(\'startDate\',{M:-0});}'})">
							</td>
							<td class="title">是否驳回:</td>
							<td class="content">
								<select class="form-control" name="REJECT" id="REJECT" style="width:120px;height:25px;padding:0px">
									<option value="">--选择--</option>
									<option value="1">是</option><option value="0">否</option>
								</select>
							</td>
							<td class="title">业务员:</td>
							<td class="content">
								<input class="form-control" name="ZZPERSR" id="ZZPERSR" style="width:120px;height:25px;padding:0px" placeholder="多个用','分隔"/>
							</td>
						</tr>
						<tr>
							<td></td>
							<td class="content" colspan="5">
								<input type="button" class="btn_blue m-r15 submitBtn" value="查 询" id="search-btn1">
								<input type="reset" class="btn_gray m-r15" value="重 置" id="reset-btn1">
								<input type="button" class="btn_gray m-r15" value="合并" id="post-btn2" onclick="postSelf('merged')">
								<input type="button" class="btn_gray m-r15" value="拆分" id="seprate-btn1" onclick="separate()"/>
							</td>
						</tr>
					</table>
				</form>
				<div class="modal-body">
					<div class="m-t10">
						<div class="clearfix table_fn">
							<span class="l"></span>
							<span class="r">
							<input type="button" class="btn_gray m-r15" value="提交" id="post-btn1" onclick="postSelf('alone')">
							<input type="button" class="btn_gray m-r15" value="导出" id="export-btn1" />
							<input type="button" class="btn_gray m-r15" value="导入" id="import-btn2" onclick="importExcel2()"/>
							<%-- <shiro:hasPermission name="/page/b/b16/export">
							</shiro:hasPermission> --%>
							</span>
						</div>
						<div class="clearfix">
							<table id="dataGridTable1"></table>
							<div id="pgtoolbar1" class="pgtoolbar"></div>
						</div>
					</div>
				</div>
				<input type="hidden" id="params">
				<input type="hidden" id="REBILL_FLAG"/>
		</div>
		<div id="tab_2" class="tab_content" style="display: block; ">
		 	 <form id="dataForm2">
		 	 	<table id="selectTable" class="table">
		 	 		<tr>
						<td class="title">点部:</td>
						<td class="content">
							<input type="text" name="BRANCH" id="BRANCH" class="form-control"/>
						</td>
						<td class="title">客户名称:</td>
						<td class="content">
							<input type="text" name="CUST_NAME" id="CUST_NAME" class="form-control"/>
						</td>
						<td class="title">纳税人识别号:</td>
						<td class="content">
							<input type="text" name="TAXPAY_ID" id="TAXPAY_ID" class="form-control"/>
						</td>
					</tr>
					<tr>
						<td class="title">发票状态:</td>
						<td class="content">
							<select class="form-control" name="KP_FLAG" id="KP_FLAG" style="width:110px;height:25px;padding:0px">
								<option value="01" selected>未提交</option>
								<option value="02">已提交</option>
								<!-- <option value="03">冲销</option> -->
							</select>
						</td>
						<td class="title">申请期间:</td>
						<td class="content">
							<input type="text" class="form-control Wdate" style="width:150px;" id="BELONG_DATE" name="BELONG_DATE"
								onclick="WdatePicker({dateFmt:'yyyyMM'})" />
						</td>
						<td class="title">是否驳回:</td>
							<td class="content">
								<select class="form-control" name="REJECT_D" id="REJECT_D" style="width:120px;height:25px;padding:0px">
									<option >--选择--</option>
									<option value="1">是</option>
									<option value="0">否</option>
								</select>
							</td>
					</tr>
					<tr>
							<td></td>
							<td class="content" colspan="3">
								<input type="button" class="btn_blue m-r15" value="查 询" id="search-btn3" onclick="doSearchDesperse()">
								<input type="reset" class="btn_gray m-r15" value="重 置" id="reset-btn2">
								<input type="button" class="btn_gray m-r15" value="提交" id="post-btnDesperse" onclick="postDesperse()">
							</td>
						</tr>
		 	 	</table>
		 	 </form>
		 	 <div class="modal-body">
					<div class="m-t10">
						<div class="clearfix table_fn">
							<span class="l">
								&nbsp;&nbsp;&nbsp;&nbsp;<label><input id="allSelect" name="allSelect" type="checkbox" value="" />全选</label>
							</span>
							<span class="r">
								<a href="${contextPath}/down_p2/dispersing_model.xls" style="margin-top: 30px;font-size: 15px;">导入模板下载</a>
								<input type="button" class="btn_gray m-r15" value="散单导入" id="import-btn1" onclick="importExcel()"/>
								<input type="button" class="btn_gray m-r15" value="删除" id="delete-btn1" onclick="deleteRecord()"/>
							</span>
						</div>
						<div class="clearfix">
							<table id="dataGridTable2"></table>
							<div id="pgtoolbar2" class="pgtoolbar"></div>
						</div>
					</div>
				</div>
		</div>
	</div>
</div> 
<div id="import-content" style="display:none;">
	   <form id="upForm"  action="#" method="post" enctype="multipart/form-data">
			<ul class="all_list">
				<li class="m-t10">
					<span class="all_title"></span>
					<input type="file" name="excel" id="excel" class="all_input v-m" style="width: 300px"  />
					<input type="button" id="upBtn" value="上传" class="btn_big submitBtn v-m" onclick="import_apply()"/>
				</li>
			</ul>
	   </form>
</div>
<div id="import-content2" style="display:none;">
	   <form id="upForm"  action="#" method="post" enctype="multipart/form-data">
			<ul class="all_list">
				<li class="m-t10">
					<span class="all_title"></span>
					<input type="file" name="excel" id="excel2" class="all_input v-m" style="width: 300px"  />
					<input type="button" id="upBtn" value="上传" class="btn_big submitBtn v-m" onclick="import_apply2()"/>
				</li>
			</ul>
	   </form>
</div>
<div class="countly_title" style="display: none;">开票申请</div>
<input type="hidden" id="queryStatus">
</body>
<jsp:include page="../../../myCountlyStart.jsp"></jsp:include>
<script type="text/javascript" src="${contextPath}/pc-rs/novatar.frameimpl/scripts/static/js/lib/formSerialize.js"></script>
    <link rel="stylesheet" type="text/css" href="${contextPath}/pc-rs/novatar.frameimpl/scripts/static/css/fm.selectator.jquery.css" />
	<script type="text/javascript" src="${contextPath}/pc-rs/novatar.frameimpl/scripts/static/js/lib/jquery.jqGrid.js"></script>
	<script type="text/javascript" src="${contextPath}/pc-rs/novatar.frameimpl/scripts/p2/output/p2_gride.js"></script>
</html>

////////////////////////////////////
function get_BILL_PRCTR () {
	$("#BILL_PRCTR").empty();
	$.ajax({
		url: contextPath + "/service/pageReq",
	  	type : "POST",
			dataType : "json",
			async : false, //异步
			data: {
				needcontrolprocess: "billingApplyBusiness.getCommonList",
				content : "queryType:BILL_PRCTR" //TODO 网点
			},
	  	success: function(result) {
	  		var status = result.status;
			if ("FAIL" != status) {
				try {
					var data = result.expData.resultList;
					$.each(data, function(i,n) {
						$("#BILL_PRCTR").append('<option value="' + n.BILL_PRCTR + '"> ' + n.BILL_PRCTR + '</option>');
					});
				} catch(e) {}
			}
	  	}
	});
}

function get_BUSINESS_TYPE() {
	$("#BUSINESS_TYPE").empty();
	$.ajax({
		url: contextPath + "/service/pageReq",
	  	type : "POST",
			dataType : "json",
			async : false, //异步
			data: {
				needcontrolprocess: "billingApplyBusiness.getCommonList",
				content : "queryType:BUSINESS_TYPE" //TODO 客户
			},
	  	success: function(result) {
	  		var status = result.status;
			if ("FAIL" != status) {
				try {
					var data = result.expData.resultList;
					$.each(data, function(i,n) {
						// 默认选择运费
						if(n.BUSINESS_TYPE == "01") {
							$("#BUSINESS_TYPE").append('<option selected value="' + n.BUSINESS_TYPE + '"> ' + n.BUSINESS_DESC + '</option>');
						} else {
							$("#BUSINESS_TYPE").append('<option value="' + n.BUSINESS_TYPE + '"> ' + n.BUSINESS_DESC + '</option>');
						}
					});
				} catch(e) {}
			}
	  	}
	});
}


function get_BILL_STATUS() {
	$("#BILL_STATUS").empty();
	$("#KP_FLAG").empty();
	$.ajax({
		url: contextPath + "/service/pageReq",
	  	type : "POST",
			dataType : "json",
			async : false, //异步
			data: {
				needcontrolprocess: "billingApplyBusiness.getBillStatusList",
				content : "queryType:BILL_STATUS" //TODO 状态
			},
	  	success: function(result) {
	  		var status = result.status;
			if ("FAIL" != status) {
				try {
					var data = result.expData.resultList.split(",");
					for(var i = 0; i < data.length; i++) {
						var value = data[i].split("=");
						$("#BILL_STATUS").append('<option value="' + value[0] + '"> ' + value[1] + '</option>');
						$("#KP_FLAG").append('<option value="' + value[0] + '"> ' + value[1] + '</option>');
					}
				} catch(e) {}
			}
	  	}
	});
}

function keyPress() {    
    var keyCode = event.keyCode;  
    if ( (keyCode >= 48 && keyCode <= 57) || keyCode == 46 || keyCode == 13 || keyCode == 45) {    
        event.returnValue = true;    
    } else {    
        event.returnValue = false;    
   }    
}

function postSelf(obj) {
		// 上传
		if (impData) {
			call_imp_func(impData);
		} else {
		// 获取选择行主键数组
		var ids = $('#dataGridTable1').jqGrid('getGridParam','selarrrow');
		if(ids == "" || ids == null) {
			art.dialog({
				title : '消息',
				width : '300px',
				content: "至少选择一行",
				lock : true,
				ok:true
			});
		} else {
			if(obj == 'merged' && ids.length == 1) {
				art.dialog({
					title : '消息',
					width : '300px',
					content: "合并提交请选择多行",
					lock : true,
					ok:true
				});
				return;
			} else if(obj == 'merged' && ids.length > 1) {
				if(!checkIfAllowed(ids))
					return;
			}
			// 主账号开票金额
			var TSK_MONTH_BILL = [];
			// 所属期间
			var bellong_date = [];
			// 主账号差异原因
			var DIFF_REASON = [];
			// 主账号票面备注
			var TICKETS_BACK = [];
			// 主账号申请人员备注
			var applierBack = [];
			// 单位
			var MEINS = [];
			// 单价 
			var UNITPE = [];
			// 数量
			var FKIMG = [];
			// 规格
			var MSPEC = [];
			var sub_MEINS = [];
			var sub_UNITPE = [];
			var sub_FKIMG = [];
			var sub_MSPEC = [];
			// 子账号数组
			var sub_ID = [];
			// 子账号开票金额
			var SUB_TSK_MONTH_BILL = [];
			// 子账号差异原因
			var SUB_DIFF_REASON = [];
			// 子账号票面备注
			var SUB_TICKETS_BACK = [];
			// 子账号申请人员备注
			var SUB_applierBack = [];
			var sub_type = [];
			var AMOUNT_RECEIVABLE;
			var j=0,k=0,m=0,n=0,r=0,s=0,t=0,u=0,w=0,d=0;
			var subCount = 0;
			//循环校验数据
			for(var i=0; i<ids.length; i++) {
				//未开总金额
				AMOUNT_RECEIVABLE = $("#dataGridTable1").jqGrid('getCell',ids[i],'TSL_MONTH_UNBILL');
				// 主账号开票金额
				TSK_MONTH_BILL[i] = $("#TSK_MONTH_BILL_" + ids[i]).val() == "" ? 0:$("#TSK_MONTH_BILL_" + ids[i]).val();
				// 主账号差异原因
				DIFF_REASON[i] = $("#DIFF_REASON_" + ids[i]).val();
				// 需求变更,取消次校验
				/*if (rebillFlag) {
					if (TSK_MONTH_BILL[i] != "0" &&  DIFF_REASON[i] == '') {
						art.dialog({
							title : '消息',
							width : '300px',
							content: "补开必须输入差异原因",
							lock : true,
							ok:true
						});
						return;
					}
				}*/
				// 主账号票面备注
				TICKETS_BACK[i] = $("#TICKETS_BACK_" + ids[i]).val();
				// 主账号申请人员备注
				applierBack[i] = $("#applierBack_" + ids[i]).val();
				MEINS[i] = $("#MEINS_" + ids[i]).val();
				UNITPE[i] = $("#UNITPE_" + ids[i]).val();
				FKIMG[i] = $("#FKIMG_" + ids[i]).val();
				MSPEC[i] = $("#MSPEC_" + ids[i]).val();
				// 所属期间
				bellong_date[i] = $("#dataGridTable1").jqGrid('getCell',ids[i],'BELONG_DATE');
				
				
				//子账号开票金额
				var sub_amt_sum = 0;
				var sub_amt_sum_temp = [];
				$("input[name='SUB_TSK_MONTH_BILL_"+ids[i]+"']").each(function(i) {
					SUB_TSK_MONTH_BILL[j++] = parseFloat($(this).val() == "" ? 0:$(this).val());
					sub_amt_sum_temp[i] = parseFloat($(this).val() == "" ? 0:$(this).val());
					sub_ID[k++] = $(this).attr("SUB_DATA_ID");
					sub_amt_sum += parseFloat($(this).val() == "" ? 0:$(this).val());
					//subCount = sub_amt_sum_temp.length;
				});
				if (subCount == 0 && sub_amt_sum_temp.length > 0) {
					subCount = sub_amt_sum_temp.length;
				}
				// 子账号差异原因
				var sub_diff_reason_temp = [];
				$("select[name='SUB_DIFF_REASON_"+ids[i]+"']").each(function(i) {
					SUB_DIFF_REASON[m++] = $(this).val();
					sub_diff_reason_temp[i] = $(this).val();
				});
				// 子账号票面备注
				$("input[name='SUB_TICKETS_BACK_"+ids[i]+"']").each(function(i) {
					SUB_TICKETS_BACK[n++] = $(this).val();
				});
				// 子账号申请人员备注
				$("input[name='SUB_applierBack_"+ids[i]+"']").each(function(i) {
					SUB_applierBack[r++] = $(this).val();
				});
				$("input[name='sub_MEINS_"+ids[i]+"']").each(function(i) {
					sub_MEINS[s++] = $(this).val();
					sub_type[d++] = $(this).attr("SUB_DATA_TYPE");
				});
				$("input[name='sub_UNITPE_"+ids[i]+"']").each(function(i) {
					sub_UNITPE[t++] = $(this).val();
				});
				$("input[name='sub_FKIMG_"+ids[i]+"']").each(function(i) {
					sub_FKIMG[u++] = $(this).val();
				});
				$("input[name='sub_MSPEC_"+ids[i]+"']").each(function(i) {
					sub_MSPEC[w++] = $(this).val();
				});
				// 判断是否存在差异
				if(!checkAmount(AMOUNT_RECEIVABLE,TSK_MONTH_BILL[i],DIFF_REASON[i],sub_amt_sum,sub_amt_sum_temp,sub_diff_reason_temp)) {
					return;
				}
			}
			// 如果是合并,判断不同月份的同一子账号,单位,单价,数量,规格必须相同;
			if (obj == 'merged') {
				var result = checkMergedCondition(sub_ID,sub_type,SUB_TICKETS_BACK,SUB_TSK_MONTH_BILL,
						sub_MEINS,sub_UNITPE,sub_FKIMG,sub_MSPEC,subCount);
				if (!result) {
					return;
				}
			}
			var params = "ids:" + ids + "|TSK_MONTH_BILL:" + TSK_MONTH_BILL + "|DIFF_REASON:" + DIFF_REASON 
							+"|TICKETS_BACK:" + TICKETS_BACK + "|applierBack:" + applierBack + "|sub_ID:" + sub_ID
							+"|SUB_TSK_MONTH_BILL:" + SUB_TSK_MONTH_BILL + "|SUB_DIFF_REASON:" + SUB_DIFF_REASON
							+"|SUB_TICKETS_BACK:" + SUB_TICKETS_BACK + "|SUB_applierBack:" + SUB_applierBack
							+"|postType:" + obj + "|bellong_date:" + bellong_date + "|REBILL_FLAG:" + $("#REBILL_FLAG").val() 
							+"|MEINS:"+ MEINS + "|UNITPE:" + UNITPE + "|FKIMG:" + FKIMG + "|MSPEC:" + MSPEC 
							+"|sub_MEINS:" +sub_MEINS + "|sub_UNITPE:" + sub_UNITPE + "|sub_FKIMG:" + sub_FKIMG + "|sub_MSPEC:" + sub_MSPEC;
			
			// 提示信息
			var remindMsg;
			if(obj == 'merged')
				remindMsg = '<font color="red">所选数据将合并开为一张发票,是否确定要提交?</font>';
			else
				remindMsg = '是否提交开票数据';
			//提交数据后台生产发票批
				art.dialog({
					title : '消息',
					content: remindMsg,
					lock : true,
					ok: function () {
						this.title('提交中').content('提交中...');
						$.ajax({
							url: contextPath + '/service/pageReq',
							type : 'post',
							dataType : "json",
							data: {
								needcontrolprocess : "billingApplyBusiness.createBillBatchSelf",
								content : params
				  			},
							success: function(result) {
								if (result.status == 'FAIL') {
									art.dialog({
										title : '消息',
										width : '300px',
										content: result.processMsg,
										lock : true,
										ok: true
									});
								} else {
									art.dialog({
										title : '消息',
										content: '申请成功!',
										lock : true,
										ok: function () {
											doSearch();
										}
									});
								}
							}
						});
					},
					cancel: true
				});		
		}	
		}
}

function checkAmount(AMOUNT_RECEIVABLE, TSK_MONTH_BILL, DIFF_REASON,sub_amt_sum,sub_amt_sum_temp,sub_diff_reason_temp) {
	if(parseFloat(TSK_MONTH_BILL)+sub_amt_sum <= 0) {
		art.dialog({
			title : '消息',
			width : '300px',
			content: "请检查月结账号,开票金额合计不允许小于0",
			lock : true,
			ok:true
		});
		return false;
	} else {
		if(parseFloat(AMOUNT_RECEIVABLE) < parseFloat(TSK_MONTH_BILL)+sub_amt_sum) {
			if(parseFloat(TSK_MONTH_BILL) > 0) {
				if(DIFF_REASON == null || $.trim(DIFF_REASON) == '' ) {
					art.dialog({
						title : '消息',
						width : '300px',
						content: "开票金额大于未开金额,请分别输入差异原因",
						lock : true,
						ok:true
					});
					return false;
				}
			}
			for(var i=0; i<sub_diff_reason_temp.length; i++) {
				if(parseFloat(sub_amt_sum_temp[i]) > 0) {
					if(sub_diff_reason_temp[i] == null || $.trim(sub_diff_reason_temp[i]) == '') {
						art.dialog({
							title : '消息',
							width : '300px',
							content: "开票金额大于未开金额,请输入差异原因",
							lock : true,
							ok:true
						});
						// 添加红色提醒样式
						return false;
					}
				}
			}
			
		}
	}
	return true;
}

//校验是否同月结客户,同发票类型
function checkIfAllowed(ids) {
	var cust_no =  $("#dataGridTable1").jqGrid('getCell',ids[0],'Z_CDH_NAME'); 
	var is_post =  $("#dataGridTable1").jqGrid('getCell',ids[0],'IS_POST'); 
	var inv_type =  $("#dataGridTable1").jqGrid('getCell',ids[0],'INVOICE_TYPE'); 
	var TICKETS_BACK = $("#TICKETS_BACK_" + ids[0]).val();
	var MEINS = $("#MEINS_" + ids[0]).val();
	var UNITPE = $("#UNITPE_" + ids[0]).val();
	var FKIMG = $("#FKIMG_" + ids[0]).val();
	var MSPEC = $("#MSPEC_" + ids[0]).val();
	var BUSINESS_TYPE = $("#dataGridTable1").jqGrid('getCell',ids[0],'BUSINESS_TYPE'); 
	var TSK_MONTH_BILL = $.trim($("#TSK_MONTH_BILL_" + ids[0]).val());
	for(var i=1; i<ids.length; i++) {
		var current_is_post = $("#dataGridTable1").jqGrid('getCell',ids[i],'IS_POST'); 
		var current_BUSINESS_TYPE = $("#dataGridTable1").jqGrid('getCell',ids[i],'BUSINESS_TYPE'); 
		var current_TSK_MONTH_BILL = $.trim($("#TSK_MONTH_BILL_" + ids[i]).val());
		var current_MEINS = $("#MEINS_" + ids[i]).val();
		var current_UNITPE = $("#UNITPE_" + ids[i]).val();
		var current_FKIMG = $("#FKIMG_" + ids[i]).val();
		var current_MSPEC = $("#MSPEC_" + ids[i]).val();
		if (TSK_MONTH_BILL == "" && parseFloat(current_TSK_MONTH_BILL) > 0) {
			// TSK_MONTH_BILL = current_TSK_MONTH_BILL;
			BUSINESS_TYPE = current_BUSINESS_TYPE;
			MEINS = current_MEINS;
			UNITPE = current_UNITPE;
			FKIMG = current_FKIMG;
			MSPEC = current_MSPEC;
			TICKETS_BACK = $("#TICKETS_BACK_" + ids[i]).val();
		}
		if(cust_no != $("#dataGridTable1").jqGrid('getCell',ids[i],'Z_CDH_NAME')
				|| inv_type !=  $("#dataGridTable1").jqGrid('getCell',ids[i],'INVOICE_TYPE')
				|| TICKETS_BACK != $("#TICKETS_BACK_" + ids[i]).val()
				|| is_post != current_is_post) {
			art.dialog({
				title : '消息',
				width : '300px',
				content: "合并提交必须为同一月结名称、相同发票类型、相同票面信息、相同寄送方式!",
				lock : true,
				ok:true
			});
			return false;
		}
		
		// 相同业务类型,单位,单价,数量,规格必须相同;
		if(BUSINESS_TYPE == current_BUSINESS_TYPE && parseFloat(current_TSK_MONTH_BILL) > 0) {
			if (MEINS != current_MEINS || UNITPE != current_UNITPE || 
					FKIMG != current_FKIMG || MSPEC != current_MSPEC) {
				art.dialog({
					title : '消息',
					width : '300px',
					content: "合并提交,同一客户的同一业务类型,单位、单价、数量、规格必须相同",
					lock : true,
					ok:true
				});
				return false;
			}
		}
	}
	return true;
}

function separate() {
	var rebillFlag = $("#REBILL_FLAG").val();
	if (rebillFlag) {
		art.dialog({
			title : '消息',
			width : '300px',
			content: "点击查询后在拆分",
			lock : true,
			ok:true
		});
		return;
	}
	var ids = $('#dataGridTable1').jqGrid('getGridParam','selarrrow');
	if(ids.length == 0) {
		art.dialog({
			title : '消息',
			width : '300px',
			content: "请选择一条记录进行拆分!",
			lock : true,
			ok:true
		});
		return;
	} else if(ids.length > 1) {
		art.dialog({
			title : '消息',
			width : '300px',
			content: "只能选择一条记录进行拆分!",
			lock : true,
			ok:true
		});
		return;
	}
	/*var rowdata = $('#dataGridTable1').jqGrid('getRowData',ids[0]);
	rowdata.WRBTR = '';
	rowdata.TSL_MONTH_UNBILL = '';*/
	// $("#dataGridTable1").jqGrid("addRowData", rowid, dataRow, "after", selectedId);
	// $("#dataGridTable1").jqGrid("addRowData", ids[0], rowdata, "after", ids[0]);
	goToPage(contextPath + '/service/page?name=home_p2/outputVat/billingApply/separatPage',ids[0]);
}

/*跳转到页面*/
function goToPage(url, id) {
	var options = {
			title : "开票数据拆分",
			top : "5%",
			width : 1000,
			lock : true,
			height: 'auto'
		}
	url += "&headerId=" + id ;
	_myDialogSepareteDialog = art.dialog(options);
	jQuery.ajax({
		url : url,
		success : function(data) {
			_myDialogSepareteDialog.content(data);
		}
	}); 
}
// _myDialog
function goToPage2(url, headerId) {
	var options = {
			title : "添加子账号",
			top : "5%",
			width : '1000px',
			lock : true,
			height: 'auto'
		}
	url += "&headerId=" + headerId;
	_myDialogSepareteDialog = art.dialog(options);
	jQuery.ajax({
		url : url,
		success : function(data) {
			_myDialogSepareteDialog.content(data);
		}
	});
}


function postSeparate() {
	var ids = $('#dataGridTable1').jqGrid('getGridParam','selarrrow');
	if(ids.length == 0) {
		art.dialog({
			title : '消息',
			width : '300px',
			content: "请选择一条记录进行拆分提交!",
			lock : true,
			ok:true
		});
		return;
	} else if(ids.length > 1) {
		art.dialog({
			title : '消息',
			width : '300px',
			content: "只能选择一条记录进行拆分提交!",
			lock : true,
			ok:true
		});
		return;
	}
	var id = ids[0];
	// 主账号开票金额
	var TSK_MONTH_BILL = [];
	// 主账号差异原因
	var DIFF_REASON = [];
	// 主账号票面备注
	var TICKETS_BACK = [];
	// 主账号申请人员备注
	var applierBack = [];
	// 未开票金额
	var AMOUNT_RECEIVABLE = $("#dataGridTable1").jqGrid('getCell',id,'TSL_MONTH_UNBILL');
	var sumAMT = 0;
	$("input[name='TSK_MONTH_BILL_" + id + "']").each(function (index, n) {
		TSK_MONTH_BILL[index] = n.value;
		sumAMT += parseFloat(n.value);
	});
	$("input[name='DIFF_REASON_" + id + "']").each(function (index, n) {
		DIFF_REASON[index] = n.value;
	});
	$("input[name='TICKETS_BACK_" + id + "']").each(function (index, n) {
		TICKETS_BACK[index] = n.value;
	});
	$("input[name='applierBack_" + id + "']").each(function (index, n) {
		applierBack[index] = n.value;
	});
	if(!checkAmount2(parseFloat(AMOUNT_RECEIVABLE), sumAMT, DIFF_REASON)) {
		return;
	}
	var params = "headerId:" + id + "|TSK_MONTH_BILL:" + TSK_MONTH_BILL + "|DIFF_REASON:" + DIFF_REASON 
	+"|TICKETS_BACK:" + TICKETS_BACK + "|applierBack:" + applierBack + "|REBILL_FLAG:" + $("#REBILL_FLAG").val();
	art.dialog({
		title : '消息',
		content: '确定要提交吗?',
		lock : true,
		ok: function () {
			this.title('提交中').content('提交中...');
			$.ajax({
				url: contextPath + '/service/pageReq',
				type : 'post',
				dataType : "json",
				data: {
					needcontrolprocess : "billingApplyBusiness.createBillBatchSeparate",
					content : params
	  			},
				success: function(result) {
					if (result.status == 'FAIL') {
						art.dialog({
							title : '消息',
							width : '300px',
							content: result.processMsg,
							lock : true,
							ok: true
						});
					} else {
						art.dialog({
							title : '消息',
							content: '申请成功!',
							lock : true,
							ok: function () {
								doSearch();
							}
						});
					}
				}
			});
		},
		cancel: true
	});
}

function checkAmount2(AMOUNT_RECEIVABLE, sumAMT, DIFF_REASON) {
	if(AMOUNT_RECEIVABLE != sumAMT){
		for(var i=0; i<DIFF_REASON.length; i++) {
			if(DIFF_REASON == null || $.trim(DIFF_REASON[i]) == "") {
				art.dialog({
					title : '消息',
					width : '300px',
					content: "开票金额不等于未开金额,请输入每条开票记录差异原因!",
					lock : true,
					ok:true
				});
				return false;
			}
		}
	}
	return true;
}

function importExcel() {
	_myDialog = art.dialog({
		id:"firstD",
		title : '导入',
		width : '700px',
		content: $('#import-content').html(),
		lock : true
	});
}

function import_apply() {
	if($("#excel").val()==''){
		art.dialog({
			content : "请选择文件",
			lock : true
		});
		return;
	}
	art.dialog({
		width : "200px",
		content:"文件加载成功,是否确定导入",
		lock  : true,
		button: [
		        {name:'是',
		        callback:function (){
		     		var content = "";
					window.setTimeout(function(){
						$("#upForm").ajaxSubmit({
					 			url : contextPath + "/service/file_upload",
								type : 'post',
								data : {"content":content,"needcontrolprocess": "billingApplyBusiness.desperseBillImport"},
								success : function(data) {
									data = eval("(" + data + ")");
									var dialog  = art.dialog.get('importing_dialog');
									dialog.close();
									if (data) {
										art.dialog({
											title : "提示",
											width : "350px",
											content : data.message,
											ok : function() {
												if(data.code == 'FAIL') {
													return true;
												} else {
													_myDialog.close();
													doSearchDesperse();
												}
											},
											lock : true
										});
									}
								}
							}); 
					},10);
			       	 
		       		art.dialog({
		       			id : "importing_dialog",
		       		 	title : "提示",
						width : "200px",
						content : "正在导入,请稍等...",
						lock  : true
		       		});
		       		
			},
			focus: true
			},
			{name:'否'}
		]
	});
}

function importExcel2() {
	_myDialog = art.dialog({
		id:"firstD",
		title : '导入',
		width : '700px',
		content: $('#import-content2').html(),
		lock : true
	});
}

function import_apply2() {
	if($("#excel2").val()==''){
		art.dialog({
			content : "请选择文件",
			lock : true
		});
		return;
	}
	art.dialog({
		width : "200px",
		content:"文件加载成功,是否确定导入",
		lock  : true,
		button: [
		        {name:'是',
		        callback:function (){
		     		var content = "";
					window.setTimeout(function(){
						$("#upForm").ajaxSubmit({
					 			url : contextPath + "/service/file_upload_bean",
								type : 'post',
								data : {"content":content,"needcontrolprocess": "billingApplyBusiness.importMonthCust"},
								success : function(data) {
									data = eval("(" + data + ")");
									var dialog  = art.dialog.get('importing_dialog');
									dialog.close();
									art.dialog({
										title : '消息',
										content: data.processMsg,
										lock : true,
										ok: function () {
											_myDialog.close();
										}
									});
									if (data) {
										impData = data.expData.page;
										$("#dataGridTable1").clearGridData();
										$("#dataGridTable1").jqGrid('setGridParam', {datatype:'local', data:impData, rowNum:10000}).trigger('reloadGrid', [{page:1}]);
									}
								}
							}); 
					},10);
		       		art.dialog({
		       			id : "importing_dialog",
		       		 	title : "提示",
						width : "200px",
						content : "正在导入,请稍等...",
						lock  : true
		       		});
		       		
			},
			focus: true
			},
			{name:'否'}
		]
	});
}

function deleteRecord() {
	// 如果已提交,不能删除
	if ($("#queryStatus").val() == '02') {
		art.dialog({
			title : '消息',
			width : '300px',
			content: "已提交的行不允许删除",
			lock : true,
			ok:true
		});
		return;
	}
	// 获取要删除的id数组
	var ids = $('#dataGridTable2').jqGrid('getGridParam','selarrrow');
	if(ids.length == 0) {
		art.dialog({
			title : '消息',
			width : '300px',
			content: "请选择需要删除的行!",
			lock : true,
			ok:true
		});
		return;
	}
	art.dialog({
		title : '消息',
		content: '确定要删除吗?',
		lock : true,
		ok: function () {
			this.title('删除中').content('删除中...');
			$.ajax({
				url: contextPath + '/service/pageReq',
				type : 'post',
				dataType : "json",
				data: {
					needcontrolprocess : "billingApplyBusiness.deleteDesperseRecord",
					content : "ids:" + ids
	  			},
				success: function(result) {
					if (result.status == 'FAIL') {
						art.dialog({
							title : '消息',
							width : '300px',
							content: result.processMsg,
							lock : true,
							ok: true
						});
					} else {
						art.dialog({
							title : '消息',
							content: '删除成功!',
							lock : true,
							ok: function () {
								doSearchDesperse();
							}
						});
					}
				}
			});
		},
		cancel: true
	});
}

// 散单提交
function postDesperse() {
	// 已提交的行禁止再次提交
	if ($("#queryStatus").val() == '02') {
		art.dialog({
			title : '消息',
			width : '300px',
			content: "已提交的行不允许再次提交,请导入新的开票信息再提交",
			lock : true,
			ok:true
		});
		return;
	}
	var selectAllFlag = $("#allSelect").attr("checked");
	// 获取要删除的id数组
	var ids = $('#dataGridTable2').jqGrid('getGridParam','selarrrow');
	if(ids.length == 0 && selectAllFlag != "checked") {
		art.dialog({
			title : '消息',
			width : '300px',
			content: "请选择需要提交的行!",
			lock : true,
			ok:true
		});
		return;
	}
	art.dialog({
		title : '消息',
		content: '确定要提交吗?',
		lock : true,
		ok: function () {
			this.title('提交中').content('提交中...');
			$.ajax({
				url: contextPath + '/service/pageReq',
				type : 'post',
				dataType : "json",
				data: {
					needcontrolprocess : "billingApplyBusiness.createDesporseBatch",
					content : "ids:" + ids + "|selectAllFlag:" + selectAllFlag
	  			},
				success: function(result) {
					if (result.status == 'FAIL') {
						art.dialog({
							title : '消息',
							width : '300px',
							content: result.processMsg,
							lock : true,
							ok: true
						});
					} else {
						art.dialog({
							title : '消息',
							content: '提交成功!',
							lock : true,
							ok: function () {
								doSearchDesperse();
							}
						});
					}
				}
			});
		},
		cancel: true
	});
}

function checkMergedCondition(sub_ID,sub_type,SUB_TICKETS_BACK,SUB_TSK_MONTH_BILL,
		sub_MEINS,sub_UNITPE,sub_FKIMG,sub_MSPEC,subCount) {
	for (var i=0; i< subCount; i++) {
		var sub_bus_type = sub_type[i];
		var sub_tickets = SUB_TICKETS_BACK[i];
		var sub_tsk_month = SUB_TSK_MONTH_BILL[i];
		var sub_m = sub_MEINS[i];
		var sub_u= sub_UNITPE[i];
		var sub_f = sub_FKIMG[i];
		var sub_ms = sub_MSPEC[i];
		for (var j=i; j<sub_ID.length; j+=subCount) {
			var current_sub_bus_type = sub_type[j];
			var current_sub_tickets = SUB_TICKETS_BACK[j];
			var current_sub_tsk_month = SUB_TSK_MONTH_BILL[j];
			var current_sub_m = sub_MEINS[j];
			var current_sub_u = sub_UNITPE[j];
			var current_sub_f = sub_FKIMG[j];
			var current_sub_ms = sub_MSPEC[j];
			if (sub_tsk_month == 0 && current_sub_tsk_month != 0) {
				sub_bus_type = current_sub_bus_type;
				sub_tickets = current_sub_tickets;
				sub_tsk_month = current_sub_tsk_month;
				sub_m = current_sub_m;
				sub_u = current_sub_u;
				sub_f = current_sub_f;
				sub_ms = current_sub_ms;
			}
			if (sub_tickets != current_sub_tickets) {
				art.dialog({
					title : '消息',
					width : '300px',
					content: "合并提交,同一关联账号票面备注必需相同",
					lock : true,
					ok:true
				});
				return false;
			}
			if (sub_bus_type == current_sub_bus_type && sub_tsk_month != 0) {
				if (sub_m != current_sub_m || sub_u != current_sub_u ||
						sub_f != current_sub_f || sub_ms != current_sub_ms) {
					art.dialog({
						title : '消息',
						width : '300px',
						content: "合并提交,同一客户的同一业务类型,单位、单价、数量、规格必须相同",
						lock : true,
						ok:true
					});
					return false;
				}
			}
		}
	}
	return true;
}

// 获取上一个月
function getBeforeMonth() {
	var curr_date = new Date();
	var curr_year = curr_date.getFullYear();
	var curr_month = curr_date.getMonth();
	if (curr_month == 0) {
		curr_year -= 1;
		curr_month = 12;
	}
	curr_month = curr_month < 10 ? "0" + curr_month : curr_month;
	return curr_year + "" + curr_month;
}

// 添加子账号
function addSubAccount() {
	var ids = $('#dataGridTable1').jqGrid('getGridParam','selarrrow');
	if (ids.length == 0) {
		art.dialog({
			title : '消息',
			width : '300px',
			content: "请选择一条记录进行添加!",
			lock : true,
			ok:true
		});
		return;
	} else if (ids.length > 1) {
		art.dialog({
			title : '消息',
			width : '300px',
			content: "只能选择一条记录进行添加!",
			lock : true,
			ok:true
		});
		return;
	}
	// var cust_no =  $("#dataGridTable1").jqGrid('getCell',ids[0],'Z_CUSTOMER_NO'); 
	// var query_date = $("#dataGridTable1").jqGrid('getCell',ids[0],'BELONG_DATE'); 
	goToPage2(contextPath + '/service/page?name=home_p2/outputVat/billingApply/addSubAccPage', ids[0]);
}

// 还原已开票未开金额
function addNewRecord() {
	if(!$("#REBILL_FLAG").val()) {
		art.dialog({
			title : '消息',
			width : '300px',
			content: "请点击补开查询后在还原未开金额!",
			lock : true,
			ok:true
		});
		return;
	}
	var ids = $('#dataGridTable1').jqGrid('getGridParam','selarrrow');
	if(ids.length == 0) {
		art.dialog({
			title : '消息',
			width : '300px',
			content: "请选择需要还原的行!",
			lock : true,
			ok:true
		});
		return;
	}
	art.dialog({
		title : '消息',
		content: '确定要还原吗?',
		lock : true,
		ok: function () {
			$.ajax({
				url: contextPath + '/service/pageReq',
				type : 'post',
				dataType : "json",
				data: {
					needcontrolprocess : "billingApplyBusiness.addNewApply",
					content : "ids:" + ids
	  			},
				success: function(result) {
					if (result.status == 'FAIL') {
						art.dialog({
							title : '消息',
							width : '300px',
							content: result.processMsg,
							lock : true,
							ok: true
						});
					} else {
						art.dialog({
							title : '消息',
							content: '还原成功!',
							lock : true,
							ok: function () {
								doSearch('reBillSearch');
							}
						});
					}
				}
			});
		},
		cancel: true
	});
}

function call_imp_func(objData) {
	art.dialog({
		title : '消息',
		content: '确定要提交吗?',
		lock : true,
		ok: function () {
			this.title('提交中').content('提交中...');
			$.ajax({
				url: contextPath + '/service/pageReq',
				type : 'post',
				dataType : "json",
				data: {
					needcontrolprocess : "billingApplyBusiness.impCreateBatch",
					content : "impData:" + JSON.stringify(objData)
	  			},
				success: function(result) {
					if (result.status == 'FAIL') {
						art.dialog({
							title : '消息',
							width : '300px',
							content: result.processMsg,
							lock : true,
							ok: true
						});
					} else {
						art.dialog({
							title : '消息',
							content: '提交成功!',
							lock : true,
							ok: function () {
								impData = null;
								$("#dataGridTable1").clearGridData();
							}
						});
					}
				}
			});
		},
		cancel: true
	});
}
//@ sourceURL=billingApply2.js

/////////////
/**
 * =================================================================
 * 版权所有 2011-2020 泰海网络支付服务有限公司,并保留所有权利
 * -----------------------------------------------------------------
 * 这不是一个自由软件!您不能在任何未经允许的前提下对程序代码进行修改和使用;
 * 不允许对程序代码以任何形式任何目的的再发布
 * =================================================================
 */
package com.sf.novatar.tpl.controller;
import java.io.IOException;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import javax.annotation.Resource;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;
import com.sf.novatar.tpl.bean.BeanBase;
import com.sf.novatar.tpl.enums.BusinessStatus;
import com.sf.novatar.tpl.p2.business.BillInvBusiness;
import com.sf.novatar.tpl.service.IService;
import com.sf.novatar.tpl.util.StringUtil;
import com.sf.novatar.tpl.util.UserUtil;
import com.sf.novatar.tpl.util.Util;
import com.sf.novatar.tpl.util.ViewExcel;
import com.sfpay.framework.base.exception.ServiceException;
import com.sfpay.framework.base.utils.StringUtils;
import com.sfpay.framework2.core.util.JsonUtil;
import com.sfpay.framework2.web.json.JsonMessage;

/**
 * 类说明:<br>
 * 
 * 
 * <p>
 * 详细描述:<br>
 * 
 * 
 * </p>
 * 
 * @author 608279 向鹏
 * 
 *         CreateDate: May 20, 2015
 */
@Controller
@RequestMapping("/service")
public class ServiceController extends BaseController {

	private final static Logger logger = LoggerFactory
			.getLogger(ServiceController.class);

	@Resource(name = "billInvBusiness")
	private BillInvBusiness billInvBusiness;

	@Resource
	private IService service;

	/**
	 * 进页面方法 方法说明:<br>
	 * 
	 * @param bean
	 * @return
	 */
	@RequestMapping("/page")
	public String page(BeanBase bean, Model model) {
		// 1.判断是否发送CORE
		// 2.无需调核心则找CONTROLL处理类
		/*
		 * try { service.service(bean); } catch (Exception e) {
		 * logger.info(bean.getProcessMsg(), e); }
		 */
		return bean.getName();
	}

	@RequestMapping("/modelView")
	public ModelAndView modelView(BeanBase bean) {
		ModelAndView mv = new ModelAndView(bean.getName());
		bean.setDatas(Util.converToBean(bean));
		mv.getModel().putAll(bean.getDatas().get(0));
		return mv;
	}

	/**
	 * 业务处理方法 方法说明:<br>
	 * 
	 * @param bean
	 * @return
	 */
	@RequestMapping(value = "/pageReq")
	@ResponseBody
	public Object pageReq(BeanBase bean, HttpServletRequest request,
			HttpServletResponse response) {
		// 1.判断是否发送CORE
		// 2.无需调核心则找CONTROLL处理类
		String splitRegex = ";";
		String message = "操作成功";
		String result = repeatSubmitPreCheck(bean.getRepeatCheckBuz(), request,
				response);
		if (!StringUtil.areBlank(result)) {
			bean.setStatus(BusinessStatus.FAIL);
			bean.setProcessMsg("请不要重复提交");
			return bean;
		}
		try {
			String processorName = bean.getNeedcontrolprocess();
			String createId = UserUtil.getCurrentUser().getCreateId();
			if (StringUtils.isEmpty(processorName)) {
				bean.setContent(bean.getContent() + createId);
				bean = service.service(bean);
			} else {
				String[] contents = bean.getContent().split(splitRegex);
				int length = contents.length;
				for (int i = 0; i < length; i++) {
					contents[i] += createId;
				}
				bean.setContent(org.apache.commons.lang3.StringUtils.join(
						contents, splitRegex));
				process(bean);
				bean.setStatus(BusinessStatus.FINLISH);
				if (org.apache.commons.lang3.StringUtils.isBlank(bean
						.getProcessMsg())) {
					bean.setProcessMsg(message);
				}
			}
		} catch (Throwable e) {
			logger.error(e.getMessage(), e);
			bean.setStatus(BusinessStatus.FAIL);
			String msg = e.getMessage();
			if (!StringUtil.areBlank(msg) && msg.length() > 64
					&& (e instanceof ServiceException == false)) {
				msg = "处理失败,请联系管理员";
			}
			bean.setProcessMsg(msg);
		} finally {
			// repeatSubmitPostCheck(bean.getRepeatCheckBuz(), request);
		}
		return bean;
	}

	/**
	 * 业务处理方法 导出:<br>
	 * 
	 * @param bean
	 * @return
	 */
	@SuppressWarnings("unchecked")
	@RequestMapping("/export")
	public ModelAndView export(BeanBase bean, HttpServletRequest request) {
		Map<String, Object> map = null;
		try {
			bean.setContent(bean.getContent() + getCreateId());
			String processorName = bean.getNeedcontrolprocess();
			if (StringUtils.isEmpty(processorName)) {
				bean = service.service(bean);
			} else {
				process(bean);
			}
			map = (Map<String, Object>) bean.getExpData().get("excelData");
		} catch (Throwable e) {
			logger.info(e.getMessage(), e);
			bean.setStatus(BusinessStatus.FAIL);
			bean.setProcessMsg(e.getMessage());
		}
		return new ModelAndView(new ViewExcel(), map);
	}

	/**
	 * 业务处理方法 导出:<br>
	 * 
	 * @param bean
	 * @return
	 */
	@SuppressWarnings("unchecked")
	@RequestMapping("/exportForInv")
	public ModelAndView exportForInv(BeanBase bean, HttpServletRequest request) {
		Map<String, Object> map = null;
		try {
			billInvBusiness.invExport(bean);
			map = (Map<String, Object>) bean.getExpData().get("excelData");
		} catch (Throwable e) {
			logger.info(e.getMessage(), e);
			bean.setStatus(BusinessStatus.FAIL);
			bean.setProcessMsg(e.getMessage());
		}
		return new ModelAndView(new ViewExcel(), map);
	}

	/**
	 * 模板导出:<br>
	 * 
	 * @param bean
	 * @return
	 */
	@RequestMapping("/template_export")
	public ModelAndView template_export(BeanBase bean) {
		ModelAndView modelview = null;
		try {
			process(bean);
			modelview = (ModelAndView) bean.getExpData().get("modelview");
		} catch (Throwable e) {
			logger.info(e.getMessage(), e);
			bean.setStatus(BusinessStatus.FAIL);
			bean.setProcessMsg(e.getMessage());
		}
		return modelview;
	}

	/**
	 * 模板导入:<br>
	 * 
	 * @param bean
	 * @return
	 */
	@RequestMapping("/template_import")
	@ResponseBody
	public Object template_import(BeanBase bean, HttpServletRequest request) {
		try {
			bean.setContent(bean.getContent() + getCreateId());
			String processorName = bean.getNeedcontrolprocess();
			if (StringUtils.isEmpty(processorName)) {
				bean = service.service(bean);
			} else {
				process(bean);
			}
		} catch (Throwable e) {
			logger.error(e.getMessage(), e);
			bean.setStatus(BusinessStatus.FAIL);
			bean.setProcessMsg(e.getMessage());
		}
		return bean;
	}

	/**
	 * 文件上传
	 * 
	 * @param bean
	 * @param request
	 * @param response
	 */
	@RequestMapping("/file_upload")
	public void ajaxfileupload(BeanBase bean, HttpServletRequest request,
			HttpServletResponse response) {
		response.setContentType("text/html;charset=utf-8");
		String result = repeatSubmitPreCheck(bean.getRepeatCheckBuz(), request,
				response);
		if (!StringUtil.areBlank(result)) {
			bean.setStatus(BusinessStatus.FAIL);
			bean.setProcessMsg("请不要重复提交");
			return;
		}
		JsonMessage jsonMessage = new JsonMessage();
		try {
			bean.setContent(bean.getContent() + getCreateId());
			String processorName = bean.getNeedcontrolprocess();
			if (StringUtils.isEmpty(processorName)) {
				bean = service.service(bean);
			} else {
				process(bean);
			}
			jsonMessage.setCode("FINISH");
			jsonMessage.setMessage("上传成功");
		} catch (Throwable e) {
			logger.error(e.getMessage(), e);
			jsonMessage.setCode("FAIL");
			if (e instanceof ServiceException) {
				jsonMessage.setMessage(e.getMessage());
			} else {
				jsonMessage.setMessage("上传失败");
			}
		}
		try {
			response.getWriter().write(JsonUtil.toJSONString(jsonMessage));
		} catch (IOException e) {
			logger.error(e.getMessage(), e);
			e.printStackTrace();
		}
	}

	/**
	 * 文件上传
	 * 
	 * @param bean
	 * @param request
	 * @param response
	 */
	@RequestMapping("/file_upload_bean")
	@ResponseBody
	public Object ajaxfileupload_bean(BeanBase bean,
			HttpServletRequest request, HttpServletResponse response) {
		response.setContentType("text/html;charset=utf-8");
		String result = repeatSubmitPreCheck(bean.getRepeatCheckBuz(), request,
				response);
		if (!StringUtil.areBlank(result)) {
			bean.setStatus(BusinessStatus.FAIL);
			bean.setProcessMsg("请不要重复提交");
			return bean;
		}
		try {
			bean.setContent(bean.getContent() + getCreateId());
			String processorName = bean.getNeedcontrolprocess();
			if (StringUtils.isEmpty(processorName)) {
				bean = service.service(bean);
			} else {
				process(bean);
			}
			bean.setStatus(BusinessStatus.FINLISH);
			bean.setProcessMsg("上传成功");
		} catch (Throwable e) {
			logger.error(e.getMessage(), e);

			bean.setStatus(BusinessStatus.FAIL);
			if (e instanceof ServiceException) {
				bean.setProcessMsg(e.getMessage());
			} else {
				bean.setProcessMsg("上传失败");
			}
		}
		return bean;
	}

	/**
	 * 文件上传
	 * 
	 * @param bean
	 * @param request
	 * @param response
	 */
	@RequestMapping("/ajax_form_submit")
	public void ajaxformSubmit(BeanBase bean, HttpServletRequest request,
			HttpServletResponse response) {
		response.setContentType("text/html;charset=utf-8");
		String splitRegex = ";";
		String result = repeatSubmitPreCheck(bean.getRepeatCheckBuz(), request,
				response);
		if (!StringUtil.areBlank(result)) {
			bean.setStatus(BusinessStatus.FAIL);
			bean.setProcessMsg("请不要重复提交");
			return;
		}
		try {
			String processorName = bean.getNeedcontrolprocess();
			String createId = UserUtil.getCurrentUser().getCreateId();
			if (StringUtils.isEmpty(processorName)) {
				bean = service.service(bean);
			} else {
				String[] contents = bean.getContent().split(splitRegex);
				int length = contents.length;
				for (int i = 0; i < length; i++) {
					contents[i] += createId;
				}
				bean.setContent(org.apache.commons.lang3.StringUtils.join(
						contents, splitRegex));
				process(bean);
			}
			bean.setStatus(BusinessStatus.FINLISH);
			if (org.apache.commons.lang3.StringUtils.isBlank(bean
					.getProcessMsg())) {
				bean.setProcessMsg("操作成功");
			}
		} catch (Throwable e) {
			logger.error(e.getMessage(), e);
			bean.setStatus(BusinessStatus.FAIL);
			if (e instanceof ServiceException) {
				bean.setProcessMsg(e.getMessage());
			} else {
				bean.setProcessMsg("操作失败");
			}
		}
		try {
			response.getWriter().write(JsonUtil.toJSONString(bean));
		} catch (IOException e) {
			logger.error(e.getMessage(), e);
			e.printStackTrace();
		}
	}

	/**
	 * 防重复前置检查
	 * 
	 * @param buzCode
	 * @param request
	 *            void
	 */
	@SuppressWarnings("unchecked")
	private String repeatSubmitPreCheck(String buzCode,
			HttpServletRequest request, HttpServletResponse response) {
		if (!StringUtil.areBlank(buzCode)) {
			Map<String, Integer> map = (Map<String, Integer>) request
					.getSession().getAttribute("repeatSubmit");
			if (map == null) {
				map = new ConcurrentHashMap<String, Integer>();
				request.getSession().setAttribute("repeatSubmit", map);
			}
			Integer submitTargetVersion = map.get(buzCode);
			if (submitTargetVersion == null) {
				submitTargetVersion = 0;
			}
			Cookie tarC = null;
			Integer submitSourceVersion = 0;
			for (Cookie c : request.getCookies()) {
				if (c.getName().equalsIgnoreCase("repeatSubmit")) {
					submitSourceVersion = Integer.parseInt(c.getValue());
					tarC = c;
					break;
				}
			}

			if (submitSourceVersion < submitTargetVersion) {
				return "请不要重复提交";
			} else {
				map.put(buzCode, submitSourceVersion + 1);
				if (tarC == null) {
					tarC = new Cookie("repeatSubmit",
							String.valueOf(submitSourceVersion + 1));
				} else {
					tarC.setValue(String.valueOf(submitSourceVersion + 1));
				}
				response.addCookie(tarC);
			}
		}
		return null;
	}

}


//////////////

/* 
 * Copyright (c) 2016, S.F. Express Inc. All rights reserved.
 */
package com.sf.novatar.tpl.p2.business;

import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.lang.StringUtils;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DuplicateKeyException;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.alibaba.fastjson.JSON;
import com.sf.novatar.tpl.bean.BeanBase;
import com.sf.novatar.tpl.bean.BusinessBase;
import com.sf.novatar.tpl.constants.BillingApplyConstants;
import com.sf.novatar.tpl.enums.BusinessStatus;
import com.sf.novatar.tpl.p2.dao.IBillingApplyDao;
import com.sf.novatar.tpl.page.PageHandler;
import com.sf.novatar.tpl.page.PageSplit;
import com.sf.novatar.tpl.util.AbstractExcelReader;
import com.sf.novatar.tpl.util.Configuration;
import com.sf.novatar.tpl.util.DateUtils;
import com.sf.novatar.tpl.util.StringUtil;
import com.sf.novatar.tpl.util.TaxPayUtil;
import com.sf.novatar.tpl.util.UserUtil;
import com.sf.novatar.tpl.util.XslUtil;
import com.sfpay.framework.base.exception.ServiceException;

/**
 * 描述:开票申请业务类
 *
 * <pre>HISTORY
 * ****************************************************************************
 *  ID   DATE           PERSON          REASON
 *  1    2016年11月24日      80001092         Create
 * ****************************************************************************
 * </pre>
 * @author 80001092
 * @since 1.0
 */
@Service("billingApplyBusiness")
public class BillingApplyBusiness extends BusinessBase {
	
	private static final Logger logger = LoggerFactory.getLogger(BillingApplyBusiness.class);
	static final String ERR_TAX_PAY_ID_FORMAT = "税号格式不对,包含特殊符号";
	static final String CUSTTYPE = "custType";
	static final String INV_TYPE_E_I = "E/I";
	static final String INV_TYPE_S = "S";
	
	@Autowired
	private IBillingApplyDao billingApplyDao;
	
	@Override
	public void beforcheck(BeanBase bean) {
		//
	}

	@Override
	public void process(BeanBase bean) {
		//
	}

	@Override
	public void afterprocess(BeanBase bean) {
		//
	}
	
	/**
	 * 80001092 方法说明:查看待开票记录
	 * @param bean
	 * void
	 */
	public void queryUnbilled (BeanBase bean) {
		Map<String, String> paramMap = bean.getDatas().get(0);
		String searchType = paramMap.get("searchType");
		// String bill_STATUS = paramMap.get("BILL_STATUS");
		/*if(StringUtil.areBlank(bill_STATUS)){
			throw new ServiceException("查询待开票信息失败:状态不允许为空!");
		}*/
		paramMap.put("currentEmpCode", UserUtil.getCurrentUser().getEmpCode());
		try {
			paramMap.put("billTaxPaySub", StringUtil.addDimmer(paramMap.get("BILL_TAX_PAY_SUB"), ",", "'"));
			paramMap.put("billPrctr", StringUtil.addDimmer(paramMap.get("BILL_PRCTR"), ",", "'"));
			paramMap.put("zCustomerNo", StringUtil.addDimmer(paramMap.get("Z_CUSTOMER_NO"), ",", "'"));
			paramMap.put("businessType", StringUtil.addDimmer(paramMap.get("BUSINESS_TYPE"), ",", "'"));
			paramMap.put("billBukrs", StringUtil.addDimmer(paramMap.get("BILL_BUKRS"), ",", "'"));
			paramMap.put("ZZPERSR", StringUtil.addDimmer(paramMap.get("ZZPERSR"), ",", "'"));
			if("reBillSearch".equals(searchType)) {
				bean.getExpData().put("page", PageHandler.execute(new PageSplit<Map<String, Object>>() {
					
					@Override
					public int queryTotalCount() {
						return billingApplyDao.getTotalCountReBill(paramMap);
					}
					
					@Override
					public List<Map<String, Object>> queryPageList(int pageStart, int pageSize) {
						return billingApplyDao.getBillListRebill(paramMap, pageStart, pageSize);
					}
				}, bean.getRows(), bean.getPage()));
			} else {
				bean.getExpData().put("page", PageHandler.execute(new PageSplit<Map<String, Object>>() {
					
					@Override
					public int queryTotalCount() {
						return billingApplyDao.getTotalCount(paramMap);
					}
					
					@Override
					public List<Map<String, Object>> queryPageList(int pageStart, int pageSize) {
						return billingApplyDao.getBillList(paramMap, pageStart, pageSize);
					}
				}, bean.getRows(), bean.getPage()));
			}
		} catch (Exception e) {
			logger.error("查询开票申请失败!");
			throw new ServiceException("查询开票申请失败:", e.getMessage());
		}

	}
	
	/**
	 * 80001092 方法说明:通用查询条件 (未添加权限)
	 * @param bean
	 * void
	 */
	public void getCommonList(BeanBase bean) {
		try {
			HashMap<String, String> map = bean.getDatas().get(0);
			map.put("currentEmpCode", UserUtil.getCurrentUser().getEmpCode());
			String queryType = map.get("queryType");
			List<Map<String, String>> resultList = null;
			if ("acturalBillTaxPaySub".equals(queryType)) {
				resultList = billingApplyDao.getActuralBilTaxPaySub(map);
			} else if ("BILL_PRCTR".equals(queryType)) {
				resultList = billingApplyDao.getBILLPRCTR(map);
			} else if ("Z_CUSTOMER_NO".equals(queryType)) {
				resultList = billingApplyDao.getZCUSTOMERNO(map);
			} else if ("BUSINESS_TYPE".equals(queryType)) {
				resultList = billingApplyDao.getBUSINESSTYPE(map);
			} else if ("BILL_BUKRS".equals(queryType)) {
				resultList = billingApplyDao.getBILLBUKRS(map);
			} else if ("A_BILL_TAX_PAY_SUB".equals(queryType)) {
				resultList = billingApplyDao.markedCancelA_BILL_TAX_PAY_SUB(map);
			} else if ("A_BILL_PRCTR".equals(queryType)) {
				resultList = billingApplyDao.markedCancelA_BILL_PRCTR(map);
			} else if ("KUNNR".equals(queryType)) {
				resultList = billingApplyDao.markedCancelKUNNR(map);
			} else if ("ZDEINVID".equals(queryType)) {
				resultList = billingApplyDao.markedCancelZDEINVID(map);
			} else if ("ZINV_NUMBER".equals(queryType)) {
				resultList = billingApplyDao.markedCancelZINV_NUMBER(map);
			} else if ("ZINV_CODE".equals(queryType)) {
				resultList = billingApplyDao.markedCancelZINV_CODE(map);
			} else if ("WAYBILL_NO".equals(queryType)) {
				resultList = billingApplyDao.markedCancelWAYBILL_NO(map);
			} else if ("WAYBILL_ORDER_NO".equals(queryType)) {
				resultList = billingApplyDao.markedCancelWAYBILL_ORDER_NO(map);
			} else if ("ZZPERSR".equals(queryType)) {
				resultList = billingApplyDao.getZZPERSR(map);
			} else if ("getInvTaxPaySub".equals(queryType)) {
				resultList = billingApplyDao.getInvTaxPaySub(map);
			}
			bean.getExpData().put("resultList", resultList);
		} catch (Exception e) {
			throw new ServiceException("获取查询条件失败:", e.getMessage());
		}
	}
	
	/**
	 * 80001092 方法说明:查询开票状态
	 * @param bean
	 * void
	 */
	public void getBillStatusList(BeanBase bean) {
		try {
			String statusList = Configuration.getConfig("BILL_STATUS");
			bean.getExpData().put("resultList", statusList);
		} catch (Exception e) {
			throw new ServiceException("获取开票状态失败:", e.getMessage());
		}
	}
	
	/**
	 * 80001092 方法说明:月结创建发票批
	 * @param bean
	 * void
	 */
	@Transactional
	public void createBillBatchSelf(BeanBase bean) {
		Map<String, String> paramMap = bean.getDatas().get(0);
		try {
			String[] ids = paramMap.get("ids").split(",",-1);
			if(ids.length < 1 || StringUtil.areBlank(ids[0])) {
				throw new ServiceException("获取提交数据失败");
			}
			String[] TSK_MONTH_BILL = paramMap.get("TSK_MONTH_BILL").split(",",-1);
			String[] DIFF_REASON = paramMap.get("DIFF_REASON").split(",",-1);
			String[] TICKETS_BACK = paramMap.get("TICKETS_BACK").split(",",-1);
			String[] applierBack = paramMap.get("applierBack").split(",",-1);
			String[] bellong_date = paramMap.get("bellong_date").split(",",-1);
			String[] sub_ID = paramMap.get("sub_ID").split(",",-1);
			String[] SUB_TSK_MONTH_BILL = paramMap.get("SUB_TSK_MONTH_BILL").split(",",-1);
			String[] SUB_DIFF_REASON = paramMap.get("SUB_DIFF_REASON").split(",",-1);
			String[] SUB_TICKETS_BACK = paramMap.get("SUB_TICKETS_BACK").split(",",-1);
			String[] SUB_applierBack = paramMap.get("SUB_applierBack").split(",",-1);
			String REBILL_FLAG = paramMap.get("REBILL_FLAG");
			// 新添加需求,实现单位,单价,数量,规格的编辑
			String[] MEINS = paramMap.get("MEINS").split(",",-1);
			String[] UNITPE = paramMap.get("UNITPE").split(",",-1);
			String[] FKIMG = paramMap.get("FKIMG").split(",",-1);
			String[] MSPEC = paramMap.get("MSPEC").split(",",-1);
			String[] sub_MEINS = paramMap.get("sub_MEINS").split(",",-1);
			String[] sub_UNITPE = paramMap.get("sub_UNITPE").split(",",-1);
			String[] sub_FKIMG = paramMap.get("sub_FKIMG").split(",",-1);
			String[] sub_MSPEC = paramMap.get("sub_MSPEC").split(",",-1);
			
			// 前台提交方式 
			String postType = paramMap.get("postType");
			// 创建发票批
			if("alone".equals(postType)) { // 提交
				for(int i=0; i<ids.length; i++) {
					createBillingBatch(ids[i],TSK_MONTH_BILL[i],DIFF_REASON[i],TICKETS_BACK[i],applierBack[i],
							sub_ID,SUB_TSK_MONTH_BILL,SUB_DIFF_REASON,SUB_TICKETS_BACK,SUB_applierBack,REBILL_FLAG,
							MEINS[i],UNITPE[i],FKIMG[i],MSPEC[i],sub_MEINS,sub_UNITPE,sub_FKIMG,sub_MSPEC);
				}
			} else if("merged".equals(postType)) { // 合并提交
				createBillingBatchMerged(ids,TSK_MONTH_BILL,DIFF_REASON,TICKETS_BACK,applierBack,
						bellong_date,sub_ID,SUB_TSK_MONTH_BILL,SUB_DIFF_REASON,SUB_TICKETS_BACK,
						SUB_applierBack,REBILL_FLAG,MEINS,UNITPE,FKIMG,MSPEC,sub_MEINS,sub_UNITPE,sub_FKIMG,sub_MSPEC);
			}
		} catch (Exception e) {
			logger.error("生产发票批失败!");
			throw new ServiceException("生成发票批失败:" + e.getMessage());
		}
	}
	
	/**
	 * 80001092 方法说明:和并提交创建发票批,形式发票表不做合并
	 * @param ids
	 * @param tSK_MONTH_BILL
	 * @param dIFF_REASON
	 * @param tICKETS_BACK
	 * @param applierBack
	 * @param sub_ID
	 * @param sUB_TSK_MONTH_BILL
	 * @param sUB_DIFF_REASON
	 * @param sUB_TICKETS_BACK
	 * @param sUB_applierBack
	 * void
	 */
	private void createBillingBatchMerged(String[] ids,
			String[] tSK_MONTH_BILL, String[] dIFF_REASON,
			String[] tICKETS_BACK, String[] applierBack, 
			String[] bellong_date, String[] sub_ID,
			String[] sUB_TSK_MONTH_BILL, String[] sUB_DIFF_REASON,
			String[] sUB_TICKETS_BACK, String[] sUB_applierBack, String REBILL_FLAG,
			String[] MEINS, String[] UNITPE, String[] FKIMG, String[] MSPEC, 
			String[] sub_MEINS, String[] sub_UNITPE, String[] sub_FKIMG, String[] sub_MSPEC) {
			//checkIfHaveBilled(ids, REBILL_FLAG);
			// 发票批次号
			String ZDEINVID = new SimpleDateFormat("yyMMddHHmmssSSS").format(new Date()) + new Double(Math.floor(Math.random()*10)).intValue();
			// 流水号
			int j = 2;
			// 开票金额之和
			double mainAccountSUMAMT = 0.0;
			List<Map<String, Object>> listSubAccount = billingApplyDao.querySubAccount(ids[0]);
			// 存放子账号序号
			Map<String, Integer> subAccountNum = new HashMap<String, Integer>();
			for (int i=0; i<listSubAccount.size(); i++) {
				subAccountNum.put(listSubAccount.get(i).get("SUB_XH").toString(), j++);
			}
			Map<String, Double> subAMT = new HashMap<String, Double>();
			// 子账号循环生成形式发票
			if(sub_ID.length > 0 && sub_ID[0] != "") {
				for(int i=0; i<sub_ID.length; i++) {
					// 为0不创建
					if(StringUtils.isBlank(sUB_TSK_MONTH_BILL[i]) || 0 == Double.parseDouble(sUB_TSK_MONTH_BILL[i])) {
						continue;
					}
					if(subAMT.get(sub_ID[i].split("_")[0]) != null) {
						subAMT.put(sub_ID[i].split("_")[0], subAMT.get(sub_ID[i].split("_")[0]) + Double.parseDouble(sUB_TSK_MONTH_BILL[i]));
					} else {
						subAMT.put(sub_ID[i].split("_")[0], Double.parseDouble(sUB_TSK_MONTH_BILL[i]));
					}
					Map<String, Object> mapSubInfo = getSubAccountInfo(sub_ID[i].split("_")[0],sub_ID[i].split("_")[1]);
					mainAccountSUMAMT += Double.parseDouble(sUB_TSK_MONTH_BILL[i]);
					mapSubInfo.put("ZDEINVID", ZDEINVID);
					mapSubInfo.put("ZDEINVID_XH", subAccountNum.get(sub_ID[i].split("_")[1]));
					mapSubInfo.put("SUB_TSK_MONTH_BILL", sUB_TSK_MONTH_BILL[i]);
					mapSubInfo.put("SUB_DIFF_REASON", sUB_DIFF_REASON[i]);
					mapSubInfo.put("SUB_TICKETS_BACK", sUB_TICKETS_BACK[i]);
					mapSubInfo.put("sub_applierBack", sUB_applierBack[i]);
					mapSubInfo.put("currentEmpCode", UserUtil.getCurrentUser().getEmpCode());
					mapSubInfo.put("MEINS", sub_MEINS[i]);
					mapSubInfo.put("UNITPE", sub_UNITPE[i]);
					mapSubInfo.put("FKIMG", sub_FKIMG[i]);
					mapSubInfo.put("MSPEC", sub_MSPEC[i]);
					billingApplyDao.createFormBillSubAccount(mapSubInfo);
				}
			}
			//int subAccount = sub_ID.length/ids.length;
			Map<String, Object> mapInfo = new HashMap<String, Object>();
			for(int i=0; i<ids.length; i++) {
				mainAccountSUMAMT += Double.parseDouble(tSK_MONTH_BILL[i]);
				double sumMonthAMT = Double.parseDouble(tSK_MONTH_BILL[i]);
				/*for(int c=i*subAccount; c<(i+1)*subAccount; c++) {
					sumMonthAMT +=  Double.parseDouble(sUB_TSK_MONTH_BILL[c]);
				}*/
				if(subAMT.get(ids[i]) != null) {
					sumMonthAMT += subAMT.get(ids[i]);
				}
				mapInfo = getBatchInfoById(ids[i]);
				mapInfo.put("billAMT", sumMonthAMT);
				mapInfo.put("ZDEINVID", ZDEINVID);
				mapInfo.put("ZDEINVID_XH", 1);
				mapInfo.put("TAXSUM", tSK_MONTH_BILL[i]);
				mapInfo.put("DIFF_REASON", dIFF_REASON[i]);
				mapInfo.put("TICKETS_BACK", tICKETS_BACK[i]);
				mapInfo.put("APPLIER_BACK", applierBack[i]);
				mapInfo.put("currentEmpCode", UserUtil.getCurrentUser().getEmpCode());
				mapInfo.put("MEINS", MEINS[i]);
				mapInfo.put("UNITPE", UNITPE[i]);
				mapInfo.put("FKIMG", FKIMG[i]);
				mapInfo.put("MSPEC", MSPEC[i]);
				if (StringUtils.isNotBlank(tSK_MONTH_BILL[i]) && 0 != Double.parseDouble(tSK_MONTH_BILL[i])) {
					billingApplyDao.createFormBill(mapInfo);
				}
				billingApplyDao.updateBillSum(mapInfo);
			}
			mapInfo.put("INV_TARGET", BillingApplyConstants.INV_TARGET_E); //外部
			mapInfo.put("billAMT", mainAccountSUMAMT);
			mapInfo.put("BEGIN_PERIOD",bellong_date[0]);
			mapInfo.put("END_PERIOD",bellong_date[ids.length-1]);
			mapInfo.put("currentStep", 
					queryCurrentStepFromStep(mapInfo.get("BILL_PRCTR").toString(), 
							BillingApplyConstants.INV_TARGET_OUTER));
			billingApplyDao.createMainAccountBatch(mapInfo);
			if (StringUtil.areBlank(REBILL_FLAG)) {
				billingApplyDao.updateBatchId(addQuotes(ids), ZDEINVID);
				billingApplyDao.updateBillItemBacthId(addQuotes(ids), ZDEINVID);
			}
			Map<String, Object> flowLogMap = billingApplyDao.getModuleConfig("TAX_10_01");
			billingApplyDao.insertBatchFlowLog(mapInfo, flowLogMap);
			/*
			for( int i=0; i<subAccount; i++ ) {
				double subInnerSumAMT = 0.0;
				for(int k=i; k<sub_ID.length; k+=subAccount) {
					mainSubAccountSUMAMT += Double.parseDouble(sUB_TSK_MONTH_BILL[k]);
					subInnerSumAMT += Double.parseDouble(sUB_TSK_MONTH_BILL[k]);
					// 插入合并提交记录表
					Map<String, Object> mapMergeDetail = new HashMap<String, Object>();
					mapMergeDetail.put("subId", sub_ID[k]);
					mapMergeDetail.put("subDate", bellong_date[k/subAccount]);
					mapMergeDetail.put("sub_applierBack", sUB_applierBack[k]);
					mapMergeDetail.put("sub_TICKETS_BACK", sUB_TICKETS_BACK[k]);
					mapMergeDetail.put("sub_DIFF_REASON", sUB_DIFF_REASON[k]);
					mapMergeDetail.put("sub_TSK_MONTH_BILL", Double.parseDouble(sUB_TSK_MONTH_BILL[k]));
					billingApplyDao.insertMergeDeatil(mapMergeDetail);
				}
				// 插入形式发票表
				Map<String, Object> mapSubInfo = getSubAccountInfo(sub_ID[i].split("_")[0],sub_ID[i].split("_")[1]);
				mapSubInfo.put("ZDEINVID", ZDEINVID);
				mapSubInfo.put("ZDEINVID_XH", j++);
				mapSubInfo.put("SUB_TSK_MONTH_BILL", subInnerSumAMT);
				mapSubInfo.put("currentEmpCode", UserUtil.getCurrentUser().getEmpCode());
				billingApplyDao.createFormBillSubAccount(mapSubInfo);
			}*/
	}

	/**
	 * 80001092 方法说明:查询月结账号子账号
	 * @param bean
	 * void
	 */
	public void querySubAccount(BeanBase bean) {
		try {
			List<Map<String, Object>> listSubAccount = billingApplyDao.querySubAccount(bean.getDatas().get(0).get("headerId"));
			bean.getExpData().put("page", listSubAccount);
		} catch (Exception e) {
			throw new ServiceException("查找子账户失败:" + e.getMessage());
		}
	}
	
	/**
	 * 80001092 方法说明:创建发票批
	 * void
	 */
	private void createBillingBatch(String headerID, String billAMT, String diffReason, String ticketsBack, String applierBack,
			String[] subId, String[] SUB_TSK_MONTH_BILL, String[] SUB_DIFF_REASON, String[] SUB_TICKETS_BACK,
			String[] sub_applierBack, String REBILL_FLAG, String MEINS, String UNITPE, String FKIMG,
			String MSPEC, String[] sub_MEINS, String[] sub_UNITPE, String[] sub_FKIMG, String[] sub_MSPEC) {
		//查询当前月结账号当前月份是否已创建发票批
		String kp_flag = billingApplyDao.getKPFlag(headerID);
		if("01".equals(kp_flag)) { // 未开票
			// 子账号流水号
			int j = 2;
			//发票批次号
			String ZDEINVID = new SimpleDateFormat("yyMMddHHmmssSSS").format(new Date()) + new Double(Math.floor(Math.random()*10)).intValue();
			// 存放子账号开票金额之和
			double subAccountSUMAMT = 0;
			// insert into p2_ztax_form_bill 子账号
			for(int i=0; i<subId.length; i++) {
				if(subId[i] != "" && subId[i].split("_")[0].equals(headerID)) {
					// 为0不创建
					if(StringUtils.isBlank(SUB_TSK_MONTH_BILL[i]) || 0 == Double.parseDouble(SUB_TSK_MONTH_BILL[i])) {
						continue;
					}
					subAccountSUMAMT += Double.parseDouble(SUB_TSK_MONTH_BILL[i]);
					//查找每一个子账号的形式发票信息
					Map<String, Object> mapSubInfo =  getSubAccountInfo(subId[i].split("_")[0],subId[i].split("_")[1]);
					mapSubInfo.put("ZDEINVID", ZDEINVID);
					mapSubInfo.put("ZDEINVID_XH", j++);
					mapSubInfo.put("SUB_TSK_MONTH_BILL", SUB_TSK_MONTH_BILL[i]);
					mapSubInfo.put("SUB_DIFF_REASON", SUB_DIFF_REASON[i]);
					mapSubInfo.put("SUB_TICKETS_BACK", SUB_TICKETS_BACK[i]);
					mapSubInfo.put("sub_applierBack", sub_applierBack[i]);
					mapSubInfo.put("subId", subId[i]);
					mapSubInfo.put("currentEmpCode", UserUtil.getCurrentUser().getEmpCode());
					mapSubInfo.put("MEINS", sub_MEINS[i]);
					mapSubInfo.put("UNITPE", sub_UNITPE[i]);
					mapSubInfo.put("FKIMG", sub_FKIMG[i]);
					mapSubInfo.put("MSPEC", sub_MSPEC[i]);
					billingApplyDao.createFormBillSubAccount(mapSubInfo);
				}
			}
			Map<String, Object> mapInfo = getBatchInfoById(headerID);
			String nextSetp = queryNextStep("20");
			//mapInfo.put("currentStep", queryCurrentStep("02", "E/S"));
			mapInfo.put("currentStep", 
					queryCurrentStepFromStep(mapInfo.get("BILL_PRCTR").toString(), 
							BillingApplyConstants.INV_TARGET_OUTER));
			mapInfo.put("nextSetp", nextSetp);
			mapInfo.put("ZDEINVID", ZDEINVID);
			mapInfo.put("ZDEINVID_XH", '1');
			mapInfo.put("INV_TARGET", BillingApplyConstants.INV_TARGET_E); //外部
			mapInfo.put("currentEmpCode", UserUtil.getCurrentUser().getEmpCode());
			// billAMT存放开票金额汇总
			mapInfo.put("billAMT", Double.parseDouble(billAMT) + subAccountSUMAMT);
			mapInfo.put("TAXSUM", Double.parseDouble(billAMT));
			mapInfo.put("DIFF_REASON", diffReason);
			mapInfo.put("TICKETS_BACK", ticketsBack);
			mapInfo.put("APPLIER_BACK", applierBack);
			mapInfo.put("BEGIN_PERIOD", mapInfo.get("GJAHR").toString() + mapInfo.get("MONAT").toString());
			mapInfo.put("END_PERIOD", mapInfo.get("GJAHR").toString() + mapInfo.get("MONAT").toString());
			mapInfo.put("MEINS", MEINS);
			mapInfo.put("UNITPE", UNITPE);
			mapInfo.put("FKIMG", FKIMG);
			mapInfo.put("MSPEC", MSPEC);
			//insert into p2_tax_bill_batch
			billingApplyDao.createMainAccountBatch(mapInfo);
			//insert into p2_ztax_form_bill 主账号
			if(StringUtils.isNotBlank(billAMT) && 0 != Double.parseDouble(billAMT)) {
				billingApplyDao.createFormBill(mapInfo);
			}
			if (StringUtil.areBlank(REBILL_FLAG)) {
				// update p2_tax_bill_item
				billingApplyDao.updateBillItemBatchId(mapInfo.get("ZBILL_NO").toString(), ZDEINVID);
				// update p2_ztax_bill_header
				billingApplyDao.updateBatchId("'" + headerID + "'", ZDEINVID);
			}
			// update p2_ztax_bill_sum 应开扣减,已开增加
			billingApplyDao.updateBillSum(mapInfo);
			// 流转日志
			Map<String, Object> flowLogMap = billingApplyDao.getModuleConfig("TAX_10_02");
			billingApplyDao.insertBatchFlowLog(mapInfo, flowLogMap);
		} else {
			throw new ServiceException("存在已经开票的月份,请查询后重新创建!");
		}
	}
	
	/**
	 * 80001092 方法说明:创建发票批需要的信息
	 * @param headerID
	 * @return
	 * List<Map<String,Object>>
	 */
	private Map<String, Object> getBatchInfoById(String headerID) {
		return billingApplyDao.getInfoForCreateBatch(headerID);
	}
	
	private Map<String, Object> getSubAccountInfo(String headerId, String subId) {
		return billingApplyDao.getSubAccountInfo(headerId, subId);
	}
	
	/**
	 * 80001092 方法说明:校验合并提交时,是否有月份已经开票
	 * @param ids
	 * void
	 */
	@SuppressWarnings("unused")
	private void checkIfHaveBilled(String[] ids, String REBILL_FLAG) {
		if(ids == null || ids.length == 0) {
			throw new ServiceException("请选择需要合并提交的月结账号!");
		}
		List<Map<String, String>> kpFlagList = billingApplyDao.getKPFlagList(ids);
		for(int i=0; i<kpFlagList.size(); i++) {
			if("Y".equals(kpFlagList.get(0).get("kp_flag")) && StringUtils.isBlank(REBILL_FLAG)) { // 如果存在已经开票的月份
				throw new ServiceException("已经存在申请过的月份,请查询后重新提交!");
			}
		}
	}
	
	/**
	 * 80001092 方法说明:添加引号
	 * @param str
	 * @return
	 * String
	 */
	private String addQuotes(String[] str) {
		StringBuffer sb = new StringBuffer();
		for(String s : str) {
			sb.append("'").append(s).append("'").append(",");
		}
		return sb.deleteCharAt(sb.length() - 1).toString();
	}
	
	
	/**
	 * 80001092 方法说明:拆分生成发票批
	 * @param bean
	 * void
	 */
	@Transactional
	public void createBillBatchSeparate(BeanBase bean) {
		Map<String, String> paramMap = bean.getDatas().get(0);
		String headerId = paramMap.get("headerId");
		try {
			//查询当前月结账号当前月份是否已创建发票批
			String kp_flag = billingApplyDao.getKPFlag(headerId);
			if("01".equals(kp_flag)) {
				String[] TSK_MONTH_BILL = paramMap.get("TSK_MONTH_BILL").split(",",-1);
				String[] DIFF_REASON = paramMap.get("DIFF_REASON").split(",",-1);
				String[] TICKETS_BACK = paramMap.get("TICKETS_BACK").split(",",-1);
				String[] applierBack = paramMap.get("applierBack").split(",",-1);
				// 发票批次号
				String ZDEINVID = new SimpleDateFormat("yyMMddHHmmssSSS").format(new Date()) + new Double(Math.floor(Math.random()*10)).intValue();
				Map<String, Object> mapInfo = getBatchInfoById(headerId);
				mapInfo.put("ZDEINVID", ZDEINVID);
				mapInfo.put("INV_TARGET", BillingApplyConstants.INV_TARGET_E); //外部
				mapInfo.put("currentEmpCode", UserUtil.getCurrentUser().getEmpCode());
				double billAMT = createFormBillSeparate(mapInfo, TSK_MONTH_BILL, DIFF_REASON, TICKETS_BACK, applierBack);
				mapInfo.put("billAMT", billAMT);
				mapInfo.put("BEGIN_PERIOD", mapInfo.get("GJAHR").toString() + mapInfo.get("MONAT").toString());
				mapInfo.put("END_PERIOD", mapInfo.get("GJAHR").toString() + mapInfo.get("MONAT").toString());
				billingApplyDao.createMainAccountBatch(mapInfo);
				billingApplyDao.updateBillItemBatchId(mapInfo.get("ZBILL_NO").toString(), ZDEINVID);
				billingApplyDao.updateBatchId("'" + headerId + "'", ZDEINVID);
				billingApplyDao.updateBillSum(mapInfo);
				insertBatchFlowLog(mapInfo, "TAX_10_03");
			} else {
				throw new ServiceException("该月结账号本月已经提交!");
			}
		} catch (Exception e) {
			logger.error("拆分提交生成发票批出错!");
			throw new ServiceException("拆分生成发票批失败");
		}
	}

	/**
	 * 80001092 方法说明:拆分生成形式发票表
	 * @param mapInfo
	 * @param tSK_MONTH_BILL
	 * @param dIFF_REASON
	 * @param tICKETS_BACK
	 * @param applierBack
	 * void
	 */
	private double createFormBillSeparate(Map<String, Object> mapInfo,
			String[] tSK_MONTH_BILL, String[] dIFF_REASON,
			String[] tICKETS_BACK, String[] applierBack) { 
		double billAMT = 0.0;
		// 子账号流水
		int j = 1;
		for(int i=0; i<tSK_MONTH_BILL.length; i++) {
			billAMT += Double.parseDouble(tSK_MONTH_BILL[i]);
			mapInfo.put("TAXSUM", Double.parseDouble(tSK_MONTH_BILL[i]));
			mapInfo.put("DIFF_REASON", dIFF_REASON[i]);
			mapInfo.put("TICKETS_BACK", tICKETS_BACK[i]);
			mapInfo.put("APPLIER_BACK", applierBack[i]);
			mapInfo.put("ZDEINVID_XH", j++);
			billingApplyDao.createFormBill(mapInfo);
		}
		return billAMT;
	}
	
	/**
	 * 80001092 方法说明:散单导入
	 * @param bean
	 * void
	 */
	@Transactional
	public void desperseBillImport(BeanBase bean) {
		try {
			new AbstractExcelReader() {
				@Override
				public void doParse(Workbook workbook) {
					insertBill(check(workbook));
				}
			}.Reader();;
		} catch (Exception e) {
			String errorMsg = "EXCEL上传失败:<br>";
			String errMsgDinamic = e.getMessage();
			if (StringUtil.areNotBlank(errMsgDinamic)) {
				errorMsg += errMsgDinamic;
			} else {
				errorMsg += "请确保最后一行数据之后没有空白数据";
			}
			logger.error(errorMsg, e);
			if (e instanceof DuplicateKeyException) {
				throw new ServiceException("导入的Excel存在重复的数据,去掉重复数据后在导入");
			} else {
				throw new ServiceException(errorMsg);
			}
		}
		bean.setStatus(BusinessStatus.FINLISH);
		bean.setProcessMsg("导入完成!");
	}

	/**
	 * 80001092 方法说明:插入数据
	 * @param check
	 * void
	 */
	private void insertBill(List<Map<String, String>> excelValueList) {
		billingApplyDao.insertBill(excelValueList);
	}

	/**
	 * 80001092 方法说明:导入数据校验
	 * @param workbook
	 * @return
	 * Object
	 */
	private List<Map<String, String>> check(Workbook workBook) {
		List<Map<String, String>> excelValueList = null;
		// 待导入的数据
		int import_wb_sheetNos = workBook.getNumberOfSheets();
		if (import_wb_sheetNos == 0) {
			throw new ServiceException("待导入的数据为空");
		}
		excelValueList = new ArrayList<>();
		// 当前权限的网点
		List<Map<String, String>> branchList = billingApplyDao.
				getCurrentAuthBranch(UserUtil.getCurrentUser().getEmpCode());
		// 合并后的业务类型
		// List<Map<String, String>> businessType = billingApplyDao.getAllBusinessType();
		for(int i=0; i<import_wb_sheetNos; i++) {
			Cell cell = null;
			String ORDER_NUM = null;
			String BRANCH = null;
			String SETTLEMENT = null;
			String CUST_NAME = null;
			String TAXPAY_ID = null;
			String TAXAMT = null;
			String INVOICE_TYPE = null;
			String BELONG_DATE = null;
			String DES = null;
			String REMARK = null;
			String EXCEP_REMARK = null;
			String ADDR = null;
			String TEL = null;
			String BANK_NAME = null;
			String ACCOUNT_NO = null;
			String SPEC = null;
			String UNIT = null;
			String UNIT_PRICE = null;
			String AMOUNT = null;
			String PAYEE = null;
			String RECHECKER = null;
			String RETE = null;
			String RECV_ADDR = null;
			String RECV_TEL = null;
			String RECV_NAME = null;
			String RECV_EMAIL = null;
			String NAMECARD_ID = null;
			String IF_REPEAT = null;
			String BILL_NO = null;
			Sheet sheet = workBook.getSheetAt(i);
			for(int line=1, count=sheet.getLastRowNum()+1; line<count; line++) {
				Row row = sheet.getRow(line);
				int j = 0;
				cell = row.getCell(j++);
				BRANCH = getCellValue(cell);
				
				cell = row.getCell(j++);
				CUST_NAME = getCellValue(cell);
				
				if (StringUtil.areBlank(BRANCH, CUST_NAME)) {
					continue; 
				}
				
				if(StringUtil.areBlank(BRANCH)) {
					String message = workBook.getSheetName(i) + "的第"
							+ line + "行,点部代码不能为空";
					throw new ServiceException(message);
			    } else {
					boolean temp = false;
					for(int k=0; k<branchList.size(); k++) {
						if(branchList.get(k).containsValue(BRANCH)) {
							temp = true;
							break;
						}
					}
					if(!temp) {
						throw new ServiceException("当前没有权限上传网点"+BRANCH);
					}
			    }
				if(StringUtil.areBlank(CUST_NAME)) {
					String message = workBook.getSheetName(i) + "的第"
							+ line + "行,客户名称不能为空";
					throw new ServiceException(message);
				} else {
					CUST_NAME = CUST_NAME.replace(" ","");
				}
				
				cell = row.getCell(j++);
				TAXPAY_ID = getCellValue(cell);
				if(!TaxPayUtil.check(TAXPAY_ID)){
					throw new ServiceException(ERR_TAX_PAY_ID_FORMAT);
				}
				
				cell = row.getCell(j++);
				ADDR =  getCellValue(cell);
				
				cell = row.getCell(j++);
				ACCOUNT_NO = getCellValue(cell);
				
				cell = row.getCell(j++);
				if(cell == null || cell.getCellType() != Cell.CELL_TYPE_NUMERIC) {
					String message = workBook.getSheetName(i) + "的第"
							+ line + "行,开票金额必须为有效数值";
					throw new ServiceException(message);
				}
				if(cell.getNumericCellValue() == 0) {
					String message = workBook.getSheetName(i) + "的第"
							+ line + "行,开票金额必须为有效数值";
					throw new ServiceException(message);
				}
				TAXAMT = getCellValue(cell);
				
				cell = row.getCell(j++);
				INVOICE_TYPE = getCellValue(cell);
				if(StringUtil.areBlank(INVOICE_TYPE)) {
					String message = workBook.getSheetName(i) + "的第"
							+ line + "行,发票类型不能为空";
					throw new ServiceException(message);
				} else {
					if(!"专票".equals(INVOICE_TYPE) && !"普票".equals(INVOICE_TYPE)) {
						throw new ServiceException("发票类型请填专票或普票");
					}
					if ("专票".equals(INVOICE_TYPE)) {
						INVOICE_TYPE = "V1";
						if (!StringUtil.areNotBlank(TAXPAY_ID, ACCOUNT_NO, ADDR)) {
							throw new ServiceException("专票请填写纳税人识别号,开户行及账号,地址及电话");
						}
					} else {
						INVOICE_TYPE = "V2";
					}
				}
				
				cell = row.getCell(j++);
				BILL_NO = getCellValue(cell);
				
				cell = row.getCell(j++);
				BELONG_DATE = XslUtil.getCellString(cell);
				if(StringUtil.areBlank(BELONG_DATE)) {
					String message = workBook.getSheetName(i) + "的第"
							+ line + "行,月结款所属期不能为空";
					throw new ServiceException(message);
				} else if (BELONG_DATE.contains("-")) {
					String errorMessage = workBook.getSheetName(i) + "的第"
							+ line + "行,月结款所属期格式错误,必须为[yyyyMM]";
					throw new ServiceException(errorMessage);
				}
				try {
					DateUtils.parseDate(BELONG_DATE, "yyyyMM");
					if (BELONG_DATE.length() < 6) {
						String errorMessage = workBook.getSheetName(i) + "的第"
								+ line + "行,月结款所属期格式错误,必须为[yyyyMM]";
						throw new ServiceException(errorMessage);
					}
				} catch (Exception e) {
					String errorMessage = workBook.getSheetName(i) + "的第"
							+ line + "行,月结款所属期格式错误,必须为[yyyyMM]";
					throw new ServiceException(errorMessage);
				}
				
				cell = row.getCell(j++);
				EXCEP_REMARK = getCellValue(cell);
				
				cell = row.getCell(j++);
				NAMECARD_ID = getCellValue(cell);
				
				cell = row.getCell(j++);
				DES = getCellValue(cell);
				
				cell = row.getCell(j++);
				RETE = getCellValue(cell);
				/*if (StringUtil.areBlank(RETE)) {
					RETE = "0";
				}*/
				
				cell = row.getCell(j++);
				SPEC = getCellValue(cell);
						
				cell = row.getCell(j++);
				UNIT = getCellValue(cell);
				
				cell = row.getCell(j++);
				UNIT_PRICE = getCellValue(cell);
				
				cell = row.getCell(j++);
				AMOUNT = getCellValue(cell);
				
				cell = row.getCell(j++);
				RECV_ADDR = getCellValue(cell);
				
				cell = row.getCell(j++);
				RECV_NAME = getCellValue(cell);
				
				cell = row.getCell(j++);
				RECV_TEL = XslUtil.getCellString(cell);
				
				cell = row.getCell(j);
				RECV_EMAIL = getCellValue(cell);
			
			/*	cell = row.getCell(3);
				BELONG_DATE = getCellValue(cell);
				if(StringUtil.areBlank(BELONG_DATE)) {
					String message = workBook.getSheetName(i) + "的第"
							+ line + "行,月结款所属期不能为空";
					throw new ServiceException(message);
				} else if (BELONG_DATE.contains("-")) {
					String errorMessage = workBook.getSheetName(i) + "的第"
							+ line + "行,月结款所属期格式错误,必须为[yyyyMM]";
					throw new ServiceException(errorMessage);
				}
				try {
					DateUtils.parseDate(BELONG_DATE, "yyyyMM");
				} catch (Exception e) {
					String errorMessage = workBook.getSheetName(i) + "的第"
							+ line + "行,月结款所属期格式错误,必须为[yyyyMM]";
					throw new ServiceException(errorMessage);
				}
				
				cell = row.getCell(4);
				EXCEP_REMARK = getCellValue(cell);
				
				cell = row.getCell(5);
				SETTLEMENT = getCellValue(cell);
				
				cell = row.getCell(6);
				
				
				cell = row.getCell(7);
				NAMECARD_ID = getCellValue(cell);
				if(StringUtil.areBlank(NAMECARD_ID)) {
					String message = workBook.getSheetName(i) + "的第"
							+ line + "行,企业名片代码不能为空";
					throw new ServiceException(message);
				}
				
				
				// 暂时取消必填和位数校验
				if(StringUtil.areBlank(TAXPAY_ID) && "V1".equals(INVOICE_TYPE) && StringUtil.areBlank(NAMECARD_ID)) {
					String message = workBook.getSheetName(i) + "的第"
							+ line + "行,纳税人识别号不能为空";
					throw new ServiceException(message);
				} else { // 大于15位
					if(TAXPAY_ID.length() < 15) {
						throw new ServiceException("税号至少15位");
					}
				}
				
				cell = row.getCell(9);
				ADDR = getCellValue(cell);
				if(StringUtil.areBlank(ADDR)  && "V1".equals(INVOICE_TYPE) && StringUtil.areBlank(NAMECARD_ID)) {
					String message = workBook.getSheetName(i) + "的第"
							+ line + "行,地址不能为空";
					throw new ServiceException(message);
				}
				
				cell = row.getCell(10);
				TEL = getCellValue(cell);
				if(StringUtil.areBlank(ADDR, TEL)  && "V1".equals(INVOICE_TYPE) && StringUtil.areBlank(NAMECARD_ID)) {
					
				}
				
				cell = row.getCell(11);
				ACCOUNT_NO = getCellValue(cell);
				if(StringUtil.areBlank(ACCOUNT_NO)  && "V1".equals(INVOICE_TYPE) && StringUtil.areBlank(NAMECARD_ID)) {
					String message = workBook.getSheetName(i) + "的第"
							+ line + "行,开户行账号不能为空";
					throw new ServiceException(message);
				}
				
				cell = row.getCell(12);
				BANK_NAME = getCellValue(cell);
				if(StringUtil.areBlank(BANK_NAME, ACCOUNT_NO)  && "V1".equals(INVOICE_TYPE) && StringUtil.areBlank(NAMECARD_ID)) {
					String message = workBook.getSheetName(i) + "的第"
							+ line + "行,开户行账号和名称不能都为空";
					throw new ServiceException(message);
				}
				
				
				
				cell = row.getCell(14);
				DES = getCellValue(cell);
				if(StringUtil.areBlank(DES)) {
					String message = workBook.getSheetName(i) + "的第"
							+ line + "行,货物或应税劳务名称不能为空";
					throw new ServiceException(message);
				} else { // 校验类型是否存在
					boolean temp = false;
					for(int k=0; k<businessType.size(); k++) {
						if(businessType.get(k).containsValue(DES)) {
							temp = true;
							break;
						}
					}
					if(!temp) {
						throw new ServiceException("请输入正确的货物或应税劳务名称");
					}
				}
			
				cell = row.getCell(15);
				SPEC = getCellValue(cell);
				
				cell = row.getCell(16);
				UNIT = getCellValue(cell);
				
				cell = row.getCell(17);
				if(cell == null) {
					UNIT_PRICE = "";
				} else {
					try {
						cell.setCellType(Cell.CELL_TYPE_NUMERIC);
						UNIT_PRICE = String.valueOf(cell.getNumericCellValue());
					} catch (Exception e) {
						String message = workBook.getSheetName(i) + "的第"
								+ line + "行,单价必须为有效数值";
						throw new ServiceException(message);
					}
				}
				
				cell = row.getCell(18);
				if(cell == null) {
					AMOUNT =  "";
				} else {
					try {
						cell.setCellType(Cell.CELL_TYPE_NUMERIC);
						AMOUNT = String.valueOf(cell.getNumericCellValue());
					} catch (Exception e) {
						String message = workBook.getSheetName(i) + "的第"
								+ line + "行,数量必须为有效数值";
						throw new ServiceException(message);
					}
				}
				
				cell = row.getCell(19);
				PAYEE =  getCellValue(cell);
				
				cell = row.getCell(20);
				RECHECKER =  getCellValue(cell);
				
				cell = row.getCell(21);
				REMARK =  getCellValue(cell);
				
				cell = row.getCell(22);
				if(cell == null || cell.getCellType() != Cell.CELL_TYPE_NUMERIC) {
					String message = workBook.getSheetName(i) + "的第"
							+ line + "行,税率必须为有效数值";
					throw new ServiceException(message);
				}
				if(cell.getNumericCellValue() == 0) {
					String message = workBook.getSheetName(i) + "的第"
							+ line + "行,税率必须为有效数值";
					throw new ServiceException(message);
				}
				RETE = getCellValue(cell);
				
				cell = row.getCell(23);
				RECV_ADDR = getCellValue(cell);
				if(StringUtil.areBlank(RECV_ADDR)) {
					String message = workBook.getSheetName(i) + "的第"
							+ line + "行,收件人地址不能为空";
					throw new ServiceException(message);
				}
				
				cell = row.getCell(24);
				RECV_NAME = getCellValue(cell);
				if(StringUtil.areBlank(RECV_NAME)) {
					String message = workBook.getSheetName(i) + "的第"
							+ line + "行,收件人名称不能为空";
					throw new ServiceException(message);
				}
				
				cell = row.getCell(25);
				RECV_TEL = getCellValue(cell);
				if(StringUtil.areBlank(RECV_TEL)) {
					String message = workBook.getSheetName(i) + "的第"
							+ line + "行,收件人电话不能为空";
					throw new ServiceException(message);
				}
				
				cell = row.getCell(26);
				RECV_EMAIL = getCellValue(cell);*/
				
				// 是否申请过
				if (ifHaveApply(CUST_NAME, TAXAMT, BELONG_DATE)) {
					IF_REPEAT = "Y";	
				}
				
				Map<String, String> map = new HashMap<String, String>();
				map.put("ORDER_NUM", ORDER_NUM);
				map.put("BRANCH", BRANCH);
				map.put("SETTLEMENT", SETTLEMENT);
				map.put("CUST_NAME", CUST_NAME);
				map.put("TAXPAY_ID", TAXPAY_ID);
				map.put("TAXAMT", TAXAMT);
				map.put("INVOICE_TYPE", INVOICE_TYPE);
				map.put("BELONG_DATE", BELONG_DATE);
				map.put("DES", DES);
				map.put("REMARK", REMARK);
				map.put("CREATE_ID", UserUtil.getCurrentUser().getEmpCode());
				map.put("EXCEP_REMARK", EXCEP_REMARK);
				map.put("ADDR", ADDR);
				map.put("TEL", TEL);
				map.put("BANK_NAME", BANK_NAME);
				map.put("ACCOUNT_NO", ACCOUNT_NO);
				map.put("SPEC", SPEC);
				map.put("UNIT", UNIT);
				map.put("UNIT_PRICE", UNIT_PRICE);
				map.put("AMOUNT", AMOUNT);
				map.put("PAYEE", PAYEE);
				map.put("RECHECKER", RECHECKER);
				map.put("RETE", RETE);
				map.put("RECV_ADDR", RECV_ADDR);
				map.put("RECV_TEL", RECV_TEL);
				map.put("RECV_NAME", RECV_NAME);
				map.put("RECV_EMAIL", RECV_EMAIL);
				map.put("NAMECARD_ID", NAMECARD_ID);
				map.put("IF_REPEAT", IF_REPEAT);
				map.put("BILL_NO", BILL_NO);
				excelValueList.add(map);
			}
		}
		return excelValueList; 
	}
	
	/**
	 * 2016年12月8日 80001092 方法说明:查询散单
	 * @param bean
	 * void
	 */
	public void queryUnbilledDesperse(BeanBase bean) {
		Map<String, String> paramMap = bean.getDatas().get(0);
		paramMap.put("currentEmpCode", UserUtil.getCurrentUser().getEmpCode());
		try {
			bean.getExpData().put("page", PageHandler.execute(new PageSplit<Map<String, Object>>() {
				
				@Override
				public int queryTotalCount() {
					return billingApplyDao.getTotalCountDesperse(paramMap);
				}
				
				@Override
				public List<Map<String, Object>> queryPageList(int pageStart, int pageSize) {
					return billingApplyDao.getBillListDesperse(paramMap, pageStart, pageSize);
				}
			}, bean.getRows(), bean.getPage()));
		} catch (Exception e) {
			logger.error("查询散单待开票失败");
			throw new ServiceException("查询失败",e.getMessage());
		}
	}
	
	/**
	 * 2016年12月9日 80001092 方法说明:散单删除
	 * @param bean
	 * void
	 */
	public void deleteDesperseRecord(BeanBase bean) {
		String idsString = bean.getDatas().get(0).get("ids");
		if(StringUtil.areBlank(idsString)) {
			throw new ServiceException("请选择需要删除的记录");
		}
		String ids = StringUtil.addDimmer(idsString, ",", "'");
		try {
			billingApplyDao.deleteDesperseRecord(ids);
		} catch (Exception e) {
			logger.error("删除失败,sql异常");
			throw new ServiceException("");
		}
	}
	
	/**
	 * 2016年12月9日 80001092 方法说明:生成散单发票批
	 * @param base
	 * void
	 */
	@Transactional
	public void createDesporseBatch(BeanBase bean) {
		Map<String, String> paramMap = bean.getDatas().get(0);
		String selectAllFlag = paramMap.get("selectAllFlag");
		String idsString = paramMap.get("ids");
		if(StringUtil.areBlank(idsString) && !"checked".equals(selectAllFlag)) {
			throw new ServiceException("请选择需要提交的记录");
		}
		String ids = StringUtil.addDimmer(idsString, ",", "'");
		if ("checked".equals(selectAllFlag)) { // 全选
			ids = null;
		}
		List<Map<String, Object>> listRecord = billingApplyDao.
				getBillListDesperseByIds(ids,UserUtil.getCurrentUser().getEmpCode());
		if(listRecord == null || listRecord.size() == 0) {
			throw new ServiceException("获取开票信息时失败,暂时无法提交");
		}
		for(int i=0,count=listRecord.size(); i<count; i++){
			Map<String, Object> mapInfo = listRecord.get(i);
			if("02".equals(mapInfo.get("KP_FLAG").toString())) {
				throw new ServiceException("已经提交的行禁止再次提交");
			}
			// 发票批次号
			String ZDEINVID = new SimpleDateFormat("yyMMddHHmmssSSS").format(new Date()) + new Double(Math.floor(Math.random()*10)).intValue();
			String nextStep = queryNextStep("20");
			//mapInfo.put("currentStep", queryCurrentStep("02", "E/S"));
			mapInfo.put("currentStep", 
					queryCurrentStepFromStep(mapInfo.get("BRANCH").toString(), 
							BillingApplyConstants.INV_TARGET_OUTER));
			mapInfo.put("nextStep", nextStep);
			mapInfo.put("ZDEINVID", ZDEINVID);
			mapInfo.put("INV_TARGET", BillingApplyConstants.INV_TARGET_S); //外部
			mapInfo.put("currentEmpCode", UserUtil.getCurrentUser().getEmpCode());
			try {
				billingApplyDao.createDisperseBillBath(mapInfo);
				billingApplyDao.createDisperseFormBill(mapInfo);
				billingApplyDao.updateDisperseKPFlag(mapInfo.get("ID").toString(), ZDEINVID);
				// 散单生成发票批日志
				insertBatchFlowLog(mapInfo, "TAX_11_02");
			} catch (Exception e) {
				logger.error("散单发票批生成失败");
				throw new ServiceException("散单发票批生成失败",e.getMessage());
			}
		}
	}
	
	/**
	 * 2016年12月10日 80001092 方法说明:获取单元格值
	 * @param cell
	 * @return
	 * String
	 */
	private String getCellValue(Cell cell) {
		if(cell == null) {
			return "";
		}
        String cellValue = "";   
        switch (cell.getCellType()) {   
	        case Cell.CELL_TYPE_STRING:   
	            cellValue =cell.getStringCellValue().trim();   
	            break;   
	        case Cell.CELL_TYPE_NUMERIC:   
	            cellValue = String.valueOf(cell.getNumericCellValue());  
	            break;   
        } 
        return cellValue;   
	}
	
	/**
	 * 2016年12月13日 80001092 方法说明:查询关联方待开票记录
	 * @param bean
	 * void
	 */
	public void queryRelatedUnbill(BeanBase bean) {
		Map<String, String> paramMap = bean.getDatas().get(0);
		paramMap.put("currentEmpCode", UserUtil.getCurrentUser().getEmpCode());
		paramMap.put("billTaxPaySub", StringUtil.addDimmer(paramMap.get("BILL_TAX_PAY_SUB"), ",", "'"));
		paramMap.put("invTaxPaySub", StringUtil.addDimmer(paramMap.get("INV_TAX_PAY_SUB"), ",", "'"));
		paramMap.put("billPrctr", StringUtil.addDimmer(paramMap.get("BILL_PRCTR"), ",", "'"));
		paramMap.put("zCustomerNo", StringUtil.addDimmer(paramMap.get("Z_CUSTOMER_NO"), ",", "'"));
		paramMap.put("businessType", StringUtil.addDimmer(paramMap.get("BUSINESS_TYPE"), ",", "'"));
		paramMap.put("billBukrs", StringUtil.addDimmer(paramMap.get("ORG_BUKRS"), ",", "'"));
		try {
			bean.getExpData().put("page", PageHandler.execute(new PageSplit<Map<String, Object>>() {
				
				@Override
				public int queryTotalCount() {
					return billingApplyDao.getRelatedTotalCount(paramMap);
				}
				
				@Override
				public List<Map<String, Object>> queryPageList(int pageStart, int pageSize) {
					return billingApplyDao.getRelatedBillList(paramMap, pageStart, pageSize);
				}
			}, bean.getRows(), bean.getPage()));
		} catch (Exception e) {
			logger.error("查询待开记录失败!");
			throw new ServiceException("查询待开票记录失败",e.getMessage());
		}
	}
	
	/**
	 * 2016年12月15日 80001092 方法说明:查看关联方待开票明细
	 * @param bean
	 * void
	 */
	public void queryRelatedDetail(BeanBase bean) {
		String headerId = bean.getDatas().get(0).get("headerId");
		if(StringUtil.areBlank(headerId)) {
			throw new ServiceException("暂时无法查询明细");
		}
		try {
			bean.getExpData().put("page", PageHandler.execute(new PageSplit<Map<String, Object>>() {
				
				@Override
				public int queryTotalCount() {
					return billingApplyDao.getTotalCountRelatedDeatail(headerId);
				}
				
				@Override
				public List<Map<String, Object>> queryPageList(int pageStart, int pageSize) {
					return billingApplyDao.getBillListRelatedDeatail(headerId, pageStart, pageSize);
				}
			}, bean.getRows(), bean.getPage()));
		} catch (Exception e) {
			logger.error("查询关联方待开票明细错误");
			throw new ServiceException("暂时无法查看明细", e.getMessage());
		}
	
	}
	
	/**
	 * 2016年12月19日 80001092 方法说明:关联方开票申请
	 * @param bean
	 * void
	 */
	@Transactional
	public void createRelatedBillBatchSelf(BeanBase bean) {
		Map<String, String> paramMap = bean.getDatas().get(0);
		String[] ids = paramMap.get("ids").split(",",-1);
		String[] busType = paramMap.get("rBUSINESS_TYPE").split(",",-1);
		/*String[] TSK_MONTH_BILL = paramMap.get("TSK_MONTH_BILL").split(",",-1);
		String[] TICKETS_BACK = paramMap.get("TICKETS_BACK").split(",",-1);
		String[] applierBack = paramMap.get("applierBack").split(",",-1);
		String[] bellong_date = paramMap.get("bellong_date").split(",",-1);*/
		String postType = paramMap.get("postType");
		String nextStep = queryNextStep("30");
		try {
			if("alone".equals(postType)) { // 单独提交
				for(int i=0; i<ids.length; i++) {
					createRelatedBillingBatch(ids[i],nextStep,busType[i]);
				}
			} else if("merged".equals(postType)) { // 合并提交
				createRelatedBillingBatchMerged(ids,nextStep,busType);
			}
		} catch (Exception e) {
			logger.error("关联方开票失败!");
			throw new ServiceException("生成发票批失败", e.getMessage());
		}
	}

	/**
	 * 2016年12月19日 80001092 方法说明:创建关联方发票批
	 * @param string
	 * @param string2
	 * @param string3
	 * @param string4
	 * void
	 */
	private void createRelatedBillingBatch(String id,String nextStep,String busType) {
		String kp_flag = billingApplyDao.getKPFlag(id);
		if("01".equals(kp_flag)) { // 未开票
			//发票批次号
			// String ZDEINVID = new SimpleDateFormat("yyMMddHHmmssSSS").format(new Date()) + new Double(Math.floor(Math.random()*10)).intValue();
			// insert into p2_ztax_form_bill 子账号
			Map<String, Object> mapInfo = billingApplyDao.getInfoForCreateRelatedBath(id);
			if (mapInfo == null) {
				throw new ServiceException("开票信息不完整,无法开票!");
			}
			String ZDEINVID = createBatchId(mapInfo);
			mapInfo.put("ZDEINVID", ZDEINVID);
			mapInfo.put("TICKETS_BACK", ZDEINVID);
			mapInfo.put("nextStep", nextStep);
			//mapInfo.put("ZDEINVID_XH", '1');
			mapInfo.put("INV_TARGET", BillingApplyConstants.INV_TARGET_I); //内部
			mapInfo.put("currentEmpCode", UserUtil.getCurrentUser().getEmpCode());
			//mapInfo.put("billAMT",TSK_MONTH_BILL);
			//mapInfo.put("APPLIER_BACK", applierBack);
			//mapInfo.put("TICKETS_BACK", TICKETS_BACK);
			mapInfo.put("billAMT",mapInfo.get("WRBTR"));
			mapInfo.put("BEGIN_PERIOD", mapInfo.get("GJAHR").toString() + mapInfo.get("MONAT").toString());
			mapInfo.put("END_PERIOD", mapInfo.get("GJAHR").toString() + mapInfo.get("MONAT").toString());
			//insert into p2_tax_bill_batch
			billingApplyDao.createRelatedBatch(mapInfo);
			//insert into p2_ztax_form_bill 主账号
			// 子账号,01,07,08,09,10,11,99,
			List<Map<String, Object>> itemList = billingApplyDao.getBillListRelatedDeatailByGroup(id);
			Map<String, Object> tempMap = null;
			for (int i=0; i<itemList.size(); i++) {
				tempMap = itemList.get(i);
				tempMap.put("ZDEINVID_XH", 1);
				// 除了物资和资产,数量置为0;
				if (!"A1".equals(busType) && !"A2".equals(busType)) {
					tempMap.put("FKIMG", 1);
				}
				billingApplyDao.createRelatedFormBill(mapInfo,tempMap);
			}
			// update p2_tax_bill_item
			billingApplyDao.updateBillItemBatchId(mapInfo.get("ZBILL_NO").toString(), ZDEINVID);
			// update p2_ztax_bill_header
			billingApplyDao.updateBatchId("'" + id + "'", ZDEINVID);
			// update p2_ztax_bill_sum 应开扣减,已开增加
			billingApplyDao.updateBillSum(mapInfo);
			// billBatch flow log
			insertBatchFlowLog(mapInfo, "TAX_31_01");
			tempMap = null;
			mapInfo = null;
			itemList.clear();
		} else {
			throw new ServiceException("存在已经提交过的开票月份,请查询后重新创建!");
		}
	}
	
	/**
	 * 2016年12月19日 80001092 方法说明:下一部
	 * @param currentStep
	 * @return
	 * String
	 */
	private String queryNextStep(String currentStep) {
		 return billingApplyDao.getNextStep(currentStep);
	}
	
	/*private String queryCurrentStep(String original_status, String target) {
		return billingApplyDao.getCurrentStep(original_status, target);
	}*/
	
	/**
	 * 2017年3月14日 80001092 方法说明:从权限表查当前步骤
	 * @param branch
	 * @param target
	 * @return
	 * String
	 */
	private String queryCurrentStepFromStep(String branch, String target) {
		return billingApplyDao.getCurrentStep2(branch, target);
	}
	
	/**
	 * 2016年12月19日 80001092 方法说明:关联方合并提交
	 * @param ids
	 * @param TSK_MONTH_BILL
	 * @param TICKETS_BACK
	 * @param APPLIER_BACK
	 * @param bellong_date
	 * @param nextStep
	 * void
	 */
	private void createRelatedBillingBatchMerged(String[] ids, String nextStep, String[] busType) {
		//List<Map<String, String>> kpFlagList = billingApplyDao.getKPFlagList(ids);
		/*for(int i=0; i<kpFlagList.size(); i++) {
			if("02".equals(kpFlagList.get(0).get("kp_flag"))) { // 如果存在已经开票的月份
				throw new ServiceException("已经存在申请过的月份,请查询后重新提交!");
			}
		}*/
		if (ids.length <= 1) {
			throw new ServiceException("合并提交请选择多个");
		}
		// 开票总金额
		double mainAccountSUMAMT = 0.0;
		Map<String, Object> mapInfo = billingApplyDao.getInfoForCreateRelatedBath(ids[0]);
		Map<String, Object> tempMap = null;
		List<Map<String, Object>> itemList = null;
		// String ZDEINVID = new SimpleDateFormat("yyMMddHHmmssSSS").format(new Date()) + new Double(Math.floor(Math.random()*10)).intValue();
		String ZDEINVID = createBatchId(mapInfo);
		// int count = 1;
		String BEGIN_PERIOD = "";
		String END_PERIOD = "";
		String temp_PERIOD = "";
		for(int i=0; i<ids.length; i++) {
			mapInfo = billingApplyDao.getInfoForCreateRelatedBath(ids[i]);
			temp_PERIOD = mapInfo.get("GJAHR").toString() + mapInfo.get("MONAT").toString();
			if (i == 0) {
				BEGIN_PERIOD = temp_PERIOD;
				END_PERIOD = temp_PERIOD;
			} else {
				if (temp_PERIOD.compareTo(BEGIN_PERIOD) < 0) {
					BEGIN_PERIOD = temp_PERIOD;
				} else if (temp_PERIOD.compareTo(END_PERIOD) > 0) {
					END_PERIOD = temp_PERIOD;
				}
			}
			mapInfo.put("ZDEINVID", ZDEINVID);
			mapInfo.put("TICKETS_BACK", ZDEINVID);
			itemList = billingApplyDao.getBillListRelatedDeatailByGroup(ids[i]);
			for (int j=0; j<itemList.size(); j++) {
				tempMap = itemList.get(j);
				tempMap.put("ZDEINVID_XH", 1);
				// 除了物资和资产,数量置为0;
				if (!"A1".equals(busType) && !"A2".equals(busType)) {
					tempMap.put("FKIMG", 1);
				}
				billingApplyDao.createRelatedFormBill(mapInfo,tempMap);
			}
			mainAccountSUMAMT += Double.parseDouble(mapInfo.get("WRBTR").toString());
			//double sumMonthAMT = Double.parseDouble(TSK_MONTH_BILL[i]);
			mapInfo.put("billAMT", mapInfo.get("WRBTR"));
			billingApplyDao.updateBillSum(mapInfo);
		}
		mapInfo.put("nextSetp", nextStep);
		mapInfo.put("INV_TARGET", BillingApplyConstants.INV_TARGET_I); //内部
		mapInfo.put("currentEmpCode", UserUtil.getCurrentUser().getEmpCode());
		mapInfo.put("billAMT", mainAccountSUMAMT);
		//mapInfo.put("TAXSUM", mainAccountSUMAMT);
		mapInfo.put("BEGIN_PERIOD",BEGIN_PERIOD);
		mapInfo.put("END_PERIOD",END_PERIOD);
		billingApplyDao.createRekatedMainAccountBatchMerged(mapInfo);
		billingApplyDao.updateBatchId(addQuotes(ids), ZDEINVID);
		billingApplyDao.updateBillItemBacthId(addQuotes(ids), ZDEINVID);
		insertBatchFlowLog(mapInfo, "TAX_31_02");
		tempMap = null;
		mapInfo = null;
		itemList.clear();
	}
	
	/**
	 * 2016年12月21日 80001092 方法说明:插入日志方法
	 * @param map
	 * @param code
	 * void
	 */
	private void insertBatchFlowLog(Map<String, Object> map, String code) {
		Map<String, Object> flowLogMap = billingApplyDao.getModuleConfig(code);
		billingApplyDao.insertBatchFlowLog(map, flowLogMap);
	}
	
	/**
	 * 2016年12月27日 80001092 方法说明:查询查分开票信息
	 * @param bean
	 * void
	 */
	public void getHeaderAndSubaccount(BeanBase bean) {
		String headerId = bean.getDatas().get(0).get("headerId");
		String queryType = bean.getDatas().get(0).get("REBILL_FLAG");
		Map<String, Object> headerData = null;
		List<Map<String, Object>> listSubAccount = null;
		try {
			 if("REBILL".equals(queryType)) { // 补开
				 headerData = billingApplyDao.getHeaderInfoRebill(headerId);
			 } else {
				 headerData = billingApplyDao.getHeaderInfo(headerId);
			 }
			 listSubAccount = billingApplyDao.querySubAccount(headerId);
		} catch(Exception e) {
			throw new ServiceException("数据库连接异常,稍后重试");
		}
		bean.getExpData().put("listSubAccount", listSubAccount);
		bean.getExpData().put("headerData", headerData);
	}
	
	/**
	 * 2016年12月29日 80001092 方法说明:新实现拆分(申请和补开申请访问同方法),生成一个发票批
	 * @param bean
	 * void
	 */
	@Transactional
	public void newSepareteMethod(BeanBase bean) {
		Map<String, String> paramMap = bean.getDatas().get(0);
		String headerId = paramMap.get("headerId");
		String REBILL_FLAG = paramMap.get("REBILL_FLAG");
		String totalAMT = paramMap.get("totalAMT");
		//查询当前月结账号当前月份是否已创建发票批
		String kp_flag = billingApplyDao.getKPFlag(headerId);
		if("01".equals(kp_flag)) { // 未开票
			String[] TSK_MONTH_BILL = paramMap.get("TSK_MONTH_BILL").split(",",-1);
			String DIFF_REASON = paramMap.get("DIFF_REASON");
			String[] TICKETS_BACK = paramMap.get("TICKETS_BACK").split(",",-1);
			String[] applierBack = paramMap.get("applierBack").split(",",-1);
			String[] sub_ID = paramMap.get("sub_ID").split(",",-1);
			String[] SUB_TSK_MONTH_BILL = paramMap.get("SUB_TSK_MONTH_BILL").split(",",-1);
			/*String[] SUB_DIFF_REASON = paramMap.get("SUB_DIFF_REASON").split(",",-1);*/
			String[] SUB_TICKETS_BACK = paramMap.get("SUB_TICKETS_BACK").split(",",-1);
			String[] SUB_applierBack = paramMap.get("SUB_applierBack").split(",",-1);
			// 新增单位,单价,数量,规格编辑
			String[] MEINS = paramMap.get("MEINS").split(",",-1);
			String[] UNITPE = paramMap.get("UNITPE").split(",",-1);
			String[] FKIMG = paramMap.get("FKIMG").split(",",-1);
			String[] MSPEC = paramMap.get("MSPEC").split(",",-1);
			String[] sub_MEINS = paramMap.get("sub_MEINS").split(",",-1);
			String[] sub_UNITPE = paramMap.get("sub_UNITPE").split(",",-1);
			String[] sub_FKIMG = paramMap.get("sub_FKIMG").split(",",-1);
			String[] sub_MSPEC = paramMap.get("sub_MSPEC").split(",",-1);
			//发票批次号
			String ZDEINVID = new SimpleDateFormat("yyMMddHHmmssSSS").format(new Date()) + new Double(Math.floor(Math.random()*10)).intValue();
			int j = 1;
			Map<String, Object> mapInfo = getBatchInfoById(headerId);
			String nextSetp = queryNextStep("20");
			mapInfo.put("nextSetp", nextSetp);
			// mapInfo.put("currentStep", queryCurrentStep("02", "E/S"));
			mapInfo.put("currentStep", 
					queryCurrentStepFromStep(mapInfo.get("BILL_PRCTR").toString(), 
							BillingApplyConstants.INV_TARGET_OUTER));
			mapInfo.put("ZDEINVID", ZDEINVID);
			mapInfo.put("INV_TARGET", BillingApplyConstants.INV_TARGET_E); //外部
			mapInfo.put("currentEmpCode", UserUtil.getCurrentUser().getEmpCode());
			// billAMT存放开票金额汇总
			mapInfo.put("billAMT", Double.parseDouble(totalAMT));
			mapInfo.put("BEGIN_PERIOD", mapInfo.get("GJAHR").toString() + mapInfo.get("MONAT").toString());
			mapInfo.put("END_PERIOD", mapInfo.get("GJAHR").toString() + mapInfo.get("MONAT").toString());
			//insert into p2_tax_bill_batch
			billingApplyDao.createMainAccountBatch(mapInfo);
			// update p2_ztax_bill_sum 应开扣减,已开增加
			billingApplyDao.updateBillSum(mapInfo);
			if (StringUtil.areBlank(REBILL_FLAG)) {
				// update p2_tax_bill_item
				billingApplyDao.updateBillItemBatchId(mapInfo.get("ZBILL_NO").toString(), ZDEINVID);
				// update p2_ztax_bill_header
				billingApplyDao.updateBatchId("'" + headerId + "'", ZDEINVID);
			}
			// 流转日志
			insertBatchFlowLog(mapInfo, "TAX_10_03");
			// 生成形式发票
			for(int i=0; i<TSK_MONTH_BILL.length; i++) {
				if(StringUtils.isBlank(TSK_MONTH_BILL[i]) || 0 == Double.parseDouble(TSK_MONTH_BILL[i])) {
					continue;
				}
				mapInfo.put("ZDEINVID_XH", j++);
				mapInfo.put("TAXSUM", Double.parseDouble(TSK_MONTH_BILL[i]));
				mapInfo.put("DIFF_REASON", DIFF_REASON);
				mapInfo.put("TICKETS_BACK", TICKETS_BACK[i]);
				mapInfo.put("APPLIER_BACK", applierBack[i]);
				mapInfo.put("MEINS", MEINS[i]);
				mapInfo.put("UNITPE", UNITPE[i]);
				mapInfo.put("FKIMG", FKIMG[i]);
				mapInfo.put("MSPEC", MSPEC[i]);
				//insert into p2_ztax_form_bill 主账号
				billingApplyDao.createFormBill(mapInfo);
			}
			for(int i=0; i<sub_ID.length; i++) {
				// 为0不创建
				if(StringUtils.isBlank(SUB_TSK_MONTH_BILL[i]) || 0 == Double.parseDouble(SUB_TSK_MONTH_BILL[i])) {
					continue;
				}
				Map<String, Object> mapSubInfo = getSubAccountInfo(headerId, sub_ID[i]);
				mapSubInfo.put("ZDEINVID", ZDEINVID);
				mapSubInfo.put("ZDEINVID_XH", j++);
				mapSubInfo.put("SUB_TSK_MONTH_BILL", SUB_TSK_MONTH_BILL[i]);
				mapSubInfo.put("SUB_DIFF_REASON", DIFF_REASON);
				mapSubInfo.put("SUB_TICKETS_BACK", SUB_TICKETS_BACK[i]);
				mapSubInfo.put("sub_applierBack", SUB_applierBack[i]);
				mapSubInfo.put("MEINS", sub_MEINS[i]);
				mapSubInfo.put("UNITPE", sub_UNITPE[i]);
				mapSubInfo.put("FKIMG", sub_FKIMG[i]);
				mapSubInfo.put("MSPEC", sub_MSPEC[i]);
				mapSubInfo.put("currentEmpCode", UserUtil.getCurrentUser().getEmpCode());
				billingApplyDao.createFormBillSubAccount(mapSubInfo);
			}
		} else {
			throw new ServiceException("该月份已经生成发票批,请查询后重新创建!");
		}
	}
	
	/**
	 * 2017年1月7日 80001092 方法说明:查询作废遗失发票
	 * @param bean
	 * void
	 */
	public void queryMarkedCancleList(BeanBase bean) {
		Map<String, String> paramMap = bean.getDatas().get(0);
		paramMap.put("currentEmpCode", UserUtil.getCurrentUser().getEmpCode());
		try {
			bean.getExpData().put("page", PageHandler.execute(new PageSplit<Map<String, Object>>() {
				
				@Override
				public int queryTotalCount() {
					return billingApplyDao.getTotalCountMarkedCancl(paramMap);
				}
				
				@Override
				public List<Map<String, Object>> queryPageList(int pageStart, int pageSize) {
					return billingApplyDao.getMarkedCancleList(paramMap, pageStart, pageSize);
				}
			}, bean.getRows(), bean.getPage()));
		} catch (Exception e) {
			logger.error("查询实物发票信息失败!");
			throw new ServiceException("数据库访问异常,暂时无法查询",e);
		}
	}
	
	/**
	 * 2017年1月7日 80001092 方法说明:打标识
	 * @param bean
	 * void
	 */
	@Transactional
	public void doMark(BeanBase bean) {
		Map<String, String> paramMap = bean.getDatas().get(0);
		String selectAllFlag = paramMap.get("selectAllFlag");
		String ids = StringUtil.addDimmer(paramMap.get("ids"), ",", "'");
		List<Map<String, String>> compareData = new ArrayList<Map<String, String>>();
		if (StringUtil.areNotBlank(ids)) {
			compareData = billingApplyDao.getCompareData(ids);
		}
		for (int i=0; i<compareData.size(); i++) {
			String tempId = billingApplyDao.getAllID(compareData.get(i).get("ZINV_CODE"), 
					compareData.get(i).get("ZINV_NUMBER"));
			if(StringUtil.areNotBlank(tempId)) {
				ids += "," + StringUtil.addDimmer(tempId, ",", "'");
			}
		}
		if(!"checked".equals(selectAllFlag)) {
			paramMap.put("ids", ids);
		}
		paramMap.put("currentEmpCode", UserUtil.getCurrentUser().getEmpCode());
		try {
			billingApplyDao.doMarkList(paramMap);
		} catch (Exception e) {
			logger.error("实物发票打标识失败!");
			throw new ServiceException("数据库访问异常,暂时无法操作",e);
		}
	}
	
	/**
	 * 2017年1月9日 80001092 方法说明:查询导入遗失发票
	 * @param bean
	 * void
	 */
	public void queryImportCancleLoseInv(BeanBase bean) {
		Map<String, String> paramMap = bean.getDatas().get(0);
		paramMap.put("currentEmpCode", UserUtil.getCurrentUser().getEmpCode());
		try {
			bean.getExpData().put("page", PageHandler.execute(new PageSplit<Map<String, Object>>() {
				
				@Override
				public int queryTotalCount() {
					return billingApplyDao.getTotalCountImportCancleLose(paramMap);
				}
				
				@Override
				public List<Map<String, Object>> queryPageList(int pageStart, int pageSize) {
					return billingApplyDao.getImportCancleLoseList(paramMap, pageStart, pageSize);
				}
			}, bean.getRows(), bean.getPage()));
		} catch (Exception e) {
			logger.error("导入作废发票查询失败!");
			throw new ServiceException("数据库访问异常,暂时无法查询",e);
		}
	}
	
	/**
	 * 2017年1月9日 80001092 方法说明:导入作废遗失发票
	 * @param bean
	 * void
	 */
	@Transactional
	public void cancleLoseInvImport(BeanBase bean) {
		try {
			new AbstractExcelReader() {
				@Override
				public void doParse(Workbook workbook) {
					insertCancleLoseInv(checkCancleLose(workbook));
				}
			}.Reader();;
		} catch (Exception e) {
			String errorMsg = "EXCEL上传失败:<br>" + e.getMessage();
			logger.error(errorMsg, e);
			if (e instanceof DuplicateKeyException) {
				throw new ServiceException("EXCEL上传失败:导入的Excel存在重复的数据,去掉重复数据后在导入");
			} else {
				throw new ServiceException(errorMsg);
			}
		}
		bean.setStatus(BusinessStatus.FINLISH);
		bean.setProcessMsg("导入完成!");
	}
	
	private void insertCancleLoseInv(List<Map<String, String>> list) {
		billingApplyDao.insertCancleLoseInv(list);
	}
	
	/**
	 * 2017年1月16日 80001092 方法说明:待完成
	 * @param workBook
	 * @return
	 * List<Map<String,String>>
	 */
	private List<Map<String, String>> checkCancleLose(Workbook workBook) {
		List<Map<String, String>> excelValueList = null;
		// 待导入的数据
		int import_wb_sheetNos = workBook.getNumberOfSheets();
		if (import_wb_sheetNos == 0) {
			throw new ServiceException("待导入的数据为空");
		}
		excelValueList = new ArrayList<>();
		String currentEmpCode = UserUtil.getCurrentUser().getEmpCode();
		// 当前登陆用户拥有的实物发票权限
		List<Map<String, Object>> dataList = billingApplyDao.getAuthDataList(currentEmpCode);
		// 已经导入系统的作废作负发票
		List<Map<String, Object>> dataHaveImp = billingApplyDao.getDataHaveImp(currentEmpCode);	
		// 本次导入的旧发票代码
		Map<String, String> codeOldToal = new HashMap<String, String>();
		// 本次导入的新发票代码
		Map<String, String> codeNewToal = new HashMap<String, String>();
		for(int i=0; i<import_wb_sheetNos; i++) {
			Cell cell = null;
			String INV_TYPE = null;
			String ZINV_CODE = null;
			String ZINV_NUMBER = null;
			String KP_DATE = null;
			String UNTAX_AMT = null;
			String TAX_AMT = null;
			String OP_ZINV_CODE = null;
			String OP_ZINV_NUMBER = null;
			String HQZF_FLAG = null;
			String DZF_FLAG = null;
			String list_BILL_STATUS = null;
			String a_bill_tax_pay_sub = null;
			String a_bill_prctr = null;
			Sheet sheet = workBook.getSheetAt(i);
			for(int line=1, count=sheet.getLastRowNum()+1; line<count; line++) {
				Row row = sheet.getRow(line);
				cell = row.getCell(0);
				INV_TYPE = getCellValue(cell);				
				
				cell = row.getCell(1);
				ZINV_CODE = getCellValue(cell);

				//去除空行
				if (StringUtil.areBlank(INV_TYPE, ZINV_CODE)) {
					continue; 
				}
				
				if (StringUtil.areBlank(INV_TYPE)) {
					throw new ServiceException("发票类型不能为空!");
				}
				
				if (!BillingApplyConstants.INV_IMPORT_HC.equals(INV_TYPE) && 
						!BillingApplyConstants.INV_IMPORT_ZF.equals(INV_TYPE)) {
					throw new ServiceException("Excel请输入正确的发票种类:红冲或作废");
				}
				
				if (StringUtil.areBlank(ZINV_CODE)) {
					throw new ServiceException("发票代码不能为空!");
				}
				
				cell = row.getCell(2);
				ZINV_NUMBER = getCellValue(cell);
				if (StringUtil.areBlank(ZINV_NUMBER)) {
					throw new ServiceException("发票代码不能为空!");
				}
				
				cell = row.getCell(3);
				KP_DATE = getCellValue(cell);
				if (StringUtil.areBlank(KP_DATE)) {
					throw new ServiceException("开票日期不能为空!");
				}
				
				try {
					DateUtils.parseDate(KP_DATE, "yyyy-MM-dd");
				} catch (Exception e) {
					String errorMessage = workBook.getSheetName(i) + "的第"
							+ line + "行,开票日期格式错误,必须为[yyyy-MM-dd]";
					throw new ServiceException(errorMessage);
				}
			
				cell = row.getCell(4);
				UNTAX_AMT = getCellValue(cell);
				try {
					Double.parseDouble(UNTAX_AMT);
				} catch (Exception e) {
					String message = workBook.getSheetName(i) + "的第"
							+ line + "行,不含税金额必须为有效数值";
					throw new ServiceException(message);
				}
				if (BillingApplyConstants.INV_IMPORT_HC.equals(INV_TYPE) && 
						!UNTAX_AMT.contains("-")) {
					String message = workBook.getSheetName(i) + "的第"
							+ line + "行,不含税金额必须为负数";
					throw new ServiceException(message);
				}
				
				cell = row.getCell(5);
				TAX_AMT = getCellValue(cell);
				try {
					Double.parseDouble(TAX_AMT);
				} catch (Exception e) {
					String message = workBook.getSheetName(i) + "的第"
							+ line + "行,税金必须为有效数值";
					throw new ServiceException(message);
				}
				if (BillingApplyConstants.INV_IMPORT_HC.equals(INV_TYPE) && 
						!TAX_AMT.contains("-")) {
					String message = workBook.getSheetName(i) + "的第"
							+ line + "行,税金必须为负数";
					throw new ServiceException(message);
				}
				
				cell = row.getCell(6);
				OP_ZINV_CODE = getCellValue(cell);
				
				cell = row.getCell(7);
				OP_ZINV_NUMBER = getCellValue(cell);
				// 校验是否重复导入
				if (codeOldToal.get(OP_ZINV_CODE+OP_ZINV_NUMBER) == null) {
					if (StringUtil.areNotBlank(OP_ZINV_CODE, OP_ZINV_NUMBER)) {
						codeOldToal.put(OP_ZINV_CODE+OP_ZINV_NUMBER, OP_ZINV_CODE+OP_ZINV_NUMBER);
					}
				} else {
					throw new ServiceException("发票代码"+ OP_ZINV_CODE +"发票号码" + OP_ZINV_NUMBER +"不能重复!");
				}
				if (codeNewToal.get(ZINV_CODE + ZINV_NUMBER) == null) {
					if (StringUtil.areNotBlank(ZINV_CODE, ZINV_NUMBER)) {
						codeNewToal.put(ZINV_CODE + ZINV_NUMBER, ZINV_CODE + ZINV_NUMBER);
					}
				} else {
					throw new ServiceException("发票代码"+ ZINV_CODE +"发票号码" + ZINV_NUMBER +"不能重复!");
				}
				// 负数发票 
				if (BillingApplyConstants.INV_IMPORT_HC.equals(INV_TYPE)) {
					if (StringUtil.areBlank(OP_ZINV_CODE)) {
						throw new ServiceException("导入红冲发票类型,负数发票对应的正数发票代码不能为空!");
					}
					
					if (StringUtil.areBlank(OP_ZINV_NUMBER)) {
						throw new ServiceException("导入红冲发票类型,负数发票对应的正数发票号码不能为空!");
					}
				}
				// 校验发票号码、代码是否存在
				boolean ifExicts = false;
				String tempUNTAX_AMT = null;
				String tempTAX_AMT = null;
				String tempStatus = null;
				String ID = null;
				String ZDEINVID = null;
				String KUNNR = null;
				String ZTAXTYPE = null;
				String target = null;
				Map<String, Object> tempMap = new HashMap<String, Object>();
				// 判断是否已经导入过
				for ( int j=0; j<dataHaveImp.size(); j++ ) {
					tempMap = dataHaveImp.get(j);
					if (BillingApplyConstants.INV_IMPORT_HC.equals(INV_TYPE)) {
						if (OP_ZINV_CODE.equals(String.valueOf(tempMap.get("OP_ZINV_CODE"))) &&
								OP_ZINV_NUMBER.equals(String.valueOf(tempMap.get("OP_ZINV_NUMBER")))) {
							throw new ServiceException("发票代码" + OP_ZINV_CODE + "发票号码" + 
									OP_ZINV_NUMBER + "已经导入过,禁止重复导入");
						}
					}
					if (BillingApplyConstants.INV_IMPORT_ZF.equals(INV_TYPE)) {
						if (ZINV_CODE.equals(String.valueOf(tempMap.get("ZINV_CODE"))) &&
								ZINV_NUMBER.equals(String.valueOf(tempMap.get("ZINV_NUMBER")))) {
							throw new ServiceException("发票代码" + ZINV_CODE + "发票号码" + 
									ZINV_NUMBER + "已经导入过,禁止重复导入");
						}
					}
				}
				// 如果是红冲,判断是否空白
				if (BillingApplyConstants.INV_IMPORT_HC.equals(INV_TYPE)) {
					for (int j=0; j<dataList.size(); j++) {
						tempMap = dataList.get(j);
						if (tempMap.containsValue(ZINV_CODE) && tempMap.containsValue(ZINV_NUMBER)) {
							throw new ServiceException("红冲发票代码" + ZINV_CODE + "发票号码" + 
									ZINV_NUMBER + "已经开过票,请输入新的发票代码、号码");
						}
					}
				}
				for (int j=0; j<dataList.size(); j++) { // 用值相等判断
					tempMap = dataList.get(j);
					if (BillingApplyConstants.INV_IMPORT_HC.equals(INV_TYPE)) {
						if (tempMap.containsValue(OP_ZINV_CODE) && tempMap.containsValue(OP_ZINV_NUMBER)) {
							ifExicts = true;
						}
					}
					if (BillingApplyConstants.INV_IMPORT_ZF.equals(INV_TYPE)) {
						if (tempMap.containsValue(ZINV_CODE) && tempMap.containsValue(ZINV_NUMBER)) {
							ifExicts = true;
						}
					}
					if (ifExicts) {
						tempUNTAX_AMT = tempMap.get("NETWR") == null ? "0" : tempMap.get("NETWR").toString();
						tempTAX_AMT = tempMap.get("TAXAMT") == null ? "0" : tempMap.get("TAXAMT").toString();
						tempStatus = tempMap.get("CANCLE_FLAG") == null ? "" : tempMap.get("CANCLE_FLAG").toString();
						ID = tempMap.get("ID").toString();
						ZDEINVID = tempMap.get("ZDEINVID").toString();
						KUNNR = tempMap.get("KUNNR") == null ? "" : tempMap.get("KUNNR").toString();
						ZTAXTYPE = tempMap.get("ZTAXTYPE") == null ? "" : tempMap.get("ZTAXTYPE").toString();
						list_BILL_STATUS = tempMap.get("list_BILL_STATUS") == null ? "" : tempMap.get("list_BILL_STATUS").toString();
						a_bill_tax_pay_sub = String.valueOf(tempMap.get("A_BILL_TAX_PAY_SUB"));
						a_bill_prctr = String.valueOf(tempMap.get("A_BILL_PRCTR"));
						target = tempMap.get("INV_TARGET").toString();
						break;
					}
				}
				if (ifExicts) { // 发票号码、代码匹配成功  比较金额
					double currentUntax = Math.abs(Double.parseDouble(UNTAX_AMT));
					double currentTax = Math.abs(Double.parseDouble(TAX_AMT));
					double tempUntax = Double.parseDouble(tempUNTAX_AMT);
					double tempTax = Double.parseDouble(tempTAX_AMT);
					if (currentUntax == tempUntax && currentTax == tempTax) { // 金额匹配成功
						// 红冲作废标识不需要
						HQZF_FLAG = "Y";
						if ("Y".equals(tempStatus)) { // 有待作废标识
							DZF_FLAG = "Y";
						}
						// 更新汇总表,扣减已开金额;如果是月结客户 暂时不处理,添加确认步骤
						/*if (BillingApplyConstants.INV_TARGET_E.equals(tempMap.get("INV_TARGET").toString())) {
							// 更新实物发票,BILL_STATUS置为”已红冲“
							billingApplyDao.updateBillListStatus(ID, INV_TYPE, currentEmpCode);
							updateBillSumAMT(ZDEINVID, KUNNR, ZTAXTYPE, tempUntax + tempTax);
							// 方法2 使用BidDecimal精确计算,暂未启用
							// updateBillSumAMT2(ZDEINVID, KUNNR, ZTAXTYPE, tempUntax, tempTax);
						} else if (BillingApplyConstants.INV_TARGET_S.equals(tempMap.get("INV_TARGET").toString())) {
							// 更新实物发票,BILL_STATUS置为”已红冲“
							billingApplyDao.updateBillListStatus(ID, INV_TYPE, currentEmpCode);
						} else if (BillingApplyConstants.INV_TARGET_I.equals(tempMap.get("INV_TARGET").toString())) { //关联方
							if (BillingApplyConstants.INV_REPALCE.equals(list_BILL_STATUS)) {
								// 如果是负数
								if (BillingApplyConstants.INV_TYPE_MINUS.equals(INV_TYPE)) {
									billingApplyDao.updateBillListStatus2(OP_ZINV_CODE, OP_ZINV_NUMBER, INV_TYPE, currentEmpCode);
								}
								// 如果是作废
								if (BillingApplyConstants.INV_TYPE_INVALID.equals(INV_TYPE)) {
									billingApplyDao.updateBillListStatus2(ZINV_CODE, ZINV_NUMBER, INV_TYPE, currentEmpCode);
								}
							}
						}*/
						
					} else { // 金额匹配失败
						String alertMsg = null;
						if (BillingApplyConstants.INV_IMPORT_HC.equals(INV_TYPE)) {
							alertMsg =  workBook.getSheetName(i) + "的第"
									+ line + "行,正数发票代码:" + OP_ZINV_CODE + ";发票号码:" + 
									OP_ZINV_NUMBER + "金额不匹配";
						} else {
							alertMsg =  workBook.getSheetName(i) + "的第"
									+ line + "行,发票代码:" + ZINV_CODE + ";发票号码:" + 
									ZINV_NUMBER + "金额不匹配";
						}
						throw new ServiceException(alertMsg);
					}
					Map<String, String> map = new HashMap<String, String>();
					map.put("INV_TYPE", INV_TYPE);
					map.put("ZINV_CODE", ZINV_CODE);
					map.put("ZINV_NUMBER", ZINV_NUMBER);
					map.put("KP_DATE", KP_DATE);
					map.put("UNTAX_AMT", UNTAX_AMT);
					map.put("TAX_AMT", TAX_AMT);
					map.put("OP_ZINV_CODE", OP_ZINV_CODE);
					map.put("OP_ZINV_NUMBER", OP_ZINV_NUMBER);
					map.put("HQZF_FLAG", HQZF_FLAG);
					map.put("DZF_FLAG", DZF_FLAG);
					map.put("currentEmpCode", currentEmpCode);
					map.put("a_bill_tax_pay_sub", a_bill_tax_pay_sub);
					map.put("a_bill_prctr", a_bill_prctr);
					map.put("listId", ID);
					map.put("ZDEINVID", ZDEINVID);
					map.put("KUNNR", KUNNR);
					map.put("ZTAXTYPE", ZTAXTYPE);
					map.put("target", target);
					map.put("list_BILL_STATUS", list_BILL_STATUS);
					map.put("totalAMT", String.valueOf(tempUntax + tempTax));
					excelValueList.add(map);
				} else { // 不存在
					String message = null;
					if (BillingApplyConstants.INV_IMPORT_ZF.equals(INV_TYPE)) {
						message = workBook.getSheetName(i) + "的第"
								+ line + "行,发票代码:" + ZINV_CODE + ";发票号码:" + 
								ZINV_NUMBER + "对应的实物发票不存在";
					} else  {
						message = workBook.getSheetName(i) + "的第"
								+ line + "行,正数发票代码:" + OP_ZINV_CODE + ";发票号码:" + 
								OP_ZINV_NUMBER + "对应的实物发票不存在";
					}
					throw new ServiceException(message);
				}
			}
		}
		return excelValueList;
	}

	/**
	 * 2017年3月31日 80001092 方法说明:更新汇总表,扣减已开金额;
	 * @param zDEINVID
	 * @param kUNNR
	 * @param zTAXTYPE
	 * @param tempUntax
	 * @param tempTax
	 * void
	 */
	@SuppressWarnings("unused")
	private void updateBillSumAMT2(String zDEINVID, String kUNNR,
			String zTAXTYPE, double tempUntax, double tempTax) {
		Map<String, String> param = billingApplyDao.getQueryCondition(zDEINVID);
		param.put("KUNNR", kUNNR);
		Map<String, Object> billSum = billingApplyDao.getUpdateLine(param);
		if (billSum == null) {
			throw new ServiceException("缺少必须维护的信息,无法获取导入的作废作负发票的客户信息");
		}
		int end = Integer.parseInt(param.get("endMonth").toString());
		int begin = Integer.parseInt(param.get("beginMonth").toString());
		BigDecimal untax = new BigDecimal(tempUntax);
		BigDecimal tax = new BigDecimal(tempTax);
		BigDecimal amt = tax.add(untax);
		for (int month = end; month>=begin; month--) {
			BigDecimal currWk = new BigDecimal(0);
			if (month < 10) {
				currWk = new BigDecimal(String.valueOf(billSum.get("TWK0" + month)));
				if (currWk.compareTo(BigDecimal.ZERO) < 0) {
					if (amt.compareTo(currWk.abs()) > 0) {
						amt = amt.subtract(currWk.abs());
						billSum.put("TSK0" + month, billSum.get("TSL0" + month));
					} else { // 停止
						billSum.put("TSK0" + month, new BigDecimal(String.valueOf(billSum.get("TSK0" + month))).subtract(amt));
						amt.setScale(0);
						break;
					}
				}
			} else {
				currWk = new BigDecimal(String.valueOf(billSum.get("TWK" + month)));
				if (currWk.compareTo(BigDecimal.ZERO) < 0) {
					if (amt.compareTo(currWk.abs()) > 0) {
						amt = amt.subtract(currWk.abs());
						billSum.put("TSK" + month, billSum.get("TSL" + month));
					} else { // 停止
						billSum.put("TSK" + month, new BigDecimal(String.valueOf(billSum.get("TSK" + month))).subtract(amt));
						amt.setScale(0);
						break;
					}
				}
			}
			
		}
		// 如果amt > 0
		if (amt.compareTo(BigDecimal.ZERO) > 0) {
			for (int month = end; month>=begin; month-- ) {
				if (month < 10) {
					amt = amt.subtract(new BigDecimal(String.valueOf(billSum.get("TSK0" + month))));
					if (amt.compareTo(BigDecimal.ZERO) < 0) {
						billSum.put("TSK0" + month, amt.abs());
						break;
					} else {
						billSum.put("TSK0" + month, 0);
					}
				} else {
					amt = amt.subtract(new BigDecimal(String.valueOf(billSum.get("TSK" + month))));
					if (amt.compareTo(BigDecimal.ZERO) < 0) {
						billSum.put("TSK" + month, amt.abs());
						break;
					} else {
						billSum.put("TSK" + month, 0);
					}
				}
				
			}
		}
	}

	/**
	 * 2017年1月17日 80001092 方法说明:更新汇总表,扣减已开金额;
	 * @param iD list表ID
	 * void
	 */
	private void updateBillSumAMT(String ZDEINVID, String KUNNR, String ZTAXTYPE, double amt) { 
		Map<String, String> param = billingApplyDao.getQueryCondition(ZDEINVID);
		param.put("KUNNR", KUNNR);
		// param.put("ZTAXTYPE", ZTAXTYPE);
		Map<String, Object> billSum = billingApplyDao.getUpdateLine(param);
		if (billSum == null) {
			throw new ServiceException("缺少必须维护的信息,无法获取导入的作废作负发票的客户信息");
		}
		int end = Integer.parseInt(param.get("endMonth").toString());
		int begin = Integer.parseInt(param.get("beginMonth").toString());
		for (int month = end; month>=begin; month--) {
			double currWk = 0;
			if (month < 10) {
				currWk = Double.parseDouble(billSum.get("TWK0" + month).toString());
				if (currWk < 0) {
					if (amt > Math.abs(currWk)) {
						amt = amt - Math.abs(currWk);
						billSum.put("TSK0" + month, billSum.get("TSL0" + month));
					} else { // 停止
						billSum.put("TSK0" + month, Double.parseDouble(billSum.get("TSK0" + month).toString()) - amt);
						amt = 0;
						break;
					}
				}
			} else {
				currWk = Double.parseDouble(billSum.get("TWK" + month).toString());
				if (currWk < 0) {
					if (amt > Math.abs(currWk)) {
						amt = amt - Math.abs(currWk);
						billSum.put("TSK" + month, billSum.get("TSL" + month));
					} else { // 停止
						billSum.put("TSK" + month, Double.parseDouble(billSum.get("TSK" + month).toString()) - amt);
						amt = 0;
						break;
					}
				}
			}
			
		}
		// 如果amt > 0
		if (amt > 0) {
			for (int month = end; month>=begin; month-- ) {
				if (month < 10) {
					amt = amt - Double.parseDouble(billSum.get("TSK0" + month).toString());
					if (amt < 0) {
						billSum.put("TSK0" + month, Math.abs(amt));
						break;
					} else {
						billSum.put("TSK0" + month, 0);
					}
				} else {
					amt = amt - Double.parseDouble(billSum.get("TSK" + month).toString());
					if (amt < 0) {
						billSum.put("TSK" + month, Math.abs(amt));
						break;
					} else {
						billSum.put("TSK" + month, 0);
					}
				}
				
			}
		}
		billSum.put("currentEmpCode", UserUtil.getCurrentUser().getEmpCode());
		// 更新sum表
		billingApplyDao.updateBillSumAMT(billSum);
		
	}
	
	/**
	 * 2017年2月7日 80001092 方法说明:根据纳税主体找地区代码 p2_qb_prctr_inv_num
	 * @param taxpay
	 * @return
	 * String
	 */
	private String createBatchId(Map<String, Object> map) {
		String id;
		if (map.get("ZONE_CODE") != null) {
			id = map.get("ZONE_CODE").toString() + new SimpleDateFormat("yyMMdd").format(new Date()) + new Double(Math.floor(Math.random()*100000)).intValue();
		} else {
			id = map.get("ORG_TAX_PAY_SUB").toString() + new SimpleDateFormat("yyMMdd").format(new Date()) + new Double(Math.floor(Math.random()*10000)).intValue();
		}
		return id;
	}
	
	/**
	 * 2017年2月21日 80001092 方法说明:添加子账号
	 * @param bean
	 * void
	 */
	public void getRelatedSubAccount(BeanBase bean) {
		Map<String, String> paramMap = bean.getDatas().get(0);
		String cust_no_text = paramMap.get("subAccount");
		if (StringUtils.isBlank(cust_no_text)) {
			throw new ServiceException("子账号不能为空");
		}
		String cust_no = addDolt(cust_no_text);
		String main_cust_no = cust_no.substring(cust_no.lastIndexOf(",")+2, cust_no.lastIndexOf("'"));
		paramMap.put("currentEmpCode", UserUtil.getCurrentUser().getEmpCode());
		paramMap.put("cust_no", cust_no);
		try {
			List<Map<String, Object>> listSubAccount = billingApplyDao.getActuralSubCustNo(paramMap);
			Map<String, Object> first = listSubAccount.get(0);
			Map<String, Object> main;
			for (int i=0; i<listSubAccount.size(); i++) {
				if (main_cust_no.equals(listSubAccount.get(i).get("Z_CUSTOMER_NO"))) {
					main = listSubAccount.get(i);
					listSubAccount.set(0, main);
					listSubAccount.set(i, first);
				}
			}
			bean.getExpData().put("page", listSubAccount);
		} catch (Exception e) {
			throw new ServiceException("查找子账户失败:" + e.getMessage());
		}
	}
	
	/**
	 * 2017年2月23日 80001092 方法说明:获取主账号及输入的子账号
	 * @param bean
	 * void
	 */
	public void getRelatedSubAndHeader(BeanBase bean) {
		Map<String, String> paramMap = bean.getDatas().get(0);
		String headerId = paramMap.get("headerId");
		String queryType = paramMap.get("REBILL_FLAG");
		String cust_no = addDolt(paramMap.get("subAccount"));
		Map<String, Object> headerData = null;
		List<Map<String, Object>> listSubAccount = null;
		try {
			 if("REBILL".equals(queryType)) { // 补开
				 headerData = billingApplyDao.getHeaderInfoRebill(headerId);
			 } else {
				 headerData = billingApplyDao.getHeaderInfo(headerId);
			 }
			 listSubAccount = billingApplyDao.querySubAccountActural(cust_no);
		} catch(Exception e) {
			throw new ServiceException("获取子客户月结账号信息失败,检查输入的子账号月结客户号是否正确");
		}
		bean.getExpData().put("listSubAccount", listSubAccount);
		bean.getExpData().put("headerData", headerData);
	}


	/**
	 * 2017年2月22日 80001092 方法说明:给子账号添加分号
	 * @param cust_no_text
	 * @return
	 * String
	 */
	private String addDolt(String cust_no_text) {
		String[] temp = cust_no_text.split(" ");
		StringBuilder sb = new StringBuilder();
		for (int i=0; i<temp.length; i++) {
			if (StringUtil.areNotBlank(temp[i])) {
				sb.append("'" + temp[i] + "',");
			}
		}
		return sb.substring(0, sb.length()-1);
	}
	
	/**
	 * 2017年2月23日 80001092 方法说明:创建关联子账号的发票批
	 * @param bean
	 * void
	 */
	@Transactional
	public void createSubBillBatch(BeanBase bean) {
		Map<String, String> paramMap = bean.getDatas().get(0);
		String headerId = paramMap.get("headerId");
		String REBILL_FLAG = paramMap.get("REBILL_FLAG");
		String totalAMT = paramMap.get("totalAMT");
		//查询当前月结账号当前月份是否已创建发票批
		String kp_flag = billingApplyDao.getKPFlag(headerId);
		if("01".equals(kp_flag)) { // 未开票
			String[] TSK_MONTH_BILL = paramMap.get("TSK_MONTH_BILL").split(",",-1);
			String DIFF_REASON = paramMap.get("DIFF_REASON");
			String[] TICKETS_BACK = paramMap.get("TICKETS_BACK").split(",",-1);
			String[] applierBack = paramMap.get("applierBack").split(",",-1);
			String[] Z_CUSTOMER_NO = paramMap.get("Z_CUSTOMER_NO").split(",",-1);
			String[] MEINS = paramMap.get("MEINS").split(",",-1);
			String[] UNITPE = paramMap.get("UNITPE").split(",",-1);
			String[] FKIMG = paramMap.get("FKIMG").split(",",-1);
			String[] MSPEC = paramMap.get("MSPEC").split(",",-1);
			//发票批次号
			String ZDEINVID = new SimpleDateFormat("yyMMddHHmmssSSS").format(new Date()) + new Double(Math.floor(Math.random()*10)).intValue();
			int j = 1;
			Map<String, Object> mapInfo = getBatchInfoById(headerId);
			String nextSetp = queryNextStep("20");
			// mapInfo.put("currentStep", queryCurrentStep("02", "E/S"));
			mapInfo.put("currentStep", 
					queryCurrentStepFromStep(mapInfo.get("BILL_PRCTR").toString(), 
							BillingApplyConstants.INV_TARGET_OUTER));
			mapInfo.put("nextSetp", nextSetp);
			mapInfo.put("ZDEINVID", ZDEINVID);
			mapInfo.put("INV_TARGET", BillingApplyConstants.INV_TARGET_E); //外部
			mapInfo.put("currentEmpCode", UserUtil.getCurrentUser().getEmpCode());
			// billAMT存放开票金额汇总
			mapInfo.put("billAMT", Double.parseDouble(totalAMT));
			mapInfo.put("BEGIN_PERIOD", mapInfo.get("GJAHR").toString() + mapInfo.get("MONAT").toString());
			mapInfo.put("END_PERIOD", mapInfo.get("GJAHR").toString() + mapInfo.get("MONAT").toString());
			//insert into p2_tax_bill_batch
			billingApplyDao.createMainAccountBatch(mapInfo);
			// update p2_ztax_bill_sum 应开扣减,已开增加
			billingApplyDao.updateBillSum(mapInfo);
			if (StringUtil.areBlank(REBILL_FLAG)) {
				// update p2_tax_bill_item
				billingApplyDao.updateBillItemBatchId(mapInfo.get("ZBILL_NO").toString(), ZDEINVID);
				// update p2_ztax_bill_header
				billingApplyDao.updateBatchId("'" + headerId + "'", ZDEINVID);
			}
			// 流转日志
			insertBatchFlowLog(mapInfo, "TAX_10_03");
			// 生成形式发票
			if(StringUtils.isNotBlank(TSK_MONTH_BILL[0]) && 0 != Double.parseDouble(TSK_MONTH_BILL[0])) {
				mapInfo.put("ZDEINVID_XH", j++);
				mapInfo.put("TAXSUM", Double.parseDouble(TSK_MONTH_BILL[0]));
				mapInfo.put("DIFF_REASON", DIFF_REASON);
				mapInfo.put("TICKETS_BACK", TICKETS_BACK[0]);
				mapInfo.put("APPLIER_BACK", applierBack[0]);
				mapInfo.put("MEINS", MEINS[0]);
				mapInfo.put("UNITPE", UNITPE[0]);
				mapInfo.put("FKIMG", FKIMG[0]);
				mapInfo.put("MSPEC", MSPEC[0]);
				//insert into p2_ztax_form_bill 主账号
				billingApplyDao.createFormBill(mapInfo);
			}
			for(int i=1; i<TSK_MONTH_BILL.length; i++) {
				// 为0不创建
				if(StringUtils.isBlank(TSK_MONTH_BILL[i]) || 0 == Double.parseDouble(TSK_MONTH_BILL[i])) {
					continue;
				}
				Map<String, Object> mapSubInfo = billingApplyDao.querySubAccountActural("'"+Z_CUSTOMER_NO[i]+"'").get(0);
				mapSubInfo.put("MATNR", mapInfo.get("MATNR"));
				mapSubInfo.put("MAKTX", mapInfo.get("MAKTX"));
				mapSubInfo.put("GJAHR", mapInfo.get("GJAHR"));
				mapSubInfo.put("MONAT", mapInfo.get("MONAT"));
				mapSubInfo.put("BUSINESS_TYPE", mapInfo.get("BUSINESS_TYPE"));
				mapSubInfo.put("ZDEINVID", ZDEINVID);
				mapSubInfo.put("ZDEINVID_XH", j++);
				mapSubInfo.put("SUB_TSK_MONTH_BILL", TSK_MONTH_BILL[i]);
				mapSubInfo.put("SUB_DIFF_REASON", DIFF_REASON);
				mapSubInfo.put("SUB_TICKETS_BACK", TICKETS_BACK[i]);
				mapSubInfo.put("sub_applierBack", applierBack[i]);
				mapSubInfo.put("MEINS", MEINS[i]);
				mapSubInfo.put("UNITPE", UNITPE[i]);
				mapSubInfo.put("FKIMG", FKIMG[i]);
				mapSubInfo.put("MSPEC", MSPEC[i]);
				mapSubInfo.put("currentEmpCode", UserUtil.getCurrentUser().getEmpCode());
				billingApplyDao.createFormBillSubAccount(mapSubInfo);
			}
		}  else {
			throw new ServiceException("该月份已经生成发票批,请查询后重新创建!");
		}	
	}
	
	/**
	 * 2017年2月27日 80001092 方法说明:是否有申请
	 * @param name
	 * @param amt
	 * @param date
	 * @return
	 * boolean
	 */
	private boolean ifHaveApply(String name, String amt, String date) {
		boolean result = false;
		String startDate;
		String year = date.substring(0, 4);
		String month = date.substring(4);
		if (Integer.parseInt(month) == 1) {
			year = String.valueOf(Integer.parseInt(year) - 1);
			startDate = year + "12";
		} else {
			startDate = year + String.valueOf(Integer.parseInt(month) - 1);
		}
		int count = billingApplyDao.getCountFromMonthCustM(name, amt, startDate, date);
		int count2 = billingApplyDao.getCountFromDesperse(name, amt, startDate, date);
		if (count >= 1 || count2 >= 1) {
			result = true;
		}
		return result;
	}
	
	/**
	 * 2017年2月28日 80001092 方法说明:标识作废遗失发票导出
	 * @param bean
	 * void
	 */
	public void exportMarkList(BeanBase bean) {
		Map<String, String> paramMap = bean.getDatas().get(0);
		paramMap.put("currentEmpCode", UserUtil.getCurrentUser().getEmpCode());
		Map<String, Object> map = new HashMap<String, Object>();
		List<String[]> excel = new ArrayList<String[]>();
		final String[] cellsTitle = {"应收所属起始时间","应收所属结束时间","发票代码","发票号码","月结账号名称", 
				"关联账号名称","净值","税金","发票状态","待作废标识","遗失标识"};
		final Map<Integer, String> header = new HashMap<Integer, String>(); //报表头部
		header.put(cellsTitle.length, "标识作废遗失发票");
		String[] cells = null;
		List<Map<String, Object>> list = null;
		list = billingApplyDao.getMarkedCancleList(paramMap, 0, Integer.MAX_VALUE);
		for (Map<String, Object> data : list) {
			cells = new String[cellsTitle.length];
			int i = 0;
			cells[i++] = getData(data, "BEGIN_PERIOD");
			cells[i++] = getData(data, "END_PERIOD");
			cells[i++] = getData(data, "ZINV_CODE");
			cells[i++] = getData(data, "ZINV_NUMBER");
			cells[i++] = getData(data, "Z_CDH_NAME");
			cells[i++] = getData(data, "SUB_Z_CDH_NAME");
			cells[i++] = getData(data, "NETWR");
			cells[i++] = getData(data, "TAXAMT");
			cells[i++] = getData(data, "BILL_SETUP_DES");
			cells[i++] = getData(data, "CANCLE_FLAG");
			cells[i++] = getData(data, "LOSE_FLAG");
			excel.add(cells);
		}
		map.put("orgCode", "sheet1");
		map.put("data", excel);
		map.put("header", header); //统计头部
		map.put("cellsTitle", cellsTitle);
		map.put("fileName", "标识作废遗失发票_" + DateUtils.formatDate(new Date(), "yyyy-MM-dd"));
		bean.getExpData().put("excelData", map);
	}
	private String getData(Map<String, Object> data, String key) {
		return data.get(key) == null ? "" : data.get(key).toString();
	}
	
	/**
	 * 2017年3月29日 80001092 方法说明:关联方导出
	 * @param bean
	 * void
	 */
	public void export(BeanBase bean) {
		Map<String, String> paramMap = bean.getDatas().get(0);
		paramMap.put("currentEmpCode", UserUtil.getCurrentUser().getEmpCode());
		paramMap.put("billTaxPaySub", StringUtil.addDimmer(paramMap.get("BILL_TAX_PAY_SUB"), ",", "'"));
		paramMap.put("invTaxPaySub", StringUtil.addDimmer(paramMap.get("INV_TAX_PAY_SUB"), ",", "'"));
		paramMap.put("billPrctr", StringUtil.addDimmer(paramMap.get("BILL_PRCTR"), ",", "'"));
		paramMap.put("zCustomerNo", StringUtil.addDimmer(paramMap.get("Z_CUSTOMER_NO"), ",", "'"));
		paramMap.put("businessType", StringUtil.addDimmer(paramMap.get("BUSINESS_TYPE"), ",", "'"));
		paramMap.put("billBukrs", StringUtil.addDimmer(paramMap.get("ORG_BUKRS"), ",", "'"));
		
		Map<String, Object> map = new HashMap<String, Object>();
		List<String[]> excel = new ArrayList<String[]>();
		final String[] cellsTitle = {"业务类型","所属时间","业务开票主体","实际开票主体","实际收票主体",
				"业务收票放账套号","发票类型","税号","地址&电话","开户行&账号","开票金额"};
		final Map<Integer, String> header = new HashMap<Integer, String>(); //报表头部
		header.put(cellsTitle.length, "关联方开票信息导出");
		String[] cells = null;
		List<Map<String, Object>> list = billingApplyDao.getRelatedBillList(paramMap, 0, Integer.MAX_VALUE);
		for (Map<String, Object> data : list) {
			cells = new String[cellsTitle.length];
			int i = 0;
			cells[i++] = getData(data, "BUSINESS_TYPE");
			cells[i++] = getData(data, "BELONG_DATE");
			cells[i++] = getData(data, "ORG_TAX_PAY_NAME");
			cells[i++] = getData(data, "BILL_TAX_PAY_NAME");
			cells[i++] = getData(data, "TAX_PAY_NAME");
			cells[i++] = getData(data, "Z_CUSTOMER_NO");
			cells[i++] = getData(data, "ZTAXTYPE");
			if (BillingApplyConstants.INV_TYPE_SPECIAL.equals(cells[i-1])) {
				cells[i-1] = "专票";
			}
			if (BillingApplyConstants.INV_TYPE_COMMON.equals(cells[i-1])) {
				cells[i-1] = "普票";
			}
			cells[i++] = getData(data, "TAXPAYER_ID_NAT");
			cells[i++] = getData(data, "ADDR_TEL");
			cells[i++] = getData(data, "BANK_ACCOUNT");
			cells[i++] = getData(data, "WRBTR");
			excel.add(cells);
		}
		map.put("orgCode", "sheet1");
		map.put("data", excel);
		map.put("header", header); //统计头部
		map.put("cellsTitle", cellsTitle);
		map.put("fileName", "关联方开票信息_" + DateUtils.formatDate(new Date(), "yyyy-MM-dd"));
		bean.getExpData().put("excelData", map);
	}
	
	/**
	 * 2017年4月7日 80001092 方法说明:还原未开票金额
	 * @param bean
	 * void
	 */
	@Transactional
	public void addNewApply(BeanBase bean) {
		Map<String, String> paramMap = bean.getDatas().get(0);
		String[] ids = paramMap.get("ids").split(",",-1);
		if (StringUtil.areBlank(ids) || ids.length < 1) {
			throw new ServiceException("获取待还原数据失败");
		}
		String empCode = UserUtil.getCurrentUser().getEmpCode();
		Map<String, Object> hAndIMap;
		try {
			for (int i=0; i<ids.length; i++) {
				hAndIMap = billingApplyDao.getHeaderById(ids[i]);
				hAndIMap.put(empCode, empCode);
				hAndIMap.put("ZBILL_NO", new SimpleDateFormat("ddHHmmssSSS").format(
						new Date()) + new Double(Math.floor(Math.random()*10)).intValue());
				billingApplyDao.addHeader(hAndIMap);
				billingApplyDao.addItem(hAndIMap);
				billingApplyDao.updateHeader(ids[i]);
			}
		} catch (Exception e) {
			throw new ServiceException("还原数据时出错");
		}
	}
	
	/**
	 * 2017年4月12日 80001092 方法说明:删除选择行
	 * @param bean
	 * void
	 */
	@Transactional
	public void deleteImport(BeanBase bean) {
		Map<String, String> paramMap = bean.getDatas().get(0);
		String selectAllFlag = paramMap.get("selectAllFlag");
		String idsString = paramMap.get("ids");
		if(StringUtil.areBlank(idsString) && !"checked".equals(selectAllFlag)) {
			throw new ServiceException("请选择需要提交的记录");
		}
		String ids = StringUtil.addDimmer(idsString, ",", "'");
		if ("checked".equals(selectAllFlag)) { // 全选
			ids = "";
		}
		paramMap.put("ids", ids);
		paramMap.put("empCode", UserUtil.getCurrentUser().getEmpCode());
		billingApplyDao.deleteImport(paramMap);
	}
	
	/**
	 * 2017年4月12日 80001092 方法说明:确认作废红冲
	 * @param bean
	 * void
	 */
	@Transactional
	public void confirmInv(BeanBase bean) {
		Map<String, String> paramMap = bean.getDatas().get(0);
		String selectAllFlag = paramMap.get("selectAllFlag");
		String idsString = paramMap.get("ids");
		if(StringUtil.areBlank(idsString) && !"checked".equals(selectAllFlag)) {
			throw new ServiceException("请选择需要确认的记录");
		}
		String HC_UNTAX_AMT = paramMap.get("HC_UNTAX_AMT");
		String HC_TAX_AMT = paramMap.get("HC_TAX_AMT");
		String ZF_UNTAX_AMT = paramMap.get("ZF_UNTAX_AMT");
		String ZF_TAX_AMT = paramMap.get("ZF_TAX_AMT");
		BigDecimal hcTotal = new BigDecimal(HC_UNTAX_AMT).add(new BigDecimal(HC_TAX_AMT)).abs();
		BigDecimal zfTotal = new BigDecimal(ZF_UNTAX_AMT).add(new BigDecimal(ZF_TAX_AMT)).abs();
		BigDecimal hcImp = new BigDecimal(0);
		BigDecimal zfImp = new BigDecimal(0);
		String currentEmpCode = UserUtil.getCurrentUser().getEmpCode();
		String ids = StringUtil.addDimmer(idsString, ",", "'");
		if ("checked".equals(selectAllFlag)) { // 全选
			ids = "";
		}
		paramMap.put("ids", ids);
		paramMap.put("empCode", currentEmpCode);
		// 加上日期限制,否则越来越大
		List<Map<String, Object>> conList = billingApplyDao.getConfirmList(paramMap);
		Map<String, Object> entryMap = null;
		try {
			for (int i=0; i<conList.size(); i++) {
				entryMap = conList.get(i);
				if (BillingApplyConstants.INV_TYPE_MINUS_CHN.equals(String.valueOf(entryMap.get("INV_TYPE")))) {
					hcImp = hcImp.add(new BigDecimal(String.valueOf(entryMap.get("TOTALAMT"))));
				} else if (BillingApplyConstants.INV_TYPE_INVALID_CHN.equals(String.valueOf(entryMap.get("INV_TYPE")))) {
					zfImp = zfImp.add(new BigDecimal(String.valueOf(entryMap.get("TOTALAMT"))));	
				}
			}
			if (hcTotal.compareTo(hcImp.abs()) != 0 || zfTotal.compareTo(zfImp.abs()) != 0) {
				throw new ServiceException("输入的总金额与需要确认的总金额不相等");
			}
			for (int i=0; i<conList.size(); i++) {
				entryMap = conList.get(i);
				if (BillingApplyConstants.INV_TARGET_E.equals(String.valueOf(entryMap.get("TARGET")))) {
					// 更新实物发票,BILL_STATUS置为”已红冲“
					billingApplyDao.updateBillListStatus(String.valueOf(entryMap.get("LIST_ID")), 
							String.valueOf(entryMap.get("INV_TYPE")), currentEmpCode);
					updateBillSumAMT(String.valueOf(entryMap.get("ZDEINVID")), 
							String.valueOf(entryMap.get("KUNNR")), String.valueOf(entryMap.get("ZTAXTYPE")),
							Double.parseDouble(String.valueOf(entryMap.get("TOTALAMT"))));
					// 方法2 使用BidDecimal精确计算,暂未启用
					// updateBillSumAMT2(ZDEINVID, KUNNR, ZTAXTYPE, tempUntax, tempTax);
				} else if (BillingApplyConstants.INV_TARGET_S.equals(String.valueOf(entryMap.get("TARGET")))) {
					// 更新实物发票,BILL_STATUS置为”已红冲“
					billingApplyDao.updateBillListStatus(String.valueOf(entryMap.get("LIST_ID")), 
							String.valueOf(entryMap.get("INV_TYPE")), currentEmpCode);
				} else if (BillingApplyConstants.INV_TARGET_I.equals(String.valueOf(entryMap.get("TARGET")))) { //关联方
					if (BillingApplyConstants.INV_REPALCE.equals(String.valueOf(entryMap.get("LIST_BILL_STATUS")))) {
						// 如果是负数
						if (BillingApplyConstants.INV_TYPE_MINUS_CHN.equals(String.valueOf(entryMap.get("INV_TYPE")))) {
							billingApplyDao.updateBillListStatus2(String.valueOf(entryMap.get("OP_ZINV_CODE")),
									String.valueOf(entryMap.get("OP_ZINV_NUMBER")), String.valueOf(entryMap.get("INV_TYPE")), 
									currentEmpCode);
						}
						// 如果是作废
						if (BillingApplyConstants.INV_TYPE_INVALID_CHN.equals(String.valueOf(entryMap.get("INV_TYPE")))) {
							billingApplyDao.updateBillListStatus2(String.valueOf(entryMap.get("ZINV_CODE")), 
									String.valueOf(entryMap.get("ZINV_NUMBER")), String.valueOf(entryMap.get("INV_TYPE")), 
									currentEmpCode);
						}
					}
				}
				billingApplyDao.confirmInv(entryMap.get("ID").toString(), currentEmpCode);
			}
			entryMap = null;
		} catch (Exception e) {
			throw new ServiceException("数据还原失败,请联系系统管理员");
		}
	}
	
	/**
	 * 2017年4月14日 80001092 方法说明:发票状态查询报表
	 * @param bean
	 * void
	 */
	public void queryAllBillStatus(BeanBase bean) {
		Map<String, String> paramMap = bean.getDatas().get(0);
		/*String startDate = paramMap.get("startDate");
		if (StringUtil.areNotBlank(startDate)) {
			startDate = startDate + "-01";
		}
		paramMap.put("startDate", startDate);*/
		String custType = paramMap.get(CUSTTYPE);
		paramMap.put("empCode", UserUtil.getCurrentUser().getEmpCode());
		if(INV_TYPE_E_I.equals(custType)){
			bean.getExpData().put("page", PageHandler.execute(new PageSplit<Map<String, Object>>() {
				
				@Override
				public int queryTotalCount() {
					return billingApplyDao.getAllBillStatusTotalCount(paramMap);
				}
				
				@Override
				public List<Map<String, Object>> queryPageList(int pageStart, int pageSize) {
					return billingApplyDao.getAllBillStatus(paramMap, pageStart, pageSize);
				}
			}, bean.getRows(), bean.getPage()));
		} else {
			bean.getExpData().put("page", PageHandler.execute(new PageSplit<Map<String, Object>>() {
				
				@Override
				public int queryTotalCount() {
					return billingApplyDao.getAllSingleBillStatusTotalCount(paramMap);
				}
				
				@Override
				public List<Map<String, Object>> queryPageList(int pageStart, int pageSize) {
					return billingApplyDao.getAllSingleBillStatus(paramMap, pageStart, pageSize);
				}
			}, bean.getRows(), bean.getPage()));
		}
	}
	
	/**
	 * 2017年4月19日 80001092 方法说明:导出
	 * @param bean
	 * void
	 */
	public void exportBillAllStatus(BeanBase bean) {
		Map<String, String> paramMap = bean.getDatas().get(0);
		String startDate = paramMap.get("startDate");
		if (StringUtil.areNotBlank(startDate)) {
			startDate = startDate + "-01";
		}
		paramMap.put("startDate", startDate);
		paramMap.put("empCode", UserUtil.getCurrentUser().getEmpCode());
		Map<String, Object> map = new HashMap<String, Object>();
		List<String[]> excel = new ArrayList<String[]>();
		final String[] cellsTitle = {"网点","申请人","月结账号","纳税人识别号","开户行",
				"地址电话","名称","业务类型", 
				"所属账期","应收金额","申请金额","差异金额","申请日期","开票人","开票日期",
				"发票状态","发票类型","寄送状态","运单号码","收件人","签收状态","发票批",
				"发票批次号"};
		final Map<Integer, String> header = new HashMap<Integer, String>(); //报表头部
		header.put(cellsTitle.length, "发票状态查询导出");
		String[] cells = null;
		List<Map<String, Object>> list = null;
		String custType = paramMap.get(CUSTTYPE);
		if(INV_TYPE_E_I.equals(custType)){
			list = billingApplyDao.getAllBillStatus(paramMap, 0, Integer.MAX_VALUE);
		}else{
			list = billingApplyDao.getAllSingleBillStatus(paramMap, 0, Integer.MAX_VALUE);
		}
		for (Map<String, Object> data : list) {
			cells = new String[cellsTitle.length];
			int i = 0;
			cells[i++] = getData(data, "A_BILL_PRCTR");
			cells[i++] = getData(data, "CREATE_ID");
			cells[i++] = getData(data, "KUNNR");
			cells[i++] = getData(data, "BILL_TAX_ID");
			cells[i++] = getData(data, "nameAndAcco");
			cells[i++] = getData(data, "addAndTel");
			cells[i++] = getData(data, "INV_TAX_NAME");
			cells[i++] = getData(data, "BUSINESS_DESC");
			cells[i++] = getData(data, "PERIOD");
			cells[i++] = getData(data, "TSL");
			cells[i++] = getData(data, "TAXSUM");
			cells[i++] = getData(data, "DIFF_TSL");
			cells[i++] = getData(data, "CREATE_TIME");
			cells[i++] = getData(data, "BILL_CLARK");
			cells[i++] = getData(data, "BILL_DATE");
			cells[i++] = getData(data, "BILL_SETUP_DES");
			cells[i++] = getData(data, "ZTAXTYPE");
			cells[i++] = getData(data, "POST_STATUS");
			cells[i++] = getData(data, "WAYBILL_NO");
			cells[i++] = getData(data, "RECEIVER");
			cells[i++] = getData(data, "RECV_STATUS");
			cells[i++] = getData(data, "ZDEINVID");
			cells[i++] = getData(data, "ZDEINVID_XH");
			excel.add(cells);
		}
		map.put("orgCode", "sheet1");
		map.put("data", excel);
		map.put("header", header); //统计头部
		map.put("cellsTitle", cellsTitle);
		map.put("fileName", "发票状态查询_" + DateUtils.formatDate(new Date(), "yyyy-MM-dd"));
		bean.getExpData().put("excelData", map);
	}
	
	/**
	 * 2017年4月25日 80001092 方法说明:发票明细查询报表
	 * @param bean
	 * void
	 */
	public void queryInvDetailReport(BeanBase bean) {
		Map<String, String> paramMap = bean.getDatas().get(0);
		paramMap.put("empCode", UserUtil.getCurrentUser().getEmpCode());
		bean.getExpData().put("page", PageHandler.execute(new PageSplit<Map<String, Object>>() {
			
			@Override
			public int queryTotalCount() {
				return billingApplyDao.getInvDetailTotalCount(paramMap);
			}
			
			@Override
			public List<Map<String, Object>> queryPageList(int pageStart, int pageSize) {
				return billingApplyDao.getInvDetail(paramMap, pageStart, pageSize);
			}
		}, bean.getRows(), bean.getPage()));
	}
	
	/**
	 * 2017年4月25日 80001092 方法说明:export
	 * @param bean
	 * void
	 */
	public void exportInvDetail(BeanBase bean) {
		Map<String, String> paramMap = bean.getDatas().get(0);
		paramMap.put("empCode", UserUtil.getCurrentUser().getEmpCode());
		Map<String, Object> map = new HashMap<String, Object>();
		List<String[]> excel = new ArrayList<String[]>();
		final String[] cellsTitle = {"发票代码","发票号码","名称","发票类型",
				"发票金额","发票状态","运单号码","收件人","发票批","商品名称","税额",
				"税率","开票日期"};
		final Map<Integer, String> header = new HashMap<Integer, String>(); //报表头部
		header.put(cellsTitle.length, "发票明细查询导出");
		String[] cells = null;
		List<Map<String, Object>> list = null;
		list = billingApplyDao.getInvDetail(paramMap, 0, Integer.MAX_VALUE);
		for (Map<String, Object> data : list) {
			cells = new String[cellsTitle.length];
			int i = 0;
			cells[i++] = getData(data, "ZINV_CODE");
			cells[i++] = getData(data, "ZINV_NUMBER");
			cells[i++] = getData(data, "INV_TAX_NAME");
			cells[i++] = getData(data, "ZTAXTYPE");
			cells[i++] = getData(data, "NETWR");
			cells[i++] = getData(data, "BILL_SETUP_DES");
			cells[i++] = getData(data, "WAYBILL_NO");
			cells[i++] = getData(data, "RECEIVER");
			cells[i++] = getData(data, "ZDEINVID");
			cells[i++] = getData(data, "MAKTX");
			cells[i++] = getData(data, "TAXAMT");
			cells[i++] = getData(data, "TAXRATE");
			cells[i++] = getData(data, "IVDATE");
			excel.add(cells);
		}
		map.put("orgCode", "sheet1");
		map.put("data", excel);
		map.put("header", header); //统计头部
		map.put("cellsTitle", cellsTitle);
		map.put("fileName", "发票明细查询_" + DateUtils.formatDate(new Date(), "yyyy-MM-dd"));
		bean.getExpData().put("excelData", map);
	}
	
	/**
	 * 2017年5月5日 80001092 方法说明:月结开票导出
	 * @param bean
	 * void
	 */
	public void exportOuterCust(BeanBase bean) {
		Map<String, String> paramMap = bean.getDatas().get(0);
		String searchType = paramMap.get("searchType");
		if("reBillSearch".equals(searchType)) {
			throw new ServiceException("补开查询结果不能导出");
		}
		paramMap.put("currentEmpCode", UserUtil.getCurrentUser().getEmpCode());
		paramMap.put("billTaxPaySub", StringUtil.addDimmer(paramMap.get("BILL_TAX_PAY_SUB"), ",", "'"));
		paramMap.put("billPrctr", StringUtil.addDimmer(paramMap.get("BILL_PRCTR"), ",", "'"));
		paramMap.put("zCustomerNo", StringUtil.addDimmer(paramMap.get("Z_CUSTOMER_NO"), ",", "'"));
		paramMap.put("businessType", StringUtil.addDimmer(paramMap.get("BUSINESS_TYPE"), ",", "'"));
		paramMap.put("billBukrs", StringUtil.addDimmer(paramMap.get("BILL_BUKRS"), ",", "'"));
		paramMap.put("ZZPERSR", StringUtil.addDimmer(paramMap.get("ZZPERSR"), ",", "'"));
		Map<String, Object> map = new HashMap<String, Object>();
		List<String[]> excel = new ArrayList<String[]>();
		final String[] cellsTitle = {"业务号","序号","月结账号","月结账号名称","所属期间","结算网点编码",
				"业务类型","发票类型","应收金额","未开票金额","开票金额","差异原因","票面备注","纳税人识别号",
				"地址及电话","开户行及账号","货物或应税劳务名称","单位","单价","数量","规格","申请人员备注",
				"驳回原因","企业名片代码","是否直寄"};
		final Map<Integer, String> header = new HashMap<Integer, String>(); //报表头部
		header.put(cellsTitle.length, "月结客户开票信息导出");
		String[] cells = null;
		boolean subFlag = false;
		Map<String, String> idMap = new HashMap<String, String >();
		List<Map<String, Object>> list = billingApplyDao.getBillListExport(paramMap);
		for (Map<String, Object> data : list) {
			cells = new String[cellsTitle.length];
			int i = 0;
			cells[i++] = getData(data, "ID");
			if (idMap.get(cells[0]) != null) {
				subFlag = true;
			}
			cells[i++] = getData(data, "SUB_XH");
			cells[i++] = getData(data, "Z_CUSTOMER_NO");
			cells[i++] = getData(data, "Z_CDH_NAME");
			cells[i++] = getData(data, "BELONG_DATE");
			cells[i++] = getData(data, "BILL_PRCTR");
			cells[i++] = getData(data, "BUSINESS_TYPE");
			cells[i++] = getData(data, "INVOICE_TYPE");
			if (BillingApplyConstants.INV_TYPE_SPECIAL.equals(cells[i-1])) {
				cells[i-1] = "专票";
			}
			if (BillingApplyConstants.INV_TYPE_COMMON.equals(cells[i-1])) {
				cells[i-1] = "普票";
			}
			if (subFlag) {
				cells[i++] = "";
				cells[i++] = "";
				cells[i++] = "";
			} else {
				cells[i++] = getData(data, "WRBTR");
				cells[i++] = getData(data, "TSL_MONTH_UNBILL");
				cells[i++] = getData(data, "TSL_MONTH_UNBILL");
			}
			cells[i++] = getData(data, "DIFF_REASON");
			cells[i++] = getData(data, "TICKETS_BACK");
			cells[i++] = getData(data, "Z_TAX_ID");
			cells[i++] = getData(data, "ADDR_TEL");
			cells[i++] = getData(data, "BANK_ACCOUNT");
			cells[i++] = getData(data, "MAKTX");
			cells[i++] = getData(data, "MEINS");
			cells[i++] = getData(data, "UNITPE");
			cells[i++] = getData(data, "FKIMG");
			cells[i++] = getData(data, "MSPEC");
			cells[i++] = getData(data, "applierBack");
			cells[i++] = getData(data, "REJECT_REASON");
			cells[i++] = getData(data, "NAMECARD_ID");
			cells[i] = getData(data, "IS_POST");
			if ("X".equals(cells[i])) {
				cells[i] = "是";
			} else {
				cells[i] = "否";
			}
			subFlag = false;
			idMap.put(cells[0], cells[0]);
			excel.add(cells);
		}
		map.put("orgCode", "sheet1");
		map.put("data", excel);
		map.put("header", header); //统计头部
		map.put("cellsTitle", cellsTitle);
		map.put("fileName", "月结开票信息_" + DateUtils.formatDate(new Date(), "yyyy-MM-dd"));
		bean.getExpData().put("excelData", map);
	}
	
	/**
	 * 2017年5月9日 80001092 方法说明:月结开票信息导入
	 * @param bean
	 * void
	 */
	@Transactional
	public void importMonthCust(BeanBase bean) {
		try {
			new AbstractExcelReader() {
				@Override
				public void doParse(Workbook workbook) {
					checkImpt(workbook, bean);
				}
			}.Reader();;
		} catch (Exception e) {
			String errorMsg = "EXCEL上传失败:<br>";
			String errMsgDinamic = e.getMessage();
			if (StringUtil.areNotBlank(errMsgDinamic)) {
				errorMsg += errMsgDinamic;
			} else {
				errorMsg += "请确保最后一行数据之后没有空白数据";
			}
			logger.error(errorMsg, e);
			if (e instanceof DuplicateKeyException) {
				throw new ServiceException("导入的Excel存在重复的数据,去掉重复数据后在导入");
			} else {
				throw new ServiceException(errorMsg);
			}
		}
		bean.setStatus(BusinessStatus.FINLISH);
		bean.setProcessMsg("导入完成!");
	}
	
	/**
	 * 2017年5月9日 80001092 方法说明:校验上传数据
	 * @param workbook
	 * @param bean
	 * void
	 */
	/**
	 * 2017年5月11日 80001092 方法说明:
	 * @param workBook
	 * @param bean
	 * void
	 */
	/**
	 * 2017年5月11日 80001092 方法说明:
	 * @param workBook
	 * @param bean
	 * void
	 */
	private void checkImpt(Workbook workBook, BeanBase bean) {
		List<Map<String, String>> excelValueList = null;
		// 待导入的数据
		int import_wb_sheetNos = workBook.getNumberOfSheets();
		if (import_wb_sheetNos == 0) {
			throw new ServiceException("待导入的数据为空");
		}
		excelValueList = new ArrayList<>();
		Cell cell = null;
		String ID = null;
		String SUB_XH = null;
		String Z_CUSTOMER_NO = null;
		String Z_CDH_NAME = null;
		String BELONG_DATE = null;
		String BILL_PRCTR = null;
		String INVOICE_TYPE = null;
		String BUSINESS_TYPE = null;
		String Z_TAX_ID = null;
		String IS_POST = null;
		String ADDR_TEL = null;
		String BANK_ACCOUNT = null;
		String MAKTX = null;
		String WRBTR = null;
		String MEINS = null;
		String UNITPE = null;
		String FKIMG = null;
		String MSPEC = null;
		String NETWR = null;
		String TAXRATE = null;
		String TAXAMT = null;
		String REJECT_REASON = null;
		String NAMECARD_ID = null;
		String TSL_MONTH_UNBILL = null;
		String TSK_MONTH_BILL = null;
		String DIFF_REASON = null;
		String TICKETS_BACK = null;
		String applierBack = null;
		Sheet sheet = workBook.getSheetAt(0);
		Map<String, String> map = null;
		Map<String, String> idMap = new HashMap<String, String>();
		for(int line=2, count=sheet.getLastRowNum()+1; line<count; line++) {
			Row row = sheet.getRow(line);
			int j = 0;
			cell = row.getCell(j++);
			ID = getCellValue(cell);
			
			cell = row.getCell(j++);
			SUB_XH = getCellValue(cell);
			
			cell = row.getCell(j++);
			Z_CUSTOMER_NO = getCellValue(cell);
			
			if (StringUtil.areBlank(ID, SUB_XH, Z_CUSTOMER_NO)) {
				continue;
			}
			
			if (StringUtil.areBlank(ID)) {
				throw new ServiceException("业务号不允许为空");
			}
			
			if (StringUtil.areBlank(SUB_XH)) {
				throw new ServiceException("序号不允许为空");
			}
			
			if (idMap.get(ID + SUB_XH) == null) {
				idMap.put(ID + SUB_XH, ID);
			} else {
				throw new ServiceException("业务号" + ID + "序号" + SUB_XH+ "出现重复,不能上传");
			}
			
			// 校验ID是否存在
			if (checkIfExcits(ID, SUB_XH) < 1) {
				throw new ServiceException("业务号" + ID + "序号" + SUB_XH + "在系统中不存在,这两列数据不允许修改值,要维持导出原值");
			}
			
			cell = row.getCell(j++);
			Z_CDH_NAME = getCellValue(cell);
			
			cell = row.getCell(j++);
			BELONG_DATE = XslUtil.getCellString(cell);
			
			cell = row.getCell(j++);
			BILL_PRCTR = getCellValue(cell);
			
			cell = row.getCell(j++);
			BUSINESS_TYPE = getCellValue(cell);
			
			cell = row.getCell(j++);
			INVOICE_TYPE = getCellValue(cell);
			if (BillingApplyConstants.INV_TYPE_SPECIAL_NAME.equals(INVOICE_TYPE)) {
				INVOICE_TYPE = BillingApplyConstants.INV_TYPE_SPECIAL;
			} else if (BillingApplyConstants.INV_TYPE_COMMON_NAME.equals(INVOICE_TYPE)) {
				INVOICE_TYPE = BillingApplyConstants.INV_TYPE_COMMON;
			}
			
			cell = row.getCell(j++);
			WRBTR = getCellValue(cell);
			
			cell = row.getCell(j++);
			TSL_MONTH_UNBILL = getCellValue(cell);
			
			cell = row.getCell(j++);
			TSK_MONTH_BILL = getCellValue(cell);
			if (StringUtil.areBlank(TSK_MONTH_BILL)) {
				throw new ServiceException("开票金额不能为空,不开票请填0或删除该行");
			}
			
			cell = row.getCell(j++);
			DIFF_REASON = getCellValue(cell);
			try {
				if (StringUtil.areNotBlank(Z_CUSTOMER_NO) && 
						Double.parseDouble(TSK_MONTH_BILL) - Double.parseDouble(TSL_MONTH_UNBILL) > 0) {
					if (StringUtil.areBlank(DIFF_REASON)) {
						throw new ServiceException("开票金额大于未开票金额必须输入差异原因");
					}
				}
			} catch (Exception e) {
				throw new ServiceException("开票金额不是正确的数值,不开票请填0");
			}
			
			if (StringUtil.areNotBlank(DIFF_REASON)) {
				switch(DIFF_REASON) {
				case "账单金额或应收金额需调整":
					break;
				case "运单挂错月结号":
					break;
				case "退换票":
					break;
				case "理赔":
					break;
				default : 
					throw new ServiceException("差异原因请输入:账单金额或应收金额需调整、运单挂错月结号、退换票、理赔中的一个");
				}
			}
			
			cell = row.getCell(j++);
			TICKETS_BACK = getCellValue(cell);
			
			cell = row.getCell(j++);
			Z_TAX_ID = getCellValue(cell);
			if(!TaxPayUtil.check(Z_TAX_ID)){
				throw new ServiceException(ERR_TAX_PAY_ID_FORMAT);
			}
			
			cell = row.getCell(j++);
			ADDR_TEL = getCellValue(cell);
			
			cell = row.getCell(j++);
			BANK_ACCOUNT = getCellValue(cell);
			
			cell = row.getCell(j++);
			MAKTX = getCellValue(cell);
			
			cell = row.getCell(j++);
			MEINS = getCellValue(cell);
			
			cell = row.getCell(j++);
			UNITPE = getCellValue(cell);
			
			cell = row.getCell(j++);
			FKIMG = getCellValue(cell);
			
			cell = row.getCell(j++);
			MSPEC = getCellValue(cell);
			
			cell = row.getCell(j++);
			applierBack = getCellValue(cell);
			
			cell = row.getCell(j++);
			REJECT_REASON = getCellValue(cell);
			
			cell = row.getCell(j++);
			NAMECARD_ID = getCellValue(cell);
			
			cell = row.getCell(j++);
			IS_POST = getCellValue(cell);
			if ("是".equals(IS_POST)) {
				IS_POST = "X";
			} else {
				IS_POST = "";
			}
			map = new HashMap<String, String>();
			map.put("ID", ID);
			map.put("SUB_XH", SUB_XH);
			map.put("Z_CUSTOMER_NO", Z_CUSTOMER_NO);
			map.put("Z_CDH_NAME", Z_CDH_NAME);
			map.put("BELONG_DATE", BELONG_DATE);
			map.put("BILL_PRCTR", BILL_PRCTR);
			map.put("INVOICE_TYPE", INVOICE_TYPE);
			map.put("BUSINESS_TYPE", BUSINESS_TYPE);
			map.put("Z_TAX_ID", Z_TAX_ID);
			map.put("IS_POST", IS_POST);
			map.put("ADDR_TEL", ADDR_TEL);
			map.put("BANK_ACCOUNT", BANK_ACCOUNT);
			map.put("MAKTX", MAKTX);
			map.put("WRBTR", WRBTR);
			map.put("MEINS", MEINS);
			map.put("UNITPE", UNITPE);
			map.put("FKIMG", FKIMG);
			map.put("MSPEC", MSPEC);
			map.put("NETWR", NETWR);
			map.put("TAXRATE", TAXRATE);
			map.put("TAXAMT", TAXAMT);
			map.put("REJECT_REASON", REJECT_REASON);
			map.put("NAMECARD_ID", NAMECARD_ID);
			map.put("TSL_MONTH_UNBILL", TSL_MONTH_UNBILL);
			map.put("TSK_MONTH_BILL", TSK_MONTH_BILL);
			map.put("DIFF_REASON", DIFF_REASON);
			map.put("TICKETS_BACK", TICKETS_BACK);
			map.put("applierBack", applierBack);
			excelValueList.add(map);
		}
		bean.getExpData().put("page", excelValueList);
	}
	
	/**
	 * 2017年5月10日 80001092 方法说明:导入创建发票批
	 * @param bean
	 * void
	 */
	@SuppressWarnings("unchecked")
	@Transactional
	public void impCreateBatch(BeanBase bean) {
		Map<String, String> paramMap = bean.getDatas().get(0);
		String impData = paramMap.get("IMPDATA");
		List<Map<String, String>> listData = (List<Map<String, String>>) JSON.parse(impData);
		String kp_flag = null;
		String ID = null;
		String subXH = null;
		Map<String, String> batchMap = new HashMap<String, String>();
		Map<String, Integer> batchXhMap = new HashMap<String, Integer>();
		// 导出的excel如果在主账号和子账号之间插入其他月结账号行或调整顺序,开票结果可能会出现错误;
		for (Map<String, String> map : listData) {
			ID = map.get("ID");
			subXH = map.get("SUB_XH");
			kp_flag = billingApplyDao.getKPFlag(ID);
			if ("01".equals(kp_flag) || !"0".equals(subXH)) {
				if ("0".equals(subXH)) {
					//发票批次号
					String ZDEINVID = new SimpleDateFormat("yyMMddHHmmssSSS").format(new Date()) + 
							new Double(Math.floor(Math.random()*10)).intValue();
					batchMap.put(ID, ZDEINVID);
					Map<String, Object> mapInfo = getBatchInfoById(ID);
					String nextSetp = queryNextStep("20");
					mapInfo.put("currentStep", queryCurrentStepFromStep(mapInfo.get("BILL_PRCTR").toString(),
							BillingApplyConstants.INV_TARGET_OUTER));
					mapInfo.put("nextSetp", nextSetp);
					mapInfo.put("ZDEINVID", ZDEINVID);
					mapInfo.put("ZDEINVID_XH", '1');
					mapInfo.put("INV_TARGET", BillingApplyConstants.INV_TARGET_E); //外部
					mapInfo.put("currentEmpCode", UserUtil.getCurrentUser().getEmpCode());
					mapInfo.put("billAMT", map.get("TSK_MONTH_BILL"));
					mapInfo.put("TAXSUM", map.get("TSK_MONTH_BILL"));
					mapInfo.put("DIFF_REASON", valTrans(map.get("DIFF_REASON")));
					mapInfo.put("TICKETS_BACK", map.get("TICKETS_BACK"));
					mapInfo.put("APPLIER_BACK", map.get("applierBack"));
					mapInfo.put("BEGIN_PERIOD", mapInfo.get("GJAHR").toString() + mapInfo.get("MONAT").toString());
					mapInfo.put("END_PERIOD", mapInfo.get("GJAHR").toString() + mapInfo.get("MONAT").toString());
					mapInfo.put("MEINS", map.get("MEINS"));
					mapInfo.put("UNITPE", map.get("UNITPE"));
					mapInfo.put("FKIMG", map.get("FKIMG"));
					mapInfo.put("MSPEC", map.get("MSPEC"));
					billingApplyDao.createMainAccountBatch(mapInfo);
					if(0 != Double.parseDouble(map.get("TSK_MONTH_BILL"))) {
						//insert into p2_ztax_form_bill 主账号
						billingApplyDao.createFormBill(mapInfo);
						// update p2_ztax_bill_sum 应开扣减,已开增加
						billingApplyDao.updateBillSum(mapInfo);
					}
					// update p2_tax_bill_item
					billingApplyDao.updateBillItemBatchId(mapInfo.get("ZBILL_NO").toString(), ZDEINVID);
					// update p2_ztax_bill_header
					billingApplyDao.updateBatchId("'" + ID + "'", ZDEINVID);
					// 流转日志
					Map<String, Object> flowLogMap = billingApplyDao.getModuleConfig("TAX_10_02");
					billingApplyDao.insertBatchFlowLog(mapInfo, flowLogMap);
				} else { // 开票金额为0,不创建
					// 判断是否有主账号
					if (batchMap.get(ID) == null) {
						throw new ServiceException("业务号" + ID + "月结客户" + map.get("Z_CUSTOMER_NO") 
								+ "的主账号不能删除,与子账号一同上传,并且主账号在前,如主账号不开票,金额填0");
					}
					Map<String, Object> mapSubInfo =  getSubAccountInfo(ID, subXH);
					if(StringUtils.isBlank(map.get("TSK_MONTH_BILL")) || 0 == Double.parseDouble(map.get("TSK_MONTH_BILL"))) {
						continue;
					}
					if (batchXhMap.get(batchMap.get(ID)) == null) {
						batchXhMap.put(batchMap.get(ID), 2);
					} else {
						batchXhMap.put(batchMap.get(ID), batchXhMap.get(batchMap.get(ID)) + 1);
					}
					mapSubInfo.put("ZDEINVID", batchMap.get(ID));
					mapSubInfo.put("ZDEINVID_XH", batchXhMap.get(batchMap.get(ID)));
					mapSubInfo.put("SUB_TSK_MONTH_BILL",  map.get("TSK_MONTH_BILL"));
					mapSubInfo.put("SUB_DIFF_REASON", valTrans(map.get("DIFF_REASON")));
					mapSubInfo.put("SUB_TICKETS_BACK", map.get("TICKETS_BACK"));
					mapSubInfo.put("sub_applierBack", map.get("applierBack"));
					mapSubInfo.put("subId", subXH);
					mapSubInfo.put("currentEmpCode", UserUtil.getCurrentUser().getEmpCode());
					mapSubInfo.put("MEINS", map.get("MEINS"));
					mapSubInfo.put("UNITPE", map.get("UNITPE"));
					mapSubInfo.put("FKIMG", map.get("FKIMG"));
					mapSubInfo.put("MSPEC", map.get("MSPEC"));
					billingApplyDao.createFormBillSubAccount(mapSubInfo);
					Map<String, Object> mapInfo = getBatchInfoById(ID);
					mapInfo.put("billAMT", map.get("TSK_MONTH_BILL"));
					billingApplyDao.updateBillSum(mapInfo);
					billingApplyDao.updateBatchNET(mapSubInfo);
				}
			} else {
				throw new ServiceException("业务号" + ID + "月结客户" + map.get("Z_CUSTOMER_NO") + "已经提交过,删除该业务号的所有行在上传");
			}
		}
		
	}

	private String valTrans(String DIFF_REASON) {
		// 常量后续定义
		if ("账单金额或应收金额需调整".equals(DIFF_REASON)) {
			DIFF_REASON = "A";
		} else if ("运单挂错月结号".equals(DIFF_REASON)) {
			DIFF_REASON = "B";
		} else if ("退换票".equals(DIFF_REASON)) {
			DIFF_REASON = "C";
		} else if ("理赔".equals(DIFF_REASON)) {
			DIFF_REASON = "E";
		} else {
			DIFF_REASON = "";
		} 
		return DIFF_REASON;
	}
	
	/**
	 * 2017年5月11日 80001092 方法说明:是否存在
	 * @param id
	 * @param sUB_XH 
	 * @return
	 * int
	 */
	private int checkIfExcits(String id, String sUB_XH) {
		return billingApplyDao.getCountHeader(id, sUB_XH);
	}
}


分享到:
评论

相关推荐

    jqGrid详解及高级应用

    jqGrid详解及高级应用

    mvc jqgrid 应用

    MVC+Jqgrid+存储过程 全部代码

    jqGrid表格应用——新增与删除数据

    jqGrid可以结合fancybox等插件完成超酷的弹出层效果,通过与php后台交互,可以轻松完成数据的添加与详情查看,而这个过程完全是一个ajax异步通信过程,是一个非常友好的富客户端应用

    html+jqgrid,

    jqgrid的简单应用,直接显示,无需服务器数据库

    jqGrid与Struts2的结合应用_操作Grid数据

    自己搜集的jqGrid与Struts2的结合应用的方法

    mvc + jqgrid 示例代码

    在mvc 中 应用 jqgrid技术,一个在mvc中应用 最广泛的表格插件。

    JQGrid的简单应用及第三方分页的实现 .NET实现

    JQGrid的简单应用及第三方分页的实现 后端实现使用C#实现 通过第三方分页控件实现JQGrid的动态分页

    jqGrid与Struts2的结合应用

    jqgrid与struts2结合的例子

    强大的JQuery的插件jqGrid

    jQuery 的jqGrid包 现在已经更新到了3.8了 ,但是其中的主要应用是不会有太大的改动的,希望这个帮助文档能对jQuery插件的学习有所帮助。

    jqGrid表格应用之新增与删除数据附源码下载

    通过与php后台交互,可以轻松完成数据的添加与详情查看,而这个过程完全是一个ajax异步通信过程,是一个非常友好的富客户端应用,本文给大家介绍jqGrid表格应用之新增与删除数据,需要的朋友参考下

    Jqgrid之强大的表格插件应用

    jqGrid是一款基于jQuery的功能强大的表格插件,使用jqGrid可以轻松实现前端页面与后台数据进行ajax异步通信,jqGrid运行速度相当快,可以很好的应用在一些后台管理系统来管理大量数据的场合。 jqGrid特性: 基于...

    jqgriddemo.zip

    jqgriddemo各种表格应用示例,版本:5。0,jqgrid 文档离线demo打包. 下载 本地可架设运行

    jqgrid 修改一列 ,

    jqgrid 修改一列 。修改所有的行。通过vue.js 与jqgrid 的应用,供大家参考学习。多多提意见 。相互学习交换意见

    jqgrid 项目手把手开发文档

    Test JQGrid 项目手把手开发文档.doc ,为我们提供jqgrid更好的应用与学习,jqgrid的强大功能,很不错哦,望各位童鞋们不要错过哦,嘻嘻

    jqGrid使用手册

    jqGrid详解及高级应用,Jquery Jqgrid使用手册.能使jqGrid初学者更加方便快捷的掌握jqGrid控件的使用,让有一定jqGrid基础的人更深层次的认识jqGrid

    jqGridDemo

    JSP使用jquery插件jqGrid的演示后台使用struts2实现,对想在JSP中应用jqGrid有一定的借鉴。导入Eclipse可以直接看效果

    基于PHP和Mysql相结合使用jqGrid读取数据并显示

    但是这些模块会使得整个插件体积显得有点庞大,而且笔者认为jqGrid的搜索查询和编辑/添加功能不好用,所以笔者放弃jqGrid自有的search和edit表格模块,借助jquery利器来完成相关功能,符合项目的实际应用。...

    jqgrid 表格插件 CURD操作完整例子

    主要参考www helloweba com 作者:月光光 qGrid表格应用 读取与查询数据 还有其他网上作者无私奉献心得 鄙视官方jqgrid Demo 修改了代码中的错误 增加了编辑功能 和jqueryUI 日历datepicker插件

Global site tag (gtag.js) - Google Analytics