我们公司的delphi代码(胆不是我写的!),看看,你觉得怎么样

unit unt_LotBill_dyc;

interface

uses
  windows, SysUtils, Classes, ComCtrls, Forms, Controls, StrUtils, Math, superobject,
  SyncObjs, unt_ShareVar, unt_LotVar, uDycIFace;

type
  TLotBillDyc = class
  private
  protected
    class function FormatIssueForBill(LotID, AIssue: integer): string;
    class function CreateTicketID(LotID, OptID, ChipID: integer): string;
  public
    class function DoPostWithoutThread(const ALotID: Integer; const BillID, AnteCode,
      BillIssue: string; const ChipMul, TicketMoney, AOneMoney: Integer;
      const sPlayType:string=''): integer;
    class function InitParam(ErrMsgFlag: boolean = true): boolean;
    class function DoPrepare(const AChip: TChipProjInfo): integer;
    //投注相关操作
    class function DoPrint(const AChip: TChipProjInfo; AItem: TListItem;
      ShowErrFlag: boolean = true): integer;
    class function DoQueryAndFinishPrint(const AChip: TChipProjInfo): integer;
    class function PrintQuery(const AValue: ISuperObject): Integer;
  end;

implementation

uses
  DmLottery, unt_ActionDef, unt_ShareFunc, unt_LotShareFunc, uXcReqFun, unt_OptVar,
  unt_Lottery, LcUtils, unt_StrFunc;

{ 参数初始化 }
class function TLotBillDyc.InitParam(ErrMsgFlag: boolean): boolean;
var
  Version, md5key, url, partnerid: string;
begin
  url := GUserIniFile.ReadString(INI_BILL_ROOT, 'billurl_21', '');
  Version := GUserIniFile.ReadString(INI_BILL_ROOT, 'billuid_21', '1.0');
  partnerid := GUserIniFile.ReadString(INI_BILL_ROOT, 'billkey_21', '');
  md5key := GUserIniFile.ReadString(INI_BILL_ROOT, 'billpwd_21', ''); 
  if (url = '') or (md5key = '') then
  begin
    if ErrMsgFlag then
      TShareFunc.ShowWarn('对不起,请配置您的出票服务接口地址!');
    Exit;
  end;
  partnerid := TShareFunc.UncrypString(partnerid); //解密
  md5key := TShareFunc.UncrypString(md5key); //解密
  InitDycParam(Version,partnerid,md5key,url);
  //InitDycParam('31017736722','136016974','d4I9y24I9C3a1i9O','http://openapi.diyicai.com/enterpriseAPI/lotServiceCtrl!login.ac');
  Result := true;
end;

class function TLotBillDyc.FormatIssueForBill(LotID, AIssue: integer): string;
begin
  if LotID=LOT_ID_ELEVEN then
    Result := Copy(IntToStr(AIssue),3, 10)
  else
    Result := IntToStr(AIssue);
end;

class function TLotBillDyc.PrintQuery(const AValue: ISuperObject): Integer;
var
  sSql: string;
  res : ISuperObject;
  nChipMoney, nResult: integer;
begin
  Result := 0;
  res := DycTicketCheckOut(AValue.s['DycID']);
  if Assigned(res) then
  begin
    if res.i['Code'] = 9 then
    begin
      //出票成功
      nResult := 9;
      Result := Result + res.i['Value.amount'];
    end
    else if res.i['Code'] = 8 then
      //出票失败、撤单、流单
      nResult := 8
    else
    begin
      //其他
      nResult := 1;
    end;
    sSql := 'UPDATE Sale_LotBillRec SET BillReturn=''%s'', BillResult=%d WHERE TicketID=''%s''';
    sSql := Format(sSql, [res.AsJSon, nResult, AValue.s['LocID']]);
    dmLot.conShare.Execute(sSql);
  end;
end;

class function TLotBillDyc.DoPrepare(const AChip: TChipProjInfo): integer;
var
  obj: ISuperObject;
  sSql: string;
begin
  Result := 0;
  sSql := 'SELECT TicketID, BillOrder FROM Sale_LotBillRec WHERE (BillResult NOT IN (0,9)) AND LotID='
    + IntToStr(AChip.LotID) + ' AND OptID in ' + ZxhtGetProjID(AChip.OptID);
  dmLot.qryPublic.Close;
  dmLot.qryPublic.SQL.Text := sSql;
  dmLot.qryPublic.Open;
  while not dmLot.qryPublic.Eof do
  begin
    obj := SO;
    obj.S['DycID'] := dmLot.qryPublic.FieldByName('BillOrder').AsString;
    obj.S['LocID'] := dmLot.qryPublic.FieldByName('TicketID').AsString;
    dmLot.qryPublic.Next;
    Result:= Result + PrintQuery(obj);
  end;
  dmLot.qryPublic.Close;
