我们公司的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),, )
else
Result := IntToStr(AIssue);
end; class function TLotBillDyc.PrintQuery(const AValue: ISuperObject): Integer;
var
sSql: string;
res : ISuperObject;
nChipMoney, nResult: integer;
begin
Result := ;
res := DycTicketCheckOut(AValue.s['DycID']);
if Assigned(res) then
begin
if res.i['Code'] = then
begin
//出票成功
nResult := ;
Result := Result + res.i['Value.amount'];
end
else if res.i['Code'] = then
//出票失败、撤单、流单
nResult :=
else
begin
//其他
nResult := ;
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 := ;
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 := ;
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, );
//如果出票成功则自动更新状态
if (Result > ) 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:= ;
end
else Result:=;
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 := ;
DycID := '';
res := DycTicketPrint(ALotID, BillID, BillIssue, AnteCode, sPlayType, trunc(TicketMoney / AOneMoney), ChipMul, AOneMoney);
if Assigned(res) then
begin
if res.I['Code'] = then
begin
nResult:= ;
DycID := res.S['Value.aOrderID'];
Result := Result + TicketMoney * ChipMul;
end
else
nResult := ; //收单失败
//更新出票记录
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 := ;
//系统流水号
sBillID := Self.CreateTicketID(AChip.LotID, AChip.OptID, ChipID + );
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 + ]);
nState := dmLot.GetFirstValInt(sSql, -);
if nState >= then
begin
nBillMoney := nState div ;
nState := nState mod ;
end;
if (nState = ) or (nState = ) then
begin
if nState = then
Result := Result + nBillMoney;
Exit;
end;
//插入出票记录
if nState = - 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 + , 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 := to lst.Count - do
begin
tcode := lst[k];
ncount := TLottery.GetSomeChipCount(tcode, LotInfo.LotID, LotInfo.LotType, LotInfo.DsCodeNum, LotInfo.DsCodeNum2);
nOneCount := nOneCount + ncount;
if ncount = then
lst2.Add('ds|' + tcode)
else
begin
if Pos('$', tcode) > then
lst2.Add('dt|' + tcode)
else
lst2.add('fs|' + tcode);
end;
end;
result := lst2.text;
lst.free;
lst2.free;
end;
begin
Result := ;
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 := to ssChip.Count - 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 + # + UpperCase(ssChip.Strings[i])
else begin
nOneCount := ;
sBillChip := TodyjCode(sBillChip);
nOneMoney := nOneCount * ;
Result := Result + DoPostChip(i);
//状态显示
if Assigned(AItem) then
AItem.SubItems.Strings[] := IntToStr(((i + ) * 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 := ;
sBillChip := TodyjCode(sBillChip);
nOneMoney := nOneCount * ;
Result := Result + DoPostChip(I+);
//状态显示
if Assigned(AItem) then
AItem.SubItems.Strings[] := IntToStr(((i + ) * div ssChip.Count)) + '%';
Application.ProcessMessages;
end;
if Result <= then
XcCancelPrint(CurrUserInfo.UserID, AChip.LotID, , 'RecIDs=' + IntToStr(AChip.OptID));
finally
FreeAndNil(ssChip);
end
end; initialization finalization end.
我们公司的delphi代码(胆不是我写的!),看看,你觉得怎么样的更多相关文章
- Winsock完成端口模型-Delphi代码
原文出处 <Windows网络编程技术>第8章 完成端口模型 由于原书附的是C代码,我把其翻译成Delphi代码. 其中winsock2.pas在delphi中不带,要另外下载http:/ ...
- Delphi代码中嵌入ASM代码
前言 Delphi作为一个快速高效的开发平台,使用的人越来越多,但熟悉在Delphi代码中嵌入ASM代码的程序员我想不多,因为这方面的资料太少了,另一方面,它还需要有基本的汇编语言知识,关於汇编语言的 ...
- Delphi代码中嵌入ASM代码(简单明了)
前言 Delphi作为一个快速高效的开发平台,使用的人越来越多,但熟悉在Delphi代码中嵌入ASM代码的程序员我想不多,因为这方面的资料太少了,另一方面,它还需要有基本的汇编语言知识,关於汇编语言的 ...
- 公司和家里代码文件同步方案: (git和dropbox实现)
公司和家里代码文件同步方案: (git和dropbox实现) 参与公司福利购入了有补贴的macbook pro后, 就不用上下班背着电脑了. 但是也出现了另外一问题: 家里和公司代码同步的问题 公司有 ...
- Delphi 如何在程序中执行动态生成的Delphi代码
如何在程序中执行动态生成的Delphi代码 经常发现有人提这类问题,或者提问内容最后归结成这种问题 前些阵子有位高手写了一个“执行动态生成的代码”,这是真正的高手,我没那种功力,我只会投机取巧. 这里 ...
- 如何在程序中执行动态生成的Delphi代码
如何在程序中执行动态生成的Delphi代码 经常发现有人提这类问题,或者提问内容最后归结成这种问题 前些阵子有位高手写了一个“执行动态生成的代码”,这是真正的高手,我没那种功力,我只会投机取巧. 这里 ...
- Delphi代码创建形式规范 1.0
Delphi代码创建形式规范 1.0 本规范的目的:给自己的代码一个统一而标准的外观,增强 可读性,可理解性,可维护性 本规范的原则:名称反映含义,形式反映结构 1.单元风格 ...
- Delphi 设计模式:《HeadFirst设计模式》Delphi代码---模式小结之一个叫声接口和几只鸭子[转]
一.一个叫声接口和几只鸭子 从一个叫声接口开始. {<HeadFirst设计模式>Delphi代码之模式小结 } { 一个叫声接口 } ...
- 只有20行Javascript代码!手把手教你写一个页面模板引擎
http://www.toobug.net/article/how_to_design_front_end_template_engine.html http://barretlee.com/webs ...
随机推荐
- 17JQuery
1. 概念 一个JavaScript框架.简化JS开发 jQuery是一个快速.简洁的JavaScript框架,是继Prototype之后又一个优秀的JavaScript代码库(或JavaScrip ...
- CLI
命令行界面(英语:command-line interface,缩写:CLI)是在图形用户界面得到普及之前使用最为广泛的用户界面,它通常不支持鼠标,用户通过键盘输入指令,计算机接收到指令后,予以执行. ...
- linux ngxtop安装安装及使用
写在前面: ngxtop是Nginx日志实时分析利器 1.下载 下载地址:https://github.com/lebinh/ngxtop 下载zip文件到本地 登录linux服务器,定位到安装目录 ...
- 网络编程与socket
.互联网协议 互联网协议又称为网络七层协议,OSI七层协议,OSI是一个世界标准组织. OSI七层协议: - 应用层 - 表示层 - 会话层 - 传输层 - 网络层 - 数据链路层 - 物理连接层 学 ...
- C++ Primer 第 5 版 习题参考答案
从 5 月初 - 8 月 16 日,每天基本都在啃 C++ 的语法.起初直接看C++ Primer 中文版(第 5 版),发现后边的章节看着很吃力.所以就转而看了清华大学郑莉老师和李超老师的视频C++ ...
- Gym - 101630G The Great Wall (前缀和+树状数组+二分)
题意:有一个序列,一开始所有的元素都是ai,你可以选择两个长度相等的区间,如果某个元素被一个区间覆盖,那么变为bi,如果被两个区间都覆盖,那么变为ci.问所有区间的选择方法中产生的第k小的元素总和. ...
- TO B是什么?TO C呢?
总是听别人说 to B. to C 的 所以了解一下这个概念: 一.基本概念 1. TO B,B指的是== business==,中文即商业,企业: 2. TO C,C指的是customer, ...
- keep-alive实现返回保留筛选条件及筛选结果
实现页面返回时,保留筛选条件和筛选结果 说明 . keep-alive 是Vue的内置组件,能在组件切换过程中将状态保留在内存中,防止重复渲染DOM 实现 结合router实现部分页面缓存 模板应用 ...
- 【leetcode】1244. Design A Leaderboard
题目如下: Design a Leaderboard class, which has 3 functions: addScore(playerId, score): Update the leade ...
- jquery input选择器 语法
jquery input选择器 语法 作用::input 选择器选取表单元素.该选择器同样适用于 <button> 元素.大理石平台价格表 语法:$(":input") ...