⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 unitsmssend.pas

📁 CMPP3移动短信平台400条/S 稳定版
💻 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 + -