unit U_LSSQSMCK;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, cxStyles, cxCustomData, cxGraphics, cxFilter, cxData, cxDataStorage,
  cxEdit, DB, cxDBData, StdCtrls, ExtCtrls, ADODB, DBClient,
  cxGridCustomPopupMenu, cxGridPopupMenu, cxGridLevel, cxGridCustomTableView,
  cxGridTableView, cxGridDBTableView, cxClasses, cxControls, cxGridCustomView,
  cxGrid, MovePanel, cxCheckBox, Menus, ComCtrls, BtnEdit, ShellAPI, cxTextEdit,
  cxLookAndFeels, cxLookAndFeelPainters, cxNavigator;

type
  TfrmLSSQSMCK = class(TForm)
    ADOQueryTemp: TADOQuery;
    ADOQueryCmd: TADOQuery;
    DS_MainSel: TDataSource;
    CDS_MainSel: TClientDataSet;
    cxGridPopupMenu4: TcxGridPopupMenu;
    cxGrid3: TcxGrid;
    Tv3: TcxGridDBTableView;
    v3Column1: TcxGridDBColumn;
    cxGridLevel1: TcxGridLevel;
    v3Column2: TcxGridDBColumn;
    Panel2: TPanel;
    Label4: TLabel;
    CKOrdNo: TEdit;
    SMID: TEdit;
    CRTime: TDateTimePicker;
    cxStyleRepository1: TcxStyleRepository;
    cxStyle1: TcxStyle;
    Label12: TLabel;
    CDS_Main: TClientDataSet;
    Label3: TLabel;
    Edit1: TEdit;
    cxGrid1: TcxGrid;
    TV2: TcxGridDBTableView;
    cxGridDBColumn2: TcxGridDBColumn;
    cxGridDBColumn3: TcxGridDBColumn;
    cxGridDBColumn5: TcxGridDBColumn;
    cxGridDBColumn6: TcxGridDBColumn;
    cxGridLevel2: TcxGridLevel;
    V2Column1: TcxGridDBColumn;
    DS_FHSQ: TDataSource;
    CDS_FHSQ: TClientDataSet;
    cxGridPopupMenu1: TcxGridPopupMenu;
    CRType: TEdit;
    Label1: TLabel;
    Label6: TLabel;
    edtIsSMTH: TEdit;
    V2Column2: TcxGridDBColumn;
    V2Column3: TcxGridDBColumn;
    V2Column4: TcxGridDBColumn;
    Panel1: TPanel;
    Button1: TButton;
    Button3: TButton;
    Button2: TButton;
    Label2: TLabel;
    Label7: TLabel;
    Button4: TButton;
    v3Column3: TcxGridDBColumn;
    TV2Column1: TcxGridDBColumn;
    cxStyleRepository2: TcxStyleRepository;
    cxStyle2: TcxStyle;
    Button5: TButton;
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure FormDestroy(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure SMIDKeyPress(Sender: TObject; var Key: Char);
    procedure Button2Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure TV2MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    procedure Button3Click(Sender: TObject);
    procedure edtIsSMTHClick(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
  private
    { Private declarations }
    FSMStr, JXFlag, FSubId: string;
    FFHPS, FSQPS: integer;
    procedure InitFHMX();
    function CheckCkd(): Boolean;
    function CheckPB(): Boolean;
    function JudgeJTMCX(): Boolean;
    procedure SaveCKDataJTMCX();
    procedure SaveCK();
    procedure InitFHPS();
  public
    { Public declarations }
  end;

var
  frmLSSQSMCK: TfrmLSSQSMCK;

implementation

uses
  U_DataLink, U_Fun, MMSystem, U_LSFHSQListSel;

//var
//  frmPBKCListSel: TfrmCKProductBCPKCListPB;    LS
{$R *.dfm}

procedure TfrmLSSQSMCK.SaveCKDataJTMCX();
begin
  try
    ADOQueryCmd.Connection.BeginTrans;

    with ADOQueryCmd do
    begin
      Close;
      sql.Clear;
      sql.Add('Update CK_YT_CR Set CRFlag=''待出库'',CRType=NULL,CRTime=NULL,CRNote=NULL,CKNo=NULL ');
      sql.Add(' where  CK_YT_CR.JYID=' + Quotedstr(Trim(FSMStr)));
      sql.Add(' and CRFlag=''出库''');

      sql.Add(' UPdate CK_YT_KC Set Valid=''Y'' ');
      sql.Add(' where  CK_YT_KC.JYID=' + Quotedstr(Trim(FSMStr)));
      sql.Add(' and Valid=''N'' ');

      ExecSQL;
    end;
    with ADOQueryCmd do
    begin
      Close;
      sql.Clear;
      sql.Add('exec P_FHSQYT_UP_QTY  ' + quotedstr(trim(CKOrdNo.Text)));
      ExecSQL;
    end;
    with ADOQueryCmd do
    begin
      Close;
      sql.Clear;
      sql.Add('insert into SY_SysLog(operor,opertime,Model,acction,opevent,result) values( ');
      sql.Add(' ' + quotedstr(trim(DName)));
      sql.Add(',getdate() ');
      sql.Add(',' + quotedstr(''));
      sql.Add(',' + quotedstr(trim('加弹丝出库扫描撤销')));
      sql.Add(',' + quotedstr('条码：' + trim(FSMStr) + ' 出库单号：' + trim(CKOrdNo.Text)));
      sql.Add(',' + quotedstr(trim('成功')));
      sql.Add(')');
      ExecSQL;
    end;
    ADOQueryCmd.Connection.CommitTrans;
    PlaySound('wav\撤销成功.wav', 0, SND_FILENAME or SND_ASYNC);
    FFHPS := FFHPS - 1;
    InitFHMX();
  except
    ADOQueryCmd.Connection.RollbackTrans;
    application.MessageBox('撤销出库失败！', '提示信息', 0);
  end;
end;

function TfrmLSSQSMCK.JudgeJTMCX(): Boolean;
begin
  try
    Result:=False;
    if Trim(CKOrdNo.Text) = '' then
    begin
      JXFlag:='';
      PlaySound('wav\出库单号不能为空.wav', 0, SND_FILENAME or SND_ASYNC);
      Application.MessageBox('出库单号不能为空','出库单号不能为空',0);
      Exit;
    end;

    if CDS_MainSel.IsEmpty then
    begin
      JXFlag:='';
      PlaySound('wav\无可撤销的数据.wav', 0, SND_FILENAME or SND_ASYNC);
      Application.MessageBox('无可撤销的数据','出库单号不能为空',0);
      Exit;
    end;

    with ADOQueryTemp do
    begin
      Close;
      sql.Clear;
      sql.Add(' select A.SQPiQty,A.FHPiQty,A.FHSubId,B.* from SQ_FHYT_Sub A');
      sql.Add(' inner join CK_YT_CR B on A.FactoryName=B.FactoryName');
      sql.Add(' and A.Y_CodeName=B.Y_CodeName and A.Y_Spec=B.Y_Spec');
      sql.Add(' and A.BatchNo=B.BatchNo and A.ZGColor=B.ZGColor');
      sql.Add(' and A.Y_CodeNameCP=B.Y_CodeNameCP  and A.Y_Type=B.Y_Type');
      sql.Add(' where A.FHMainID=''' + Trim(CKOrdNo.Text) + '''');
      sql.Add(' and  B.CRFlag=''出库'' and B.JYID=''' + Trim(FSMStr) + '''');
      Open;
    end;

    if ADOQueryTemp.IsEmpty then
    begin
      JXFlag:='';
      PlaySound('wav\无可撤销的数据.wav', 0, SND_FILENAME or SND_ASYNC);
      Application.MessageBox('无可撤销的数据','出库单号不能为空',0);
      Exit;
    end
    else
    begin
      FSubId := ADOQueryTemp.fieldbyname('FHSubId').AsString;
      FSQPS := ADOQueryTemp.fieldbyname('SQPiQty').AsInteger;
      FFHPS := ADOQueryTemp.fieldbyname('FHPiQty').AsInteger;
    end;
    Result := True;
  except
    Result := false;
  end;
end;

procedure TfrmLSSQSMCK.InitFHPS();
begin
  with CDS_FHSQ do
  begin
    Locate('FHSubId', FSubId, []);
    Edit;
    FieldByName('FHPiQty').Value := FFHPS;
    Post;
    Edit1.Text := IntToStr(FFHPS)
  end;

end;

procedure TfrmLSSQSMCK.SaveCK();
var
  maxno, SMFlag, KYCKFlag: string;
  FFQty: Integer;
begin

  try
    ADOQueryCmd.Connection.BeginTrans;

    with ADOQueryCmd do
    begin
      Close;
      sql.Clear;
      sql.Add('UPDATE CK_YT_CR Set  ');
      sql.add(' CRTime=getdate()  ');
      sql.add(',CRType=' + quotedstr(Trim(CRType.Text)));
      sql.add(',CRFlag=''出库''  ');
      sql.add(',CKNo=' + Quotedstr(CKOrdNo.Text));
      sql.Add(' where CK_YT_CR.JYID=' + Quotedstr(Trim(FSMStr)));
      sql.Add('and CK_YT_CR.CRFlag=''待出库''  ');
      ExecSQL;
    end;

    with ADOQueryCmd do
    begin
      Close;
      sql.Clear;
      sql.Add('UPDATE CK_YT_KC Set  ');
      sql.add(' Valid=''N''  ');
      sql.Add(' where CK_YT_KC.JYID=' + Quotedstr(Trim(FSMStr)));
      ExecSQL;
    end;
    with ADOQueryCmd do
    begin
      Close;
      sql.Clear;
      sql.Add('exec P_FHSQYT_UP_QTY  ' + quotedstr(trim(CKOrdNo.Text)));
      ExecSQL;
    end;
    ADOQueryCmd.Connection.CommitTrans;
    FFHPS := FFHPS + 1;
    InitFHMX();
    PlaySound('wav\正确.wav', 0, SND_FILENAME or SND_ASYNC);
    Exit;
  except
    ADOQueryCmd.Connection.RollbackTrans;
    PlaySound('wav\出库失败.wav', 0, SND_FILENAME or SND_ASYNC);
    application.MessageBox('出库失败！', '提示信息', 0);
  end;
end;

function TfrmLSSQSMCK.CheckCkd(): Boolean;
begin
  try
    Result:=False;
    JXFlag:='JX';
    if CKOrdNo.Text = Trim(FSMStr) then
    begin
      PlaySound('wav\申请单已存在.wav', 0, SND_FILENAME or SND_ASYNC);
      Exit;
    end;

    with ADOQueryTemp do
    begin
      Close;
      sql.Clear;
      sql.Add('select * from SQ_FHYT_Main A inner join SQ_FHYT_Sub B on A.FHMainId=B.FHMainId  where A.FHMainId=''' + Trim(FSMStr) + '''');
      Open;
    end;
    if ADOQueryTemp.IsEmpty then
    begin
      JXFlag:='';
      PlaySound('wav\申请单不存在暂停发货.wav', 0, SND_FILENAME or SND_ASYNC);
      Application.MessageBox('申请单不存在暂停发货','提示',0);
      Exit;
    end
    else
    begin
      SCreateCDS20(ADOQueryTemp, CDS_FHSQ);
      SInitCDSData20(ADOQueryTemp, CDS_FHSQ);
      CKOrdNo.Text := Trim(FSMStr);
      CRType.Text := Trim(CDS_FHSQ.FieldByName('SQType').AsString);
      InitFHMX();
    end;
    Result := True;
  except
    Result := false;
  end;

end;

function TfrmLSSQSMCK.CheckPB(): Boolean;
begin

  try
    JXFlag:='JX';
    if Trim(CKOrdNo.Text) = '' then
    begin
      JXFlag:='';
      PlaySound('wav\未选单不能扫描出库.wav', 0, SND_FILENAME or SND_ASYNC);
      Application.MessageBox('未选单不能扫描出库','提示',0);
      Exit;
    end;
    with ADOQueryTemp do
    begin
      Close;
      sql.Clear;
      sql.Add('select * from SQ_FHYT_Main where FHMainID='''+Trim(CKOrdNo.Text)+'''');
      sql.Add(' and EndFlag=1 ');
      Open;
    end;
    if ADOQueryTemp.IsEmpty=False then
    begin
      JXFlag:='';
      PlaySound('wav\已结束暂停发货.wav', 0, SND_FILENAME or SND_ASYNC);
      Application.MessageBox('已结束，暂停发货','提示',0);
      Exit;
    end;
    with ADOQueryTemp do
    begin
      Close;
      sql.Clear;
      sql.Add(' select A.SQPiQty,A.FHPiQty,A.FHSubid,B.* from SQ_FHYT_Sub A');
      sql.Add(' inner join JY_YT B on A.FactoryName=B.FactoryName');
      sql.Add(' and A.Y_CodeName=B.Y_CodeName and A.Y_Spec=B.Y_Spec');
      sql.Add(' and A.BatchNo=B.BatchNo  and A.ZGColor=B.ZGColor');
      sql.Add(' and A.Y_CodeNameCP=B.Y_CodeNameCP  and A.Y_Type=B.Y_Type');
      sql.Add(' where A.FHMainID=''' + Trim(CKOrdNo.Text) + '''');
      sql.Add(' and B.JYID=''' + Trim(FSMStr) + '''');
      Open;
    end;
    if ADOQueryTemp.IsEmpty then
    begin
      JXFlag:='';
      PlaySound('wav\条码错误暂停发货.wav', 0, SND_FILENAME or SND_ASYNC);
      Application.MessageBox('条码错误暂停发货','提示',0);
      Exit;
    end
    else
    begin
      FSubId := ADOQueryTemp.fieldbyname('FHSubId').AsString;
      FSQPS := ADOQueryTemp.fieldbyname('SQPiQty').AsInteger;
      FFHPS := ADOQueryTemp.fieldbyname('FHPiQty').AsInteger;
      if FSQPS <= FFHPS then
      begin
        JXFlag:='';
        PlaySound('wav\超出发货上限暂停发货.wav', 0, SND_FILENAME or SND_ASYNC);
        Application.MessageBox('超出发货上限暂停发货','提示',0);
        Exit;
      end;
    end;
    with ADOQueryTemp do
    begin
      Close;
      sql.Clear;
      sql.Add(' select A.SQPiQty,A.FHPiQty,A.FHSubid,B.* from SQ_FHYT_Sub A');
      sql.Add(' inner join JY_YT B on A.FactoryName=B.FactoryName');
      sql.Add(' and A.Y_CodeName=B.Y_CodeName and A.Y_Spec=B.Y_Spec');
      sql.Add(' and A.BatchNo=B.BatchNo and A.ZGColor=B.ZGColor');
      sql.Add(' and A.Y_CodeNameCP=B.Y_CodeNameCP  and A.Y_Type=B.Y_Type');
      sql.Add(' where A.FHMainID=''' + Trim(CKOrdNo.Text) + '''');
      sql.Add(' and B.JYID=''' + Trim(FSMStr) + '''');
      sql.Add(' and ((B.JYNW>=20 and B.JYNW<=45 and B.ZGKS=6) or B.ChuLiFlag=1)');
      Open;
    end;
    if ADOQueryTemp.IsEmpty then
    begin
      JXFlag:='';
      PlaySound('wav\数据异常暂停发货.wav', 0, SND_FILENAME or SND_ASYNC);
      Application.MessageBox('数据异常暂停发货','提示',0);
      Exit;
    end;

    with ADOQueryTemp do
    begin
      Close;
      sql.Clear;
      sql.Add(' select C.CKNo from SQ_FHYT_Sub A');
      sql.Add(' inner join JY_YT B on A.FactoryName=B.FactoryName');
      sql.Add(' and A.Y_CodeName=B.Y_CodeName and A.Y_Spec=B.Y_Spec');
      sql.Add(' and A.BatchNo=B.BatchNo and A.ZGColor=B.ZGColor');
      sql.Add(' and A.Y_CodeNameCP=B.Y_CodeNameCP  and A.Y_Type=B.Y_Type');
      sql.Add(' inner join CK_YT_CR C on B.JYID=C.JYID and C.CRFlag=''出库'' ');
      sql.Add(' where B.JYID=''' + Trim(FSMStr) + '''');
      sql.Add(' and A.FHMainId=''' + Trim(CKOrdNo.Text) + '''');
      Open;
    end;
    if ADOQueryTemp.IsEmpty = False then
    begin
      if Trim(ADOQueryTemp.fieldbyname('CKNo').AsString) = Trim(CKOrdNo.Text) then
      begin
        JXFlag:='';
        PlaySound('wav\已扫描.wav', 0, SND_FILENAME or SND_ASYNC);
        Exit;
      end
      else
      begin
        JXFlag:='';
        PlaySound('wav\已出库暂停发货.wav', 0, SND_FILENAME or SND_ASYNC);
        Application.MessageBox('已出库暂停发货','提示',0);
        Exit;
      end;
    end;
    Result := True;
  except
    Result := false;
  end;
end;

procedure TfrmLSSQSMCK.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := caFree;
end;

procedure TfrmLSSQSMCK.FormDestroy(Sender: TObject);
begin
  frmLSSQSMCK := nil;
end;

procedure TfrmLSSQSMCK.FormShow(Sender: TObject);
begin
  SMID.SetFocus;
  //ReadCxGrid('扫描出库', Tv3, '坯布仓库');
  CRTime.DateTime := SGetServerDate(ADOQueryTemp);
end;

procedure TfrmLSSQSMCK.InitFHMX();
var
  MFHPS: integer;
begin
  if CDS_FHSQ.IsEmpty then
    Exit;
  with ADOQueryTemp do
  begin
    Close;
    sql.Clear;
    sql.Add('select A.*  ');
    sql.Add(' from CK_YT_CR A');
    sql.Add(' where A.CKNO=' + quotedstr(Trim(CKOrdNo.Text)));
    Open;
  end;
  SCreateCDS20(ADOQueryTemp, CDS_MainSel);
  SInitCDSData20(ADOQueryTemp, CDS_MainSel);
  if CDS_MainSel.IsEmpty = False then
    MFHPS := Tv3.DataController.Summary.FooterSummaryValues[0]
  else
    MFHPS := 0;

  Edit1.Text := IntToStr(MFHPS);
  with CDS_FHSQ do
  begin
    Edit;
    FieldByName('FHPiQty').Value := MFHPS;
  end;
end;

procedure TfrmLSSQSMCK.SMIDKeyPress(Sender: TObject; var Key: Char);
begin
  if Key = #13 then
  begin
    FSMStr := Trim(SMID.Text);
    SMID.Text := '';
    if edtIsSMTH.Text = '' then
    begin
      if Copy(FSMStr, 1, 2) = 'FC' then
      begin
        CheckCkd();
        if JXFlag<>'JX'  then
        begin
          Exit;
        end;
      end
      else
      begin
        if CheckPB() then
        begin
          if JXFlag<>'JX' then Exit;
          SaveCK();
          InitFHPS();
        end;
      end;
    end
    else
    begin
      if JudgeJTMCX() then  //检测卷条码
      begin
        SaveCKDataJTMCX();
        InitFHPS();
      end;

    end;
  end;
end;

procedure TfrmLSSQSMCK.Button2Click(Sender: TObject);
begin
  Close;
  WriteCxGrid('扫描出库', Tv3, '坯布仓库');
end;

procedure TfrmLSSQSMCK.Button1Click(Sender: TObject);
var
  MKey: Char;
begin
  MKey := #13;
  try
    frmLSFHSQListSel := TfrmLSFHSQListSel.Create(Application);
    with frmLSFHSQListSel do
    begin
      FSQType:='销售出库';
      if ShowModal = 1 then
      begin
        SMID.Text := Trim(Order_Main.fieldbyname('FHMainId').AsString);
        SMIDKeyPress(SMID, MKey);
      end;
    end;
  finally
    frmLSFHSQListSel.Free;
  end;

end;

procedure TfrmLSSQSMCK.TV2MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  InitFHMX();
end;

procedure TfrmLSSQSMCK.Button3Click(Sender: TObject);
var
  MKey: Char;
begin
//  MKey := #13;
//  if TRIM(SELF.CKOrdNo.Text) = '' then
//    EXIT;
//  try
//    frmPBKCListSel := TfrmCKProductBCPKCListPB.Create(self);
//    with frmPBKCListSel do
//    begin
//
//      if ShowModal = 1 then
//      begin
//        while frmPBKCListSel.CDS_Main.Locate('SSel', true, []) do
//        begin
//          self.SMID.Text := Trim(frmPBKCListSel.CDS_Main.fieldbyname('MJID').AsString);
//          self.SMIDKeyPress(SMID, MKey);
//          frmPBKCListSel.CDS_Main.Delete;
//          sleep(500);
//        end;
//      end;
//    end;
//  finally
//    frmPBKCListSel.Free;
//  end;
end;

procedure TfrmLSSQSMCK.edtIsSMTHClick(Sender: TObject);
begin
  SMID.SetFocus;
  if edtIsSMTH.Text = '√' then
  begin
    edtIsSMTH.Text := '';
  end
  else
  begin
    if Application.MessageBox('确定要扫描退货吗？', '提示', 32 + 4) = IDYES then
      edtIsSMTH.Text := '√';
  end;
end;

procedure TfrmLSSQSMCK.Button4Click(Sender: TObject);
var
  MKey: Char;
begin
  MKey := #13;
  try
    frmLSFHSQListSel := TfrmLSFHSQListSel.Create(Application);
    with frmLSFHSQListSel do
    begin
      FSQType:='本厂出库';
      if ShowModal = 1 then
      begin
        SMID.Text := Trim(Order_Main.fieldbyname('FHMainId').AsString);
        SMIDKeyPress(SMID, MKey);
      end;
    end;
  finally
    frmLSFHSQListSel.Free;
  end;

end;

procedure TfrmLSSQSMCK.Button5Click(Sender: TObject);
var
  MKey: Char;
begin
  MKey := #13;
  try
    frmLSFHSQListSel := TfrmLSFHSQListSel.Create(Application);
    with frmLSFHSQListSel do
    begin
      FSQType:='损耗出库';
      if ShowModal = 1 then
      begin
        SMID.Text := Trim(Order_Main.fieldbyname('FHMainId').AsString);
        SMIDKeyPress(SMID, MKey);
      end;
    end;
  finally
    frmLSFHSQListSel.Free;
  end;

end;

end.

