⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 laneinfo_unt.pas

📁 煤矿行业采掘接替计划自动生成系统
💻 PAS
📖 第 1 页 / 共 5 页
字号:
      //获取各个掘进任务的前工序的个数
      first;
      while not eof do
        begin
          t:=FieldByName('DrillTask_Id').AsInteger;
          for i:=1 to High(DrillTask) do
            begin
              if DrillTask[i].Id=t then
                begin
                  DrillTask[i].PriorTask_Count:=DrillTask[i].PriorTask_Count+1;
                  break;
                end;
            end;
          next;
        end;
      //进一步读取各掘进工作任务的前工序信息
      for i:=1 to High(DrillTask) do
        begin
          if DrillTask[i].PriorTask_Count<>0 then
            setlength(DrillTask[i].PriorTask,DrillTask[i].PriorTask_Count+1);
        end;
      first;
      while not eof do
        begin
          t:=FieldByName('DrillTask_Id').AsInteger;
          for i:=1 to High(DrillTask) do
            begin
              if DrillTask[i].Id=t then
                begin
                  j:=DrillTask[i].tag;
                  DrillTask[i].PriorTask[j].Id:=FieldByName('PriorTask_Id').AsInteger;
                  DrillTask[i].PriorTask[j].Name:=FieldByName('PriorTask_Name').AsString;
                  for n:=1 to High(DrillTask) do
                    begin
                      if DrillTask[n].Id=DrillTask[i].PriorTask[j].Id then
                        begin
                          DrillTask[i].PriorTask[j].Task_Type:=DrillTask[n].Task_Type;
                          break;
                        end;
                    end;
                  DrillTask[i].tag:=DrillTask[i].tag+1;
                  break;
                end;
            end;
          next;
        end;
    end;  //end: with DrillWorkPriorTask_Frm.Base_DataS.DataSet do
  DrillWorkPriorTask_Frm.Free;
  DrillWorkPriorTask_Frm:=nil;

  //重置DrillTask[i].tag的值为初值1,以辅助用于下面的操作
  for i:=1 to High(DrillTask) do
    begin
      DrillTask[i].tag:=1;
    end;

  //-----------------------test
      {for i:=1 to High(DrillTask) do
        begin
          str:='';
          if DrillTask[i].PriorTask_Count<>0 then
            begin
              for j:=1 to DrillTask[i].PriorTask_Count do
                begin
                  str:=str+DrillTask[i].PriorTask[j].Name+',';
                end;
              showmessage('’'+DrillTask[i].Name+'‘的前工序有:'+str);
            end;
        end;}
  //--------------------------test

  //确定首采面的巷道准备之前的掘进工作
  FirstFaceDrillWorkPriorTask_Frm:=TFirstFaceDrillWorkPriorTask_Frm.Create(self);
  FirstFaceDrillWorkPriorTask_Frm.ShowModal;
  with FirstFaceDrillWorkPriorTask_Frm.Base_DataS.DataSet do
    begin
      first;
      while not eof do
        begin
          t:=FieldByName('DrillTask_Id').AsInteger;
          for i:=1 to High(DrillTask) do
            begin
              if DrillTask[i].Id=t then
                begin
                  DrillTask[i].FirstFaceDrillPrior_Count:=DrillTask[i].FirstFaceDrillPrior_Count+1;
                  break;
                end;
            end;
          next;
        end;

      //进一步读取各掘进工作任务的前工序信息
      for i:=1 to High(DrillTask) do
        begin
          if DrillTask[i].FirstFaceDrillPrior_Count<>0 then
             setlength(DrillTask[i].FirstFaceDrillPrior,DrillTask[i].FirstFaceDrillPrior_Count+1);
        end;
      first;
      while not eof do
        begin
          t:=FieldByName('DrillTask_Id').AsInteger;
          for i:=1 to High(DrillTask) do
            begin
              if DrillTask[i].Id=t then
                begin
                  j:=DrillTask[i].tag;
                  DrillTask[i].FirstFaceDrillPrior[j].Id:=FieldByName('PriorTask_Id').AsInteger;
                  DrillTask[i].FirstFaceDrillPrior[j].Name:=FieldByName('PriorTask_Name').AsString;
                  for n:=1 to High(DrillTask) do
                    begin
                      if DrillTask[n].Id=DrillTask[i].FirstFaceDrillPrior[j].Id then
                        begin
                          DrillTask[i].FirstFaceDrillPrior[j].Task_Type:=DrillTask[n].Task_Type;
                          break;
                        end;
                    end;
                  DrillTask[i].tag:=DrillTask[i].tag+1;
                  break;
                end;
            end;
          next;
        end;
    end;
  FirstFaceDrillWorkPriorTask_Frm.Free;
  FirstFaceDrillWorkPriorTask_Frm:=nil;

  //-----------------------test
      {for i:=1 to High(DrillTask) do
        begin
          str:='';
          if DrillTask[i].FirstFaceDrillPrior_Count<>0 then
            begin
              for j:=1 to DrillTask[i].FirstFaceDrillPrior_Count do
                begin
                  str:=str+DrillTask[i].FirstFaceDrillPrior[j].Name+',';
                end;
              showmessage('’'+DrillTask[i].Name+'‘的前工序有:'+str);
            end;
        end;}
  //--------------------------test

  //确定掘进保险系数
  DrillAssurance_Frm:=TDrillAssurance_Frm.Create(self);
  DrillAssurance_Frm.ShowModal;
  setlength(DrillAssurance,DrillAssurance_Frm.Base_DataS.DataSet.RecordCount+1);
  With DrillAssurance_Frm.Base_DataS.DataSet do
    begin
      first;
      i:=1;
      while not eof do
        begin
          DrillAssurance[i].TypeName:=FieldByName('LaneType').AsString;
          DrillAssurance[i].Coeff:=FieldByName('Coeff').AsFloat;
          next;
          i:=i+1;
        end;
    end;
  DrillAssurance_Frm.Free;
  DrillAssurance_Frm:=nil;
  LaneInfo_Frm.Refresh;
  //进度显示


  //读取接替面信息
  ReadRelayFace;

  //use of test
  //for i:=1 to High(RelayFace) do
    //begin
      //if RelayFace[i].FirstMine then showmessage('’'+inttostr(RelayFace[i].Project_Id)+'‘方案:'RelayFace[i].Area_Name+'采区的首采面:'+RelayFace[i].Face_Name);
    //end;