end;

class function TLotBillDyc.DoQueryAndFinishPrint(const AChip: TChipProjInfo): integer;
var
  sSql, TIDs: string;
begin
  //先查询出票结果
  Self.DoPrepare(AChip);
  Result := 0;
  sSql := 'SELECT SUM(ChipMoney*ChipMul) FROM Sale_LotBillRec WHERE BillResult=9 AND LotID='
    + IntToStr(AChip.LotID) + ' AND OptID IN ' + ZxhtGetProjID(AChip.OptID);
  Result := dmLot.GetFirstValInt(sSql, 0);
  //如果出票成功则自动更新状态
  if (Result > 0) and (Result = AChip.ChipMoney) then
  begin
    sSql := 'SELECT BillOrder FROM Sale_LotBillRec WHERE LotID=%d AND OptId IN %s';
    sSql := Format(sSql, [AChip.LotID, ZxhtGetProjID(AChip.OptID)]);
    try
      TIDs := DmLot.GetSomeValStr(sSql, ',', True);
    except
      TIDs := '';
    end;
    if TIDs<>'' then
      XcFinishPrint(CurrUserInfo.UserID, AChip.LotID, AChip.OptID, TIDs)
    else
      Result:= 0;
  end
  else Result:=0;
end;

{ 生成唯一的出票票号 }
class function TLotBillDyc.CreateTicketID(LotID, OptID, ChipID: integer):string;
begin
  Result := IntToStr(OptID) + 'A' + IntToStr(ChipID);
end;

{ 不通过线程出票 }
class function TLotBillDyc.DoPostWithoutThread(const ALotID: Integer; const BillID, AnteCode, BillIssue: string;
  const ChipMul, TicketMoney, AOneMoney: Integer; const sPlayType:string=''): Integer;
var
  nResult: integer;
  DycID, sSql: string;
  res: ISuperObject;
begin
  Result := 0;
  DycID  := '';
  res := DycTicketPrint(ALotID, BillID, BillIssue, AnteCode, sPlayType, trunc(TicketMoney / AOneMoney), ChipMul, AOneMoney);
  if Assigned(res) then
  begin
    if res.I['Code'] = 1 then
    begin
      nResult:= 1;
      DycID  := res.S['Value.aOrderID'];
      Result := Result + TicketMoney * ChipMul;
    end
    else
      nResult := 3; //收单失败
    //更新出票记录
    sSql := 'UPDATE Sale_LotBillRec SET BillReturn=''%s'', BillResult=%d, BillMoney=%d, BillTime=''%s'', BillOrder=''%s'' WHERE TicketID=''%s''';
    sSql := Format(sSql, [res.AsJSon, nResult, Result, FormatDateTime('yyyy-mm-dd hh:nn:ss', now()), DycID, BillID]);
    dmLot.ExecuteUpdate(sSql);
  end;
end;

function objlstSort(List: TStringList; Index1, Index2: Integer): Integer;
begin
  Result:= StrToInt(List[Index1]) - StrToInt(List[Index2]);
