Prvni verze

This commit is contained in:
2025-05-21 21:14:32 +02:00
commit 03ff9ebc84
147 changed files with 40100 additions and 0 deletions

View File

@ -0,0 +1,3 @@
,uHeOObj_Custom in '_custom\Gornicky\uHeOObj_Custom.pas'
,uCtrlCustom in '_custom\Gornicky\uCtrlCustom.pas'
,uSvcCustom in '_custom\Gornicky\uSvcCustom.pas'

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,164 @@
-- dbo.ep_HDCDZApi_ZpracujPrijataData
CREATE PROCEDURE dbo.ep_HDCDZApi_ZpracujPrijataData
@idJson INT=NULL
AS
SET NOCOUNT ON
-- ! proceduru neupravujte, bude stejne pregenerovana pri startu Windows sluzby HDCDZApi !
IF OBJECT_ID(N'dbo.Tabx_HDC_API_DigitalizaceSoubory', N'U') IS NULL
BEGIN
IF OBJECT_ID(N'dbo._hdc_ph_Log', N'U') IS NOT NULL
INSERT dbo._hdc_ph_Log (LogText) SELECT N'Neexistuje tabulka Tabx_HDC_API_DigitalizaceSoubory'
RETURN
END
DECLARE
@errMsg NVARCHAR(500)=N'',
@errProc NVARCHAR(100),
@tranPred INT,
@iChyba INT,
@bChyba BIT,
@iTemp INT,
@debugXML XML,
@idUziv INT
DECLARE
@jsonString NVARCHAR(max),
@docsJson NVARCHAR(max),
@soubor NVARCHAR(100),
@dataZoneId INT,
@docNum INT,
@ordNum NVARCHAR(15), -- zakazka,
@docUrl NVARCHAR(255),
@jeNacteno BIT,
@jeKpl BIT,
@pgTotal INT,
@pgRead INT,
@cisZam INT
DROP TABLE IF EXISTS #TabJSONData
CREATE TABLE #TabJSONData (ID INT IDENTITY(1,1) NOT NULL, doc NVARCHAR(max) )
IF (@idJson IS NOT NULL)
DECLARE j CURSOR LOCAL FOR
SELECT ID, JsonData FROM dbo._hdc_ph_PrijataJsonData WHERE ID=@idJson
ELSE
DECLARE j CURSOR LOCAL FOR
SELECT ID, JsonData
FROM dbo._hdc_ph_PrijataJsonData
WHERE Blokovano=0
AND DatZpracovani IS NULL
AND ISNULL(JSONData,N'')<>N''
ORDER BY DatPorizeni
OPEN j
WHILE (1=1)
BEGIN
FETCH NEXT FROM j INTO @idJson, @jsonString
IF (@@FETCH_STATUS<>0) BREAK
IF (ISJSON(@jsonString)=0)
BEGIN
UPDATE dbo._hdc_ph_PrijataJsonData SET DatZpracovani=GETDATE(), PosledniChyba=N'Neplatna JSON data' WHERE ID=@idJson
END
BEGIN TRY
SET @tranPred=@@TRANCOUNT
IF (@tranPred=0)
BEGIN TRAN
-- smaz pomocnou tabulku
DELETE FROM #TabJSONData
INSERT #TabJSONData (doc) SELECT @jsonString
UPDATE dbo._hdc_ph_PrijataJsonData SET PosledniChyba=NULL, CisloZam=@cisZam, Blokovano=1 WHERE ID=@idJson
SELECT @dataZoneId=JSON_VALUE(d.doc, '$.datazoneId'),
@soubor=JSON_VALUE(d.doc, '$.file'),
@docsJson = d2.documents
FROM #TabJSONData d
CROSS APPLY OPENJSON(d.doc, N'$')
WITH ([documents] NVARCHAR(max) AS JSON) AS d2
SET @soubor=ISNULL(@soubor, N'')
IF (@soubor<>N'')
UPDATE dbo._hdc_ph_PrijataJsonData SET UzivIdent=@soubor WHERE ID=@idJson
IF (@docsJson<>N'')
BEGIN
IF (ISJSON(@docsJson)=1)
BEGIN
DELETE FROM #TabJSONData
INSERT #TabJSONData (doc) SELECT @docsJson
DECLARE docs CURSOR LOCAL FOR
SELECT detail.idDoklad, detail.cisloZakazky, ISNULL(detail.jeNacteno,0), ISNULL(detail.jeKpl,0),
ISNULL(detail.pgCount,0), ISNULL(detail.pgRead,0), detail.docUrl
FROM #TabJSONData d
CROSS APPLY OPENJSON (d.doc, N'$')
WITH (idDoklad INT '$.documentNumber',
cisloZakazky NVARCHAR(15) '$.orderNumber',
jeNacteno BIT '$.isNotFound',
jeKpl BIT '$.isComplete',
pgCount INT '$.pageCountTotal',
pgRead INT '$.pageCountRead',
docURL NVARCHAR(255) '$.documentUrl') AS detail
OPEN docs
WHILE (1=1)
BEGIN
FETCH NEXT FROM docs INTO @docNum, @ordNum, @jeNacteno, @jeKpl, @pgTotal, @pgRead, @docUrl
IF (@@FETCH_STATUS<>0) BREAK
IF (CHARINDEX(N'NotFound', @docUrl)=0)
BEGIN
IF NOT EXISTS (SELECT 1 FROM dbo.Tabx_HDC_API_DigitalizaceSoubory WHERE DocNumber=@docNum AND OrderNumber=@ordNum AND DocURL=@docUrl)
INSERT dbo.Tabx_HDC_API_DigitalizaceSoubory (IDJsonData, IDDZDoc, DocNumber, OrderNumber, IsComplete, IsNotFound, PagesTotal, PagesRead, DocURL, IDDokladOZ)
SELECT @idJson, @dataZoneId, @docNum, @ordNum, @jeKpl, @jeNacteno, @pgTotal, @pgRead, @docUrl, @docNum
END
ELSE
BEGIN
IF NOT EXISTS (SELECT 1 FROM dbo.Tabx_HDC_API_DigitalizaceSoubory WHERE DocURL=@docUrl)
INSERT dbo.Tabx_HDC_API_DigitalizaceSoubory (IDJsonData, IDDZDoc, IsComplete, IsNotFound, PagesTotal, PagesRead, DocURL, IDDokladOZ)
SELECT @idJson, @dataZoneId, @jeKpl, @jeNacteno, @pgTotal, @pgRead, @docUrl, @docNum
END
END
CLOSE docs
DEALLOCATE docs
END -- ISJSON(@jsonString)=1
END -- @docsJson<>''
UPDATE dbo._hdc_ph_PrijataJsonData SET Blokovano=0, DatZpracovani=GETDATE() WHERE ID=@idJson
IF (@tranPred=0) AND (@@TRANCOUNT>0)
COMMIT TRAN
END TRY
BEGIN CATCH
SET @errMsg = ERROR_MESSAGE()
SET @errProc = ERROR_PROCEDURE()
IF (@tranPred=0) AND (@@TRANCOUNT>0)
ROLLBACK TRAN
UPDATE dbo._hdc_ph_PrijataJsonData SET DatZpracovani=GETDATE(), PosledniChyba=N'CHYBA: ' + @errMsg WHERE ID=@idJson
END CATCH
END
CLOSE j
DEALLOCATE j
-- cisteni
DROP TABLE IF EXISTS #TabJSONData