//2、产生掘进任务,并写进"巷道"表中(Data_Frm.Lane_AdoTab)

  with Base_DataS.DataSet do
    begin
      while RecordCount>0 do
        begin
          //Firstly,Delete all records in the table
          first;
          delete;
        end;
      close;
      //Secondly,Write correlative data into the LaneInfo_AdoTab table
      open;
      //Caculate the count of project of RelayFace
      ProjectCount:=1;
      for i:=1 to High(RelayFace)-1 do
        begin
          if RelayFace[i].Project_Id<>RelayFace[i+1].Project_Id then
            ProjectCount:=ProjectCount+1;
        end;
      //获取各个方案的编号
      setlength(Proj,ProjectCount+1);
      Proj[1].Id:=RelayFace[1].Project_Id;
      j:=1;
      for i:=2 to High(RelayFace) do
        begin
          if RelayFace[i].Project_Id<>Proj[j].Id then
            begin
              Proj[j+1].Id:=RelayFace[i].Project_Id;
              j:=j+1;
            end;
        end;
      //计算每个方案的接替记录数目
      for i:=1 to ProjectCount do
        begin
          Proj[i].Count:=0;
          for j:=1 to High(RelayFace) do
            begin
              if RelayFace[j].Project_Id=Proj[i].Id
                    then Proj[i].Count:=Proj[i].Count+1;
            end;
        end;        

      //use of test
      //for i:=1 to ProjectCount do
        //begin
          //showmessage('共有'+inttostr(ProjectCount)+'个方案:这里是方案‘'+inttostr(Proj[i].Id)+'’');
        //end;


      //逐个方案进行处理
      for i:=1 to ProjectCount do
        begin
          //Find the latest BeginDate in every project:LatestDate
          LatestDate:=0;
          for j:=1 to High(RelayFace) do
            begin
              if (RelayFace[j].Project_Id=Proj[i].Id)
                  and(RelayFace[j].BeginDate>LatestDate)
                                  then LatestDate:=RelayFace[j].BeginDate;
            end;
          LatestDate:=LatestDate+1;