end;
{ 出票 }
class function TLotBillDyc.DoPrint(const AChip: TChipProjInfo; AItem: TListItem; ShowErrFlag: boolean): integer;
var
  i: Integer;
  nOneMoney, nOneCount: integer;
  LastPt, sBillIssue, sBillChip: string;
  ssChip: TStringList;
  LotInfo: TSaleLotRec;
  { 执行出票打印, 返回出票成功金额 }
  function DoPostChip(ChipID: integer): integer;
  var
    chipobj: ISuperObject;
    nState, nBillMoney, nBillResult: integer;
    sSql, sBillID, sTicket, sValue: string;
  begin
    Result := 0;
    //系统流水号
    sBillID := Self.CreateTicketID(AChip.LotID, AChip.OptID, ChipID + 1);
    sTicket := sBillChip;
    //检查定单是否已经出票
    sSql := 'SELECT BillMoney*10+BillResult FROM Sale_LotBillRec WHERE LotID=%d AND OptID=%d AND ChipID=%d';
    sSql := Format(sSql, [AChip.LotID, AChip.OptID, ChipID + 1]);
    nState := dmLot.GetFirstValInt(sSql, -1);
    if nState >= 0 then
    begin
      nBillMoney := nState div 10;
      nState := nState mod 10;
    end;
    if (nState = 9) or (nState = 1) then
    begin
      if nState = 9 then
        Result := Result + nBillMoney;
      Exit;
    end;
    //插入出票记录
    if nState = -1 then
    begin
      try
        chipobj:=so;
        chipobj.S['pt']  := LastPt;
        chipobj.S['code']:= sBillChip;
        chipobj.I['onemoney'] := AChip.OneMoney;
        chipobj.i['chipmoney']:= nOneMoney;
        //插入出票记录
        sSql := 'INSERT INTO Sale_LotBillRec(TicketID, OptId, ChipID, LotID, LotIssue, UserChip,'
          + ' ChipMoney, ChipMul, PostTime, PostStr, BillSP)'
          + ' VALUES(''%s'', %d, %d, %d, %d, ''%s'', %d,%d, %s, ''%s'', 1010)';
        sSql := Format(sSql, [sBillID, AChip.OptID, ChipID + 1, AChip.LotID,
          AChip.LotIssue, chipobj.AsJSon , nOneMoney, AChip.ChipMul, dmLot.DbFunc_Now, sTicket]);
        dmLot.ExecuteUpdate(sSql);
      except
      end;
    end;
    //出票
    Result := Result + Self.DoPostWithoutThread(AChip.LotID, sBillID, sTicket, sBillIssue, achip.ChipMul,
      nOneMoney, AChip.OneMoney, LastPt);
  end;
  function TodyjCode(Acode: string): string;
  var
    k: Integer;
    lst, lst2: TStrings;
    ncount: Integer;
    tcode: string;
  begin
    lst := TStringList.Create;
    lst2 := TStringList.Create;
    lst.Text := Acode;
    for k := 0 to lst.Count - 1 do
    begin
      tcode := lst[k];
      ncount := TLottery.GetSomeChipCount(tcode, LotInfo.LotID, LotInfo.LotType, LotInfo.DsCodeNum, LotInfo.DsCodeNum2);
      nOneCount := nOneCount + ncount;
      if ncount = 1 then
        lst2.Add('ds|' + tcode)
      else
      begin
        if Pos('$', tcode) > 0 then
          lst2.Add('dt|' + tcode)
        else
          lst2.add('fs|' + tcode);
      end;
    end;
    result := lst2.text;
    lst.free;
    lst2.free;
  end;
begin
  Result := 0;
  if AChip.LotId<>LOT_ID_ELEVEN then
  begin
    if ShowErrFlag then
      TShareFunc.ShowWarn('对不起,该接口暂时只支持十一运夺金投注!');
    Exit;
  end;
  LastPt := '';
  sBillIssue:= Self.FormatIssueForBill(AChip.LotId, AChip.LotIssue);
  LotInfo := TLottery.GetOneSaleLottery(AChip.LotId);
  ssChip := TStringList.Create;
  try
    ssChip.Text := AChip.UserChip;
    ssChip.Sort;
    for i := 0 to ssChip.Count - 1 do
    begin
      if LastPt='' then
      begin
        LastPt:= TStrFunc.CopyLeft(ssChip.Strings[i], '|');
        sBillChip:= UpperCase(ssChip.Strings[i]);
      end else if UpperCase(LastPt)=UpperCase(TStrFunc.CopyLeft(ssChip.Strings[i], '|')) then
        sBillChip:= sBillChip + #13 + UpperCase(ssChip.Strings[i])
      else begin
        nOneCount := 0;
        sBillChip := TodyjCode(sBillChip);
        nOneMoney := nOneCount * 2;
        Result := Result + DoPostChip(i);
        //状态显示
        if Assigned(AItem) then
          AItem.SubItems.Strings[4] := IntToStr(((i + 1) * 100 div ssChip.Count)) + '%';
        Application.ProcessMessages;
        //重新装载
        LastPt:='';
        sBillChip:= '';
        LastPt:= TStrFunc.CopyLeft(ssChip.Strings[i], '|');
        sBillChip:= UpperCase(ssChip.Strings[i]);
      end;
    end;
    if (sBillChip<>'') and (LastPt<>'') then
    begin
      nOneCount := 0;
      sBillChip := TodyjCode(sBillChip);
      nOneMoney := nOneCount * 2;
      Result := Result + DoPostChip(I+1);
      //状态显示
      if Assigned(AItem) then
        AItem.SubItems.Strings[4] := IntToStr(((i + 1) * 100 div ssChip.Count)) + '%';
      Application.ProcessMessages;
    end;
    if Result <= 0 then
      XcCancelPrint(CurrUserInfo.UserID, AChip.LotID, 0, 'RecIDs=' + IntToStr(AChip.OptID));
  finally
    FreeAndNil(ssChip);
  end
end;

initialization

finalization

end.
原文地址:https://www.cnblogs.com/jijm123/p/10905219.html