我们公司的delphi代码,胆不是我写的!,看看,你觉得怎么样 - 癫狂编程?

我们公司的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 Ticket\'%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 Lot
    + 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 Lot
    + 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 Lot;
    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 Ticket\'%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 Lot;
    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.