CorpSms/DLG_Send_Inport.cpp
2025-02-27 16:58:16 +08:00

514 lines
13 KiB
C++

// DLG_Send_Inport.cpp : implementation file
//
#include "stdafx.h"
#include "corpsms.h"
#include "DLG_Send_Inport.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// DLG_Send_Inport dialog
DLG_Send_Inport::DLG_Send_Inport(CWnd* pParent /*=NULL*/)
: CDialog(DLG_Send_Inport::IDD, pParent)
{
//{{AFX_DATA_INIT(DLG_Send_Inport)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
m_bInport = true;
m_pSend = (DLG_Send *)pParent;
m_pSendFax = (DLG_SendFax *)pParent;
m_pSendMms = (DLG_SendMms *)pParent;
m_pSendQQTX = (DLG_QXBox_Group_Modify *)pParent;
m_lType = 0;
}
void DLG_Send_Inport::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(DLG_Send_Inport)
DDX_Control(pDX, IDC_USER_SEND_RECORD_SPLIT, m_C_RecordSplit);
DDX_Control(pDX, IDC_SEND_INPORT_FIELD_SPLIT, m_C_FieldSplit);
DDX_Control(pDX, IDC_SEND_INPORT_S1, m_B_Tips);
DDX_Control(pDX, IDC_SEND_INPORT_LIST, m_L_List);
DDX_Control(pDX, IDC_SEND_INPORT_FILENAME, m_E_FileName);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(DLG_Send_Inport, CDialog)
//{{AFX_MSG_MAP(DLG_Send_Inport)
ON_BN_CLICKED(IDC_SEND_INPORT_SELALL, OnSendInportSelall)
ON_BN_CLICKED(IDC_SEND_INPORT_CLEAR, OnSendInportClear)
ON_BN_CLICKED(IDC_SEND_INPORT_GETFILE, OnSendInportGetfile)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// DLG_Send_Inport message handlers
BOOL DLG_Send_Inport::OnInitDialog()
{
CDialog::OnInitDialog();
if ( !m_bInport )
{
this->SetWindowText(_T("导入发送列表(*.txt , *.csv)"));
CWnd * pWnd = (CWnd*)GetDlgItem(IDOK);
pWnd->SetWindowText(_T("导 出"));
pWnd = (CWnd*)GetDlgItem(IDC_SEND_INPORT_S2);
pWnd->SetWindowText(_T("导出字段与顺序(拖动选择,打勾为导出字段)"));
pWnd = (CWnd*)GetDlgItem(IDC_SEND_INPORT_S1);
pWnd->SetWindowText(_T("导出txt/csv文件名"));
m_C_FieldSplit.EnableWindow(false);
m_C_RecordSplit.EnableWindow(false);
}
m_C_FieldSplit.SetCurSel(0);
m_C_RecordSplit.SetCurSel(0);
InitList();
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void DLG_Send_Inport::InitList()
{
m_L_List.Init(true,1,-1,-1);
m_L_List.InsertColumn( 0 , _T("顺序") , LVCFMT_LEFT , 40 , 0);
m_L_List.InsertColumn( 1 , _T(" 字段名") , LVCFMT_LEFT , 120 , 1);
m_L_List.SetTextColor( RGB(0,0,255) );
switch(m_lType)
{
case 2:
{
TCHAR * pItem[] =
{
_T("姓 名"),
_T("传真号码"),
};
TCHAR Buf[256];
for ( int i = 0 ; i<2 ; i++ )
{
m_L_List.InsertItem( i , _itot(i+1,Buf,10) );
m_L_List.SetItemText(i , 1 , pItem[i] );
m_L_List.SetItemData(i , i ); //设置这个是为了顺序不至于打乱
}
}
break;
case 3:
{
TCHAR * pItem[] =
{
_T("姓 名"),
_T("手机号码"),
};
TCHAR Buf[256];
for ( int i = 0 ; i<2 ; i++ )
{
m_L_List.InsertItem( i , _itot(i+1,Buf,10) );
m_L_List.SetItemText(i , 1 , pItem[i] );
m_L_List.SetItemData(i , i ); //设置这个是为了顺序不至于打乱
}
}
break;
case 4:
{
TCHAR * pItem[] =
{
_T("姓 名"),
_T("手机号码"),
};
TCHAR Buf[256];
for ( int i = 0 ; i<2 ; i++ )
{
m_L_List.InsertItem( i , _itot(i+1,Buf,10) );
m_L_List.SetItemText(i , 1 , pItem[i] );
m_L_List.SetItemData(i , i ); //设置这个是为了顺序不至于打乱
}
}
break;
default:
{
TCHAR * pItem[] =
{
_T("姓 名"),
_T("手机号码"),
_T("昵 称"),
_T("备 注"),
};
TCHAR Buf[256];
for ( int i = 0 ; i<4 ; i++ )
{
m_L_List.InsertItem( i , _itot(i+1,Buf,10) );
m_L_List.SetItemText(i , 1 , pItem[i] );
m_L_List.SetItemData(i , i ); //设置这个是为了顺序不至于打乱
}
}
}
m_L_List.NoverCheck();
m_L_List.ReShowSort();
}
void DLG_Send_Inport::OnSendInportSelall()
{
m_L_List.CheckAll();
}
void DLG_Send_Inport::OnSendInportClear()
{
m_L_List.ClearAll();
}
void DLG_Send_Inport::OnSendInportGetfile()
{
#define FILE_FILTER_TEXT \
TEXT("txt文本文件 (*.txt)\0*.txt\0")\
TEXT("Excel csv 文件 (*.csv)\0*.csv\0")\
TEXT("所有文件 (*.*)\0*.*;\0\0")
if ( m_bInport )
{
TCHAR szFile[ 256 ];
TCHAR szFileB[ 256 ];
*szFileB = NULL;
_stprintf( szFile , _T("*.txt") );
OPENFILENAME sOpen;
sOpen.lStructSize = sizeof( sOpen );
sOpen.hwndOwner = this->m_hWnd ;
sOpen.Flags = OFN_EXPLORER|OFN_OVERWRITEPROMPT|OFN_HIDEREADONLY;
sOpen.lpstrFilter = FILE_FILTER_TEXT;
sOpen.lpstrDefExt = _T("txt");
sOpen.lpstrCustomFilter = NULL;
sOpen.nMaxCustFilter = 0;
sOpen.lpstrFile = szFile;
sOpen.nMaxFile = sizeof( szFile );
sOpen.lpstrFileTitle = szFileB;
sOpen.nMaxFileTitle = sizeof( szFileB );
sOpen.lpstrInitialDir = NULL;
sOpen.lpstrTitle = _T("打开导入发送列表的文件");
if ( ::GetOpenFileName( &sOpen ) )
{
m_E_FileName.SetWindowText(sOpen.lpstrFile);
return ;
}
}
else
{
TCHAR szFile[ 256 ];
TCHAR szFileB[ 256 ];
*szFileB = NULL;
_stprintf( szFile , _T("Address") );
OPENFILENAME sOpen;
sOpen.lStructSize = sizeof( sOpen );
sOpen.hwndOwner = this->m_hWnd ;
sOpen.Flags = OFN_EXPLORER|OFN_OVERWRITEPROMPT|OFN_HIDEREADONLY;
sOpen.lpstrFilter = FILE_FILTER_TEXT;
sOpen.lpstrDefExt = _T("txt");
sOpen.lpstrCustomFilter = NULL;
sOpen.nMaxCustFilter = 0;
sOpen.lpstrFile = szFile;
sOpen.nMaxFile = sizeof( szFile );
sOpen.lpstrFileTitle = szFileB;
sOpen.nMaxFileTitle = sizeof( szFileB );
sOpen.lpstrInitialDir = NULL;
sOpen.lpstrTitle = _T("选择导出发送列表的文件");
if ( ::GetSaveFileName( &sOpen ) )
{
m_E_FileName.SetWindowText(sOpen.lpstrFile);
}
}
}
void DLG_Send_Inport::SetInport( BOOL bInport)
{
m_bInport = bInport;
}
void DLG_Send_Inport::OnOK()
{
long lItemCount = m_L_List.GetItemCount();
long lExPortItem[50];memset(&lExPortItem,0,sizeof(lExPortItem));
for ( int j=0 ; j < 50 ; j++ ) lExPortItem[j] = -1;
long lCheckCount = 0;
for ( int i=0 ; i<lItemCount ; i++ )
{
if ( m_L_List.GetCheck(i) )
{
lExPortItem[lCheckCount] = m_L_List.GetItemData(i) ;
lCheckCount ++;
}
}
if ( lCheckCount <=0 )
{
if ( m_bInport )
MessageBox( _T("你必须从左边的字段列表中选择一个或多个导入字段。") , _T("选择错误") , MB_OK|MB_ICONWARNING );
else
MessageBox( _T("你必须从左边的字段列表中选择一个或多个导出字段。") , _T("选择错误") , MB_OK|MB_ICONWARNING );
return ;
}
TCHAR szFileName[512];
m_E_FileName.GetWindowText( szFileName , sizeof(szFileName) );
if ( _tcslen(AllTrim(szFileName)) <=0 )
{
if ( m_bInport )
MessageBox( _T("你必须输入导入的文件名。") , _T("错误") , MB_OK|MB_ICONWARNING );
else
MessageBox( _T("你必须输入导出的文件名。") , _T("错误") , MB_OK|MB_ICONWARNING );
m_E_FileName.SetFocus();
return ;
}
if ( m_bInport )
{
//取分隔
TCHAR szFieldSplit[8]={0};
TCHAR szRecordSplit[8]={0};
m_C_FieldSplit.GetWindowText( szFieldSplit , sizeof(szFieldSplit));
m_C_RecordSplit.GetWindowText( szRecordSplit , sizeof(szRecordSplit));
if ( _tcslen( szRecordSplit )<=0 )
{
MessageBox( _T("记录分隔不能为空,请输入!") , _T("错误") , MB_ICONWARNING );
m_C_RecordSplit.SetFocus();
return ;
}
if ( !_tcsncmp(szRecordSplit,_T("换行"),4) )
{
_tcscpy( szRecordSplit,_T("\n") );
}
if ( _tcslen( szFieldSplit )<=0 )
{
MessageBox( _T("字段分隔不能为空,请输入!") , _T("错误") , MB_ICONWARNING );
m_C_FieldSplit.SetFocus();
return ;
}
szFieldSplit[1]=0; //字段分隔只能是一个字符
CFile fTalk;
if ( !fTalk.Open( szFileName , CFile::modeRead ) )
{
TCHAR Buf[512];
_stprintf( Buf , _T("打开文件:%s\n产生错误!") , szFileName );
MessageBox( Buf , _T("错误") , MB_ICONWARNING|MB_OK );
return ;
}
TCHAR szPNBuf[512];
TCHAR szName[512];
long lLineCount = 0; //计算行数
long lNameCount = 0; //计算用户数
Send_User user;
m_pSend->m_wndList.ShowWindow( SW_HIDE ); //为了加快速度
this->BeginWaitCursor();
#ifdef UNICODE
TCHAR szTemp[512]={0};
char szTempA[512]={0};
char szPNBuf2[512]={0};
char szRecordSplit2[512]={0};
strcpy(szRecordSplit2,CAdoRecordSet::Ado_W2A(szRecordSplit,szTempA));
#endif
while ( true )
{
memset( szPNBuf , 0 , sizeof( szPNBuf ) );
#ifdef UNICODE
if ( ReadLine( &fTalk , szRecordSplit2, szPNBuf2 , sizeof( szPNBuf2 )-5 ) )
{
_tcscpy(szPNBuf,CAdoRecordSet::Ado_A2W(szPNBuf2,szTemp));
#else
if ( ReadLine( &fTalk , szRecordSplit, szPNBuf , sizeof( szPNBuf )-5 ) )
{
#endif
ExChar( szPNBuf , _T("\r") );
ExChar( szPNBuf , _T("\n") );
ExChar( szPNBuf ,szRecordSplit );
for ( i=0;i<5;i++ )
{
_tcscat( szPNBuf , szFieldSplit );
}
memset( &user , 0 , sizeof(Send_User) );
for ( i=0 ; i<lCheckCount ; i++ )
{
memset(szName , 0 , sizeof(szName) );
GetReqMess( szPNBuf , szName , i , szFieldSplit[0] );
AllTrim(szName);
ExChar(szName,_T("\r"));
ExChar(szName,_T("\n"));
ExChar(szName,_T("\t"));
switch (lExPortItem[i])
{
case 0: //姓名
_tcscpy(user.szName , szName );
break;
case 1: //手机
_tcscpy(user.szMobile , szName );
break;
case 2: //昵称
_tcscpy( user.szNickName , szName );
break;
case 3: //备注
_tcscpy( user.szBZ , szName );
break;
}
}
if ( _tcslen(user.szName) <= 0 )
_stprintf( user.szName , _T("IP%d") , lNameCount );
if (_tcslen(user.szName) >0 && _tcslen(user.szMobile) >0 )
{
//添加用户
m_pSend->AddUser(user , -1);
lNameCount ++;
_stprintf( szName , _T("现正处理->%d") , lNameCount );
m_B_Tips.SetWindowText( szName );
}
lLineCount ++;
}
else
{
break;
}
}
m_pSend->m_wndList.ShowWindow( SW_SHOW ); //为了加快速度
this->EndWaitCursor();
fTalk.Close();
_stprintf(szName , _T("导入发送列表成功,具体如下:\n导入文件类型:TXT\n导入记录数:%d\n文件总行数:%d\n导入文件名:%s") , lNameCount , lLineCount, szFileName);
MessageBox( szName , _T("导入成功"),MB_OK|MB_ICONINFORMATION );
}
else
{
CFile fTalk;
if ( !fTalk.Open( szFileName , CFile::modeReadWrite|CFile::modeCreate ) )
{
TCHAR Buf[512];
_stprintf( Buf , _T("创建文件:%s\n产生错误!") , szFileName );
MessageBox( Buf , _T("错误") , MB_ICONWARNING|MB_OK );
return ;
}
CListCtrl * pList = &m_pSend->m_wndList;
if ( m_lType==2 )
pList = &m_pSendFax->m_wndList;
if ( m_lType==3 )
pList = &m_pSendMms->m_wndList;
if ( m_lType==4 )
pList = &m_pSendQQTX->m_wndList;
long lAdrCount =pList->GetItemCount();
TCHAR Buf[1024];
TCHAR Buf2[256];
long lRecnCount= 0; //总记录数
long lFileSize = 0; //文件总字节数
long lBufLen = 0;
for ( i = 0; i<lAdrCount ; i++ )
{
memset(Buf , 0 , sizeof(Buf) );
for( int j = 0 ; j< lCheckCount ; j++ ) //按按所选中的字段,取通讯录内容进行保存。
{
memset(Buf2 , 0 , sizeof(Buf2) );
if ( m_lType==2 || m_lType==4)
{
switch( lExPortItem[j] )
{
case 0: //姓名
pList->GetItemText( i , 0 , Buf2 , sizeof(Buf2) );
break;
case 1: //手机
pList->GetItemText( i , 1 , Buf2 , sizeof(Buf2) );
break;
}
}
else
{
switch( lExPortItem[j] )
{
case 0: //姓名
pList->GetItemText( i , 0 , Buf2 , sizeof(Buf2) );
break;
case 1: //手机
pList->GetItemText( i , 2 , Buf2 , sizeof(Buf2) );
break;
case 2: //昵称
pList->GetItemText( i , 1 , Buf2 , sizeof(Buf2) );
break;
case 3: //备注
pList->GetItemText( i , 5 , Buf2 , sizeof(Buf2) );
break;
}
}
_tcscat(Buf , Buf2 );
if ( j < lCheckCount-1 ) //最后一条不用加","号
_tcscat(Buf , _T(",") );
}
_tcscat(Buf , _T("\r\n") ); //换行
lBufLen = _tcslen(Buf);
#ifdef _UNICODE
CStringA strA = CW2A(Buf);
fTalk.Write( strA , strA.GetLength() );
#else
fTalk.Write( Buf , lBufLen );
#endif
lRecnCount++; //取得总记录数
lFileSize = lFileSize + lBufLen ; //取得总字节数
}
fTalk.Close();
this->EndWaitCursor();
_stprintf(Buf , _T("导出发送列表成功,具体如下:\n导出文件类型:TXT\n导出记录数:%d\n导出字节数:%d\n导出文件名:%s") , lRecnCount , lFileSize , szFileName);
MessageBox( Buf , _T("导出成功"),MB_OK|MB_ICONINFORMATION );
}
CDialog::OnOK();
}
long DLG_Send_Inport::ReadLine(CFile *file, char* pSplit,char *szBuf, long lLen)
{
int i,j;
int lLineCount = 0;
int lSplitLen = strlen(pSplit);
char c;
i = 0;
while ( true )
{
j = file->Read( &c , 1 );
if ( j < 1 )
{
szBuf[i]=0;
return i;
}
if ( i >= lLen-1 )
{
szBuf[i] = 0;
return i;
}
szBuf[i] = c;
i++;
if ( !memcmp( szBuf+i-lSplitLen , pSplit , lSplitLen ) ) //换行标志
{
szBuf[i] = 0;
return i;
}
}
return 0;
}
void DLG_Send_Inport::SetType(long lType)
{
m_lType = lType;
}