Prvni verze
This commit is contained in:
3
_custom/Gornicky/customDefs.inc
Normal file
3
_custom/Gornicky/customDefs.inc
Normal 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'
|
||||
BIN
_custom/Gornicky/openssl-1.0.2u-i386-win32.zip
Normal file
BIN
_custom/Gornicky/openssl-1.0.2u-i386-win32.zip
Normal file
Binary file not shown.
BIN
_custom/Gornicky/openssl-1.0.2u-x64_86-win64.zip
Normal file
BIN
_custom/Gornicky/openssl-1.0.2u-x64_86-win64.zip
Normal file
Binary file not shown.
164
_custom/Gornicky/sql/ep_HDCDZApi_ZpracujPrijataData.sql
Normal file
164
_custom/Gornicky/sql/ep_HDCDZApi_ZpracujPrijataData.sql
Normal 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
|
||||
45
_custom/Gornicky/sql/tbl_HDC_API_DigitalizaceSoubory.sql
Normal file
45
_custom/Gornicky/sql/tbl_HDC_API_DigitalizaceSoubory.sql
Normal 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
|
||||
@ -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
|
||||
@ -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
|
||||
1
_custom/Gornicky/sqlDefs.inc
Normal file
1
_custom/Gornicky/sqlDefs.inc
Normal file
@ -0,0 +1 @@
|
||||
arrDefs.Add('ep_HDCDZApi_ZpracujPrijataData');
|
||||
106
_custom/Gornicky/uCtrlCustom.pas
Normal file
106
_custom/Gornicky/uCtrlCustom.pas
Normal 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.
|
||||
7
_custom/Gornicky/uHeOObj_Custom.pas
Normal file
7
_custom/Gornicky/uHeOObj_Custom.pas
Normal file
@ -0,0 +1,7 @@
|
||||
unit uHeOObj_Custom;
|
||||
{$RTTI EXPLICIT METHODS([vcPublic, vcPublished]) FIELDS([vcPrivate, vcProtected, vcPublic, vcPublished]) PROPERTIES([vcPublic, vcPublished])}
|
||||
|
||||
|
||||
interface
|
||||
implementation
|
||||
end.
|
||||
140
_custom/Gornicky/uSvcCustom.pas
Normal file
140
_custom/Gornicky/uSvcCustom.pas
Normal 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.
|
||||
2
_custom/Gornicky/uWebModCustom.inc
Normal file
2
_custom/Gornicky/uWebModCustom.inc
Normal file
@ -0,0 +1,2 @@
|
||||
FEngine.AddController (TGornickyController);
|
||||
|
||||
1
_custom/Gornicky/winSvc/consts.inc
Normal file
1
_custom/Gornicky/winSvc/consts.inc
Normal file
@ -0,0 +1 @@
|
||||
tblAPIDigiSoubory = '[dbo].[Tabx_HDC_API_DigitalizaceSoubory]';
|
||||
2
_custom/Gornicky/winSvc/gornicky.xml
Normal file
2
_custom/Gornicky/winSvc/gornicky.xml
Normal file
@ -0,0 +1,2 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<config downPDFintMins="10"/>
|
||||
462
_custom/Gornicky/winSvc/impl.inc
Normal file
462
_custom/Gornicky/winSvc/impl.inc
Normal 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;
|
||||
|
||||
|
||||
1
_custom/Gornicky/winSvc/mainPrivs.inc
Normal file
1
_custom/Gornicky/winSvc/mainPrivs.inc
Normal file
@ -0,0 +1 @@
|
||||
gorDownPDFThr: THeoGorDownPDFThread;
|
||||
3
_custom/Gornicky/winSvc/mainSvcCont.inc
Normal file
3
_custom/Gornicky/winSvc/mainSvcCont.inc
Normal file
@ -0,0 +1,3 @@
|
||||
if (gorDownPDFThr<>nil) then
|
||||
if (gorDownPDFThr.Suspended) then
|
||||
gorDownPDFThr.Resume;
|
||||
6
_custom/Gornicky/winSvc/mainSvcExec.inc
Normal file
6
_custom/Gornicky/winSvc/mainSvcExec.inc
Normal 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;
|
||||
3
_custom/Gornicky/winSvc/mainSvcPause.inc
Normal file
3
_custom/Gornicky/winSvc/mainSvcPause.inc
Normal file
@ -0,0 +1,3 @@
|
||||
if (gorDownPDFThr<>nil) then
|
||||
if not(gorDownPDFThr.Suspended) then
|
||||
gorDownPDFThr.Suspend;
|
||||
12
_custom/Gornicky/winSvc/mainSvcStart.inc
Normal file
12
_custom/Gornicky/winSvc/mainSvcStart.inc
Normal 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;
|
||||
18
_custom/Gornicky/winSvc/mainSvcStop.inc
Normal file
18
_custom/Gornicky/winSvc/mainSvcStop.inc
Normal 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;
|
||||
3
_custom/Gornicky/winSvc/readCfg.inc
Normal file
3
_custom/Gornicky/winSvc/readCfg.inc
Normal file
@ -0,0 +1,3 @@
|
||||
|
||||
|
||||
intervalSecDownPDF
|
||||
15
_custom/Gornicky/winSvc/types.inc
Normal file
15
_custom/Gornicky/winSvc/types.inc
Normal 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;
|
||||
0
_custom/Gornicky/winSvc/uses.inc
Normal file
0
_custom/Gornicky/winSvc/uses.inc
Normal file
1
_custom/Gornicky/winSvc/usesTop.inc
Normal file
1
_custom/Gornicky/winSvc/usesTop.inc
Normal file
@ -0,0 +1 @@
|
||||
System.Net.HttpClient, System.Threading,
|
||||
1
_custom/Gornicky/winSvc/vars.inc
Normal file
1
_custom/Gornicky/winSvc/vars.inc
Normal file
@ -0,0 +1 @@
|
||||
intervalSecDownPDF: integer;
|
||||
BIN
_custom/Gornicky/zdroje.RES
Normal file
BIN
_custom/Gornicky/zdroje.RES
Normal file
Binary file not shown.
1
_custom/Gornicky/zdroje.rc
Normal file
1
_custom/Gornicky/zdroje.rc
Normal file
@ -0,0 +1 @@
|
||||
ep_HDCDZApi_ZpracujPrijataData RCDATA .\sql\ep_HDCDZApi_ZpracujPrijataData.sql
|
||||
Reference in New Issue
Block a user