Kaynağa Gözat

1. 部分用户,网页触发登陆软件,报错问题
2. 变更管理相关
3. debug-view测试版本下,导入计量数据

MaiXinRong 5 yıl önce
ebeveyn
işleme
06f9e611c0

+ 3 - 2
Forms/LoginFrm.pas

@@ -17,7 +17,8 @@ uses
   cxTextEdit, cxButtons, cxControls, cxEdit,
   cxMaskEdit, cxDropDownEdit, HookEdit, cxContainer, XPMenu, cslLabel,
   IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, IdHTTP,
-  CslButton, OleCtrls, SHDocVw, DB, ADODB, Menus;
+  CslButton, OleCtrls, SHDocVw, DB, ADODB, Menus,
+  UtilMethods;
   
 
 type
@@ -281,7 +282,7 @@ var s: string;
 begin
   FUsersCon := TADOConnection.Create(nil);
   FUsersCon.LoginPrompt := False;
-  s := 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=CloudUser.dat;Persist Security Info=False';
+  s := Format('Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%sCloudUser.dat;Persist Security Info=False', [GetAppFilePath]);
   FUsersCon.ConnectionString := s;
   FUsersQry := TADOQuery.Create(nil);
   FUsersQry.Connection := FUsersCon;

+ 14 - 0
Forms/MainFrm.dfm

@@ -435,6 +435,10 @@ object MainForm: TMainForm
           Visible = True
         end
         item
+          Item = dxbtnImportPhaseData
+          Visible = True
+        end
+        item
           Item = dxbtnExportBillsJson
           Visible = True
         end
@@ -1284,6 +1288,10 @@ object MainForm: TMainForm
       Hint = #23548#20986#26631#20934#28165#21333'json'#25968#25454
       Visible = ivAlways
     end
+    object dxbtnImportPhaseData: TdxBarButton
+      Action = actnImportPhaseData
+      Category = 2
+    end
   end
   object Images: TImageList
     DrawingStyle = dsTransparent
@@ -3492,6 +3500,12 @@ object MainForm: TMainForm
       OnExecute = actnImportSubTenderGatherGclExcelExecute
       OnUpdate = actnImportSubTenderGatherUpdate
     end
+    object actnImportPhaseData: TAction
+      Category = 'File'
+      Caption = #23548#20837#35745#37327#25968#25454
+      OnExecute = actnImportPhaseDataExecute
+      OnUpdate = actnImportPhaseDataUpdate
+    end
   end
   object dxpmTabSet: TdxBarPopupMenu
     BarManager = dxBarManager

+ 17 - 0
Forms/MainFrm.pas

@@ -195,6 +195,8 @@ type
     ilstLarge: TImageList;
     ilstSmall: TImageList;
     ilstExpend: TImageList;