//处理方案中的每个记录,
//以下循环即是为了对方案Proj[i].Id中的每一个接替面按照开工时间先后逐个进行处理,
//处理过的接替面进行标记:RelayFace[t].HaveChose:=true;
          Main_Frm.StatusBar1.Panels[0].Text:='产生掘进任务.....';
          Main_Frm.StatusBar1.Refresh;
          Main_Frm.PosId:=0;
          Main_Frm.Step:=Main_Frm.StatusBarLen/(ProjectCount*High(RelayFace));
          Main_Frm.Col:=clBlue;

          for j:=1 to High(RelayFace) do
            begin
              inc(Main_Frm.PosId);
              Main_Frm.StatusBarFill;
              //在每次处理还没有被处理的接替面时,
              //都要先找出剩余没有处理的接替面中开工时间最早的一个接替面
              Early.BeginDate:=LatestDate;
              Early.Seq:=0;
              if RelayFace[j].Project_Id<>Proj[i].Id then continue;//去除非Proj[i].Id方案
              //找到Proj[i].Id方案中未处理过的最早开工的接替面
              for k:=1 to High(RelayFace) do
                begin
                  if RelayFace[k].HaveChose then continue; //去除已经处理过的接替面
                  if (RelayFace[k].Project_Id=Proj[i].Id)
                       and(RelayFace[k].BeginDate<Early.BeginDate) then
                     begin
                       Early.BeginDate:=RelayFace[k].BeginDate;
                       Early.Seq:=RelayFace[k].Seq;
                     end;
                end;
              //到此处编号为Early.Seq的接替面是最早开工的,对其进行标记
              for t:=1 to High(RelayFace) do
                begin
                  if RelayFace[t].HaveChose then continue; //排除已经处理过的接替面
                  if RelayFace[t].Seq=Early.Seq then
                    begin
                      RelayFace[t].HaveChose:=true;

                      {//排除非待采状态的接替面
                      if RelayFace[t].FaceState<>2 then continue;//RelayF.FaceState=0,1。  0:采完,1:正在回采,2:待采状态}

                      //把RelayFace[t]相关的掘进任务添加进‘巷道’表中
                      WriteIntoLaneTab(RelayFace[t]);

                      break;
                    end;
                end;
              //
            end;//end: for j:=1 to Proj[i].Count do 处理方案中的每个记录
          Main_Frm.StatusBar1.Panels[0].Text:='';
          Main_Frm.StatusBar1.Refresh;
        end;//end: for i:=1 to ProjectCount do  逐个方案进行处理

    end;//end:with Base_DataS.DataSet do

  //激活相应按钮
  //BitBtn1.Enabled:=true;
  BitBtn2.Enabled:=true;
  BitBtn4.Enabled:=true;
  BitBtn5.Enabled:=true;
  BitBtn6.Enabled:=true;
  BitBtn7.Enabled:=true;
  BitBtn8.Enabled:=true;
  //BitBtn9.Enabled:=true;
  BitBtn10.Enabled:=true;
  BitBtn11.Enabled:=true;
  BitBtn13.Enabled:=true;
  //BitBtn12.Enabled:=false;

end;

procedure TLaneInfo_Frm.FormCreate(Sender: TObject);
begin
  LaneInfo_FrmCreated:=true;
  inherited;
  try
    Project_AdoQ.Active:=true;
  except
    showmessage('数据库连接有问题!(Project_ADOQ控件连接有误)');
  end;
end;

procedure TLaneInfo_Frm.DBLookupComboBox1KeyDown(Sender: TObject;
  var Key: Word; Shift: TShiftState);
begin
  if key=VK_RETURN then DBEdit1.SetFocus;

end;

procedure TLaneInfo_Frm.ReadRelayFace; //读取回采接替计划,并获取安准时间,掘进完成提前时间,判断是否是准备采区的首采面
var
i,j,m,n:integer;
Face,Area,WorkGroup,Technic:integer;
Earliest:boolean;
begin
  if Data_Frm.MineRelay_AdoTab.RecordCount=0 then
    begin
      showmessage('回采接替计划还没有安排!');
      exit;
    end;
  with Data_Frm.MineRelay_AdoTab do
    begin
      if not active then open;
      setlength(RelayFace,RecordCount+1);
      first;
      i:=1;
      //读取表中的数据
      while not eof do
        begin
          RelayFace[i].Seq:=FieldByName('Sequence').AsInteger;
          RelayFace[i].Project_Id:=FieldByName('Project_Id').AsInteger;
          RelayFace[i].Relay_Route:=FieldByName('Relay_Route').AsInteger;
          RelayFace[i].Relay_Id:=FieldByName('Relay_Id').AsInteger;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -