📄 unitsmssend.pas
字号:
{****短信发送线程类****}
unit UnitSmsSend;
interface
uses
Classes, Windows, ADODB, SysUtils, StdCtrls, Forms, Variants, Activex, strutils;
type
unitsendsms = class(TThread)
private
{ Private declarations }
procedure LogSysRsp(Content, Terminal, FeeCode, FeeType, serviceid, smsid: string; FeeUserType, ReturnCode: Integer); //记录系统日志
procedure SendSingle(tmpquery: TADOQuery); //单条发送
procedure SendBatch(tmpquery: TADOQuery); //群发短信息
procedure GetSysFeedback(TmpQuery: TADOQuery); //获得系统返回信息
procedure GetSysRadiostation(TmpQuery: TADOQuery); //获得群发信息
procedure SetOrderedUserStatus(SimNo: string; ServiceID: string); //设置用户状态
procedure BatchFee(var slist: tstringlist; feecode, serviceid: string); //群发计费信息
protected
procedure Execute; override; //线程类执行过程重载
end;
implementation
uses UnitMain, UnitCode, cmpp;
//记录系统返回信息日志
procedure unitsendsms.LogSysRsp(Content, Terminal, FeeCode, FeeType, serviceid, smsid: string; FeeUserType, ReturnCode: Integer);
var
TmpQuery: TADOQuery;
begin
//记录发送短信信息到表log_sysfeedback
TmpQuery := TADOQuery.Create(nil);
TmpQuery.ConnectionString := 'FILE NAME=newsms.udl';
try
TmpQuery.Close;
TmpQuery.SQL.Clear;
TmpQuery.SQL.Add('insert into Log_SysFeedBack(simno,Content,warnid,FeeUserType,FeeCode,FeeType,serviceid,time,smsid) values(:p1,:p2,:p3,:p4,:p5,:p6,:p7,:p8,:p9)');
TmpQuery.Parameters.ParamValues['p1'] := Terminal;
TmpQuery.Parameters.ParamValues['p2'] := Content;
TmpQuery.Parameters.ParamValues['p3'] := ReturnCode;
TmpQuery.Parameters.ParamValues['p4'] := FeeUserType;
TmpQuery.Parameters.ParamValues['p5'] := FeeCode;
tmpQuery.Parameters.ParamValues['p6'] := FeeType;
tmpQuery.Parameters.ParamValues['p7'] := serviceid;
tmpQuery.Parameters.ParamValues['p8'] := datetimetostr(Now());
tmpQuery.Parameters.ParamValues['p9'] := smsid;
try
TmpQuery.ExecSQL;
except
PostMessage(frmmain.Handle, ShowRunInfo, 0, Integer(PChar('记录发送短消息日志错误!')));
end;
finally
tmpquery.Free;
end;
end;
//线程类执行过程
procedure unitsendsms.Execute;
var
TmpQuery: TADOQuery;
begin
Sleep(5000);
FreeOnTerminate := True;
Activex.CoInitialize(nil);
if InitCMPPAPI('cmppc.ini') = 0 then
PostMessage(frmmain.Handle, ShowRunInfo, 0, Integer(PChar('Sms Center Init OK!for send sms!')))
else
begin
PostMessage(frmmain.Handle, ShowRunInfo, 0, Integer(PChar('Sms Center Init Error!for send sms!')));
Activex.CoUninitialize;
Exit;
end;
TmpQuery := TADOQuery.Create(nil);
TmpQuery.ConnectionString := 'FILE NAME=newsms.udl';
try
while not Terminated do
begin
if Terminated then break;
Sleep(100);
//************单条短信息的处理************//
GetSysFeedback(tmpquery);
if not TmpQuery.IsEmpty then SendSingle(tmpquery);
//************单条短信息的处理************//
//*********群发短信息的处理***************//
GetSysRadiostation(tmpquery);
if not tmpquery.IsEmpty then SendBatch(tmpquery);
//*********群发短信息的处理***************//
end;
finally
SendActive := false;
TmpQuery.Free;
Activex.CoUninitialize;
end;
end;
procedure unitsendsms.SendSingle(tmpquery: TADOQuery);
var
pBinInfo: TBininfo;
i, errorcode: integer;
content,
simno,
feetype,
smsid,
ServiceID,
spcode,
feecode: string;
userfeetype: byte;
nNeedReply,
Msg_Fmt,
TpPid,
TpUdhi,
TpSequence: integer;
begin
//初始化content,nNeedReply,UserFeeType,FeeType,simno,Serviceid,TpPid,tpudhi,msg_fmt.
content := trim(tmpquery.fieldbyname('content').AsString);
nNeedReply := NEED_REPLY_NO;
userfeetype := Byte(TmpQuery.FieldValues['FeeUserType']);
feetype := VarToStr(TmpQuery.FieldValues['FeeType']);
simno := tmpquery.fieldbyname('simno').asstring;
serviceid := tmpquery.fieldbyname('serviceid').AsString;
TpPid := TPPID_ASCII;
tpudhi := TPUDHI_ASCII;
msg_fmt := MSG_FORMAT_ASCII;
spcode := VarToStr(TmpQuery.FieldValues['spcode']);
feecode := VarToStr(TmpQuery.FieldValues['feecode']);
//初始化完成
try
if leftstr(content, 7) = '<#BIN#>' then
begin
msg_Fmt := MSG_FORMAT_BINARY;
TpPid := TPPID_BINARY;
tpudhi := TPUDHI_BINARY;
TpSequence := 1;
GetBininfo(content, pBininfo);
for i := 1 to pbininfo.filecount do
begin
content := readbinfile('resource\' + pbininfo.filename + '.dat.' + inttostr(i));
try
if SendSmsSingle(spcode, simno, content, feetype, feecode, userfeetype, ErrorCode,
ServiceID, Msg_Fmt, TpPid, TpUdhi, nNeedReply, smsid) = 0 then
begin
inc(TpSequence);
if TpSequence > 1 then feetype := '01';
unitcode.InsertCmppQuery(serviceid);
PostMessage(frmmain.Handle, GetCountInfo, 1, 1);
PostMessage(frmmain.Handle, ShowRunInfo, 21, Integer(PChar('Send SMS OK to ' + simno)));
LogSysRsp(pbininfo.filename, simno, feecode, feetype, serviceid, smsid, userfeetype, ErrorCode);
end
else
begin
//发送失败,log
PostMessage(frmmain.Handle, GetCountInfo, 2, 2);
PostMessage(frmmain.Handle, ShowRunInfo, 21, Integer(PChar('Send SMS Error to ' + simno)));
LogSysRsp(pbininfo.filename, simno, feecode, feetype, serviceid, smsid, userfeetype, ErrorCode);
end;
except
PostMessage(frmmain.Handle, ShowRunInfo, 21, Integer(PChar('Send SMS Error,and Need Reboot!')));
end;
end;
end
else
begin
//检查关键字发送
{if FindSensitiveWord(content) then
begin
PostMessage(frmmain.Handle, ShowRunInfo, 0, Integer(PChar('Find Sensitive Word!')));
exit;
end; }
if leftstr(content, 7) = '<#FEE#>' then
begin
nNeedReply := NEED_REPLY_YES;
content := copy(content, 8, length(content) - 7);
userfeetype := 0; //更改处在这里进行试验,完后恢复参数
feetype := '03';
end;
try
if SendSmsSingle(spcode, simno, content, feetype, feecode, userfeetype, ErrorCode, ServiceID,
Msg_Fmt, TpPid, TpUdhi, nNeedReply, smsid) = 0 then
begin
if nNeedReply = NEED_REPLY_YES then
begin
//计算费用成功
SetOrderedUserStatus(simno, serviceid);
end;
InsertCmppQuery(serviceid);
PostMessage(frmmain.Handle, GetCountInfo, 1, 1);
PostMessage(frmmain.Handle, ShowRunInfo, 21, Integer(PChar('Send SMS OK to ' + simno)));
LogSysRsp(content, simno, feecode, feetype, serviceid, smsid, userfeetype, ErrorCode);
end
else
begin
//发送失败,log
PostMessage(frmmain.Handle, GetCountInfo, 2, 2);
PostMessage(frmmain.Handle, ShowRunInfo, 21, Integer(PChar('Send SMS Error to ' + simno)));
LogSysRsp(content, simno, feecode, feetype, serviceid, smsid, userfeetype, ErrorCode);
end;
except
PostMessage(frmmain.Handle, ShowRunInfo, 21, Integer(PChar('Send SMS Error,and Need Reboot!')));
end;
end;
finally
TmpQuery.Close;
TmpQuery.SQL.Clear;
TmpQuery.SQL.Add('delete from Queue_SysFeedBack where ID=(select min(id) from Queue_SysFeedBack)');
try
TmpQuery.ExecSQL;
except
PostMessage(frmmain.Handle, ShowRunInfo, 0, Integer(PChar('删除队列表中记录错误!')));
end;
end;
end;
procedure unitsendsms.SendBatch(tmpquery: TADOQuery);
var
serviceid,
content,
SQLStr,
feecode,
MsgIdFile: string;
Qry: TADOQuery;
slist: tstringlist;
nNeedReply: integer;
begin
{以下是对群发短信息的处理,radiostation表保存有群发短信的信息 }
nNeedReply := NEED_REPLY_NO;
SQLStr := '';
serviceid := tmpquery.fieldbyname('serviceid').AsString;
content := tmpquery.fieldbyname('content').AsString;
feecode := tmpquery.fieldbyname('feecode').AsString;
//判断如果是包月用户收费则取status<>0的,nNeedReply设置为0
if leftstr(content, 7) = '<#FEE#>' then
begin
content := rightstr(content, length(content) - 7);
SQLStr := ' and status<>0';
nNeedReply := NEED_REPLY_YES;
end;
Qry := TADOQuery.Create(nil);
Qry.ConnectionString := 'FILE NAME=newsms.udl';
slist := tstringlist.Create;
try
with Qry do
begin
sql.Text := 'select simno from ordereduser where serviceid=' + '''' + serviceid + '''' + SQLStr;
open;
while not eof do
begin
slist.Add(fieldbyname('simno').AsString);
next;
end;
end;
if nNeedReply = NEED_REPLY_YES then
begin
BatchFee(slist, feecode, serviceID);
exit;
end;
slist.SaveToFile(PHONENO_TXT);
slist.Clear;
slist.Add(content);
slist.SaveToFile(MSGCONTENT_TXT);
finally
slist.Free;
Qry.Free;
//无论什么类型短信,在这里都做删除处理。
TmpQuery.Close;
TmpQuery.SQL.Clear;
TmpQuery.SQL.Add('delete from radiostation where ID=(select min(id) from radiostation)');
try
TmpQuery.ExecSQL;
except
PostMessage(frmmain.Handle, ShowRunInfo, 0, Integer(PChar('删除radiostation表中记录错误!')));
end;
end;
//以上为群发用户计费处理,如果为计费,则以下处理省略
try
if SendSmsBatch(serviceid, MSG_FORMAT_ASCII, '03', feecode, GTD_SPCODE, PHONENO_TXT, MSGCONTENT_TXT, MSGID_TXT, 0, nNeedReply) = 0 then
begin
//写状态分析报告
InsertCmppQuery(serviceid);
//保存MSGID文件
MsgIdFile := 'msgidfile\' + formatdatetime('yymmddhhnnss', now) + '.txt';
copyfile(pchar(MSGID_TXT), pchar(msgidfile), false);
PostMessage(frmmain.Handle, GetCountInfo, 1, 1);
PostMessage(frmmain.Handle, ShowRunInfo, 21, Integer(PChar('Send Batch SMS OK '))); //记录日志
LogSysRsp(MsgIdFile,'BatchSendOK', feecode, '03', serviceid, '0', 0, 0);
end
else
begin
PostMessage(frmmain.Handle, GetCountInfo, 2, 2);
PostMessage(frmmain.Handle, ShowRunInfo, 21, Integer(PChar('Send SMS Error to' + VarToStr(TmpQuery.FieldValues['SimNo']))));
LogSysRsp('error','Batch ERROR', feecode, '03', serviceid, '0', 0, 1);
end;
except
PostMessage(frmmain.Handle, ShowRunInfo, 21, Integer(PChar('Send SMS Error,and Need Reboot!')));
end;
end;
procedure unitsendsms.GetSysFeedback(TmpQuery: TADOQuery);
begin
//从队列表中取的数据
TmpQuery.Close;
TmpQuery.SQL.Clear;
TmpQuery.SQL.Add('select * from Queue_SysFeedBack where id=(select min(id) from Queue_SysFeedBack)');
try
TmpQuery.Open;
except
PostMessage(frmmain.Handle, ShowRunInfo, 0, Integer(PChar('Conn DB Error!Send thread restart')));
end;
end;
procedure unitsendsms.GetSysRadiostation(TmpQuery: TADOQuery);
begin
TmpQuery.Close;
TmpQuery.SQL.Clear;
TmpQuery.SQL.Add('select * from radiostation where id=(select min(id) from radiostation)');
try
TmpQuery.Open;
except
PostMessage(frmmain.Handle, ShowRunInfo, 0, Integer(PChar('Conn RadioStationDB Error!Send thread restart')));
end;
end;
procedure unitsendsms.setOrderedUserStatus(simno: string; serviceid: string);
var
TmpQuery: TADOQuery;
begin
TmpQuery := TADOQuery.Create(nil);
TmpQuery.ConnectionString := 'FILE NAME=newsms.udl';
TmpQuery.Close;
TmpQuery.SQL.Clear;
//TmpQuery.SQL.Add('update ordereduser set status=1 where simno=' + '''' + simno + '''' + ' and serviceid=' + '''' + serviceid + '''');
TmpQuery.SQL.Add('exec updateuser '+''''+simno+''''+','+''''+serviceid+'''');
try
TmpQuery.execsql;
except
PostMessage(frmmain.Handle, ShowRunInfo, 0, Integer(PChar('Conn RadioStationDB Error!Send thread restart')));
end;
end;
//包月用户循环进行计费
procedure unitsendsms.BatchFee(var slist: tstringlist; feecode,
serviceid: string);
var
i: integer;
TMPQuery: TADOQuery;
begin
if slist.Count = 0 then exit;
TmpQuery := TADOQuery.Create(nil);
TmpQuery.ConnectionString := 'FILE NAME=newsms.udl';
try
for i := 0 to slist.Count - 1 do
begin
TmpQuery.Close;
TmpQuery.SQL.Clear;
TmpQuery.SQL.Text := 'insert into Queue_SysFeedBack(simno,content,destaddr,feetype,feeusertype,feecode,serviceid,spcode)' +
'values(' + '''' + slist.Strings[i] + '''' + ',' + '''' + '<#FEE#>' + slist.Strings[i] + '''' + ',' + '''' + cmpp.GTD_SPCODE + '''' + ','
+ '''' + '01' + '''' + ',' + inttostr(2) + ',' + '''' + feecode + '''' + ',' + '''' + serviceid + '''' + ',' + '''' + cmpp.GTD_SPCODE + '''' + ')';
try
TmpQuery.execsql;
except
PostMessage(frmmain.Handle, ShowRunInfo, 0, Integer(PChar(slist.Strings[i] + '包月计费失败')));
end;
end;
finally
tmpquery.Free;
end;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -