unit U_CPSQSMCK;

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
  TfrmCPSQSMCK = class(TForm)
    ADOQueryTemp: TADOQuery;
    ADOQueryCmd: TADOQuery;
    DS_MainSel: TDataSource;
    CDS_MainSel: TClientDataSet;
    cxGridPopupMenu4: TcxGridPopupMenu;
    cxGrid3: TcxGrid;
    Tv3: TcxGridDBTableView;
    cxGridDBColumn4: TcxGridDBColumn;
    v3Column1: TcxGridDBColumn;
    cxGridLevel1: TcxGridLevel;
    v3Column2: TcxGridDBColumn;
    Panel2: TPanel;
    Label5: TLabel;
    Label4: TLabel;
    CKOrdNo: TEdit;
    SMID: TEdit;
    CRTime: TDateTimePicker;
    Button2: TButton;
    cxStyleRepository1: TcxStyleRepository;
    cxStyle1: TcxStyle;
    Label12: TLabel;
    CDS_Main: TClientDataSet;
    Button1: TButton;
    Label2: TLabel;
    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;
    Button3: TButton;
    CRType: TEdit;
    Label1: TLabel;
    Label6: TLabel;
    edtIsSMTH: TEdit;
    TV2Column1: TcxGridDBColumn;
    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);
  private
    { Private declarations }
    FSMStr, JXFlag, FSubId, FAPBatchNo, FCarNo, isGX, FIsFJT: 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
  frmCPSQSMCK: TfrmCPSQSMCK;

implementation

