BSOne.SFC/eCrmHE/EXE_eCrmHomeEdition/Service/xPrintLogService.pas

206 lines
6.1 KiB
Plaintext

{*******************************************************}
{ }
{ xPrintLogService }
{ }
{ Copyright (C) 2025 kku }
{ }
{*******************************************************}
unit xPrintLogService;
interface
uses
System.SysUtils, System.Classes, Tocsg.Files;
type
TxPrintLogService = class(TTgDirWatchBase)
private
sLogDir_: String;
bIsWorking_: Boolean;
procedure ProcessDirWatchEnt(Sender: TObject; pInfo: PDirWatchEnt); override;
public
Constructor Create;
Destructor Destroy; override;
procedure StartService;
procedure StopService;
property IsWorking: Boolean read bIsWorking_;
end;
implementation
uses
Tocsg.Exception, Tocsg.Path, superobject, ManagerService, GlobalDefine,
Tocsg.Safe, Tocsg.Strings;
Constructor TxPrintLogService.Create;
begin
Inherited Create(true, false);
bIsWorking_ := false;
sLogDir_ := 'C:\ProgramData\bsoneprint\logs\';
end;
Destructor TxPrintLogService.Destroy;
begin
StopService;
Inherited;
end;
procedure Send_xPrintLog(aO: ISuperObject);
function GetStrRange(sVal: String; nLen: Integer): String;
begin
if Length(sVal) > nLen then
SetLength(sVal, nLen);
Result := sVal;
end;
var
sMsg: String;
dt: TDateTime;
O: ISuperObject;
StrList: TStringList;
begin
try
sMsg := Format('Billcode : %s, Document : %s', [aO.S['bizworkCode'], aO.S['docname']]);
dt := Now;
O := SO;
O.S['TYP_MSG'] := '@(!)_IC_P';
O.S['KEY_AGENTID'] := gMgSvc.AgentId;
O.S['KEY_EMPNO'] := gMgSvc.EmpNo;
O.S['KEY_HOSTNAME'] := gMgSvc.UserName;
O.S['KEY_SUBMITTIME'] := FormatDateTime('yyyy-mm-dd hh:nn:ss', dt);
O.S['key_submitTime'] := O.S['logtime'];
O.S['KEY_LOGCODE'] := LOGCODE_EVENT_PRINTER;
O.S['DETECTION_DATE'] := O.S['KEY_SUBMITTIME']; // 이벤트 발생 시각. REQUEST의 경우, 예외 신청할 이벤트의 발생 시각
O.S['detectionDate'] := O.S['key_submitTime']; // 이벤트 발생 시각. REQUEST의 경우, 예외 신청할 이벤트의 발생 시각
O.S['KEY_SUMMARY'] := sMsg;
O.S['PRINTER_JOBNAME'] := aO.S['docname'];
O.S['actionGroupId'] := aO.S['uidkey']; // 문서번호
O.I['printCopyCnt'] := aO.I['copycnt']; // 부수
O.I['printPageCnt'] := aO.I['sheetcnt']; // 장수
// 스마트웨어 연동 정보 매치
O.S['userId'] := GetStrRange(aO.S['userid'], 30);
O.S['guidKey'] := GetStrRange(aO.S['uidkey'], 40);
O.S['macCode'] := GetStrRange(aO.S['maccode'], 30);
O.S['modelCode'] := GetStrRange(aO.S['modelname'], 50);
O.S['macLocation'] := GetStrRange(aO.S['maclocation'], 100);
O.S['userComIP'] := GetStrRange(aO.S['usercomip'], 15);
O.S['docName'] := GetStrRange(aO.S['docname'], 255);
O.S['unitPaperSize'] := GetStrRange(aO.S['pagersize'], 30);
O.S['unitColorMode'] := GetStrRange(aO.S['colormode'], 1);
O.S['unitDuplexMode'] := GetStrRange(IntToStr(aO.I['duplexmode']), 1);
O.I['sT_PageCnt'] := aO.I['sheetcnt'];
O.I['sT_CopyCnt'] := aO.I['copycnt'];
O.S['jobType'] := '0'; // 출력구분 (0 : Print), Len=3
Guard(StrList, TStringList.Create);
SplitString(aO.S['pagersize'], 'X', StrList);
if StrList.Count > 1 then
begin
O.S['unitPaperSizeW'] := GetStrRange(StrList[0], 10);
O.S['unitPaperSizeH'] := GetStrRange(StrList[1], 10);
end else begin
O.S['unitPaperSizeW'] := '';
O.S['unitPaperSizeH'] := '';
end;
O.S['xerox_YN'] := GetStrRange(aO.S['xeroxyn'], 1);
O.S['macIP'] := GetStrRange(aO.S['macip'], 15); // GetStrRange(aO.S['usercommacaddr'], 15);
O.S['usercommacaddr'] := GetStrRange(aO.S['usercommacaddr'], 15);
O.S['macFloor'] := GetStrRange(aO.S['mac_floor'], 10);
O.S['macPartName'] := GetStrRange(aO.S['mac_partname'], 30);
O.S['bizWorkCode'] := GetStrRange(aO.S['bizworkCode'], 100);
O.S['billable'] := GetStrRange(IntToStr(aO.I['billable']), 1);
O.S['err_BizWorkCodeYN'] := GetStrRange(aO.S['err_bizworkcodeyn'], 1);
O.S['collectMode'] := '0'; // 집계방식 (김앤장 사양 대응 -> 0:실시간 집계, 1: 접속후 집계, 2:Upload 집계), Len=1
O.S['winID'] := GetStrRange(aO.S['usercomloginname'], 30);
O.S['jobSTDate'] := GetStrRange(StrsReplace(aO.S['jobstdate'], ['-', ':', 'T', 'Z'], ''), 14);
// 정보 추가 25_0911 20:44:36 kku
O.S['processName'] := GetStrRange(aO.S['processname'], 30);
O.S['deviceName'] := GetStrRange(aO.S['devicename'], 30);
O.S['printName'] := GetStrRange(aO.S['printname'], 30);
gMgSvc.EventLog.Push(O.AsJSon);
except
on E: Exception do
ETgException.TraceException(E, 'Fail .. SendEventLog()');
end;
end;
procedure TxPrintLogService.StartService;
var
StrList: TStringList;
i: Integer;
O: ISuperObject;
begin
if not DirectoryExists(sLogDir_) then
exit;
Guard(StrList, TStringList.Create);
ExtrFilesFromDir(sLogDir_, StrList, false, 'json');
for i := 0 to StrList.Count - 1 do
begin
if LoadJsonObjFromFile(O, sLogDir_ + StrList[i]) then
begin
Send_xPrintLog(O);
DeleteFile(sLogDir_ + StrList[i]);
end;
end;
if not bIsWorking_ then
begin
AddDirWatch(sLogDir_);
bIsWorking_ := true;
Processor_.StartThread;
end;
end;
procedure TxPrintLogService.StopService;
begin
if bIsWorking_ then
begin
bIsWorking_ := false;
Processor_.Clear;
Processor_.PauseThread;
try
ClearDirWatch;
except
on E: Exception do
ETgException.TraceException(Self, E, 'Fail .. StopService()');
end;
end;
end;
procedure TxPrintLogService.ProcessDirWatchEnt(Sender: TObject; pInfo: PDirWatchEnt);
var
O: ISuperObject;
begin
try
if pInfo.dwAction = 3 then // Modify
begin
if GetFileExt(pInfo.sPath).ToUpper <> 'JSON' then
exit;
if LoadJsonObjFromFile(O, pInfo.sPath) then
begin
Send_xPrintLog(O);
DeleteFile(pInfo.sPath);
end;
end;
except
on E: Exception do
ETgException.TraceException(Self, E, 'Fail .. ProcessDirWatchEnt()');
end;
end;
end.