//------------------------------------------------------------------
//存根打印
//------------------------------------------------------------------
UINT8 INVM_GetInvNum(string nCode, UINT32 nStartNo, UINT32 nEndNo, UINT32 &nNum)
{
    DBG_ENTER("GetInvNum(UINT32 &nNum)");

    nNum = 0;
    INT32 errorcode;
    INT32 nTmpNum = 0;
    CInvHead curInvHead;
    CInvHead *pInvHead = &curInvHead;
    DBG_ASSERT_EXIT((pInvHead != NULL), (" pInvHead == NULL!"));

    //查总记录数,已分发未导入,赋值pageNum

    INT8 value[256];
    memset((void*)value, 0, sizeof(value));
    pInvHead->m_filter = "where FPDM = ";
    sprintf(value,"'%s' and FPHM >= %u and FPHM <= %u",nCode.c_str(),nStartNo,nEndNo);
    pInvHead->m_filter.append(value);
    DBG_PRINT((" pInvHead->m_filter = %s", pInvHead->m_filter.c_str()));
    nTmpNum = pInvHead->GetRecordNum();

    pInvHead = NULL;

    if (nTmpNum<0)
    {
        DBG_RETURN(FAILURE);
    }
    nNum = nTmpNum;
    DBG_RETURN(SUCCESS);
}
INT32 CJSKMakeInvoice::FPBL_Proc(string nsrsbh, string sksbbh, UINT32 SDate, UINT32 EDate, string &strErr)
{
	DBG_PRINT(("FPBL_Proc Begin()"));
	CInvHead invHead;
	INT8 sqlbuf[128];
	INT8 tmpBuf[128];
	INT32 errcode = 0;
	XMLConstruct pXmlBuild;
	UINT32 nCount = 1;
	string filename("");

	memset(tmpBuf, 0, sizeof(tmpBuf));
	UINT8 ret = UsbDiskMount(tmpBuf);
	if (SUCCESS != ret)
	{
		DBG_PRINT(("挂载U盘失败"));
		strErr = "挂载U盘失败";
		UsbDiskUnMount();
		return JSK_FAILURE;
	}

	UINT32 uDate = SDate/100;
	DBG_PRINT(("uDate= %u",uDate));
	sprintf(tmpBuf, "/mnt/%s%s%s_%s_%u_%s%s.DAT", XML_FILE_NAME_CGLPLBL,XML_FILE_NAME_KFSBM,nsrsbh.c_str(),sksbbh.c_str(),uDate,XML_FILE_NAME_ENCODE,"0001");
	filename = tmpBuf;
	DBG_PRINT(("filename = %s", filename.c_str()));

	memset(sqlbuf, 0, sizeof(sqlbuf));
	sprintf(sqlbuf, "where KPRQ>=%u and KPRQ<=%u", SDate, EDate);
	DBG_PRINT(("sqlbuf = %s", sqlbuf));
	invHead.m_filter.append(sqlbuf);
	INT32 m_InvNum = invHead.GetRecordNum();
	DBG_PRINT(("m_InvNum = %ld", m_InvNum));
	if(m_InvNum  > 0 )
	{
		pXmlBuild.XMLConstructBegin("1.0", "gbk", "business");
		pXmlBuild.m_RootElement->SetAttribute("id", "JSZZP");
		pXmlBuild.m_RootElement->SetAttribute("comment", "卷式增普票");
		pXmlBuild.m_RootElement->SetAttribute("version", "1.0");
	}
	else
	{
		strErr = "该时间段没有开票信息!";
		return JSK_FAILURE;
	}

	UINT32 date_StartNo = 0;	//当天的发票起始号码
	TDateTime tmpDateTime(SDate, 0);
	UINT32 TempDate = tmpDateTime.FormatInt(YYYYMMDD);	
	DBG_PRINT(("TempDate = %u", TempDate));
	while(TempDate <= EDate)
	{
		DBG_PRINT(("补录日期: %u", TempDate));
		date_StartNo = 0;

		memset(sqlbuf, 0, sizeof(sqlbuf));
		sprintf(sqlbuf, "WHERE KPRQ=%u order by NO limit 1", TempDate);
		DBG_PRINT(("sqlbuf = %s", sqlbuf));
		invHead.m_filter.append(sqlbuf);
		errcode = invHead.Load();
		DBG_PRINT(("errcode = %u", errcode));	

		while (errcode == SQLITE_OK)	//查到记录
		{
			DBG_PRINT(("查询invhead表有内容!"));
			pXmlBuild.AddNode(pXmlBuild.m_RootElement, "body");
			memset(tmpBuf, 0, sizeof(tmpBuf));
			sprintf(tmpBuf, "%u", nCount);
			pXmlBuild.AddAttr("no", tmpBuf);
			pXmlBuild.m_parentElement[1] = pXmlBuild.m_NewElement;
			
			pXmlBuild.AddNode(pXmlBuild.m_parentElement[1], "fpdm");
			pXmlBuild.AddText(invHead.m_fpdm);
			
			pXmlBuild.AddNode(pXmlBuild.m_parentElement[1], "fphm");
			memset(tmpBuf, 0, sizeof(tmpBuf));
			sprintf(tmpBuf, "%08u", invHead.m_fphm);
			pXmlBuild.AddText(tmpBuf);


			TDateTime tmpdate(invHead.m_kprq, invHead.m_kpsj);
			string tmpKprq = tmpdate.FormatString(YYYYMMDD);
			DBG_PRINT(("tmpKprq= %s",tmpKprq.c_str()));
			string tmpKpsj = tmpdate.FormatString(HHMMSS);
			DBG_PRINT(("tmpKpsj= %s",tmpKpsj.c_str()));

			pXmlBuild.AddNode(pXmlBuild.m_parentElement[1], "kprq");
			//memset(tmpBuf, 0, sizeof(tmpBuf));
			//sprintf(tmpBuf, "%08u", invHead.m_kprq);
			pXmlBuild.AddText(tmpKprq);			
			
			pXmlBuild.AddNode(pXmlBuild.m_parentElement[1], "kpsj");
// 			memset(tmpBuf, 0, sizeof(tmpBuf));
// 			sprintf(tmpBuf, "%u", invHead.m_kpsj);
			pXmlBuild.AddText(tmpKpsj);			

			pXmlBuild.AddNode(pXmlBuild.m_parentElement[1], "sbbh");
			pXmlBuild.AddText(sksbbh);

			if(invHead.m_kplx == JSK_RETURN_INV)
			{
				pXmlBuild.AddNode(pXmlBuild.m_parentElement[1], "hjje");
				memset(tmpBuf, 0, sizeof(tmpBuf));
				sprintf(tmpBuf, "-%.2lf", ((double)(invHead.m_kpje)*1.0)/SUM_EXTENSION);
				pXmlBuild.AddText(tmpBuf);
			
				pXmlBuild.AddNode(pXmlBuild.m_parentElement[1], "se");
				memset(tmpBuf, 0, sizeof(tmpBuf));
				if(invHead.m_kpse == 0)
				{
					sprintf(tmpBuf, "%.2lf", ((double)invHead.m_kpse *1.0)/SUM_EXTENSION);
				}
				else
				{
					sprintf(tmpBuf, "-%.2lf", ((double)invHead.m_kpse *1.0)/SUM_EXTENSION);
				}
				pXmlBuild.AddText(tmpBuf);

				pXmlBuild.AddNode(pXmlBuild.m_parentElement[1], "jshj");
				memset(tmpBuf, 0, sizeof(tmpBuf));
				invHead.m_kphjje = invHead.m_kpje + invHead.m_kpse;
				sprintf(tmpBuf, "-%.2lf", ((double)invHead.m_kphjje *1.0)/SUM_EXTENSION);
				pXmlBuild.AddText(tmpBuf);		
			}
			else
			{
				pXmlBuild.AddNode(pXmlBuild.m_parentElement[1], "hjje");
				memset(tmpBuf, 0, sizeof(tmpBuf));
				sprintf(tmpBuf, "%.2lf", ((double)(invHead.m_kpje)*1.0)/SUM_EXTENSION);
				pXmlBuild.AddText(tmpBuf);
				
				pXmlBuild.AddNode(pXmlBuild.m_parentElement[1], "se");
				memset(tmpBuf, 0, sizeof(tmpBuf));
				sprintf(tmpBuf, "%.2lf", ((double)invHead.m_kpse *1.0)/SUM_EXTENSION);
				pXmlBuild.AddText(tmpBuf);
				
				pXmlBuild.AddNode(pXmlBuild.m_parentElement[1], "jshj");
				memset(tmpBuf, 0, sizeof(tmpBuf));
				invHead.m_kphjje = invHead.m_kpje + invHead.m_kpse;
				sprintf(tmpBuf, "%.2lf", ((double)invHead.m_kphjje *1.0)/SUM_EXTENSION);
				pXmlBuild.AddText(tmpBuf);
			}
			
			pXmlBuild.AddNode(pXmlBuild.m_parentElement[1], "jym");
			pXmlBuild.AddText(invHead.m_fwm);
			
			pXmlBuild.AddNode(pXmlBuild.m_parentElement[1], "xfmc");
			pXmlBuild.AddText(g_globalArgLib->m_corpInfo->m_Nsrmc);
			
			pXmlBuild.AddNode(pXmlBuild.m_parentElement[1], "xfsh");
			pXmlBuild.AddText(nsrsbh);
			
			pXmlBuild.AddNode(pXmlBuild.m_parentElement[1], "gfmc");
			pXmlBuild.AddText(invHead.m_fkdw);
			
			pXmlBuild.AddNode(pXmlBuild.m_parentElement[1], "gfsh");
			pXmlBuild.AddText(invHead.m_payerCode);
			
				
			string fpztbz("");
			switch(invHead.m_kplx)
			{
			case JSK_NORMAL_INV:
					fpztbz = "0";	//正票
				break;
			case JSK_RETURN_INV:
					fpztbz = "1";	//退票
				break;
			case JSK_WASTE_INV:
					fpztbz = "2";	//空白废
				break;
			case JSK_WASTE_NOR:
					fpztbz = "3";	//正废
				break;
			case JSK_WASTE_RET:
					fpztbz = "4";	//负废
				break;
			}
			//发票状态标志(0 正常票1 退票2新发票的作废发票3正常发票的作废发票4已开退票的作废发票)
			pXmlBuild.AddNode(pXmlBuild.m_parentElement[1], "fpbz");
			pXmlBuild.AddText(fpztbz);

			pXmlBuild.AddNode(pXmlBuild.m_parentElement[1], "skr");
			pXmlBuild.AddText(invHead.m_sky);
			
			pXmlBuild.AddNode(pXmlBuild.m_parentElement[1], "bz");
			UINT8 baseBuf[256];
			memset(baseBuf, 0, sizeof(baseBuf));
			sprintf((INT8 *)baseBuf, "%s", invHead.m_backup1.c_str());
			Base64_Encode_2(baseBuf, invHead.m_backup1.length());
			string tmpStr = (INT8 *)baseBuf;
			pXmlBuild.AddText(tmpStr);
			
			if(invHead.m_kplx == JSK_RETURN_INV)
			{
				pXmlBuild.AddNode(pXmlBuild.m_parentElement[1], "yfpdm");
				pXmlBuild.AddText(invHead.m_yfpdm);
				
				pXmlBuild.AddNode(pXmlBuild.m_parentElement[1], "yfphm");
				memset(tmpBuf, 0, sizeof(tmpBuf));
				sprintf(tmpBuf, "%u",  invHead.m_yfphm);
				pXmlBuild.AddText(tmpBuf);
			}
			else
			{
				pXmlBuild.AddNode(pXmlBuild.m_parentElement[1], "yfpdm");
				pXmlBuild.AddText("");
				
				pXmlBuild.AddNode(pXmlBuild.m_parentElement[1], "yfphm");
				pXmlBuild.AddText("");
			}

			if( (invHead.m_kplx == JSK_WASTE_NOR) || (invHead.m_kplx == JSK_WASTE_RET) || (invHead.m_kplx == JSK_WASTE_INV) )
			{
				TDateTime zfDate(invHead.m_zfsj.c_str(), DATETIME_POS);
				string strZfrq =  zfDate.FormatString(YYYYMMDD);
				DBG_PRINT(("strZfrq= %s",strZfrq.c_str()));
				string strZfsj=zfDate.FormatString(HHMMSS);
				DBG_PRINT(("strZfsj= %s",strZfsj.c_str()));

				pXmlBuild.AddNode(pXmlBuild.m_parentElement[1], "zfrq");
				memset(tmpBuf, 0, sizeof(tmpBuf));
				//sprintf(tmpBuf, "%u", zfDate.FormatInt(YYYYMMDD));
				pXmlBuild.AddText(strZfrq);
				
				pXmlBuild.AddNode(pXmlBuild.m_parentElement[1], "zfsj");
				memset(tmpBuf, 0, sizeof(tmpBuf));
				//sprintf(tmpBuf, "%u", zfDate.FormatInt(HHMMSS));
				pXmlBuild.AddText(strZfsj);				
			}
			else
			{
				pXmlBuild.AddNode(pXmlBuild.m_parentElement[1], "zfrq");
				pXmlBuild.AddText("");
				
				pXmlBuild.AddNode(pXmlBuild.m_parentElement[1], "zfsj");
				pXmlBuild.AddText("");
			}

			pXmlBuild.AddNode(pXmlBuild.m_parentElement[1], "qmz");
			pXmlBuild.AddText(invHead.m_casign);


			CInvDet *pInvDet = invHead.pHead;
			
			for(int j=1; j<=invHead.m_sphsl; j++, pInvDet=pInvDet->pNext)
			{
				pXmlBuild.AddNode(pXmlBuild.m_parentElement[1], "zb");
				pXmlBuild.m_parentElement[2] = pXmlBuild.m_NewElement;
				
				pXmlBuild.AddNode(pXmlBuild.m_parentElement[2], "xh");
				memset(tmpBuf, 0, sizeof(tmpBuf));
				sprintf(tmpBuf, "%u", pInvDet->m_sphxh);
				pXmlBuild.AddText(tmpBuf);
				
				pXmlBuild.AddNode(pXmlBuild.m_parentElement[2], "xm");
				pXmlBuild.AddText(pInvDet->m_spmc);
				
				if(invHead.m_kplx == JSK_RETURN_INV)
				{
					pXmlBuild.AddNode(pXmlBuild.m_parentElement[2], "sl");
					memset(tmpBuf, 0, sizeof(tmpBuf));
					if(pInvDet->m_spsl < 0.001)
					{
						sprintf(tmpBuf, "0.00000000");
					}
					else
					{
						sprintf(tmpBuf, "-%.3lf00000",  pInvDet->m_spsl);
					}
					pXmlBuild.AddText(tmpBuf);
				}
				else
				{
					pXmlBuild.AddNode(pXmlBuild.m_parentElement[2], "sl");
					memset(tmpBuf, 0, sizeof(tmpBuf));
					sprintf(tmpBuf, "%.3lf00000",  pInvDet->m_spsl);
					pXmlBuild.AddText(tmpBuf);
				}
				
				pXmlBuild.AddNode(pXmlBuild.m_parentElement[2], "hsdj");
				memset(tmpBuf, 0, sizeof(tmpBuf));
				sprintf(tmpBuf, "%.3lf00000", pInvDet->m_spdj);
				pXmlBuild.AddText(tmpBuf);
				
				if(invHead.m_kplx == JSK_RETURN_INV)
				{
					pXmlBuild.AddNode(pXmlBuild.m_parentElement[2], "hsje");
					memset(tmpBuf, 0, sizeof(tmpBuf));
					sprintf(tmpBuf, "-%.2lf", ((double)pInvDet->m_spje*1.0)/SUM_EXTENSION);
					pXmlBuild.AddText(tmpBuf);
				}
				else
				{
					pXmlBuild.AddNode(pXmlBuild.m_parentElement[2], "hsje");
					memset(tmpBuf, 0, sizeof(tmpBuf));
					sprintf(tmpBuf, "%.2lf", ((double)pInvDet->m_spje*1.0)/SUM_EXTENSION);
					pXmlBuild.AddText(tmpBuf);
				}
				
				pXmlBuild.AddNode(pXmlBuild.m_parentElement[2], "dj");
				memset(tmpBuf, 0, sizeof(tmpBuf));
				sprintf(tmpBuf, "%.3lf00000", pInvDet->m_dj);
				pXmlBuild.AddText(tmpBuf);
				
				pXmlBuild.AddNode(pXmlBuild.m_parentElement[2], "je");
				memset(tmpBuf, 0, sizeof(tmpBuf));
				sprintf(tmpBuf, "%.2lf", ((double)pInvDet->m_je*1.0)/SUM_EXTENSION);
				pXmlBuild.AddText(tmpBuf);
				
				pXmlBuild.AddNode(pXmlBuild.m_parentElement[2], "zsl");
				memset(tmpBuf, 0, sizeof(tmpBuf));
				sprintf(tmpBuf, "%.2lf", (double)pInvDet->m_sl);
				pXmlBuild.AddText(tmpBuf);
				
				pXmlBuild.AddNode(pXmlBuild.m_parentElement[2], "se");
				memset(tmpBuf, 0, sizeof(tmpBuf));
				sprintf(tmpBuf, "%.2lf", ((double)pInvDet->m_spse*1.0)/SUM_EXTENSION);
				pXmlBuild.AddText(tmpBuf);
			}

			nCount++;
			DBG_PRINT(("nCount = %u", nCount));
			date_StartNo = invHead.m_no;
			sprintf(sqlbuf, "WHERE KPRQ=%u and NO>%u limit 1", TempDate, date_StartNo);
			invHead.m_filter.append(sqlbuf);
			errcode = invHead.Load();			
		}

		//--------------------------------------------------
		//未找到票,查下一天
		//--------------------------------------------------
		if (errcode == SQLITE_DONE)
		{
			tmpDateTime ++;
			TempDate = tmpDateTime.FormatInt(YYYYMMDD);
			continue;
		}
		else
		{
			DBG_PRINT(("读数据库错误"));
			break;
		}
	}


	if( 1 != pXmlBuild.XMLConstructEnd(filename.c_str()) )
	{
		strErr = "报存XML文件错误!";
		return JSK_FAILURE;
	}

	UsbDiskUnMount();
	
	return JSK_SUCCESS;
}