uses
  U_DataLink, U_Fun, MMSystem, U_FHSQListSel, U_PBKCListSel;        //, U_CKProductBCPKCList

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

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

    with ADOQueryCmd do
    begin
      Close;
      sql.Clear;
      sql.Add('exec P_Do_PBCK @CRFlag=''未出库'', @CKOrdNo=' + quotedstr(trim(CKOrdNo.Text)) + ', @MJID=' + quotedstr(trim(FSMStr)) + ', @DName=' + quotedstr(trim(DName)));
      ExecSQL;
    end;
    with ADOQueryCmd do
    begin
      Close;
      sql.Clear;
      sql.Add('exec P_Do_FHSQ ''' + 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;
    FFHPS := FFHPS - 1;
  except
    ADOQueryCmd.Connection.RollbackTrans;
    application.MessageBox('撤销出库失败！', '提示信息', 0);
  end;
end;

function TfrmCPSQSMCK.JudgeJTMCX(): Boolean;
begin
  try
    if Trim(CKOrdNo.Text) = '' then
      raise Exception.Create('出库单号不能为空');

    if CDS_MainSel.IsEmpty then
      raise Exception.Create('无可撤销的数据');

    with ADOQueryTemp do
    begin
      Close;
      sql.Clear;
      sql.Add('  select A.SQPS,A.FHPS,B.* from FHSQ_Sub A');
      sql.Add('  inner join CK_PBCP_CR B on A.MainId=B.MainId');
      sql.Add(' where A.FSID=''' + Trim(CKOrdNo.Text) + '''');
      sql.Add(' and  B.CRFlag=''出库'' and B.MJID=''' + Trim(FSMStr) + '''');
//      ShowMessage(sql.text);
      Open;
    end;

    if ADOQueryTemp.IsEmpty then
    begin
      raise Exception.Create('无可撤销的数据');
    end
    else
    begin
      FSubId := ADOQueryTemp.fieldbyname('SubId').AsString;
      FSQPS := ADOQueryTemp.fieldbyname('SQPS').AsInteger;
      FFHPS := ADOQueryTemp.fieldbyname('FHPS').AsInteger;
    end;
    Result := True;
  except
    Result := false;
    PlaySound(PChar('wav\' + Exception(ExceptObject).Message + '.wav'), 0, SND_FILENAME or SND_ASYNC);
  end;
end;

procedure TfrmCPSQSMCK.InitFHPS();
begin
  with CDS_FHSQ do
  begin
    Locate('SubId;APBatchNo', VarArrayOf([Trim(FSubId), Trim(FAPBatchNo)]), []);
    Edit;
    FieldByName('FHPSHZ').Value := FFHPS;
    Post;
    Edit1.Text := IntToStr(FFHPS)
  end;

end;

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

  try
    ADOQueryCmd.Connection.BeginTrans;
     //如果是别的批号来凑数的，就把批号更新成要发货的批号，但是保留原批号，字段为WFB_MJJY_PB中的YuanAPBatchNo
    if isGX = '是' then
    begin
      with ADOQueryCmd do
      begin
        Close;
        sql.Clear;
        sql.Add('select top 1 isnull(APBatchNo,'''') AS APBatchNo  from FHSQ_Sub where isnull(FHPS,0) < isnull(SQPS,0) and FSID =''' + Trim(CKOrdNo.Text) + '''');
        sql.Add('and SubID=''' + Trim(FSubID) + '''');
//      ShowMessage(sql.text);
        open;
      end;
      with ADOQueryTemp do
      begin
        Close;
        sql.Clear;
        sql.Add('UPDATE WFB_MJJY_PB set YuanAPBatchNo =isnull(APBatchNo,''''),APBatchNo=''' + Trim(ADOQueryCmd.fieldbyname('APBatchNo').AsString) + '''');
        sql.Add('where MJID = ''' + Trim(FSMStr) + '''');
//      ShowMessage(sql.text);
        ExecSQL;
      end;
    end;

    with ADOQueryCmd do
    begin
      Close;
      sql.Clear;
      sql.Add('exec P_Do_PBCK @CRFlag=''直接出库'', @CKOrdNo=' + quotedstr(trim(CKOrdNo.Text)) + ', @MJID=' + quotedstr(trim(FSMStr)) + ', @DName=' + quotedstr(trim(DName)));
//      ShowMessage(sql.text);
      ExecSQL;
    end;

    with ADOQueryCmd do
    begin
      Close;
      sql.Clear;
      sql.Add('exec P_Do_FHSQ ''' + Trim(CKOrdNo.Text) + '''');
//      ShowMessage(sql.text);
      ExecSQL;
    end;
    ADOQueryCmd.Connection.CommitTrans;
    FFHPS := FFHPS + 1;

    PlaySound('wav\正确.wav', 0, SND_FILENAME or SND_ASYNC);
    Exit;
  except
    ADOQueryCmd.Connection.RollbackTrans;
    application.MessageBox('出库失败！', '提示信息', 0);
    PlaySound('wav\出库失败.wav', 0, SND_FILENAME or SND_ASYNC);
  end;
end;

function TfrmCPSQSMCK.CheckCkd(): Boolean;
begin
  try
    if CKOrdNo.Text = Trim(FSMStr) then
      raise Exception.Create('重复扫描申请单!.wav');

    with ADOQueryTemp do
    begin
      Close;
      sql.Clear;
      sql.Add('select * from FHSQ_MAIN A inner join FHSQ_Sub B on A.FSID=B.FSID  where A.FSID=''' + Trim(FSMStr) + '''');
      Open;
    end;
    if ADOQueryTemp.IsEmpty then
    begin
      raise Exception.Create('申请单不存在暂停发货.wav');
    end
    else
    begin
      SCreateCDS20(ADOQueryTemp, CDS_FHSQ);
      SInitCDSData20(ADOQueryTemp, CDS_FHSQ);
      CKOrdNo.Text := Trim(FSMStr);
      CRType.Text := Trim(CDS_FHSQ.FieldByName('CRType').AsString);
      InitFHMX();
    end;
    Result := True;
  except
    Result := false;
//    application.MessageBox(PChar(Exception(ExceptObject).Message), '提示信息', 0);
    PlaySound(PChar('wav\' + Exception(ExceptObject).Message + '.wav'), 0, SND_FILENAME or SND_ASYNC);
  end;

end;

function TfrmCPSQSMCK.CheckPB(): Boolean;
begin

  try

    if Trim(CKOrdNo.Text) = '' then
      raise Exception.Create('未扫描申请单暂停发货');

    with ADOQueryTemp do
    begin
      Close;
      sql.Clear;
      sql.Add(' select * from (select APID=SUBSTRING(OPEvent,4,13) from SY_Syslog where Acction =''作废布票'' and Operor <> ''ygname''  ');
      sql.Add(' )AA where APID = ''' + Trim(FSMStr) + '''');
      Open;
    end;
    if ADOQueryTemp.IsEmpty = false then
    begin
      raise Exception.Create('布票已作废');
    end;

    with ADOQueryTemp do
    begin
      Close;
      sql.Clear;
      sql.Add(' select * from  JYCon_Sub_AnPai B   ');
      sql.Add(' where B.APID=''' + Trim(FSMStr) + '''');
//      showmessage(sql.text);
      Open;
    end;
    if ADOQueryTemp.IsEmpty then
    begin
      raise Exception.Create('条码错误');
    end;

    with ADOQueryTemp do
    begin
      Close;
      sql.Clear;
      sql.Add(' select isnull(APBatchNo,'''') AS APBatchNo,A.*,B.* from  WFB_MJJY_PB B inner join Cloth_Sub A on A.SubID =B.SubID  ');
      sql.Add(' where B.MJID=''' + Trim(FSMStr) + '''');
//      showmessage(sql.text);
      Open;
    end;
    if ADOQueryTemp.IsEmpty then
    begin
      raise Exception.Create('未检验');
    end;
    if Trim(ADOQueryTemp.fieldbyname('MJStr2').AsString) = '未入库' then
    begin
      raise Exception.Create('未入库');
    end;
    FSubId := Trim(ADOQueryTemp.fieldbyname('SubID').AsString);  //获取这个布票的subid
    FAPBatchNo := Trim(ADOQueryTemp.fieldbyname('APBatchNo').AsString);   //获取这个布票的批号
    FCarNo := Trim(ADOQueryTemp.fieldbyname('CarNo').AsString);   //获取这个布票的机台号

    //查询这个subid在不在这个申请单里
    with ADOQueryTemp do
    begin
      Close;
      sql.Clear;
      sql.Add(' select * from FHSQ_Sub  ');
      sql.Add(' where FSID=''' + Trim(CKOrdNo.Text) + '''');
      sql.Add(' and SubID=''' + Trim(FSubId) + '''');
      Open;
    end;

    if ADOQueryTemp.IsEmpty then
    begin
      raise Exception.Create('产品编号错误');
    end;

    with ADOQueryTemp do
    begin
      Close;
      sql.Clear;
      sql.Add(' select * from FHSQ_Sub  ');
      sql.Add(' where FSID=''' + Trim(CKOrdNo.Text) + '''');
      sql.Add(' and SubID=''' + Trim(FSubId) + '''');
      sql.Add(' and isnull(APBatchNo,'''')=''' + Trim(FAPBatchNo) + '''');
//      showmessage(sql.text);
      Open;
    end;

    if ADOQueryTemp.IsEmpty then
    begin
    //如果这个布票的批号没有在在要发货里
      PlaySound(PChar('wav\批号不一致.wav'), 0, SND_FILENAME or SND_ASYNC);
      isGX := '否';
      if Application.MessageBox('批号不一致，是否要出库？', '提示', 32 + 4) = IDYES then
      begin
        isGX := '是';  //要更新检验表中的批号
      end
      else
      begin
        Result := false;
        Exit;
      end;
      //找一个同产品的没发全的别的申请
      with ADOQueryCmd do
      begin
        Close;
        sql.Clear;
        sql.Add('select top 1 *  from FHSQ_Sub where isnull(FHPS,0) < isnull(SQPS,0) and FSID =''' + Trim(CKOrdNo.Text) + '''');
        sql.Add('and SubID=''' + Trim(FSubID) + '''');
//        ShowMessage(sql.text);
        open;
      end;
      if ADOQueryCmd.IsEmpty then
      begin
        //找不到的话，就让发货匹数大于申请匹数，这样后面就会卡主，不给发货
        FSQPS := 0;
        FFHPS := 1;
      end
      else
      begin
        //找的到的话，就是获取别的发货申请的申请匹数和发货匹数，为了不发多
        FSQPS := ADOQueryCmd.fieldbyname('SQPS').AsInteger;
        FFHPS := ADOQueryCmd.fieldbyname('FHPS').AsInteger;
        FIsFJT := '否';
      end;

    end
    else
    begin
      FSQPS := ADOQueryTemp.fieldbyname('SQPS').AsInteger;
      FFHPS := ADOQueryTemp.fieldbyname('FHPS').AsInteger;
      FIsFJT := Trim(ADOQueryTemp.fieldbyname('IsFJT').AsString);  //是否分机台
    end;

    if Trim(FIsFJT) = '是' then
    begin
      //查询一下这个出库单号第一次出库的机台号，
      with ADOQueryTemp do
      begin
        Close;
        sql.Clear;
        sql.Add(' select top 1 B.CarNo from CK_PBCP_CR A inner join WFB_MJJY_PB B on A.MJID =B.MJID   ');
        sql.Add(' where A.SubId=''' + Trim(FSubId) + '''');
        sql.Add(' and A.CKOrdNo=''' + Trim(CKOrdNo.Text) + '''');
        sql.Add(' order by CRTime    ');
//        showmessage(sql.text);
        Open;
      end;

      if (ADOQueryTemp.IsEmpty = False) and (Trim(ADOQueryTemp.fieldbyname('CarNo').AsString) <> FCarNo) then
      begin
        PlaySound(PChar('wav\机台号不一致.wav'), 0, SND_FILENAME or SND_ASYNC);
        if Application.MessageBox('机台号不一致，是否要出库？', '提示', 32 + 4) <> IDYES then
        begin
          Result := false;
          Exit;
        end;

      end;

    end;

    if FSQPS <= FFHPS then
    begin
      raise Exception.Create('超出发货上限暂停发货');
    end;

    with ADOQueryTemp do
    begin
      Close;
      sql.Clear;
      sql.Add('  select C.CKOrdNo from FHSQ_Sub A');
      sql.Add('  inner join WFB_MJJY_PB B on A.MainId=B.MainId');
      sql.Add('  inner join CK_PBCP_CR C on B.MJID=C.MJID and C.CRFlag=''出库'' ');
      sql.Add('  where B.MJID=''' + Trim(FSMStr) + '''');
      sql.Add('  and A.FSID=''' + Trim(CKOrdNo.Text) + '''');
//      ShowMessage(SQL.text);
      Open;
    end;
    if ADOQueryTemp.IsEmpty = False then
    begin
      if Trim(ADOQueryTemp.fieldbyname('CKOrdNo').AsString) = Trim(CKOrdNo.Text) then
      begin
        raise Exception.Create('已扫描');
      end
      else
      begin
        raise Exception.Create('已出库暂停发货');
      end;
    end;

    Result := True;
  except
    Result := false;
//    application.MessageBox(PChar(Exception(ExceptObject).Message), '提示信息', 0);
    PlaySound(PChar('wav\' + Exception(ExceptObject).Message + '.wav'), 0, SND_FILENAME or SND_ASYNC);
  end;
end;

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

procedure TfrmCPSQSMCK.FormDestroy(Sender: TObject);
begin
  frmCPSQSMCK := nil;
end;

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

procedure TfrmCPSQSMCK.InitFHMX();
var
  MFHPS: integer;
begin
  if CDS_FHSQ.IsEmpty then
    Exit;
  with ADOQueryTemp do
  begin
    Close;
    sql.Clear;
    sql.Add('select B.* ');
    sql.Add(' from CK_PBCP_CR A');
    sql.Add(' inner join WFB_MJJY_PB B on A.MJID=B.MJID');
    sql.Add(' where A.CKOrdNo=' + quotedstr(Trim(CKOrdNo.Text)));
    sql.Add(' and A.SubId=' + quotedstr(Trim(CDS_FHSQ.FieldByName('SubId').AsString)));
    sql.Add(' and isnull(B.APBatchNo,'''')=' + quotedstr(Trim(CDS_FHSQ.FieldByName('APBatchNo').AsString)));
//    ShowMessage(sql.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('FHPS').Value := MFHPS;
  end;
end;

procedure TfrmCPSQSMCK.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) = 'CK' then
      begin
        if CheckCkd() then
        begin

        end;
      end
      else
      begin
        if CheckPB() then
        begin
          SaveCK();
          InitFHPS();
          InitFHMX();
        end;
      end;
    end
    else
    begin
      if JudgeJTMCX() then  //检测卷条码
        SaveCKDataJTMCX();
      InitFHPS();
      InitFHMX
    end;
  end;
end;

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

procedure TfrmCPSQSMCK.Button1Click(Sender: TObject);
var
  MKey: Char;
begin
  MKey := #13;
  try
    frmFHSQListSel := TfrmFHSQListSel.Create(self);
    with frmFHSQListSel do
    begin
      if ShowModal = 1 then
      begin
        SMID.Text := Trim(Order_Main.fieldbyname('FSID').AsString);
        SMIDKeyPress(SMID, MKey);
      end;
    end;
  finally
    frmFHSQListSel.Free;
  end;
end;

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

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

procedure TfrmCPSQSMCK.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;

end.