+    dxbtnImportPhaseData: TdxBarButton;
+    actnImportPhaseData: TAction;
     procedure FormCreate(Sender: TObject);
     procedure FormDestroy(Sender: TObject);
     procedure jtsProjectsChange(Sender: TObject; NewTab: Integer;
@@ -250,6 +252,8 @@ type
     procedure dxbtnGatherSubTenderGclClick(Sender: TObject);
     procedure actnImportSubTenderGatherGclExecute(Sender: TObject);
     procedure actnImportSubTenderGatherGclExcelExecute(Sender: TObject);
+    procedure actnImportPhaseDataUpdate(Sender: TObject);
+    procedure actnImportPhaseDataExecute(Sender: TObject);
   private
     FProjectManagerFrame: TProjectManagerFrame;
     FProjectFrames: TList;
@@ -1045,4 +1049,17 @@ begin
     CurProjectFrame.ProjectData.ImportSubTenderGatherGclExcel(sFileName);
 end;
 
+procedure TMainForm.actnImportPhaseDataUpdate(Sender: TObject);
+begin
+  TAction(Sender).Visible := _IsDebugView;
+end;
+
+procedure TMainForm.actnImportPhaseDataExecute(Sender: TObject);
+var
+  sFileName: string;
+begin
+  if QuestMessage('导入计量数据,请确认前后标段一致,并在新增清单前导入,对于本期新增清单,导入数据可能有误,导入后请检查。') and SelectFile(sFileName, 'mtf') then
+    CurProjectFrame.ProjectData.ImportPhaseData(sFileName);
+end;
+
 end.

+ 4 - 2
Frames/BGLFme.pas

@@ -99,14 +99,16 @@ begin
   zaBGBills.DataSet := FBGLData.cdsBGBillsView;
   SetDxBtnAction(actnNew, tobtnNew);
 
-  if _IsCloud then
+  if _IsCloud and (TProjectData(ABGLData.ProjectData).WebChangeSwitch = 1) then
   begin
     zaBGL.Options := [aoAllowEdit, aoAllowDelete, aoAllowUpMove, aoAllowDownMove];
     zaBGL.ExtendRowCount := 0;
-    FBGLData.AfterCurrentBGLChanged := zgBGLCurrentChanged;
+    labTitle.Caption := ' ±ä¸üÁ±ä¸ü¹ÜÀí£©';  
+    zaBGBills.ExtendRowCount := 0;
   end
   else
     zaBGL.Options := [aoAllowInsert, aoAllowEdit, aoAllowDelete, aoAutoInsert, aoAllowUpMove, aoAllowDownMove];
+  FBGLData.AfterCurrentBGLChanged := zgBGLCurrentChanged;
 end;
 
 procedure TBGLFrame.actnNewExecute(Sender: TObject);

+ 1 - 1
Frames/BillsGatherFme.pas

@@ -92,7 +92,7 @@ begin
   saDetailGcl.DataView := FBillsGatherData.sdvDetailGclBills;
   saDetailDeal.DataView := FBillsGatherData.sdvDetailDealBills;
   saDetailBGL.DataView := FBillsGatherData.sdvDetailBGLBills;
-  pnlTop.Visible := _IsCloud;
+  pnlTop.Visible := _IsCloud and (TProjectData(FBillsGatherData.ProjectData).WebChangeSwitch = 1);
 end;
 
 destructor TBillsGatherFrame.Destroy;

+ 20 - 0
Units/PhaseData.pas

@@ -56,6 +56,7 @@ type
     procedure SimpleOpen(const AProjectName: string);
     procedure SimpleSave;
     procedure SimpleOpen2(const AProjectName: string);
+    procedure SimpleOpen3(const AProjectName: string; AStageIndex: Integer = -1);
 
     procedure CreateNewAuditData;
     procedure CopyPreData;
@@ -342,4 +343,23 @@ begin
   TProjectData(FProjectData).AppendProjectLog('Save Phase Data --> End');
 end;
 
+procedure TPhaseData.SimpleOpen3(const AProjectName: string;
+  AStageIndex: Integer = -1);
+begin
+  FConnection.Open(AProjectName);
+  UpdatePhaseDataBase;
+  FPhaseProperty.Open;
+  CheckAuditCount;
+  if AStageIndex = -1 then
+    FStageIndex := FPhaseProperty.AuditCount
+  else if AStageIndex <= FPhaseProperty.AuditCount then
+    FStageIndex := FPhaseProperty.AuditCount
+  else
+    raise Exception.Create('ÊäÈëµÄ½ÇÉ«²»´æÔÚ');
+  FStageData.TableName := StageTableName[FStageIndex];
+  FStageData.Open(FConnection.Connection);
+  FPhasePayData.Open(FConnection.Connection);
+  FZJJLData.Open(FConnection.Connection);
+end;
+
 end.

+ 67 - 0
Units/ProjectCommands.pas

@@ -315,6 +315,24 @@ type
     property CheckType: TTenderZipCheckType read FCheckType write FCheckType;
   end;
 
+  TmtfFileView = class
+  private
+    FTempFolder: string;
+    FSelect: TsdIDTreeNode;
+    FNewNode: TsdIDTreeNode;
+    FFileName: string;
+    FTenderFileName: string;
+
+    procedure LoadProjectInfo(AXmlNode: IXMLNode);
+    procedure LoadInfoFromXmlDocument(AXmlNode: IXMLNode);
+    procedure LoadXmlInfo;
+  public
+    constructor Create(const AFileName: string);
+    destructor Destroy; override;
+
+    property FileName: String read FFileName;
+  end;
+
 implementation
 
 uses
@@ -1273,4 +1291,53 @@ begin
   inherited;
 end;
 
+{ TmtfFileView }
+
+constructor TmtfFileView.Create(const AFileName: string);
+begin
+  FFileName := AFileName;
+  FTempFolder := GenerateTempFolder(GetTempFilePath);
+
+  UnZipFile(FFileName, FTempFolder);
+  LoadXmlInfo;
+  FFileName := FTempFolder + '\' + FTenderFileName;
+end;
+
+destructor TmtfFileView.Destroy;
+begin
+  DeleteFileOrFolder(FTempFolder);
+  inherited;
+end;
+
+procedure TmtfFileView.LoadInfoFromXmlDocument(AXmlNode: IXMLNode);
+var
+  ChildNodes: IXMLNodeList;
+begin
+  ChildNodes := AXmlNode.ChildNodes;
+  LoadProjectInfo(ChildNodes.FindNode('ProjectInfo'));
+end;
+
+procedure TmtfFileView.LoadProjectInfo(AXmlNode: IXMLNode);
+begin
+  FTenderFileName := AXmlNode.Attributes['FileName'];
+end;
+
+procedure TmtfFileView.LoadXmlInfo;
+var
+  FXmlDocument: IXMLDocument;
+  XmlNode: IXMLNode;
+  FRootList: IXMLNodeList;
+begin
+  FXmlDocument := TXMLDocument.Create(nil) as IXMLDocument;
+  try
+    FXmlDocument.LoadFromFile(FTempFolder + '\Info.xml');
+    FXmlDocument.Options := [doNodeAutoCreate,doNodeAutoIndent,doAutoPrefix,doNamespaceDecl];
+    XmlNode := FXmlDocument.DocumentElement;
+    LoadInfoFromXmlDocument(XmlNode);
+  finally
+    FRootList := nil;
+    FXmlDocument := nil;
+  end;
+end;
+
 end.

+ 137 - 1
Units/ProjectData.pas

@@ -63,6 +63,7 @@ type
     FAttachmentData: TUpFiles;
     FCheckers: TCheckers;
     FIsGuest: Boolean;
+    FWebChangeSwitch: Integer;
 
     {For Open}
     procedure UpdateProjectDataBase;
@@ -97,6 +98,8 @@ type
 
     procedure LoadCheckersData;
 
+    procedure LoadWebSwitchChange;
+
     function GetMainFileName: string;
     procedure SetPhaseIndex(const Value: Integer);
     function GetTempPath: string;
@@ -155,6 +158,7 @@ type
     procedure OpenForSumUpBase(const AFileName: string);
     {OpenForSumUpGather: BillsData, BillsMeasureTree, PhaseData(根据PhaseIndex指定打开),直接调用OpenForSignOnline}
     procedure OpenForSumUpGather(const AFileName: string; APhaseIndex: Integer = -1);
+    procedure OpenForImportMtf(const AFileName: string; APhaseIndex: Integer = -1; AStageIndex: Integer = -1);
     //-----------------------  End ---后台打开 ------------------------
 
     procedure SaveDebugFile(const AFileName: string);
@@ -211,6 +215,7 @@ type
     procedure ImportSubTenderGather(const AFileName: string);
     procedure ImportSubTenderGatherGcl(const AFileName: string);
     procedure ImportSubTenderGatherGclExcel(const AFileName: string);
+    procedure ImportPhaseData(const AFileName: string);
 
     function CheckPassword: Boolean;
 
@@ -278,6 +283,8 @@ type
     property ProjectReadOnly: Boolean read FProjectReadOnly;
     property Checkers: TCheckers read FCheckers write SetCheckers;
     property IsGuest: Boolean read GetIsGuest;
+
+    property WebChangeSwitch: Integer read FWebChangeSwitch;
   end;
 
 implementation
@@ -288,7 +295,7 @@ uses
   mProgressProFrm, mDataRecord, ConditionalDefines, DbTreeImport,
   StrUtils, sdProvider, CalcDecimal, Math, CslJson, OrderCheckerFme,
   stgSubGatherFile, Forms, ProgressHintFrm, BillsTree, Controls,
-  stgGclSubGatherFile;
+  stgGclSubGatherFile, rmfImportFrm;
 
 { TProjectData }
 
@@ -343,6 +350,7 @@ begin
   FAttachmentData := TUpFiles.Create;
   FAttachmentInfoData := TAttachmentInfoData.Create(Self);
   FPhaseIndex := 0;
+  FWebChangeSwitch := -1;
 end;
 
 procedure TProjectData.CreateNewPhase;
@@ -519,6 +527,8 @@ begin
     FDebugDir := GetAppFilePath + 'Debug\' + FProjectName;
     CreateDirectoryInDeep(FDebugDir);
   end;
+  if _IsCloud then
+    LoadWebSwitchChange;
 end;
 
 procedure TProjectData.OpenLastPhaseData;
@@ -2414,4 +2424,130 @@ begin
   Result := not (UserIsAuthor(PHPWeb.UserID) or UserIsChecker(PHPWeb.UserID));
 end;
 
+procedure TProjectData.ImportPhaseData(const AFileName: string);
+var
+  vMtfFile: TmtfFileView;
+  vProjectData: TProjectData;
+  vFails: TStringList;
+  iPhase, iStage: Integer;
+
+  procedure ClearOldData(AStageData: TStageData);
+  var
+    i: Integer;
+    vRec: TStageRecord;
+  begin
+    for i := 0 to AStageData.sddStage.RecordCount - 1 do
+    begin
+      vRec := TStageRecord(AStageData.sddStage.Records[i]);
+      vRec.DealQuantity.AsFloat := 0;
+      vRec.DealTotalPrice.AsFloat := 0;
+      vRec.DealFlag.AsInteger := 0;
+      vRec.DealFormula.AsString := '';
+      vRec.EndDealQuantity.AsFloat := vRec.PreDealQuantity.AsFloat;
+      vRec.EndDealTotalPrice.AsFloat := vRec.PreDealTotalPrice.AsFloat;
+    end;
+  end;
+
+  procedure ImportData(AProjectData: TProjectData);
+  var
+    vStageData: TStageData;
+    vBillsData: TBillsData;
+    i: Integer;
+    vRec, vOrgBillsRec, vBillsRec, vStageRec: TsdDataRecord;
+  begin
+    vStageData := AProjectData.PhaseData.StageData;
+    vBillsData := AProjectData.BillsData;
+    for i := 0 to vStageData.sddStage.RecordCount - 1 do
+    begin
+      vRec := vStageData.sddStage.Records[i];
+      vOrgBillsRec := vBillsData.sddBills.FindKey('idxID', vRec.ValueByName('BillsID').AsInteger);
+      if not vOrgBillsRec.ValueByName('IsLeaf').AsBoolean then Continue;
+
+      vBillsRec := BillsData.sddBills.Locate('ID', vRec.ValueByName('BillsID').AsInteger);
+      if Assigned(vBillsRec) and Assigned(vOrgBillsRec) and
+        (vBillsRec.ValueByName('Name').AsString = vOrgBillsRec.ValueByName('Name').AsString) then
+      begin
+        vStageRec := PhaseData.StageData.StageRecordWithAdd(vRec.ValueByName('BillsID').AsInteger);
+        vStageRec.ValueByName('DealQuantity').AsFloat := vRec.ValueByName('DealQuantity').AsFloat;
+      end
+      else
+        vFails.Add(Format('ID: %s', [vRec.ValueByName('BillsID').AsString]));
+    end;
+  end;
+
+begin
+  if not GetMtfImportInfo(iPhase, iStage) then
+    Exit;
+
+  Screen.Cursor := crHourGlass;
+  try
+    vFails := TStringList.Create;
+    vMtfFile := TmtfFileView.Create(AFileName);
+    vProjectData := TProjectData.Create;
+    vProjectData.OpenForImportMtf(vMtfFile.FileName, iPhase, iStage);
+
+    PhaseData.StageData.sddStage.BeginUpdate;
+    PhaseData.StageData.BeforeBatchOperation;
+    try
+      ClearOldData(PhaseData.StageData);
+      ImportData(vProjectData);
+      BillsMeasureData.ResetTreeNodeStageRec;
+      if vFails.Count > 0 then
+        WarningMessage('未能导入的清单:' + #13#10 + vFails.Text);
+    finally
+      PhaseData.StageData.AfterBatchOperation;
+      PhaseData.StageData.sddStage.EndUpdate;
+    end;
+  finally
+    Screen.Cursor := crDefault;
+    vProjectData.Free;
+    vMtfFile.Free;
+    vFails.Free;
+  end;
+end;
+
+procedure TProjectData.OpenForImportMtf(const AFileName: string;
+  APhaseIndex: Integer; AStageIndex: Integer);
+begin
+  FProjectID := -1;
+  UnZipFile(AFileName, TempPath);
+  FConnection.Open(MainFileName);
+  UpdateProjectDataBase;
+  FProjProperties.Open(FConnection.Connection);
+  UpdateOldData;
+  FBillsData.Open(FConnection.Connection);
+  if ProjProperties.PhaseCount > 0 then
+  begin
+    if APhaseIndex = -1 then
+      FPhaseIndex := ProjProperties.PhaseCount
+    else if (APhaseIndex <= ProjProperties.PhaseCount) and (APhaseIndex > 0) then
+      FPhaseIndex := APhaseIndex
+    else
+      raise Exception.Create('输入的期数不存在');
+    ProjProperties.PhaseIndex := FPhaseIndex;
+    FPhaseData.SimpleOpen3(Format('%sPhase%d.dat', [TempPath, FPhaseIndex]), AStageIndex);
+  end;
+  FBillsMeasureData.ResetTreeNodeStageRec;
+end;
+
+procedure TProjectData.LoadWebSwitchChange;
+var                
+  sgs: TStrings;
+  iResult: Integer;
+  sResult: string;
+begin           
+  sgs := TStringList.Create;
+  try     
+    sgs.Add(Format('id=%d', [FWebID]));
+    iResult := PHPWeb.UrlGet(PhPWeb.MeasureURL + 'change/switch', sgs, sResult);
+    case iResult of
+      1: FWebChangeSwitch := StrToIntDef(sResult, 0);
+      0: WarningMessage('网络错误:' + sResult);
+      -1: WarningMessage('网络错误:无法连接到云端');
+    end;
+  finally
+    sgs.Free;
+  end;
+end;
+
 end.

+ 3 - 3
Units/ReportManager.pas

@@ -771,7 +771,7 @@ end;
 function TMemoryReportManager.GetMemoryDataSet(
   ADataSetID: Integer; AProjectData: TProjectData): TDataSet;
 begin
-  //ADataSetID := 62;
+  ADataSetID := 54;
   case ADataSetID of
     1: Result := FrmGridHeaderData.AssginData(AProjectData);   // 몹깊깊庫
     2: Result := FrmGclBillsBGData.AssignData(AProjectData, rmtPhaseGather, rmgtGather); // 묏넋좆헌데[굶퍅供냥]
@@ -813,8 +813,8 @@ begin
     59: Result := FrmWuJiuZqzfGatherData.AssignData(AProjectData);
   end;
   // For Inner Test
-  //if _IsDebugView then
-    //ShowTestForm(Result);
+  if _IsDebugView then
+    ShowTestForm(Result);
 end;
 
 function TMemoryReportManager.GetSqlResultDataSet(const ASql: string;