unit uMain; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, System.IOUtils, System.StrUtils, System.DateUtils, System.ImageList, ActiveX, ShellAPI, FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Objects, FMX.ImgList, FMX.Controls.Presentation, FMX.Edit, FMX.Pickers, FMX.ListBox, FMX.ComboEdit, FMX.Layouts, FMX.StdCtrls, utcpdevice, iniFiles, uSafeLog, uKsoap, uPucFun, uPassword, uShowInfo, udm, uFrameBase, uFrameBaseBland, uInkPrintConent, MahUSB, uConfigManager, uBusinessServices, uLogManager; type TfrmMain = class(TForm) LayoutMain: TRectangle; Rectangle7: TRectangle; Rectangle_MenuLeft: TRectangle; Rectangle_MenuRight: TRectangle; Glyph1: TGlyph; ImageList1: TImageList; Rectangle001: TRectangle; Text3: TText; TxtPc: TText; Rec_OkSave: TRectangle; Rectangle12: TRectangle; Rectangle14: TRectangle; Text7: TText; Rec_GD: TRectangle; Glyph4: TGlyph; Text8: TText; Text9: TText; EdtEmpNo: TEdit; Rec_code: TRectangle; Glyph5: TGlyph; Text10: TText; Text11: TText; EdtGoodsNo: TEdit; RectangleLotNo: TRectangle; Glyph6: TGlyph; Text12: TText; Text13: TText; EdtLotNo: TEdit; Rectangle18: TRectangle; Glyph7: TGlyph; Text14: TText; TxtLineNum: TText; Rectangle19: TRectangle; Glyph8: TGlyph; Text16: TText; TxtLine: TText; Rectangle2: TRectangle; Rectangle3: TRectangle; Rectangle6: TRectangle; Rectangle4: TRectangle; TxtFactoryCode: TText; Text2: TText; Rectangle5: TRectangle; Text21: TText; Timer1: TTimer; Rectangle35: TRectangle; Text49: TText; Rectangle36: TRectangle; TxtEmpNoError: TText; Glyph23: TGlyph; Text4: TText; TxtVerInfo: TText; TxtLotnoError: TText; Text5: TText; TxtOffline: TText; TxtGoodsNoError: TText; ComboBoxP_PC: TComboBox; StyleBook1: TStyleBook; GridLayout1: TGridLayout; Rec_Menu: TRectangle; CheckBox1: TCheckBox; Label_NG: TLabel; RectangleChild: TRectangle; procedure Text7Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure Timer1Timer(Sender: TObject); procedure Rectangle2Click(Sender: TObject); procedure Text4Click(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure EdtEmpNoKeyDown(Sender: TObject; var Key: Word; var KeyChar: Char; Shift: TShiftState); procedure EdtLotNoKeyDown(Sender: TObject; var Key: Word; var KeyChar: Char; Shift: TShiftState); procedure EdtLotNoExit(Sender: TObject); procedure Text5Click(Sender: TObject); procedure AppctionError(Sender: TObject; E: Exception); procedure ComboBoxP_PCExit(Sender: TObject); procedure TxtVerInfoClick(Sender: TObject); procedure EdtEmpNoChange(Sender: TObject); procedure EdtLotNoChange(Sender: TObject); procedure EdtEmpNoExit(Sender: TObject); procedure EdtLotNoClick(Sender: TObject); procedure FormShow(Sender: TObject); procedure ComboBoxP_PCChange(Sender: TObject); procedure EdtGoodsNoExit(Sender: TObject); procedure ComboBoxP_PCClick(Sender: TObject); procedure EdtGoodsNoKeyUp(Sender: TObject; var Key: Word; var KeyChar: Char; Shift: TShiftState); private FUsb : TUsbClass; FLastInputTime, oldFLastInputTime: TDateTime; // 记录最后输入时间 FDataAccessService: TDataAccessService; FProductionService: TProductionReportingService; procedure UIDataClear; procedure UIClear(); procedure SetMainUIParameter; procedure SetRadioOption(sRadioList: string); procedure ShowMainError(EmpNoError,LotNoError,GoodsNoError:string); procedure aaaWork(Avalue: string); function EdtLotPartnum(Value: string): Boolean; procedure UsbIN(ASender : TObject; const ADevType,ADriverName, AFriendlyName : string); procedure UsbOUT(ASender : TObject; const ADevType,ADriverName, AFriendlyName : string); procedure comlista; procedure CreateEmpNoExit; procedure EdtEmpNoExitList; procedure EdtLotNoExit1; procedure ComboBoxP_PC_Down(); procedure HFraButClick(Sender: TObject; ButtonID: Integer); { Private declarations } public DisplayFrame:TFrameBase; sLotNum:string; //批号的数量 sPartnumValue:string; //获取料号返回的数据 DbSoapThread:TDbSoapThread; end; var frmMain: TfrmMain; iniListName:TStrings; implementation {$R *.fmx} { 二维要代出 259->261 259-R->261-R 54-> 18K预烤 ? 541-> 18K后烤 18B油墨印刷机->18B大气烤箱 182-B景晖手动印刷机->182-B烤箱 } uses uSetMain, uListMoreConent, uListConent, json_dypSave, uFrame_Dyp001, uFrame_Dyp_Setup, uFrame_Dyp002, uFrame_Dyp003, uFrame_Dyp000, json_webservice; procedure TfrmMain.EdtEmpNoChange(Sender: TObject); begin if EdtEmpNo.Text='' then TxtShowErrorInfo(TxtEmpNoError,''); end; procedure TfrmMain.EdtEmpNoExit(Sender: TObject); //查用户表 var sError:string; begin if EdtEmpNo.Text='' then exit; ShowMainError('','',''); TThread.CreateAnonymousThread( procedure var sError:string; begin CoInitialize(nil); TRY if not FProductionService.ValidateUser(EdtEmpNo.Text) then begin TxtEmpNoError.TextSettings.FontColor:= $FFFF0000; ShowMainError('用户账号错误','',''); Exit; end; FINALLY CoUninitialize; END; end).Start; // EdtEmpNoExitList; end; procedure TfrmMain.EdtGoodsNoExit(Sender: TObject); begin if (EdtGoodsNo.Text = '') or (ComboBoxP_PC.ItemIndex < 0) or (EdtLotNo.Text = '') then Exit; ShowMainError('', '', ''); // 提前获取需要在线程中使用的值,避免跨线程访问VCL控件 var LItemCode := EdtGoodsNo.Text; var LLotNo := EdtLotNo.Text; var LProcessIndex := ComboBoxP_PC.ItemIndex; var LProcessNumber := ''; if LProcessIndex >= 0 then LProcessNumber := KJSon.REST_Value(KJSon.FList_pro_process.Strings[LProcessIndex], 'number'); TThread.CreateAnonymousThread( procedure var sError: string; LNeedsSync: Boolean; begin CoInitialize(nil); try sError := ''; LNeedsSync := False; // 检查是否满足执行条件 if (KJSon.FList_pro_process.Count > 0) and (LProcessIndex > -1) then begin if not FProductionService.ValidateGoodsNo(LItemCode, LProcessNumber, LLotNo) then begin LNeedsSync := True; TThread.Synchronize(nil, procedure begin TxtEmpNoError.TextSettings.FontColor := $FFFF0000; ShowMainError('二维码错误或还没有检验过', '', ''); end); Exit; end; end; // 如果有错误信息,也同步显示 if sError <> '' then begin if not LNeedsSync then // 如果尚未同步,则需要新的同步 begin TThread.Synchronize(nil, procedure begin ShowMainError(sError, '', ''); end); end else begin // 如果已经需要同步,可以合并错误信息(根据实际需求调整) TThread.Synchronize(nil, procedure begin ShowMainError('二维码错误或还没有检验过', sError, ''); end); end; end; finally CoUninitialize; end; end).Start; end; procedure TfrmMain.EdtGoodsNoKeyUp(Sender: TObject; var Key: Word; var KeyChar: Char; Shift: TShiftState); begin // 每次输入内容时,更新最后输入时间 FLastInputTime := Now; // Text13.Text:= EdtGoodsNo.Text; // if (EdtGoodsNo.Text.Length>10) then // begin // // Text13.Text:= EdtGoodsNo.Text + Key.ToString(); // Text7Click(Sender); // end; end; procedure TfrmMain.EdtEmpNoExitList; begin if (EdtEmpNo.Text<>'') and (not TxtOffline.Visible) then //不是手工操作 TThread.CreateAnonymousThread( procedure var sError:string; I: Integer; begin CoInitialize(nil); TRY //检查工号 if KJSon.REST_pro_List(EdtEmpNo.Text,2,sError)<>'' then begin TxtEmpNoError.TextSettings.FontColor:= $FFFF0000; ShowMainError(sError,'',''); Exit; end; // if (not Ksoap.xxcc_work_num_f(FactoryCode,EdtEmpNo.Text,TxtPc.Text,TxtLine.Text,sError)) then // begin // TxtEmpNoError.TextSettings.FontColor:= $FFFF0000; // ShowMainError(sError,'',''); // Exit; // end // else // begin // TxtEmpNoError.TextSettings.FontColor:= $FF0003F3; // ShowMainError('ok','',''); // end; finally CoUninitialize; end; end ).Start; end; procedure TfrmMain.EdtEmpNoKeyDown(Sender: TObject; var Key: Word; var KeyChar: Char; Shift: TShiftState); var i: Boolean; StartTime: Int64; begin StartTime := TThread.GetTickCount; try if Key = vk_Return then begin TxtEmpNoError.Text:=''; EdtGoodsNo.Text:=''; EdtLotNo.SetFocus; end; // i := (KeyChar <= #8) or (KeyChar <= #8) and (KeyChar < #48) or (KeyChar > #57); // if i then // KeyChar := #0; // // if not (KeyChar in ['0'..'9', #13]) then // KeyChar := #0; finally LogManager.LogUIOperation('KeyDown', 'EdtEmpNo', TThread.GetTickCount - StartTime); end; end; procedure TfrmMain.EdtLotNoKeyDown(Sender: TObject; var Key: Word; var KeyChar: Char; Shift: TShiftState); var StartTime: Int64; begin StartTime := TThread.GetTickCount; try if Key = vk_Return then EdtGoodsNo.SetFocus; finally LogManager.LogUIOperation('KeyDown', 'EdtLotNo', TThread.GetTickCount - StartTime); end; end; procedure TfrmMain.aaaWork(Avalue:string); begin //连接数据库服务器 TThread.Synchronize(nil, procedure begin TxtLineNum.Text:=Avalue; //Form1.Memo1.Lines.Add(); end); end; procedure TfrmMain.UIClear(); begin ComboBoxP_PC.Items.Clear; try dm.MainUI:=StrToInt(FDataAccessService.ReadProductionParams('MainUI')); except dm.MainUI:= 1; end; // EdtGoodsNo.ReadOnly:=not TxtOffline.Visible; if FDataAccessService.ReadProductionParams('DataOpline')<>'' then try dm.DataOpline:=StrToInt(FDataAccessService.ReadProductionParams('DataOpline')); except dm.DataOpline:= 0; end; TRY // KJSon.REST_pro_List('', 1, sP_KB); //查工序 if dm.MainUI=2 then //特殊处理 'VCP F线A列'=trim(TxtLine.Text) begin RectangleLotNo.Visible:=false; Rec_code.Visible:=false; Label_NG.Visible:= true; end else if dm.MainUI=3 then begin // ComboBoxP_PC_Down(); //加载数据 end else if dm.MainUI=4 then begin // // 安全释放方案 // if Assigned(DisplayFrame) then // 更标准的Delphi对象检查方式 // begin // try // DisplayFrame.Free; // finally // DisplayFrame := nil; // 重要:立即置空指针 // end; // end; // Rec_GD.Visible:= False; // RectangleLotNo.Visible:= False; Label_NG.Visible:= False; Text12.Text:= '返回工序'; DisplayFrame:=TFrame_Dyp_Setup.Create(nil); DisplayFrame.Parent:=RectangleChild; DisplayFrame.Align:=TAlignLayout.Top; DisplayFrame.GridLayout:=GridLayout1; DisplayFrame.FillDefaultValue('sPartnumValue',''); // DisplayFrame.Controls[0].BringToFront; // RectangleChild.Controls[0].BringToFront; WorkLog.MessageInfo('修维部1:%s ' , [DisplayFrame.Name]); // ShowInfoOK('上传成功,正在生产中...'); // exit; // Rectangle16.Visible:=false; end; except END; // SetMainUIParameter(); //加载界面数据 TThread.CreateAnonymousThread( procedure var sError:string; I: Integer; begin CoInitialize(nil); TRY SetMainUIParameter(); //加载界面 if DisplayFrame=nil then //其他 begin DisplayFrame:=TFrameBaseBland.Create(nil); DisplayFrame.Parent:=RectangleChild; DisplayFrame.Align:=TAlignLayout.Bottom; DisplayFrame.GridLayout:=GridLayout1; //Text21.Text:= DisplayFrame.Name; DisplayFrame.Initialize(); Exit; end; if EdtEmpNo.Visible then EdtEmpNo.SetFocus; finally CoUninitialize; end; end ).Start; end; procedure TfrmMain.UIDataClear(); VAR I:INTEGER; sP_KB:string; begin WorkLog.MessageInfo('界面初始化'); TxtShowErrorInfo(TxtEmpNoError,''); TxtShowErrorInfo(TxtLotNoError,''); TxtShowErrorInfo(TxtGoodsNoError,''); // EdtEmpNo.Text:=''; //EdtLotNo.Text:=''; EdtGoodsNo.Text:=''; for I :=GridLayout1.ChildrenCount-1 downto 0 do begin TRadioButton(GridLayout1.Children[i]).IsChecked:=false; end; if DisplayFrame<>nil then begin DisplayFrame.ClearAll; end; end; procedure TfrmMain.ComboBoxP_PCChange(Sender: TObject); var sTemp: string; begin if dm.MainUI=4 then exit; //去掉维修 // ShowMainError('1','',''); if (ComboBoxP_PC.ItemIndex>-1) and (KJSon. FList_pro_process.Count>0) then TxtLine.Text:= KJSon. REST_Value(KJSon. FList_pro_process.Strings[ComboBoxP_PC.ItemIndex], 'name'); //ComboBoxP_PC.Items.Add(KJSon. REST_Value(KJSon. FList_Str.Strings[i], 'number')); // 安全释放方案 // if (ComboBoxP_PC.ItemIndex > -1) and (KJSon. FList_pro_process.Count>0) then begin if Assigned(DisplayFrame) then // 更标准的Delphi对象检查方式 begin try DisplayFrame.Free; finally DisplayFrame := nil; // 重要:立即置空指针 end; // ComboBoxP_PC.ItemIndex:= 0; end; // end; //电应普 if (DisplayFrame=nil) and (ComboBoxP_PC.ItemIndex > -1) and (trim(KJSon. REST_Value(KJSon. FList_pro_process.Strings[ComboBoxP_PC.ItemIndex], 'attention'))<>'') then begin sTemp:= UpperCase(Trim(copy(trim(KJSon. REST_Value(KJSon. FList_pro_process.Strings[ComboBoxP_PC.ItemIndex], 'attention')),1,2))); WorkLog.MessageInfo('DisplayFrame_sTemp: %d,%s',[ComboBoxP_PC.ItemIndex,sTemp]); // ShowMainError('2','',''); if sTemp=UpperCase('bx') then begin DisplayFrame:=TFrame_Dyp001.Create(nil); DisplayFrame.Parent:=RectangleChild; DisplayFrame.Align:=TAlignLayout.Top; DisplayFrame.GridLayout:=GridLayout1; DisplayFrame.OnPanelButClick := HFraButClick; DisplayFrame.Tag:= ComboBoxP_PC.ItemIndex; // ShowMainError('3','',''); exit; end; if sTemp=UpperCase('bd') then begin DisplayFrame:=TFrame_Dyp002.Create(nil); DisplayFrame.Parent:=RectangleChild; DisplayFrame.Align:=TAlignLayout.Top; DisplayFrame.GridLayout:=GridLayout1; DisplayFrame.OnPanelButClick := HFraButClick; DisplayFrame.Tag:= ComboBoxP_PC.ItemIndex; exit; end; if sTemp=UpperCase('cl') then begin DisplayFrame:=TFrame_Dyp003.Create(nil); DisplayFrame.Parent:=RectangleChild; DisplayFrame.Align:=TAlignLayout.Top; DisplayFrame.GridLayout:=GridLayout1; DisplayFrame.OnPanelButClick := HFraButClick; DisplayFrame.Tag:= ComboBoxP_PC.ItemIndex; exit; end; if sTemp=UpperCase('nu') then //'null' begin DisplayFrame:=TFrame_Dyp000.Create(nil); DisplayFrame.Parent:=RectangleChild; DisplayFrame.Align:=TAlignLayout.Top; DisplayFrame.GridLayout:=GridLayout1; DisplayFrame.Tag:= ComboBoxP_PC.ItemIndex; exit; end; // SetRadioOption('TOP面,BOT面'); Exit; end; end; procedure TfrmMain.ComboBoxP_PCClick(Sender: TObject); begin if EdtLotNo.Text.Length=0 then begin // ShowInfoOK('工单不能为空'); TxtShowErrorInfo(TxtEmpNoError,'工单不能为空'); exit; end; end; procedure TfrmMain.ComboBoxP_PCExit(Sender: TObject); //把工序给值 begin if (ComboBoxP_PC.Count>0) and (ComboBoxP_PC.Selected<>nil) then Text13.Text:=ComboBoxP_PC.Selected.Text; end; procedure TfrmMain.ComboBoxP_PC_Down(); var i: Integer; sTemp: String; begin ComboBoxP_PC.Items.Clear; if KJSon. FList_pro_process.Count>0 then begin for I := 0 to KJSon. FList_pro_process.Count - 1 do begin sTemp:= KJSon. REST_Value(KJSon. FList_pro_process.Strings[i], 'attention').Replace('null',''); if (sTemp<>'') then sTemp:= UpperCase(Copy(sTemp, 1, 2)) + '-'; ComboBoxP_PC.Items.Add(sTemp + KJSon. REST_Value(KJSon. FList_pro_process.Strings[i], 'processName')); end; end; with ComboBoxP_PC do begin DropDownKind := TDropDownKind.Custom; for i := 0 to Count - 1 do begin ListBox.ListItems[i].TextSettings.Font.Size := 16; ListBox.ListItems[i].StyledSettings :=ListBox.ListItems[i].StyledSettings-[TStyledSetting.Size]; end; end; // ShowInfoOK(inttostr(KJSon. FList_pro_process.Count)); end; procedure TfrmMain.SetMainUIParameter(); VAR tmpList:Tstrings; sP_KB, sTemp: String; i: integer; procedure SetOption(Rectangle:TRectangle;sValue:string); var i:integer; begin if (sValue='#') then begin for I := 0 to Rectangle.ControlsCount-1 do begin if TControl(Rectangle.Controls[i]) is TGlyph then TGlyph(Rectangle.Controls[i]).ImageIndex:=-1 else TControl(Rectangle.Controls[i]).Visible:=false; end; end else begin for i := 0 to Rectangle.ControlsCount-1 do begin if Pos('OptionLabel',Rectangle.Controls[i].Name)>0 then TText(Rectangle.Controls[i]).Text:=sValue; TControl(Rectangle.Controls[i]).Visible:=true; if TControl(Rectangle.Controls[i]) is TGlyph then TGlyph(Rectangle.Controls[i]).ImageIndex:=11; end; end; end; begin sbaseUrl:=FDataAccessService.ReadConfigValue('tv_DirData','server_url'); if sbaseUrl='' then sbaseUrl:= Config.GetServerURL; FactoryCode:=FDataAccessService.ReadDeviceInfo('FACTORY_CODE'); TxtFactoryCode.Text:= FactoryCode; //string类型 // TxtPc.Text:= FDataAccessService.ReadDeviceInfo('P_PC'); //string类型 TxtLine.Text:= FDataAccessService.ReadDeviceInfo('P_LINE'); //string类型 TxtLineNum.Text:= FDataAccessService.ReadDeviceInfo('P_LINE_NUM'); //string类型 sP_KB:=FDataAccessService.ReadDeviceInfo('P_KB'); fDevRecord.FP_User:= FDataAccessService.ReadConfigValue('tv_DirData','u_user'); fDevRecord.FP_Pass:= FDataAccessService.ReadConfigValue('tv_DirData','u_pass'); try dm.Operate:=StrToInt(FDataAccessService.ReadProductionParams('tv_Operate')); except dm.Operate:= 1; end; WorkLog.MessageInfo('设备信息:'+FactoryCode+','+TxtPc.Text+','+TxtLine.Text+','+TxtLineNum.Text+','+sP_KB); //登录用户 if WebJSon.PostJSONWithREST_Login(fDevRecord.FP_User,fDevRecord.FP_Pass,sP_KB)='' then begin TxtEmpNoError.TextSettings.FontColor:= $FFFF0000; ShowMainError(sP_KB,'',''); Exit; end; if dm.MainUI=4 then //维修数据加载 begin // KJSon.REST_pro_List('', 9, sP_KB); //查工序 // if DisplayFrame<>nil then // DisplayFrame.FillDefaultValue('sPartnumValue',''); //查工序 TxtLineNum.Text:= '修维部'; end; end; procedure TfrmMain.AppctionError(Sender: TObject; E: Exception); begin WorkLog.Error('AppctionError:'+E.Message); ShowError('程序异常,请与技术人员联系!'); end; procedure TfrmMain.comlista; var ADevType,ADriverDesc, AFriendlyName : string; begin UsbOUT(nil,ADevType,ADriverDesc,AFriendlyName); end; procedure TfrmMain.FormCreate(Sender: TObject); var Filename: string; vs,sError: string; i:integer; f:TStrings; begin FDataAccessService := TBusinessServiceFactory.GetDataAccessService(); FProductionService := TBusinessServiceFactory.GetProductionReportingService(''); //http://home09.compeq.huizhou.gd.cn/ctshopfloor/Mor/PRM/MorQuery.asp 查询 制程名称 設備統稱 Application.OnException:=AppctionError; WorkLog.MessageInfo(''); WorkLog.MessageInfo('程序开始'); DbApiLog.MessageInfo(''); DbApiLog.MessageInfo('程序开始'); ksoap.OnLine:=true; sError:= ''; // ksoap.Thread_ExecuteDataSet('select sysdate from dual',sError);//查时间 // Ksoap.getPartnumTime('R300000100','TIME',sError); try FLastInputTime := Now; // 初始化时间 oldFLastInputTime:= FLastInputTime; // SetTime(sError); Except end; TxtOffline.Visible:=false; //手工操作 dm.LoadMain(); dm.LoadDetail(); //R3003420L //R3003420L12001 ComName:=FDataAccessService.ReadAlarmConfig('DevName'); // if ComName<>'' then // begin // ComType:=FDataAccessService.ReadAlarmConfig('ComType'); // if ComType='1' then //使用IO盒子控制 // begin // AlarmCom:=TAlarmCom.Create; // AlarmCom.open(ComName,sError); // sleep(200); // AlarmCom.GreenLed(sError); // sleep(800); // end // else // begin // // ComName:= comName_a; // // AlarmLed:=TAlarmLed.Create; // // AlarmLed.open(ComName,sError); // end; // end; iniListName:= TStringList.Create; dm.MemTableReadTabList(iniListName); TxtVerInfo.Text:=GetBuildInfo; //获取版本号 UIClear(); UIDataClear(); DbSoapThread:=TDbSoapThread.Create; DbSoapThread.Start; //开始提交失败数据 end; procedure TfrmMain.FormDestroy(Sender: TObject); var sError:string; begin WorkLog.MessageInfo('程序退出1'); // if Assigned(AlarmLed) then // 更标准的Delphi对象检查方式 // begin // try // AlarmLed.CloseAllLed(sError); // AlarmLed.Free; // finally // AlarmLed := nil; // 重要:立即置空指针 // end; // end; WorkLog.MessageInfo('程序退出2'); if Assigned(DbSoapThread) then // 更标准的Delphi对象检查方式 begin try DbSoapThread.Free; finally DbSoapThread := nil; // 重要:立即置空指针 end; end; WorkLog.MessageInfo('程序退出3'); if Assigned(DisplayFrame) then // 更标准的Delphi对象检查方式 begin try DisplayFrame.Free; finally DisplayFrame := nil; // 重要:立即置空指针 end; end; WorkLog.MessageInfo('程序退出4'); if Assigned(iniListName) then // 更标准的Delphi对象检查方式 begin try iniListName.Free; finally iniListName := nil; // 重要:立即置空指针 end; end; WorkLog.MessageInfo('程序退出5'); if Assigned(FUsb) then // 更标准的Delphi对象检查方式 begin try FUsb.Free; finally FUsb := nil; // 重要:立即置空指针 end; end; // if AlarmLed<>nil then AlarmLed.CloseAllLed(sError); // if DbSoapThread<>nil then DbSoapThread.Terminate; // WorkLog.MessageInfo('程序退出3'); // if AlarmLed<>nil then AlarmLed.Free; // WorkLog.MessageInfo('程序退出4'); // if DisplayFrame<>nil then DisplayFrame.Free; // WorkLog.MessageInfo('程序退出'); // DbApiLog.MessageInfo('程序退出'); // iniListName.Free; // WorkLog.MessageInfo('程序退出5'); // FreeAndNil(FUsb); // WorkLog.MessageInfo('程序退出6'); if Assigned(FDataAccessService) then begin try FDataAccessService.Free; finally FDataAccessService := nil; end; end; if Assigned(FProductionService) then begin try FProductionService.Free; finally FProductionService := nil; end; end; end; procedure TfrmMain.CreateEmpNoExit; begin // if (EdtEmpNo.Text<>'') and (not TxtOffline.Visible) then //不是手工操作 TThread.CreateAnonymousThread( procedure var sError:string; I: Integer; begin CoInitialize(nil); TRY // if (not Ksoap.xxcc_work_num_f(FactoryCode,EdtEmpNo.Text,TxtPc.Text,TxtLine.Text,sError)) then // begin // TxtEmpNoError.TextSettings.FontColor:= $FFFF0000; // ShowMainError(sError,'',''); // Exit; // end // else // begin // TxtEmpNoError.TextSettings.FontColor:= $FF0003F3; // ShowMainError('ok','',''); // end; finally CoUninitialize; end; end ).Start; end; procedure TfrmMain.FormShow(Sender: TObject); var StartTime: Int64; begin StartTime := TThread.GetTickCount; try if FUsb=nil then begin FUsb := TUsbClass.Create; FUsb.OnUsbInsertion := UsbIN; FUsb.OnUsbRemoval := UsbOUT; comlista; CreateEmpNoExit; end; finally LogManager.LogFormShow('MainForm', TThread.GetTickCount - StartTime); end; end; procedure TfrmMain.HFraButClick(Sender: TObject; ButtonID: Integer); var Frame: TFramebase; begin WorkLog.MessageInfo('HFraButClick:%s ' , [fDevRecord.P_ORG_CODE]); Frame := Sender as TFramebase; EdtGoodsNo.Text:= fDevRecord.P_ORG_CODE; if Copy(fDevRecord.P_DIE_NAME,1,3)='不合格' then begin Label_NG.Text:='NG'; Label_NG.FontColor:= TAlphaColor($eeff0000); end else begin Label_NG.Text:='OK'; Label_NG.FontColor:= TAlphaColor($ee06b75b); end; if ButtonID=8 then Text7Click(self); end; procedure TfrmMain.Rectangle2Click(Sender: TObject); begin FrmPassword:= TFrmPassword.Create(nil); try FrmPassword.Position:=TFormPosition.MainFormCenter; if FrmPassword.ShowModal=mrOk then begin dm.MemTableReadTabList(iniListName); frmSetMain:= TfrmSetMain.Create(nil); try frmSetMain.Position:=TFormPosition.MainFormCenter; frmSetMain.TxtFactoryCode.Text:=FactoryCode; //厂区 frmSetMain.ShowModal; TxtOffline.Visible:=frmSetMain.CheckBox1.IsChecked; ksoap.OnLine:=not TxtOffline.Visible; // if ksoap.OnLine then // EdtGoodsNo.StyleLookup:='EdtGoodsNoStyle1' // else // EdtGoodsNo.StyleLookup:=''; //重新加载参数信息 SetMainUIParameter(); finally frmSetMain.Free; end; end; finally FrmPassword.Free; end; end; procedure TfrmMain.Text4Click(Sender: TObject); begin ShowTouchKeyBoard(); end; procedure TfrmMain.Text5Click(Sender: TObject); begin UIDataClear(); end; procedure TfrmMain.ShowMainError(EmpNoError,LotNoError,GoodsNoError:string); begin TThread.Synchronize(nil, procedure begin TxtShowErrorInfo(TxtEmpNoError,EmpNoError); TxtShowErrorInfo(TxtLotNoError,LotNoError); if LotNoError<>'' then EdtLotNo.SetFocus; TxtShowErrorInfo(TxtGoodsNoError,GoodsNoError); // EdtGoodsNo.Text:='';//料号为空 end); end; procedure TfrmMain.Text7Click(Sender: TObject); var sError:string; sFixture_Code:string; begin // showmessage('aa'); // WorkLog.MessageInfo('login点击'); //防止连续点击多次 if Text7.TextSettings.FontColor=TAlphaColorRec.Silver then begin WorkLog.MessageInfo('重复点击'); Exit; end; // showmessage('aa1'); Text7.TextSettings.FontColor:=TAlphaColorRec.Silver; try TxtShowErrorInfo(TxtEmpNoError,''); if EdtEmpNo.Text='' then begin TxtShowErrorInfo(TxtEmpNoError,'工号不能为空'); TxtShowErrorInfo(TxtLotnoError,''); TxtShowErrorInfo(TxtGoodsNoError,''); EdtEmpNo.SetFocus; Exit; end; if Rec_GD.Visible and (EdtLotNo.Text='') then //检查工号 begin TxtShowErrorInfo(TxtEmpNoError,''); TxtShowErrorInfo(TxtLotnoError,'工单不能为空'); TxtShowErrorInfo(TxtGoodsNoError,''); EdtLotno.SetFocus; Exit; end; // showmessage('aa11'); if Rec_code.Visible then begin // showmessage('aa111'); EdtGoodsNo.Text:= EdtGoodsNo.Text.Replace(';',''); EdtGoodsNo.Text:= EdtGoodsNo.Text.Replace(',',''); if EdtGoodsNo.Text='' then begin TxtShowErrorInfo(TxtEmpNoError,''); TxtShowErrorInfo(TxtLotnoError,''); TxtShowErrorInfo(TxtGoodsNoError,'条码不能为空'); EdtLotno.SetFocus; Exit; end; // showmessage('aa1111'); // if ((Rectangle16.Visible) and (EdtGoodsNo.Text='')) then //批号带不出料号 // begin // TxtShowErrorInfo(TxtEmpNoError,''); // TxtShowErrorInfo(TxtLotnoError,''); // TxtShowErrorInfo(TxtGoodsNoError,'料號不能為空'); // EdtLotno.SetFocus; // Exit; // end; end; // showmessage('aa2'); if not TxtOffline.Visible then //不是手工操作 begin WorkLog.MessageInfo('开始提交数据到服务器...'); fDevRecord.P_BC:= EdtEmpNo.Text; //工号 fDevRecord.P_LOT:= EdtLotNo.Text; //单号 WorkLog.MessageInfo('提交+%d,%d,%d',[ComboBoxP_PC.ItemIndex,ComboBoxP_PC.Count,KJson.FList_pro_process.Count]); if (ComboBoxP_PC.ItemIndex> -1) and (KJson.FList_pro_process.Count> 0) then begin fDevRecord.P_LINE_index:= ComboBoxP_PC.ItemIndex; //线别序号 fDevRecord.P_LINE_id:= StrToInt(KJson.REST_Value(KJson.FList_pro_process.Strings[ComboBoxP_PC.ItemIndex],'id')); //线别ID // fDevRecord.P_LINE:= (KJson.REST_Value(KJson.FList_pro_process.Strings[ComboBoxP_PC.ItemIndex],'number')); //线别编号 fDevRecord.P_LINE_name:= (KJson.REST_Value(KJson.FList_pro_process.Strings[ComboBoxP_PC.ItemIndex],'processName')); //线别名称 end; fDevRecord.P_ORG_CODE:= EdtGoodsNo.Text; //二维码 fDevRecord.P_COPPER_MODEL:= EdtGoodsNo.Text; //二维码ID WorkLog.MessageInfo('提交数据main: ' + '工号=' + fDevRecord.P_BC + ', ' + '单号=' + fDevRecord.P_LOT + ', ' + '线别id=' + IntToStr(fDevRecord.P_LINE_id) + ', ' + '线别名称=' + fDevRecord.P_LINE_name + ', ' + '料号=' + fDevRecord.P_ORG_CODE); WorkLog.MessageInfo('EdtGoodsNo: %s',[EdtGoodsNo.Text]); //去掉维修,第一个工序 if (dm.MainUI<>4) and (ComboBoxP_PC.ItemIndex=0) and ((fDevRecord.P_ORG_CODE='') or (fDevRecord.P_ORG_CODE_id='')) then begin TxtShowErrorInfo(TxtEmpNoError,''); TxtShowErrorInfo(TxtLotnoError,''); TxtShowErrorInfo(TxtGoodsNoError,'条码和ID不能为空'); EdtLotno.SetFocus; Exit; end; // 提交生产数据到服务层 if not FProductionService.SubmitProductionData( fDevRecord.P_BC, // 工号 fDevRecord.P_LOT, // 单号 IntToStr(fDevRecord.P_LINE_id), // 工序ID fDevRecord.P_ORG_CODE) then // 二维码 begin TxtShowErrorInfo(TxtEmpNoError,''); TxtShowErrorInfo(TxtLotnoError,''); TxtShowErrorInfo(TxtGoodsNoError,'数据提交失败'); Exit; end; // //检查工号 // if (not KJSon.Thread_xxcc_work_num_f(FactoryCode,EdtEmpNo.Text,TxtPc.Text,TxtLine.Text,sError)) then // begin // TxtShowErrorInfo(TxtEmpNoError,sError); // TxtShowErrorInfo(TxtLotnoError,''); // TxtShowErrorInfo(TxtGoodsNoError,''); // Exit; // end; WorkLog.MessageInfo('提交数据main1:' + sError); // //检查批号 // if RectangleLotNo.Visible then // begin // if (not Ksoap.Thread_XXCC_LOT_PC_F(EdtLotno.Text,TxtLineNum.Text,'1',sError)) then // begin // TxtShowErrorInfo(TxtEmpNoError,''); // TxtShowErrorInfo(TxtLotNoError,sError); // TxtShowErrorInfo(TxtGoodsNoError,''); // Exit; // end; // // sFixture_Code:=DisplayFrame.GetFixture_Code; //取治具ID // // //獲取治工具或者設備的狀態 // if not Ksoap.Thread_Check_tool_or_equip_status_f(EdtLotNo.Text,TxtLineNum.Text,sFixture_Code,'-1',sError) then // begin // ShowMainError('',sError,''); // Exit; // end; // end; end else begin WorkLog.MessageInfo('提交数据:2'); ksoap.P_ORG_CODE:=FactoryCode; //廠區 ksoap.P_WORK_NUM:=EdtEmpNo.Text; //工號 ksoap.P_PC:=TxtPc.Text; //製程 ksoap.P_LINE:=TxtLine.Text; //線別 ksoap.P_LINE_NUM:=TxtLineNum.Text; //線別編號 ksoap.P_Goods_Num:=EdtGoodsNo.Text; //料号 ksoap.P_Lot:=EdtLotNo.Text; //批号 ksoap.P_Lot_Num:=0; ksoap.Fixture_Code:=DisplayFrame.GetFixture_Code; // TxtShowErrorInfo(TxtEmpNoError,'工號进入'); end; // Text21.Text:= DisplayFrame.Name; WorkLog.MessageInfo('提交数据main2:%s', [sError]); if (DisplayFrame<>nil) and (DisplayFrame.DoExec) then UIDataClear; finally Text7.TextSettings.FontColor:=TAlphaColorRec.White; end; end; procedure TfrmMain.Timer1Timer(Sender: TObject); begin Text2.Text:= GetSysTimeByFormate; //判断整点,就上传日志 dm.Tim_Timer(Text2.Text); // 判断如果当前时间减去最后输入时间大于等于1秒 20260426 if (SecondsBetween(Now, FLastInputTime) >= 1) and (oldFLastInputTime6 then begin // 执行Text7Click Text7Click(Sender); // 重置时间,避免重复触发 FLastInputTime := Now; oldFLastInputTime:= FLastInputTime; end; end; end; procedure TfrmMain.TxtVerInfoClick(Sender: TObject); begin // exit; // frmListConent:=TfrmListConent.Create(nil); //多个读头 // try // frmListConent.ShowModal; // finally // frmListConent.Free; // end; { frmInkPrinterConent:=TfrmInkPrinterConent.Create(nil); try frmInkPrinterConent.ShowModal; finally frmInkPrinterConent.Free; end; } // frmListMoreConent:=TfrmListMoreConent.Create(nil); //多个批号 // try // frmListMoreConent.ShowModal; // finally // frmListMoreConent.Free; // end; end; procedure TfrmMain.UsbIN(ASender: TObject; const ADevType, ADriverName, AFriendlyName: string); var sError:String; begin WorkLog.MessageInfo('USB Inserted - Device Type = ' + ADevType + #13#10 + 'Driver Name = ' + ADriverName + #13+#10 + 'Friendly Name = ' + AFriendlyName); // if (dm.MemTableReadKeyValue('报警灯','DevName')<>'') and (Pos('340',AFriendlyName)>0) then // begin // dm.MemTableWriteKeyValue('报警灯','DevName',ADriverName); // if AlarmLed<>nil then // begin // AlarmLed.open(ADriverName,sError); // sleep(100); // AlarmLed.YellowLed(sError); // end; // end; end; procedure TfrmMain.UsbOUT(ASender: TObject; const ADevType, ADriverName, AFriendlyName: string); begin WorkLog.MessageInfo('USB Removed - Device Type = ' + ADevType + #13#10 + 'Driver Name = ' + ADriverName + #13+#10 + 'Friendly Name = ' + AFriendlyName); end; procedure TfrmMain.SetRadioOption(sRadioList:string); VAR i:integer; tmpList:TStrings; begin if sRadioList='' then Exit; // if (GridLayout1<>nil) and (GridLayout1.ChildrenCount>0) then //检测TOP面,BOT面 // begin // while GridLayout1.ChildrenCount>0 do //有选项没显示,返回也为真 // begin // GridLayout1.Children.Items[0].Destroy; // end; // end; // WorkLog.Debug(Format('iLayerValue1:%s',[IntToStr(GridLayout1.ChildrenCount)])); tmpList:=TStringlist.Create; try tmplist.DelimitedText:=sRadioList; if tmpList.Count>10 then Exit; if tmplist.Count>GridLayout1.ChildrenCount then //创建 begin for i := 0 to tmplist.Count-GridLayout1.ChildrenCount-1 do begin WITH TRadioButton.Create(SELF) DO BEGIN PARENT:=GridLayout1; GroupName:='a'; Height:=34; END; end; end; if tmplist.Count=tmplist.Count then TRadioButton(GridLayout1.Children[i]).Visible:=false else TRadioButton(GridLayout1.Children[i]).Text:=tmplist.Strings[i]; end; if tmplist.Count>0 then GridLayout1.ItemWidth:=GridLayout1.Width / tmplist.Count; end else //数量相同 begin for I := 0 to GridLayout1.ChildrenCount-1 do begin TRadioButton(GridLayout1.Children[i]).IsChecked:=false; TRadioButton(GridLayout1.Children[i]).Text:=tmplist.Strings[i]; TRadioButton(GridLayout1.Children[i]).Visible:=true; end; if GridLayout1.ChildrenCount>0 then GridLayout1.ItemWidth:=GridLayout1.Width / GridLayout1.ChildrenCount; end; finally tmpList.Free; end; WorkLog.Debug(Format('iLayerValue2:%s',[IntToStr(GridLayout1.ChildrenCount)])); end; procedure TfrmMain.EdtLotNoChange(Sender: TObject); begin if EdtLotNo.Text='' then TxtShowErrorInfo(TxtLotnoError,''); EdtLotNo.Text:= Trim(EdtLotNo.Text.ToUpper); end; procedure TfrmMain.EdtLotNoClick(Sender: TObject); begin ShowTouchKeyBoard(); end; function TfrmMain.EdtLotPartnum(Value: string): Boolean; begin Result:= False; if Value<>'' then begin if ComboBoxP_PC.Items.IndexOf(Value)<0 then // ComboBoxP_PC.Items.Add(sPc); begin TxtShowErrorInfo(TxtLotNoError,'该批当前站在'+Value); end else begin COMBOBOXp_PC.ItemIndex:=ComboBoxP_PC.Items.IndexOf(Value); TxtPc.Text:=Value; ksoap.P_PC:=TxtPc.Text; //製程 Result:= True; end; end; end; procedure TfrmMain.EdtLotNoExit(Sender: TObject); //离开单号处理 var sError:string; begin //检查单号 if EdtLotNo.Text='' then exit; ShowMainError('','',''); TThread.CreateAnonymousThread( procedure var sError:string; begin CoInitialize(nil); TRY ComboBoxP_PC.Items.Clear; // 获取工单信息 var WorkOrderInfo := FProductionService.GetWorkOrderInfo(EdtLotNo.Text); if not Assigned(WorkOrderInfo) then begin TxtEmpNoError.TextSettings.FontColor:= $FFFF0000; ShowMainError('没有找到单号','',''); Exit; end; // 获取工序列表 var ProcessList := FProductionService.GetProcessList(EdtLotNo.Text); if Assigned(ProcessList) and (ProcessList.Count > 0) then begin // 这里可以将ProcessList转换为KJSon.FList_pro_process的格式 // 或者修改ComboBoxP_PC_Down方法以使用新的数据源 KJSon. REST_pro_List(EdtLotNo.Text, 1, sError); // 暂时保留原调用,后续可完全迁移 ComboBoxP_PC_Down(); end; FINALLY CoUninitialize; END; end).Start; end; procedure TfrmMain.EdtLotNoExit1; //离开二维码处理 var sLayerValue,sDefaulValue:string; // sFixture_Code:string; begin if (EdtEmpNo.Text<>'') and (EdtLotNo.Text<>'') then //不是手工操作 TThread.CreateAnonymousThread( procedure var sError:string; sGoodsNo,sNum,sPc:string; begin CoInitialize(nil); TRY // ShowInfoOK('连接数据库中...'); if not EdtLotPartnum(sPc) then begin Exit; end; //检查批号 if (not Ksoap.XXCC_LOT_PC_F(EdtLotno.Text,TxtLineNum.Text,'1',sError)) then begin ShowMainError('',sError,''); if (EdtLotno.Text<>'R30034200L') then Exit; end; //得料号 if not Ksoap.getPartnum(EdtLotNo.Text,'',sGoodsNo,sNum,sPc,sPartnumValue,sError) then begin ShowMainError('',sError,''); Exit; end; //获取缺省值 if DisplayFrame.DefaultXN and not Ksoap.return_default_values_f(sDefaulValue,sError) then begin ShowMainError('','Ksoap.return_default_values_f'+sError,''); Exit; end; //根据料号,设置正反面板材 if not Ksoap.xxcf_get_layer_f(sGoodsNo,sLayerValue,sError) then begin ShowMainError('','',sError); Exit; end; if sLayerValue<>'' then //面次 begin SetRadioOption(sLayerValue); WorkLog.Debug(Format('sLayerValue:%s',[sLayerValue])); end; // //原物料編號 // if (DisplayFrame<>nil) and ((DisplayFrame.ClassType=TFrame_maoqie) or (DisplayFrame.ClassType=TFrame_pingdao) or (DisplayFrame.ClassType=TFrame_yandao)) then // begin // DisplayFrame.F2DCodeCreate(); // end; //参数带入,根据参数设置PLC if (DisplayFrame.Name='FrameAutoYLBland') then begin //get_barcode_param_f if (not Ksoap.xx_get_barcode_param_f(FactoryCode,EdtLotNo.Text,'yfynj',TxtLineNum.Text,sError)) then begin TThread.Synchronize(nil, procedure begin TxtShowErrorInfo(TxtLotNoError,sError); end); Exit; end; end; finally CoUninitialize; end; TThread.Synchronize(nil, procedure begin // EdtGoodsNo.Text:=sGoodsNo; sLotNum:=sNum; DisplayFrame.sLotNum:= sNum; TxtShowErrorInfo(TxtLotNoError,''); DisplayFrame.FillDefaultValue(sPartnumValue,sDefaulValue); SetRadioOption(sDefaulValue); // // //根据批号,带出料号与当前制程,自动增加填写当前制程 // if sPc<>'' then // begin // if ComboBoxP_PC.Items.IndexOf(sPc)<0 then // // ComboBoxP_PC.Items.Add(sPc); // begin // TxtShowErrorInfo(TxtLotNoError,'該批當前站在'+sPc); // end // else // begin // COMBOBOXp_PC.ItemIndex:=ComboBoxP_PC.Items.IndexOf(sPc); // TxtPc.Text:=sPc; // ksoap.P_PC:=TxtPc.Text; //製程 // end; // end; //设置PLC相关参数 end); end ).Start; end; end.