View File

@ -0,0 +1,45 @@
IF OBJECT_ID(N'dbo.Tabx_HDC_API_DigitalizaceSoubory', N'U') IS NULL
CREATE TABLE dbo.Tabx_HDC_API_DigitalizaceSoubory (
ID INT IDENTITY(1, 1) NOT NULL,
IDJsonData INT,
IDDZDoc INT, -- datazone id davky
DocNumber INT,
OrderNumber NVARCHAR(15),
IsComplete BIT NOT NULL DEFAULT 0,
IsNotFound BIT NOT NULL DEFAULT 0,
PagesTotal INT,
PagesRead INT,
DocURL NVARCHAR(255),
IDDokument INT,
Blokovano BIT NOT NULL DEFAULT 0,
Zpracovat BIT NOT NULL DEFAULT 1,
DatZpracovani DATETIME,
Zpracovano AS CONVERT(bit, CASE WHEN DatZpracovani IS NULL THEN 0 ELSE 1 END),
DatPorizeni DATETIME NOT NULL DEFAULT GETDATE(),
CONSTRAINT PK_Tabx_HDC_API_DigitalizaceSoubory_ID PRIMARY KEY CLUSTERED (ID DESC)
WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF, STATISTICS_NORECOMPUTE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
)
DROP INDEX IF EXISTS EI_Tabx_HDC_API_DigitalizaceSoubory_IDDZDoc ON dbo.Tabx_HDC_API_DigitalizaceSoubory
CREATE NONCLUSTERED INDEX EI_Tabx_HDC_API_DigitalizaceSoubory_IDDZDoc ON dbo.Tabx_HDC_API_DigitalizaceSoubory (IDDZDoc)
WITH ( PAD_INDEX = OFF, DROP_EXISTING = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
DROP INDEX IF EXISTS EI_Tabx_HDC_API_DigitalizaceSoubory_DocNumber ON dbo.Tabx_HDC_API_DigitalizaceSoubory
CREATE NONCLUSTERED INDEX EI_Tabx_HDC_API_DigitalizaceSoubory_DocNumber ON dbo.Tabx_HDC_API_DigitalizaceSoubory (DocNumber)
WITH ( PAD_INDEX = OFF, DROP_EXISTING = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
DROP INDEX IF EXISTS EI_Tabx_HDC_API_DigitalizaceSoubory_IDDokument ON dbo.Tabx_HDC_API_DigitalizaceSoubory
CREATE NONCLUSTERED INDEX EI_Tabx_HDC_API_DigitalizaceSoubory_IDDokument ON dbo.Tabx_HDC_API_DigitalizaceSoubory (IDDokument)
WITH ( PAD_INDEX = OFF, DROP_EXISTING = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
/* 16.1.2025 */
IF COL_LENGTH(N'dbo.Tabx_HDC_API_DigitalizaceSoubory', N'Blokovano') IS NULL ALTER TABLE dbo.Tabx_HDC_API_DigitalizaceSoubory ADD Blokovano BIT NOT NULL DEFAULT 0
IF COL_LENGTH(N'dbo.Tabx_HDC_API_DigitalizaceSoubory', N'Zpracovat') IS NULL ALTER TABLE dbo.Tabx_HDC_API_DigitalizaceSoubory ADD Zpracovat BIT NOT NULL DEFAULT 1
/* 236.1.2025 */
IF COL_LENGTH(N'dbo.Tabx_HDC_API_DigitalizaceSoubory', N'IDJsonData') IS NULL ALTER TABLE dbo.Tabx_HDC_API_DigitalizaceSoubory ADD IDJsonData INT

View File

@ -0,0 +1,25 @@
-- dbo.ET_Tabx_HDC_API_DigitalizaceSoubory_D
CREATE TRIGGER dbo.ET_Tabx_HDC_API_DigitalizaceSoubory_D ON dbo.Tabx_HDC_API_DigitalizaceSoubory
WITH EXECUTE AS CALLER
FOR DELETE
AS
BEGIN
SET NOCOUNT ON
-- ! trigger neupravujte, bude stejne pregenerovan pri startu Win sluzby HDCDZApi
DECLARE
@id INT
-- cisteni seedu
IF EXISTS(SELECT 1 FROM dbo.Tabx_HDC_API_DigitalizaceSoubory)
BEGIN
SELECT @id=MAX(ID) FROM dbo.Tabx_HDC_API_DigitalizaceSoubory
DBCC CHECKIDENT(Tabx_HDC_API_DigitalizaceSoubory, RESEED, @id)
END
ELSE
TRUNCATE TABLE dbo.Tabx_HDC_API_DigitalizaceSoubory
END

View File

@ -0,0 +1,49 @@
-- dbo.ET_Tabx_HDC_API_DigitalizaceSoubory_IU
CREATE TRIGGER dbo.ET_Tabx_HDC_API_DigitalizaceSoubory_IU ON dbo.Tabx_HDC_API_DigitalizaceSoubory
WITH EXECUTE AS CALLER
FOR INSERT, UPDATE
AS
BEGIN
SET NOCOUNT ON
-- ! trigger neupravujte, bude stejne pregenerovan pri startu Win sluzby HDCDZApi
DECLARE
@id INT,
@idDokl INT,
@idDokum INT,
@idZak INT
DECLARE c CURSOR LOCAL FAST_FORWARD FOR
SELECT i.ID, i.DocNumber, i.IDDokument
FROM inserted i
OPEN c
WHILE (1=1)
BEGIN
FETCH NEXT FROM c INTO @id, @idDokl, @idDokum
IF (@@FETCH_STATUS<>0) BREAK
IF (@idDokum IS NOT NULL)
BEGIN
IF (@idDokl IS NOT NULL)
IF EXISTS(SELECT 1 FROM dbo.TabDokladyZbozi WHERE ID=@idDokl)
BEGIN
IF NOT EXISTS(SELECT 1 FROM dbo.TabDokumVazba WHERE IdentVazby=9 AND IdTab=@idDokl AND IdDok=@idDokum)
INSERT dbo.TabDokumVazba (IdentVazby, IdTab, IdDok) SELECT 9, @idDokl, @idDokum
SET @idZak = (SELECT z.ID FROM dbo.TabDokladyZbozi d INNER JOIN dbo.TabZakazka z ON (z.CisloZakazky=d.CisloZakazky) WHERE d.ID=@idDokl)
IF (@idZak IS NOT NULL)
IF NOT EXISTS(SELECT 1 FROM dbo.TabDokumVazba WHERE IdentVazby=2 AND IdTab=@idZak AND IdDok=@idDokum)
INSERT dbo.TabDokumVazba (IdentVazby, IdTab, IdDok) SELECT 2, @idZak, @idDokum
END -- doklad existuje
END -- dokument neni null
END
CLOSE c
DEALLOCATE c
END

View File

@ -0,0 +1 @@
arrDefs.Add('ep_HDCDZApi_ZpracujPrijataData');

View File

@ -0,0 +1,106 @@
unit uCtrlCustom;
interface
uses
MVCframework,
MVCframework.Commons,
MVCframework.Serializer.Commons,
// MVCframework.Serializer.Intf,
System.Generics.Collections, // kvuli TDictionary
System.RegularExpressions,
// JsonDataObjects,
uCommons, // kvuli EServiceException
uCtrlBase,
// uSvc_Base,
helTabsBIDs,
uHeOObj_Base,
uHeOObj_Custom,
uSvcCustom,
MVCFramework.Swagger.Commons; // kvuli dokumentaci
type
[MVCPath('/gor')]
TGornickyController = class(TBaseController)
{
strict private
FSelfSvc: TGornickyService;
strict protected
function GetGornickyService: TGornickyService;
}
public
destructor Destroy; override;
// [MVCDoc('Pomoc<6F> POST zap<61><70>e obecn<63> json data do Heliosu')]
[MVCPath('/zapisjson')] // zapis obecnych json data do Heliosu
[MVCHTTPMethod([httpPOST])]
[MVCSwagSummary('Gornicky', 'Z<>pis JSON dat do db Heliosu', 'GORZapisJSONDoHeliosu')]
[MVCConsumes(TMVCMediaType.APPLICATION_JSON)]
procedure ZapisJSONDoHeliosu (CTX: TWebContext);
[MVCPath('/nactiurl')] // zapis obecnych json data do Heliosu
[MVCHTTPMethod([httpGET])]
[MVCSwagSummary('Gornicky', 'Na<4E>te data ze zadan<61> URL adresy', 'GORNacteniDatURL')]
[MVCSwagParam(plQuery, 'url', 'URL adresa', ptString, true)]
procedure NactiDataZURL ([MVCFromQueryString('url', '')] sURL: string=''
);
end;
implementation
uses
FireDAC.Stan.Option,
FireDAC.Comp.Client,
FireDAC.Stan.Param,
MVCFramework.FireDAC.Utils,
MVCFramework.DataSet.Utils,
System.StrUtils,
System.SysUtils,
System.JSON,
JsonDataObjects,
Winapi.ActiveX,
uDataMod,
Quick.Logger;
const
selSloupce = '';
{ TGornickyController }
destructor TGornickyController.Destroy;
begin
// FSelfSvc.Free;
inherited;
end;
procedure TGornickyController.ZapisJSONDoHeliosu (CTX: TWebContext);
var respData, jsonData: string;
// o: System.JSON.TJSONObject;
begin
respData:= '';
try
jsonData:= CTX.Request.Body.Trim;
if (jsonData<>'') then
GetGornickyService.ZapisJsonDoHeliosu (jsonData, respData);
ResponseStatus(HTTP_STATUS.OK, 'OK');
Render(respData);
except
RenderStatusMessage (200);
end;
end;
procedure TGornickyController.NactiDataZURL (sURL: string = '');
begin
end;
end.

View File

@ -0,0 +1,7 @@
unit uHeOObj_Custom;
{$RTTI EXPLICIT METHODS([vcPublic, vcPublished]) FIELDS([vcPrivate, vcProtected, vcPublic, vcPublished]) PROPERTIES([vcPublic, vcPublished])}
interface
implementation
end.

View File

@ -0,0 +1,140 @@
unit uSvcCustom;
interface
uses
System.Classes,
System.JSON,
System.Generics.Collections,
Winapi.ActiveX,
System.DateUtils,
System.SysUtils,
JsonDataObjects,
uSvc_Base,
uCommons, // kvuli EServiceException
helTabsBIDs,
uHeoObj_Base,
uHeOObj_Custom,
uHeoObj_Vyroba,
uSvc_ObehZbozi,
uSvc_Vyroba;
const
CRLF = #13#10;
type
TGornickyService = class(TServiceBase)
public
procedure ZapisJsonDoHeliosu (jsonData: string; var respString: string);
end;
implementation
uses
System.StrUtils,
FireDAC.Stan.Option,
FireDAC.Comp.Client,
FireDAC.Stan.Param,
MVCFramework.FireDAC.Utils,
MVCFramework.DataSet.Utils,
MVCFramework.Serializer.Commons;
{ TGornickyService }
procedure TGornickyService.ZapisJsonDoHeliosu (jsonData: string; var respString: string);
var lSQL, taskStr, strTmp, strTmp2, code, rs, guidIdent: string;
guid: TGuid;
akce: string;
j, t, a, v: JsonDataObjects.TJSONObject;
i, ii, taskDZId, taskId, intTemp, idJSON: integer;
jeOld: boolean;
lQry: TFDQuery;
w: TStreamWriter;
jo: System.JSON.TJsonObject;
begin
idJSON:= 0;
respString:= '[';
jo:= System.JSON.TJsonObject.Create;
jsonData:= jsonData.Trim;
if (jsonData<>'') then
begin
lQry:= TFDQuery.Create(nil);
try
lQry.Connection:= FDM.sqlConn;
try
CoCreateGuid(guid);
if (System.SysUtils.CreateGUID(guid)=S_OK) then
guidIdent:= System.SysUtils.GUIDToString(guid)
else
guidIdent:= self.NewUUID32;
lSQL:= 'INSERT ' + tblPrijataJsonData + ' (IdPHIdent, GUIDIdent, JSONData) SELECT 0, CONVERT(uniqueidentifier, N' + guidIdent.QuotedString + '), N' + jsonData.QuotedString;
FDM.sqlConn.ExecSQL(lSQL);
lSQL:= 'SELECT ID FROM ' + tblPrijataJsonData + ' WHERE GUIDIdent=CONVERT(uniqueidentifier, N' + guidIdent.QuotedString + ')';
lQry.Open(lSQL);
if (lQry.RecordCount=1) then
begin
idJSON:= lQry.FieldByName('ID').AsInteger;
respString:= 'OK';
jo.AddPair('heliosid', idJSON.ToString);
end;
except on E:Exception do
begin
respString:= 'NOT OK';
raise EServiceException.Create('Chyba zápisu JSON dat: ' + E.Message);
end;
end;
finally
FreeAndNil(lQry);
end;
CoInitialize(nil);
j:= TJsonObject.Parse(jsonData) as JsonDataObjects.TJsonObject;
try
if (j<>nil) then
if (j.Contains('akce')) then
begin
akce:= j.S['akce'].Trim;
if (idJSON>0) and (akce<>'') then
FDM.sqlConn.ExecSQL('UPDATE ' + tblPrijataJsonData + ' SET Akce=N' + akce.QuotedString + ' WHERE ID=' + idJSON.ToString);
{
for i:=0 to j['tasks'].Count-1 do
begin
try
t:= j['tasks'].Items[i];
taskDZId:= t.I['id']; // j['tasks'].Items[i].I['id'];
taskStr:= j['tasks'].Items[i].ObjectValue.ToString;
except on E:Exception do
end;
end;
}
end;
finally
j.Free;
end;
CoUninitialize;
end
else
respString:= 'NO input data';
jo.AddPair('status', respString);
respString:= '[' +respString + ']';
respString:= jo.ToString;
end;
end.

View File

@ -0,0 +1,2 @@
FEngine.AddController (TGornickyController);

View File

@ -0,0 +1 @@
tblAPIDigiSoubory = '[dbo].[Tabx_HDC_API_DigitalizaceSoubory]';

View File

@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?>
<config downPDFintMins="10"/>

View File

@ -0,0 +1,462 @@
constructor THeoGorDownPDFThread.Create (AOnTerminate: TNotifyEvent; AService: TService);
begin
inherited Create (false); // Create thread in NOT suspended mode
FMainService:= AService;
FLock:= TCriticalSection.Create;
FRunning:= false;
FTermEvent:= TEvent.Create (nil, False, False, '');
// OnTerminate:= AOnTerminate;
// FreeOnTerminate:= true;
FreeOnTerminate:= false; // Ensure manual freeing of thread resources
end;
destructor THeoGorDownPDFThread.Destroy;
begin
{$IFDEF DEBUG}
Write('Ukoncuji thread GOR Download PDF...');
{$ENDIF}
if (FTimer<>0) then
CloseHandle (FTimer);
FTermEvent.Free;
FRunning:= false;
FMainService:= nil;
Terminate;
FLock.Free;
inherited;
{$IFDEF DEBUG}
WriteLn('OK');
{$ENDIF}
end;
procedure THeoGorDownPDFThread.TerminatedSet;
begin
FTermEvent.SetEvent;
end;
procedure THeoGorDownPDFThread.ThreadTerminate;
begin
Terminate;
WaitFor;
end;
procedure THeoGorDownPDFThread.Execute;
const _Second = 10_000_000;
var lSQL, errMsg, url, outData, fName, loopCasTyp: string;
lLoop, idDigiFile, cnt, idx: Integer;
lLoopMax, koefProCas: integer;
logRunCnt: integer;
Msg: TMsg;
firstRun, inProg, inDL: boolean;
lQry: TFDQuery;
sqlConnX, sqlConnX2: TFDConnection;
sqlTrans: IFDPhysTransaction;
f, lOpenSSLLib: string;
lBusy: LongInt;
liDueTime: LARGE_INTEGER;
mamSSLLibs: boolean;
sslLibPath: string;
http1: System.Net.HTTPClient.THTTPClient;
iResp: System.Net.HTTPClient.IHTTPResponse;
aResp: TMemoryStream;
http2: TIdHttp;
sslHndlr: TIdSSLIOHandlerSocketOpenSSL;
respHttp2: TStream;
i: integer;
sTemp, outData2: string;
cfgFile: string;
specCfgXML: XML.XmlIntf.IXMLDocument;
n1: XML.XmlIntf.IXMLNode;
attribs: IXMLNodeList;
attrIdx: integer;
function StringToHex (const inStr: string): string;
var i: integer;
begin
result:= '';
for i:=1 to Length(inStr) do
result:= result + IntToHex(Ord(inStr[i]), 2); // 2 means two hex digits per character
end;
function MemStreamToHex (aStream: TMemoryStream): string;
var i: integer;
b: byte;
begin
result:= '';
for i:=0 to aStream.Size-1 do
begin
b:= PByte(TMemoryStream(aStream).Memory)[i];
result:= result + IntToHex(b,2);
end;
end;
begin
lLoop:= 0;
idDigiFile:= 0;
logRunCnt:= 1;
{
koefProCas:= 0; // default vteriny
loopCasTyp:= '???';
case DZTaksZapisTypCas of
0: koefProCas:= 1;
1: koefProCas:= 60;
2: koefProCas:= 3600;
end;
lLoopMax:= koefProCas * intProcessDZTasksSec;
case DZTaksZapisTypCas of
0: loopCasTyp:= 'sek';
1: loopCasTyp:= 'min';
2: loopCasTyp:= 'hod';
end;
}
lLoopMax:= 10; // v minutach !!!!
try
try
CoInitialize(nil);
cfgFile:= ExtractFilePath(ParamStr(0)) + 'gornicky.xml';
if (FileExists(cfgFile)) then
begin
specCfgXML:= Xml.XMLDoc.TXMLDocument.Create(nil);
specCfgXML.LoadFromFile (cfgFile);
specCfgXML.Active:= true;
if not(specCfgXML.IsEmptyDoc) then
begin
if (specCfgXML.DocumentElement<>nil) then
begin
n1:= specCfgXML.DocumentElement;
if (n1.NodeName='config') then
begin
attribs:= n1.AttributeNodes;
attrIdx:= attribs.IndexOf('downPDFintMins');
if (attrIdx>-1) then
if (attribs.Get(attrIdx).NodeValue<>null) then
lLoopMax:= attribs.Get(i).NodeValue;
end; // n1 = config
end; // specCfgXML.DocumentElement<>nil
end; // not specCfgXML.IsEmptyDoc
end; // FileExists(cfgFile)
except
end;
finally
begin
if (specCfgXML<>nil) then
specCfgXML:= nil;
CoUninitialize;
end;
end;
datMod.LogInfo (Quick.Logger.etInfo, 'Download PDF interval: ' + lLoopMax.ToString + ' min.');
lLoopMax:= lLoopMax * 60; // minuty na vteriny
firstRun:= true;
inProg:= false;
sslLibPath:= '';
f:= ExtractFilePath (ParamStr(0));
mamSSLLibs:= false;
for lOpenSSLLib in OPENSSL_LIBS do
begin
if (FileExists(TPath.Combine(f, lOpenSSLLib))) then
begin
mamSSLLibs:= true;
sslLibPath:= ExcludeTrailingPathDelimiter (f);
end;
end;
FRunning:= false;
if not(datMod.SQLTableExists(tblAPIDigiSoubory)) then
Exit;
FRunning:= true;
if (1=1) then // pro rychle vypnuti
begin
FTimer:= CreateWaitableTimer (nil, true, 'GorDownloadPDFWaitableTimer');
liDueTime.QuadPart:= -1*_Second;
try
while not(Terminated) or not(FRunning) do
begin
if (HDCDZApiService<>nil) then
if (HDCDZApiService.Terminated) then
begin
Terminate;
FRunning:= false;
end;
PeekMessage (&Msg, 0, 0, 0, PM_NOREMOVE); { Create message queue }
if (lLoop=lLoopMax) or (firstRun) then // pri startu a pak kazdou minutu
begin
idDigiFile:= 0;
firstRun:= false;
if (logRunCnt<4) then
datMod.LogInfo (Quick.Logger.etInfo, 'Spoustim download ' + logRunCnt.toString + '...');
if (logRunCnt=4) then
datMod.LogInfo (Quick.Logger.etInfo, 'Spoustim download - bezi ale dal neloguju');
try
if not(inProg) then // nebezi uz ?
begin
if (1=1) then // pro rychle vypnuti
begin
sqlConnX:= TFDConnection.Create (nil);
sqlConnX.Params.SetStrings (datMod.sqlConnParams);
// sqlConnX.TxOptions.AutoCommit:= false;
sqlConnX.Open;
if (sqlConnX.Connected) then
begin
// sqlConnX.ExecSQL('DECLARE @i INT; SET @i=ISNULL( (SELECT MAX(ID) FROM dbo.TabDokumenty), 1); DBCC CHECKIDENT (TabDokumenty, RESEED, @i)');
lSQL:= '/* hdcDZApiSvc */ SELECT ID FROM ' + tblAPIDigiSoubory + ' WHERE Blokovano=0 AND Zpracovano=0 AND Zpracovat=1'
+ ' AND IDDokument IS NULL ORDER BY ID';
lQry:= TFDQuery.Create(nil);
try
lQry.Connection:= sqlConnX;
lQry.Open(lSQL);
if (lQry.RecordCount>0) then
begin
lQry.First;
if (sqlConnX.TxOptions.AutoCommit=false) then
sqlConnX.StartTransaction;
inProg:= true;
while not(lQry.EOF) do
begin
idDigiFile:= lQry.FieldByName('ID').asInteger;
if (idDigiFile>0) then
begin
try
// musim to zablokovat uz tady aby se to nezpracovavalo znovu
sqlConnX.ExecSQL('UPDATE ' + tblAPIDigiSoubory + ' SET Blokovano=1 WHERE ID=' + idDigiFile.ToString);
// datMod.LogInfo (Quick.Logger.etInfo, 'Zablokovani downloadPDF id ' + idDigiFile.ToString + ' pred zpracovanim');
url:= datMod.SQLGetString ('SELECT DocURL FROM ' + tblAPIDigiSoubory + ' WHERE ID=' + idDigiFile.ToString);
if (url<>'') then
begin
datMod.LogInfo (Quick.Logger.etInfo, 'Mam URL downloadPDF id ' + idDigiFile.ToString);
outData:= '';
if (sslLibPath='') then
begin
try
http1:= System.Net.HTTPClient.THTTPClient.Create;
datMod.LogInfo (Quick.Logger.etInfo, 'HTTP klient NET vytvoren downloadPDF id ' + idDigiFile.ToString);
aResp:= TMemoryStream.Create;
// datMod.LogInfo (Quick.Logger.etInfo, 'Vytvoren memStream downloadPDF id ' + idDigiFile.ToString);
try
if (Assigned(http1)) then
begin
http1.AllowCookies:= false;
http1.UserAgent:= 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:134.0) Gecko/20100101 Firefox/134.0';
http1.Accept:= 'application/pdf';
datMod.LogInfo (Quick.Logger.etInfo, 'Nacitam data PDF pro downloadPDF id ' + idDigiFile.ToString);
iResp:= http1.Get (url);
aResp:= (iResp.ContentStream as TMemoryStream);
outData:= MemStreamToHex (aResp);
datMod.LogInfo (Quick.Logger.etInfo, 'Mam data PDF pro downloadPDF id ' + idDigiFile.ToString);
end;
except on E:Exception do
begin
datMod.LogInfo (Quick.Logger.etError, 'Chyba zpracovani downloadPDF id ' + idDigiFile.ToString + ' : ' + E.Message);
{$IFDEF DEBUG}
WriteLn ('Chyba zpracovani downloadPDF id ' + idDigiFile.ToString + ' >> ' + E.Message);
{$ENDIF}
end;
end;
finally
http1.Free;
http1:= nil;
aResp.Free;
aResp:= nil;
// datMod.LogInfo (Quick.Logger.etInfo, 'Uvolnen Net HTTP klient a memStream pro downloadPDF id ' + idDigiFile.ToString);
end;
end
else
begin
IdOpenSSLSetLibPath (sslLibPath);
http2:= TIdHttp.Create (nil);
sslHndlr:= TIdSSLIOHandlerSocketOpenSSL.Create (http2);
try
sslHndlr.SSLOptions.Method:= sslvTLSv1_2;
sslHndlr.SSLOptions.SSLVersions := [sslvTLSv1_2, sslvTLSv1_1];
http2.IOHandler:= sslHndlr;
http2.Request.Accept:= 'application/pdf';
http2.Request.BasicAuthentication := False;
http2.HTTPOptions:= http2.HTTPOptions + [hoKeepOrigProtocol] + [hoNoProtocolErrorException];
http2.Request.ContentType:= 'application/pdf; charset=utf-8';
respHttp2:= TMemoryStream.Create;
http2.Get (url, respHttp2);
outData:= MemStreamToHex (respHttp2 as TMemoryStream);
finally
FreeAndNil (sslHndlr); // must be freed before IdHttp
FreeAndNil (http2);
FreeAndNil (respHttp2);
// datMod.LogInfo (Quick.Logger.etInfo, 'Uvolnen Indy HTTP klient a memStream pro downloadPDF id ' + idDigiFile.ToString);
end;
end;
if (outData<>'') then
begin
// datMod.LogInfo (Quick.Logger.etInfo, 'Mam data 2 PDF pro downloadPDF id ' + idDigiFile.ToString);
fName:= '';
i:= LastDelimiter ('/\', url);
if (i>0) then
fName:= Copy (url, i+1, Length(url)-i);
if (LeftStr(outData,4)='5025') then
begin
outData2:= '';
for i:=1 to Length(outData) div 2 do
outData2:= outData2 + MidStr(outData, (4*i)-1, 2) + MidStr(outData, (4*i)-3, 2);
if (outData2<>'') then
outData:= outData2;
end;
lSQL:= 'DECLARE @i INT' + CRLF + 'SET @i=(SELECT ID FROM dbo.TabDokumenty WHERE JmenoACesta=N' + url.QuotedString
+ ')' + CRLF + 'IF (@i IS NULL)' + CRLF
+ ' BEGIN' + CRLF + ' INSERT dbo.TabDokumenty (Popis, JmenoACesta, Poznamka, Autor, Dokument) SELECT N' + fName.QuotedString
+ ', N' + fName.QuotedString + ', N' + url.QuotedString + ', N''apiImport'''
+ ', CONVERT(varbinary(max), 0x' + outData +', 1)' + CRLF + ' SET @i=SCOPE_IDENTITY()' + CRLF + ' END'
+ CRLF + 'SELECT @i';
sTemp:= datMod.SQLGetString (lSQL);
if (sTemp<>'') then
begin
// datMod.LogInfo (Quick.Logger.etInfo, 'Update zapisu downloadPDF id ' + idDigiFile.ToString);
lSQL:= 'UPDATE ' + tblAPIDigiSoubory + ' SET IDDokument=' + sTemp + ', DatZpracovani=GETDATE(), Blokovano=0 WHERE ID=' + idDigiFile.ToString;
sqlConnX.ExecSQL(lSQL);
// datMod.LogInfo (Quick.Logger.etInfo, 'Update zapisu/odblokovani downloadPDF id ' + idDigiFile.ToString + ' - OK');
end;
end;
end; // url<>''
if (url='') then
begin
lSQL:= 'UPDATE ' + tblAPIDigiSoubory + ' SET DatZpracovani=GETDATE(), Blokovano=0 WHERE ID=' + idDigiFile.ToString;
sqlConnX.ExecSQL (lSQL);
end;
except on E:Exception do
begin
errMsg:= E.Message; // datMod.sqlQry11.FieldByName('ErrMsg').AsString;
{$IFDEF DEBUG}
WriteLn ('Chyba 2 zpracovani downloadPDF id ' + idDigiFile.ToString + ' >> ' + errMsg);
{$ENDIF}
// sqlConnX.ExecSQL('UPDATE ' + tblAPIDigiSoubory + ' SET PosledniChyba=N' + errMsg.QuotedString + ' WHERE ID=' + idDigiFile.ToString);
datMod.LogInfo(Quick.Logger.etError, 'Chyba 2 zpracovani downloadPDF ID ' + idDigiFile.ToString + ' : ' + errMsg);
end;
end;
end;
lQry.Next;
end;
end;
finally
lQry.Close;
FreeAndNil (lQry);
// lQry.Free;
// lQry:= nil;
end;
// datMod.LogInfo (Quick.Logger.etInfo, 'Uzavrena SQL query - downloadPDF id ' + idDigiFile.ToString);
if (sqlConnX.InTransaction) then
sqlConnX.Commit;
inProg:= false;
end; // sql Connected
sqlConnX.Close;
FreeAndNil (sqlConnX);
// sqlConnX.Free;
// sqlConnX:= nil;
// datMod.LogInfo (Quick.Logger.etInfo, 'Zrusena SQL connection - downloadPDF id ' + idDigiFile.ToString);
end;
end;
except on E:Exception do
begin
inProg:= false;
if (lQry<>nil) then
begin
lQry.Close;
FreeAndNil (lQry);
end;
if (sqlConnX<>nil) then
begin
if (sqlConnX.InTransaction) then
sqlConnX.Rollback;
sqlConnX.Close;
FreeAndNil (sqlConnX);
// sqlConnX.Free;
// sqlConnX:= nil;
end;
errMsg:= E.Message; // datMod.sqlQry11.FieldByName('ErrMsg').AsString;
if (mamTabPrijataData) then
datMod.LogInfo (Quick.Logger.etError, 'Chyba zpracovani API souboru ID ' + idDigiFile.ToString + ' : ' + errMsg);
end;
end;
lLoop:= 0;
if (logRunCnt<5) then
Inc (logRunCnt);
end;
Inc (lLoop);
if (FTimer<>0) then
SetWaitableTimer (FTimer, TLargeInteger(liDueTime), 0, nil, nil, false);
repeat
lBusy:= MsgWaitForMultipleObjects (1, FTimer, false, INFINITE, QS_ALLINPUT);
until lBusy = WAIT_OBJECT_0;
// Sleep (998);
end;
finally
end;
end;
if (sqlConnX2<>nil) then
begin
if (sqlConnX2.Connected) then
sqlConnX2.Close;
FreeAndNil (sqlConnX2);
end;
end;

View File

@ -0,0 +1 @@
gorDownPDFThr: THeoGorDownPDFThread;

View File

@ -0,0 +1,3 @@
if (gorDownPDFThr<>nil) then
if (gorDownPDFThr.Suspended) then
gorDownPDFThr.Resume;

View File

@ -0,0 +1,6 @@
if (gorDownPDFThr<>nil) then
if not(gorDownPDFThr.Started) then
begin
gorDownPDFThr.Start;
datMod.LogInfo (Quick.Logger.etInfo, 'Start sluzby GOR downloadPDF - pocet ' + datMod.SQLGetString('SELECT COUNT(ID) FROM ' + tblAPIDigiSoubory + ' WHERE Zpracovat=1 AND DatZpracovani IS NULL'));
end;

View File

@ -0,0 +1,3 @@
if (gorDownPDFThr<>nil) then
if not(gorDownPDFThr.Suspended) then
gorDownPDFThr.Suspend;

View File

@ -0,0 +1,12 @@
datMod.LogInfo (Quick.Logger.etInfo, 'Start sluzby GOR downloadPDF - inverval 10 minut...');
{$IFDEF DEBUG}
WriteLn ('Start sluzby GOR downloadPDF - inverval 10 minut...');
{$ENDIF}
gorDownPDFThr:= THeoGorDownPDFThread.Create (ThreadTerminated, self);
if (gorDownPDFThr.Started) then
begin
datMod.LogInfo (Quick.Logger.etInfo, ' OK');
{$IFDEF DEBUG}
WriteLn (' OK');
{$ENDIF}
end;

View File

@ -0,0 +1,18 @@
if Assigned(gorDownPDFThr) then
begin
{$IFDEF DEBUG}
WriteLn ('Ukoncuji sluzbu GOR downloadPDF...');
{$ENDIF}
datMod.LogInfo (Quick.Logger.etInfo, 'Ukoncuji sluzbu GOR downloadPDF...');
try
gorDownPDFThr.ThreadTerminate;
FreeAndNil(gorDownPDFThr);
except on E:Exception do
// add event in eventlog with reason why the service couldn't stop
LogMessage('Cannot stop service: ' + E.Message, EVENTLOG_ERROR_TYPE, 0, 1);
end;
datMod.LogInfo (Quick.Logger.etInfo, ' OK');
{$IFDEF DEBUG}
WriteLn (' OK');
{$ENDIF}
end;

View File

@ -0,0 +1,3 @@
intervalSecDownPDF

View File

@ -0,0 +1,15 @@
THeoGorDownPDFThread = class(TThread)
private
FMainService: TService;
FLock: TCriticalSection;
FTermEvent: TEvent;
FRunning: boolean;
FTimer: THandle;
protected
procedure Execute; override;
procedure TerminatedSet; override; // XE2+ only *
public
constructor Create (AOnTerminate: TNotifyEvent; AService: TService);
destructor Destroy; override;
procedure ThreadTerminate;
end;

View File

View File

@ -0,0 +1 @@
System.Net.HttpClient, System.Threading,

View File

@ -0,0 +1 @@
intervalSecDownPDF: integer;

BIN
_custom/Gornicky/zdroje.RES Normal file

Binary file not shown.

View File

@ -0,0 +1 @@
ep_HDCDZApi_ZpracujPrijataData RCDATA .\sql\ep_HDCDZApi_ZpracujPrijataData.sql