unit uBlandDBJConent; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Objects, System.ImageList, FMX.ImgList, FMX.Controls.Presentation, FMX.Edit,uTcpDevice, FMX.Layouts, System.Rtti, FMX.Grid.Style, FMX.Memo, FMX.ScrollBox, FMX.Grid, Winapi.Windows, uDM,uShowInfo, FMX.StdCtrls,uKsoap,uSafeLog,Winapi.ActiveX, System.StrUtils, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, IdHTTP, REST.Types, Data.Bind.Components, Data.Bind.ObjectScope, REST.Client, FMX.Memo.Types; type TfrmBlandDBJConent = class(TForm) Rectangle1: TRectangle; Rectangle2: TRectangle; Rectangle3: TRectangle; TxtFactoryCode: TText; Rectangle4: TRectangle; Rectangle6: TRectangle; Text2: TText; ImageList1: TImageList; Rectangle18: TRectangle; Rectangle19: TRectangle; Rectangle20: TRectangle; Text7: TText; Rectangle26: TRectangle; Text17: TText; Rectangle33: TRectangle; Text3: TText; Rectangle5: TRectangle; Rectangle7: TRectangle; Rectangle8: TRectangle; Rectangle10: TRectangle; Rectangle11: TRectangle; Rectangle12: TRectangle; Memo1: TMemo; Text4: TText; Text5: TText; Rectangle15: TRectangle; Rectangle16: TRectangle; Rectangle17: TRectangle; Rectangle22: TRectangle; Text11: TText; TxtEmpNo: TText; Rectangle25: TRectangle; Text12: TText; TxtLotNo: TText; Rectangle28: TRectangle; Text13: TText; TxtGoodsNo: TText; Rectangle29: TRectangle; Line1: TLine; Rectangle30: TRectangle; Line2: TLine; Text14: TText; TxtPc: TText; Text18: TText; TxtLine: TText; Text20: TText; TxtLineNum: TText; Rectangle31: TRectangle; Text22: TText; TxtLotNum: TText; Rectangle32: TRectangle; Text26: TText; Text29: TText; Line3: TLine; StringGrid1: TStringGrid; StringColumn1: TStringColumn; StringColumn6: TStringColumn; Rectangle35: TRectangle; Text21: TText; Text16: TText; Glyph23: TGlyph; TxtVerInfo: TText; Rectangle001: TRectangle; Glyph1: TGlyph; Text6: TText; TxtPc11: TText; EdtInput1: TEdit; Rectangle23: TRectangle; Text1: TText; Text10: TText; TxtError: TText; StringColumn2: TStringColumn; TxtBarCodePrompt: TText; TxtLotNumInfo: TText; Timer1: TTimer; Rectangle9: TRectangle; Text8: TText; Text9: TText; IdHTTP1: TIdHTTP; procedure Text16Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure Text5Click(Sender: TObject); procedure Rectangle20Click(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure Text1Click(Sender: TObject); procedure Text17Click(Sender: TObject); procedure Timer1Timer(Sender: TObject); procedure FormShow(Sender: TObject); procedure TxtBarCodePromptClick(Sender: TObject); procedure TxtLotNumInfoClick(Sender: TObject); private BarCodeDic:TStringList; procedure F2DCodeWork(Sender: TObject;sValue: string); procedure F2DCodeWork2(Sender:TObject;sValue: string); //读取条码 procedure NumEnceWork(Avalue: string); procedure RfidWork(Avalue: string); procedure F2DCodeShowState(Avalue: string); //显示读头状态 procedure AddLog(sLog:string); procedure ShowEndNum(); function httpget(url: string;JsonValue:string): String; { Private declarations } public iDetailCount:Integer; iCount:Integer; vP_ID:Double; vId:integer; F2DCode:array[0..9] of T2DCode; Rfid:TRfid; NumEnce:TNumEnce; LotNoRecord:TLotNoRecord; end; var frmBlandDBJConent: TfrmBlandDBJConent; implementation {$R *.fmx} uses uPucFun, uMain, uAlarmLed, uErrorInfo, IdGlobal; //609104 procedure TfrmBlandDBJConent.NumEnceWork(Avalue: string); begin end; procedure TfrmBlandDBJConent.RfidWork(Avalue: string); begin end; procedure TfrmBlandDBJConent.ShowEndNum(); begin TxtLotNumInfo.Visible:=ksoap.P_Lot_Num-iCount<6; if TxtLotNumInfo.Visible then begin if ksoap.P_Lot_Num>iCount then TxtLotNumInfo.Text:=Format('该批次即将完成,还剩%d片,请注意换批!',[ksoap.P_Lot_Num-iCount]) else TxtLotNumInfo.Text:='该批次已经完成,请注意换批!'; end; end; procedure TfrmBlandDBJConent.AddLog(sLog:string); begin if Memo1.Lines.Count>100 then Memo1.Lines.Delete(0); Memo1.Lines.Add(FormatDateTime('yyyymmdd hh:mm:ss.zzz ',Now)+sLog); Memo1.SelStart:=Length(Memo1.Text); Memo1.SelLength:=0; end; procedure TfrmBlandDBJConent.F2DCodeShowState(Avalue: string); //显示读头状态 begin AddLog(Avalue); end; procedure TfrmBlandDBJConent.F2DCodeWork(Sender:TObject;sValue: string); //读取条码 var sError: string; procedure ReOpen2D(); begin TThread.CreateAnonymousThread( procedure begin Sleep(3000); TThread.Synchronize( nil, procedure begin if Sender<>nil then T2DCode(Sender).Open; TxtBarCodePrompt.Text:='读码中...'; end ); end ).Start; end; begin AddLog('条码读取成功:'+sValue); if sValue='ERROR' then BEGIN AddLog('条码读取出错'+sValue); WorkLog.MessageInfo('条码读取出错'+sValue); TxtBarCodePrompt.Text:='二维码读取出错'; ReOpen2D(); Exit; END; // AddLog('条码读取成功1:'+sValue); if BarCodeDic.IndexOf(sValue)>=0 then //判断重复 BEGIN AddLog('条码重复'+sValue); WorkLog.MessageInfo('条码重复'+sValue); TxtBarCodePrompt.Text:=Format('二维码重复:%s',[sValue]); ReOpen2D(); Exit; END; // AddLog('条码读取成功2:'+sValue); // if LeftStr(TxtLotNo.Text,8)<>LeftStr(sValue,8) then // begin // AddLog('注意混批:'+sValue); // if NumEnce<>nil then // begin // NumEnce.SendStr('#011301'); // Sleep(500); // NumEnce.SendStr('#011300'); // end; // AddLog('条码读取成功23:'+sValue); // ReOpen2D(); // Exit; // //Sleep(100); // // NumEnce.SendStr('#011300'); // // Sleep(50); // // NumEnce.SendStr('#011400'); // end; // AddLog('条码读取成功3:'+sValue); if NumEnce<>nil then begin NumEnce.SendStr('#011101'); Sleep(500); NumEnce.SendStr('#011100'); //Sleep(100); // NumEnce.SendStr('#011300'); // Sleep(50); // NumEnce.SendStr('#011400'); end; // AddLog('条码读取成功4:'+sValue); if AlarmLed<>nil then //打开报警灯 begin AlarmLed.SparkGreen(sError); end; BarCodeDic.Add(sValue); with StringGrid1 do begin inc(iCount); BeginUpdate; RowCount:=RowCount+1; Cells[0,RowCount-1]:=iCount.ToString; Cells[1,RowCount-1]:=sValue; Cells[2,RowCount-1]:=FormatDateTime('yyyymmdd hh:mm:ss',Now); SelectRow(RowCount-1); EndUpdate; inc(iDetailCount); Text29.Text:=iCount.ToString; end; ShowEndNum(); TxtBarCodePrompt.Text:=Format('二维码 %d:%s',[iCount,sValue]); //EdtInput1.Text:= sValue; WorkLog.MessageInfo('条码sValue:'+sValue); // AddLog('条码读取成功5:'+sValue); //开启线程,提交数据到服务器,提交不成功,就保存在本地 TThread.CreateThreadX( procedure (Avalue:string) var DetailRecord:TDetailRecord; sError:string; bResult:boolean; tmp,tmp1:string; begin DetailRecord.P_ORG_CODE:=ksoap.P_ORG_CODE; //廠區 DetailRecord.P_LOT:=TxtLotNo.Text; //批号 DetailRecord.P_BC:=Avalue; // 條碼(批號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:='-1'; // 正常板/重工板 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:=Avalue+'提交失敗:連接數據庫服務器失败,暫存本地'; end; if bResult then begin tmp:=Avalue+'提交成功:OK'; tmp1:= (httpget('/steel-plate/put/product/2did', '"lineNum":"'+ksoap.P_LINE+'","lotNumber":"'+ ksoap.P_Lot+'","lotPanel":"'+ Avalue+'","processLineId":"'+ vP_ID.ToString+'"')); AddLog(tmp1); WorkLog.MessageInfo(tmp1); end else tmp:=Avalue+'提交失敗:'+sError; WorkLog.MessageInfo(tmp); finally CoUninitialize; end; TThread.Synchronize( nil, procedure begin AddLog(tmp); end ); end,sValue ).Start; //开启线程,3秒后开启2D读头 ReOpen2D(); end; procedure TfrmBlandDBJConent.F2DCodeWork2(Sender:TObject;sValue: string); //读取条码 var sError: string; procedure ReOpen2D(); begin TThread.CreateAnonymousThread( procedure begin Sleep(3000); TThread.Synchronize( nil, procedure begin if Sender<>nil then T2DCode(Sender).Open; TxtBarCodePrompt.Text:='读码中...'; end ); end ).Start; end; begin AddLog('条码2读取成功:'+sValue); if sValue='ERROR' then BEGIN AddLog('条码2读取出错'+sValue); WorkLog.MessageInfo('条码2读取出错'+sValue); TxtBarCodePrompt.Text:='二维码2读取出错'; ReOpen2D(); Exit; END; // AddLog('条码读取成功4:'+sValue); if AlarmLed<>nil then //打开报警灯 begin AlarmLed.SparkGreen(sError); end; //EdtInput1.Text:= sValue; WorkLog.MessageInfo('条码2sValue:'+sValue); // AddLog('条码读取成功5:'+sValue); //开启线程,提交数据到服务器,提交不成功,就保存在本地 TThread.CreateThreadX( procedure (Avalue:string) var DetailRecord:TDetailRecord; sError:string; bResult:boolean; tmp:string; begin CoInitialize(nil); try try tmp:= (httpget('/mirror-plate/put/product', '"fixtureCodeSeq":"'+Avalue+'","lotNumber":"'+ ksoap.P_Lot+'","machineName":"'+ ksoap.P_LINE+'","machineNumber":"' +ksoap.P_LINE_NUM+'","processCode":"'+ ksoap.P_PC+'","processLineId":"'+ vP_ID.ToString+'","trayNumber":"'+ LotNoRecord.P_TROLLEY_NUM+'","workNumber":"'+ ksoap.P_WORK_NUM+'"')); // AddLog(tmp); WorkLog.MessageInfo(tmp); finally CoUninitialize; end; except on e:Exception do begin DbApiLog.Error('TIdHttp 错误:%s',[ChangeErrorInfo(E.Message)]); // sError:=ChangeErrorInfo(E.Message); end; end; TThread.Synchronize( nil, procedure begin Text9.Text:=(StrToInt(Text9.Text)+1).ToString; AddLog(tmp); end ); end,sValue ).Start; //开启线程,3秒后开启2D读头 ReOpen2D(); end; procedure TfrmBlandDBJConent.FormClose(Sender: TObject; var Action: TCloseAction); begin if (F2DCode[0]<>nil) and (StrToInt(Text29.Text)=0) then Text29.Text:= TxtLotNum.Text; //退出的时候 dm.InsertQtyTime(vId.ToString,'0',Text29.Text,'-1','-1','-1','-1'); end; function TfrmBlandDBJConent.httpget(url:string;JsonValue:string):String; var IdHTTP1: TIdHTTP; jsonToSend,tmpStream : TStringStream; surl,tmpStr : String; begin IdHTTP1 := TIdHttp.Create(nil); try IdHTTP1.HandleRedirects := True;//允许头转向 IdHTTP1.ReadTimeout := 5000;//请求超时设置 IdHTTP1.Request.ContentType := 'application/json';//设置内容类型为json IdHTTP1.HandleRedirects:=True; IdHTTP1.ProtocolVersion:=pv1_1; IdHTTP1.HTTPOptions:=IdHTTP1.HTTPOptions+[hoTreat302Like303]; // Memo1.Text:=IdHTTP1.Post('http://www.*.com/User/login.aspx',StrLst,IndyTextEncoding(encUTF8)); //http.Request.CustomHeaders.Values['Authorization'] := Concat('Bearer ',这里写token信息 ); jsonToSend := TStringStream.Create('{'+UTF8Encode(JsonValue)+'}');//",name":"Peter Pan" 创建一个包含JSON数据的变量 tmpStream := TStringStream.Create(''); try DbApiLog.MessageInfo('TIdHttp_jsonToSend:%s',[jsonToSend.DataString]); jsonToSend.Position := 0;//将流位置置为0 surl:= 'http://home170.compeq.huizhou.gd.cn:8090'+url; DbApiLog.MessageInfo('IdHttp_Post:%s,%s',[surl,jsonToSend.DataString]); IdHTTP1.Post(surl, jsonToSend,tmpStream);//用MEMO控件接收POST后的数据返回 tmpStr:= UTF8Decode(tmpStream.DataString); DbApiLog.MessageInfo('IdHttp_Post返回:%s',[tmpStr]); finally jsonToSend.free; tmpStream.free; IdHTTP1.free;//用完记得释放 end; Result:= tmpStr; except on e:Exception do begin Result:=''; DbApiLog.Error('TIdHttp 错误:%s,%s,%s',[surl,jsonToSend.DataString,ChangeErrorInfo(E.Message)]); // sError:=ChangeErrorInfo(E.Message); end; end; end; procedure TfrmBlandDBJConent.FormCreate(Sender: TObject); var sDevName,sIp,sPort:string; tmpValue:string; i,i_F2DCode:integer; begin TxtFactoryCode.Text:= FactoryCode; //厂区 TxtEmpNo.Text:=ksoap.P_WORK_NUM; //工号 TxtLotNo.Text:=ksoap.P_Lot; //批号 TxtGoodsNo.Text:=ksoap.P_Goods_Num; //料号 TxtPc.Text:=ksoap.P_PC; //制程代码 TxtLine.Text:=ksoap.P_LINE; //制程名 TxtLineNum.Text:=ksoap.P_LINE_NUM; //线别 TxtLotNum.Text:=ksoap.P_Lot_Num.tostring; ShowEndNum(); TxtVerInfo.Text:=GetBuildInfo; Memo1.Lines.Clear; TxtShowErrorInfo(TxtError,''); iCount:=0; iDetailCount:=0; BarCodeDic:=TStringList.Create; BarCodeDic.Sorted:=true; //Rectangle001.Visible:=ksoap.P_LINE='油墨印刷機'; i_F2DCode:= 0; //根据配置加载设备 for i := 1 to 9 do begin tmpValue:=dm.MemTableReadKeyValue('读头','tv_line_speed'+i.ToString); if tmpValue<>'' then begin if CheckParameter(tmpValue,sDevName,sIp,sPort) then begin if sameText(sDevName.ToLower,'keyence') then //1、2D读头 ,2、鏡板、板翹读头 begin inc(i_F2DCode); F2DCode[i]:=T2DCode.Create(sIp,sPort.ToInteger); F2DCode[i].Num:=i_F2DCode; if i_F2DCode=1 then F2DCode[i].OnWork:=F2DCodeWork else F2DCode[i].OnWork:=F2DCodeWork2; F2DCode[i].OnShowState:=F2DCodeShowState; F2DCode[i].Connect; TThread.CreateThreadX( procedure (Avalue:Integer) begin Sleep(1000); TThread.Synchronize( nil, procedure begin F2DCode[Avalue].Open; end ); end,i ).Start; end; if sameText(sDevName,'RFID') then //RFID begin Rfid:=TRfid.Create(sIp,sPort.ToInteger); Rfid.OnWork:=RfidWork; end; if sameText(sDevName,'WJ95') then //采集器 begin NumEnce:=TNumEnce.Create(sIp,sPort.ToInteger); NumEnce.OnWork:=NumEnceWork; end; end; end; end; //调整网格列宽 StringColumn6.Width:=StringGrid1.Width-StringColumn1.Width-25-StringColumn2.Width; end; procedure TfrmBlandDBJConent.FormDestroy(Sender: TObject); var i:integer; begin for i := 0 to 9 do begin if F2DCode[i]<>nil then begin F2DCode[i].Close; Sleep(200); FreeandNil(F2DCode[i]); end; end; if Rfid<>nil then FreeandNil(Rfid); if NumEnce<>nil then FreeandNil(NumEnce); BarCodeDic.Free; end; procedure TfrmBlandDBJConent.FormShow(Sender: TObject); begin // AddLog(httpget('/mirror-plate/put/product', // '"fixtureCodeSeq":"D2FDXJG1D2631","lotNumber":"'+ // ksoap.P_Lot+'","machineName":"'+ // ksoap.P_LINE+'","machineNumber":"' // +ksoap.P_LINE_NUM+'","processCode":"'+ // ksoap.P_PC+'","processLineId":"'+ // vP_ID.ToString+'","trayNumber":"'+ // LotNoRecord.P_TROLLEY_NUM+'","workNumber":"'+ // ksoap.P_WORK_NUM+'"')); end; procedure TfrmBlandDBJConent.Rectangle20Click(Sender: TObject); begin if ShowInfoOKCancel('該批還沒有完成,真的要退出嗎?') then Close; end; procedure TfrmBlandDBJConent.Text16Click(Sender: TObject); begin ShowTouchKeyBoard(); end; procedure TfrmBlandDBJConent.Text17Click(Sender: TObject); begin Close; end; procedure TfrmBlandDBJConent.Text1Click(Sender: TObject); var sError:string; begin sError:=''; //更换烤箱号 if Text1.TextSettings.FontColor=TAlphaColorRec.Silver then Exit; Text1.TextSettings.FontColor:=TAlphaColorRec.Silver; try if ShowInfoOKCancel(Format('確定要%s嗎?',[Text6.Text])) then begin if not Ksoap.Thread_Check_tool_or_equip_status_f(Ksoap.P_Lot,Ksoap.P_LINE_NUM,EdtInput1.Text,'-1',sError) then begin TxtShowErrorInfo(TxtError,sError); Exit; end; vP_ID:=Ksoap.Thread_cf_traceability_seq_f(Ksoap.P_ORG_CODE,sError); if vP_ID=0 then //取不到ID begin TxtShowErrorInfo(TxtError,sError); Exit; end; dm.InsertQtyTime(vId.ToString,'0',iDetailCount.ToString,'-1','-1','-1','-1'); iDetailCount:=0; LotNoRecord.P_ID:=vP_ID; LotNoRecord.P_TROLLEY_NUM := EdtInput1.Text; if vP_ID=0 then BEGIN dm.InsertMain(vId,LotNoRecord,false); 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,false); end else ShowError(sError); end else begin dm.InsertMain(vId,LotNoRecord,false); dm.UpdateMainId(vId,vP_ID.ToString,True); end; END; end; finally Text1.TextSettings.FontColor:=TAlphaColorRec.White; end; end; procedure TfrmBlandDBJConent.Text5Click(Sender: TObject); begin MEMO1.Lines.Clear; end; procedure TfrmBlandDBJConent.Timer1Timer(Sender: TObject); begin Text2.Text:= GetSysTimeByFormate; end; procedure TfrmBlandDBJConent.TxtBarCodePromptClick(Sender: TObject); begin // F2DCodeWork(F2DCode[0],'D30101860L12001'); //測試板 end; procedure TfrmBlandDBJConent.TxtLotNumInfoClick(Sender: TObject); begin // F2DCodeWork2(F2DCode[1],'D2FDXJG1D2631'); //鏡板 end; end.