Files
dyp/backup_ansi/uFrame_Ofen.pas
T
2026-05-07 20:25:34 +08:00

327 lines
13 KiB
ObjectPascal

unit uFrame_Ofen;
interface
uses
System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
FMX.Types, FMX.Graphics, FMX.Controls, FMX.Forms, FMX.Dialogs, FMX.StdCtrls,
uFrameBase, System.ImageList, FMX.ImgList, FMX.Controls.Presentation,uKsoap,
FMX.Edit, FMX.Objects,uShowInfo;
type
TFrame_Ofen = class(TFrameBase)
Rectangle88: TRectangle;
Option1: TRectangle;
Glyph9: TGlyph;
OptionLabel1: TText;
Text19: TText;
Edit_TrolleyNum: TEdit;
Option2: TRectangle;
Glyph2: TGlyph;
OptionLabel3: TText;
Text6: TText;
Edit_Temperature1: TEdit;
Option3: TRectangle;
Glyph3: TGlyph;
OptionLabel5: TText;
Text23: TText;
Edit_Time1: TEdit;
Option4: TRectangle;
Glyph12: TGlyph;
OptionLabel7: TText;
Text28: TText;
Edit_Temperature2: TEdit;
Option5: TRectangle;
Glyph4: TGlyph;
Text3: TText;
Text4: TText;
Edit_Time2: TEdit;
TxtError: TText;
Rectangle1: TRectangle;
ImageList1: TImageList;
Rectangle2: TRectangle;
Glyph1: TGlyph;
Text1: TText;
Text2: TText;
Edit_Temperature3: TEdit;
Rectangle3: TRectangle;
Glyph5: TGlyph;
Text5: TText;
Text7: TText;
Edit_Time3: TEdit;
private
{ Private declarations }
public
procedure FillDefaultValue(sPartnumValue,sDefaultTxt:string);override; //填写默认值
function DoExec():boolean;override; //判断输入是否有效,执行插入主表,或打开窗体
function CheckValid(var sTxt:string):boolean;override;
function GetFixture_Code():string;override; //返回治具ID
procedure Initialize();override;
end;
var
Frame_Ofen: TFrame_Ofen;
implementation
{$R *.fmx}
uses uDM, uInkPrintConent, uPucFun, uSafeLog, uErrorInfo, uTcpDevice,Winapi.ActiveX;
function TFrame_Ofen.GetFixture_Code():string; //返回治具ID
begin
Result:=Edit_TrolleyNum.Text; //烤箱編號
end;
procedure TFrame_Ofen.Initialize;
var
vvP_PC:string;
begin
vvP_PC:= dm.MemTableReadKeyValue('设备信息','P_PC'); //string类型
// OptionLabel1.Text:= ''+ vvP_PC;
if vvP_PC.ToUpper='18K' then
begin
Rectangle3.Visible:= False;
Rectangle2.Visible:= False;
// OptionLabel1.Text:= OptionLabel1.Text+'1';
end;
end;
function TFrame_Ofen.CheckValid(var sTxt:string):boolean; //返回面次数据
var
aa:Extended;
sError:string;
begin
Result:=false;
try
if not GetRadioTxt(sTxt) then //没有选择,提示出错信息
begin
ErrorLayout(GridLayout,TxtError,'请选择TOP面/BOT面');
Exit;
end;
if Trim(Edit_TrolleyNum.Text)='' then begin Error(Edit_TrolleyNum,TxtError,'烤箱編號不能為空');Exit;end;
if Trim(Edit_Temperature1.Text)='' then begin Error(Edit_Temperature1,TxtError,'第一段溫度不能為空');Exit;end;
if Trim(Edit_Temperature2.Text)='' then begin Error(Edit_Temperature2,TxtError,'第二段溫度不能為空');Exit;end;
if Rectangle2.Visible and (Trim(Edit_Temperature3.Text)='') then begin Error(Edit_Temperature3,TxtError,'第三段溫度不能為空');Exit;end;
if Trim(Edit_Time1.Text)='' then begin Error(Edit_Time1,TxtError,'第一段時間不能為空');Exit;end;
if Trim(Edit_Time2.Text)='' then begin Error(Edit_Time2,TxtError,'第二段時間不能為空');Exit;end;
if Rectangle3.Visible and (Trim(Edit_Time3.Text)='') then begin Error(Edit_Time3,TxtError,'第三段時間不能為空');Exit;end;
if not TryStrToFloat(Edit_Temperature1.Text,aa) then begin Error(Edit_Temperature1,TxtError,'第一段溫度類型錯誤,請重新輸入.');Exit;end;
if not TryStrToFloat(Edit_Temperature2.Text,aa) then begin Error(Edit_Temperature2,TxtError,'第二段溫度類型錯誤,請重新輸入.');Exit;end;
if Rectangle2.Visible and (not TryStrToFloat(Edit_Temperature3.Text,aa)) then begin Error(Edit_Temperature3,TxtError,'第三段溫度類型錯誤,請重新輸入.');Exit;end;
if not TryStrToFloat(Edit_Time1.Text,aa) then begin Error(Edit_Time1,TxtError,'第一段時間類型錯誤,請重新輸入.');Exit;end;
if not TryStrToFloat(Edit_Time2.Text,aa) then begin Error(Edit_Time2,TxtError,'第二段時間類型錯誤,請重新輸入.');Exit;end;
if Rectangle3.Visible and (not TryStrToFloat(Edit_Time3.Text,aa)) then begin Error(Edit_Time3,TxtError,'第三段時間類型錯誤,請重新輸入.');Exit;end;
Result:=true;
if Result then Error(Edit_TrolleyNum,TxtError,'');
except
on e:Exception do
begin
Result:=false;
DbApiLog.Error('CheckValid 错误:%s',[ChangeErrorInfo(E.Message)]);
// sError:=ChangeErrorInfo(E.Message);
end;
end;
end;
procedure TFrame_Ofen.FillDefaultValue(sPartnumValue,sDefaultTxt:string);
var
tmpList:TStrings;
begin
if sDefaultTxt='' then Exit;
tmpList:=TStringList.Create;
try
tmpList.DelimitedText:=sDefaultTxt;
if tmpList.Count>24 then
begin
Edit_Temperature1.Text:=tmpList.Strings[20]; //第一段溫度
Edit_Time1.Text:=tmpList.Strings[21]; //第一段時間
Edit_Temperature2.Text:=tmpList.Strings[22]; //第二段溫度
Edit_Time2.Text:=tmpList.Strings[23]; //第二段時間
if ksoap.P_PC.ToUpper<>'18K' then
begin
Edit_Temperature3.Text:=tmpList.Strings[25]; //第三段溫度
Edit_Time3.Text:=tmpList.Strings[26]; //第三段時間
end;
end;
finally
tmpList.Free;
end;
end;
function TFrame_Ofen.DoExec():boolean;
var
LotNoRecord:TLotNoRecord;
vId:Integer;
sTxt:string;
sError:string;
vP_ID:Double;
f:TStrings;
begin
Result:=false;
if CheckValid(sTxt) then //上传数据
begin
LotNoRecord:=TLotNoRecord.Create('-1'); //初始化记录
LotNoRecord.P_LOT:=ksoap.P_Lot;
LotNoRecord.P_LOT_TYPE:='正常板';
LotNoRecord.P_Enable:='Y';
LotNoRecord.P_ID:=0;
LotNoRecord.P_ORG_CODE:=ksoap.P_ORG_CODE; //廠區
LotNoRecord.P_NUM:=ksoap.P_WORK_NUM; //工號
LotNoRecord.P_PC:=ksoap.P_PC; //製程
LotNoRecord.P_LINE:=ksoap.P_LINE; //線別
LotNoRecord.P_LINE_NUM:=ksoap.P_LINE_NUM; //線別編號
if ksoap.P_LINE='氮氣烤箱' then
begin
LotNoRecord.P_TROLLEY_NUM:=Edit_TrolleyNum.Text; //烤架編號
LotNoRecord.P_PRODUCT_PRESSURE:=StrToFloat(Edit_Time1.Text); //第一段時間(MIN)
LotNoRecord.P_COMPRESS_SEC:=StrToFloat(Edit_Time2.Text); //第二段時間(MIN)
if ksoap.P_PC.ToUpper<>'18K' then
begin
LotNoRecord.P_COMPRESS_SEC:=StrToFloat(Edit_Time3.Text); //第三段時間(MIN)
LotNoRecord.P_PREHEATING_SEC:=StrToFloat(Edit_Temperature3.Text); //第三段溫度(℃)
end;
LotNoRecord.P_PREHEATING_SEC:=StrToFloat(Edit_Temperature2.Text); //第二段溫度(℃)
LotNoRecord.P_COM_TEMPERATURE:=StrToFloat(Edit_Temperature1.Text); //第一段溫度(℃)
// LotNoRecord.P_COMPRESS_SEC:= //烘烤時間(min)
// LotNoRecord.P_COM_TEMPERATURE:= //烘烤溫度(℃)
end;
if ksoap.P_LINE='大氣烤箱' then
begin
LotNoRecord.P_TROLLEY_NUM:=Edit_TrolleyNum.Text; //烤架編號
LotNoRecord.P_ELE_AREA1:=StrToFloat(Edit_Temperature1.Text); //第一段溫度(℃)
LotNoRecord.P_COM_TEMPERATURE:=StrToFloat(Edit_Temperature2.Text); //第二段溫度(℃)
LotNoRecord.P_PREHEATING_SEC:=StrToFloat(Edit_Time3.Text); //第三段溫度(℃)
LotNoRecord.P_SIDE := sTxt; // 面次
LotNoRecord.P_COMPRESS_SEC:=StrToFloat(Edit_Temperature3.Text); //第三段時間(MIN)
LotNoRecord.P_PRODUCT_PRESSURE:=StrToFloat(Edit_Time2.Text); //第二段時間(min)
LotNoRecord.P_ELE_AREA2:=StrToFloat(Edit_Time1.Text); //第一段時間(min)
end;
LotNoRecord.P_CREATION_DATE:=FormatDateTime('yyyymmdd hh:mm:ss',Now);
sError:='';
vP_ID:=Ksoap.Thread_cf_traceability_seq_f(ksoap.P_ORG_CODE,sError);
LotNoRecord.P_ID:=vP_ID;
if vP_ID=0 then
BEGIN
dm.InsertMain(vId,LotNoRecord,true);
ShowInfoOK('連接數據庫服務器失敗數據暫存本地,正在生產中...');
Result:=true;
END
ELSE
BEGIN
//直接调用API,出错再保存本地
if not Ksoap.Thread_Insert_CM_WIP_PROCESS_LINE_HISTORY_NEW(LotNoRecord,sError) then //提交主表不成功
begin
if sError='連接數據庫服務器失败' then
begin
dm.InsertMain(vId,LotNoRecord,true);
ShowInfoOK('連接數據庫服務器失敗數據暫存本地,正在生產中...');
Result:=true;
end
else
ShowError(sError);
end
else
begin
if ksoap.P_LINE='氮氣烤箱' then
begin
f:= TStringlist.Create;
try
DataSavaLog('').OpenLog(LotNoRecord.P_LOT+','+LotNoRecord.P_TROLLEY_NUM+'.log',f);
DataSavaLog('').MessageInfo(LotNoRecord.P_LOT+','+LotNoRecord.P_TROLLEY_NUM,f.Text);
DbApiLog.MessageInfo('文件'+LotNoRecord.P_LOT+','+LotNoRecord.P_TROLLEY_NUM+'需要生产数量:'+f.Count.ToString);
//开启线程,提交数据到服务器,提交不成功,就保存在本地
TThread.CreateThreadX<TStrings>(
procedure (Avalue:TStrings)
var
i:integer;
DetailRecord:TDetailRecord;
sError:string;
bResult:boolean;
sAvalue,tmp,tmp1:string;
tmpList: TStrings;
begin
tmpList:=TStringList.Create;
try
DbApiLog.MessageInfo('需提交数据数量:'+Avalue.Count.ToString);
for I := 0 to Avalue.Count-1 do
begin
sAvalue:= Avalue.Strings[i].Replace(' ','#');
tmpList.DelimitedText:=sAvalue;
DbApiLog.MessageInfo(tmpList.Count.ToString+':'+sAvalue);
if tmpList.Count>2 then
begin
DetailRecord.P_ORG_CODE:=ksoap.P_ORG_CODE; //廠區
DetailRecord.P_LOT:=ksoap.P_Lot; //批号
DetailRecord.P_BC:=tmpList.Strings[2]; // 條碼(批號10碼+PNL3碼)
DetailRecord.P_PC:=ksoap.P_PC; //製程
DetailRecord.P_LINE:=ksoap.P_LINE; //線別
DetailRecord.P_LINE_NUM:=ksoap.P_LINE_NUM; //線別編號
DetailRecord.P_LOT_TYPE:='正常板'; // 正常板/重工板
DetailRecord.P_TROLLEY_NUM:=LotNoRecord.P_TROLLEY_NUM; // 台車編號
DetailRecord.P_COPPER_MODEL:=LotNoRecord.P_COPPER_MODEL; // 銅箔型號
DetailRecord.P_BUFFER_TYPE:=LotNoRecord.P_Buffer; // 緩衝材型號
DetailRecord.P_CREATION_DATE:=FormatDateTime('yyyymmdd hh:mm:ss',Now);
DetailRecord.P_ID:=vP_ID.ToString;
CoInitialize(nil);
try
bResult:=Ksoap.Insert_cc_wip_lot_bc_history(DetailRecord,sError);
if sError='連接數據庫服務器失败' then
begin
dm.InsertDetail(vId,DetailRecord);
tmp:=sAvalue+'提交失敗:連接數據庫服務器失败,暫存本地';
end;
if bResult then
begin
tmp:=sAvalue+'提交成功:OK';
end
else
tmp:=sAvalue+'提交失敗:'+sError;
WorkLog.MessageInfo(tmp);
finally
CoUninitialize;
end;
end;
end;
finally
Avalue.Free;
tmpList.Free;
end;
// ShowInfoOK('上傳成功');
end,f
).Start;
ShowInfoOK('正在生產中...');
finally
DataSavaLog('').DelFile(LotNoRecord.P_LOT+','+LotNoRecord.P_TROLLEY_NUM);
end;
end
else
begin
ShowInfoOK('上傳成功,正在生產中...');
end;
Result:=true;
end;
END;
end;
end;
end.