我们公司的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.
请发表评论