ソースを参照

Merge branch 'master' of http://192.168.1.12:3000/MaiXinRong/Measure

CSL 9 年 前
コミット
41a159550b

+ 17 - 25
DataModules/BillsDm.pas

@@ -141,7 +141,7 @@ end;
 
 procedure TBillsData.Save;
 
-  procedure ResolveCode(ARec: TsdDataRecord);
+  procedure ResolveCode(ARec: TBillsRecord);
   var
     sgs: TStrings;
     i: Integer;
@@ -150,7 +150,7 @@ procedure TBillsData.Save;
     sgs := TStringList.Create;
     try
       sgs.Delimiter := '-';
-      sgs.DelimitedText := ARec.ValueByName('Code').AsString;
+      sgs.DelimitedText := ARec.Code.AsString;
       case sgs.Count of
         1: sXiangCode := '';
         2: sXiangCode := ChinessNum(StrToIntDef(sgs[1], 0));
@@ -166,14 +166,10 @@ procedure TBillsData.Save;
         end;
       end;
     finally
-      if (ARec.ValueByName('XiangCode').AsString <> sXiangCode) then
-        ARec.ValueByName('XiangCode').AsString := sXiangCode;
-      if (ARec.ValueByName('MuCode').AsString <> sMuCode) then
-        ARec.ValueByName('MuCode').AsString := sMuCode;
-      if (ARec.ValueByName('JieCode').AsString <> sJieCode) then
-        ARec.ValueByName('JieCode').AsString := sJieCode;
-      if (ARec.ValueByName('XiMuCode').AsString <> sXiMuCode) then
-        ARec.ValueByName('XiMuCode').AsString := sXiMuCode;
+      ARec.SetStrValue(ARec.XiangCode, sXiangCode);
+      ARec.SetStrValue(ARec.MuCode, sMuCode);
+      ARec.SetStrValue(ARec.JieCode, sJieCode);
+      ARec.SetStrValue(ARec.XimuCode, sXiMuCode);
       sgs.Free;
     end;
   end;
@@ -181,7 +177,7 @@ procedure TBillsData.Save;
   procedure SaveReportsRela;
   var
     iIndex: Integer;
-    stnNode: TsdIDTreeNode;
+    stnNode: TBillsIDTreeNode;
     iLeafXmjParentID: Integer;
     sIndexCode: string;
   begin
@@ -190,34 +186,30 @@ procedure TBillsData.Save;
       with TProjectData(FProjectData).BillsCompileData do
         for iIndex := 0 to BillsCompileTree.Count - 1 do
         begin
-          stnNode := BillsCompileTree.Items[iIndex];
+          stnNode := TBillsIDTreeNode(BillsCompileTree.Items[iIndex]);
           // 分项清单排序
-          if (stnNode.Rec.ValueByName('SerialNo').AsString = '') or
-              (stnNode.MajorIndex <> stnNode.Rec.ValueByName('SerialNo').AsInteger) then
-            stnNode.Rec.ValueByName('SerialNo').AsInteger := stnNode.MajorIndex;
+          if (stnNode.Rec.SerialNo.AsString = '') or
+              (stnNode.MajorIndex <> stnNode.Rec.SerialNo.AsInteger) then
+            stnNode.Rec.SerialNo.AsInteger := stnNode.MajorIndex;
 
           // 叶子节点
-          if (stnNode.Rec.ValueByName('IsLeaf').asBoolean <> not stnNode.HasChildren) then
-            stnNode.Rec.ValueByName('IsLeaf').AsBoolean := not stnNode.HasChildren;
+          stnNode.Rec.SetBoolValue(stnNode.Rec.IsLeaf, stnNode.HasChildren);
 
           // 最底项目节父节点ID
-          if (stnNode.Rec.ValueByName('B_Code').AsString <> '') then
+          if (stnNode.Rec.B_Code.AsString <> '') then
             iLeafXmjParentID := GetLeafXmjParentID(stnNode.ID)
           else
             iLeafXmjParentID := -1;
-          if (stnNode.Rec.ValueByName('LeafXmjParentID').AsInteger <> iLeafXmjParentID) then
-            stnNode.Rec.ValueByName('LeafXmjParentID').AsInteger := iLeafXmjParentID;
+          stnNode.Rec.SetIntValue(stnNode.Rec.LeafXmjParentID, iLeafXmjParentID);
 
           // 分解项目节编号为项、目、节、细目
-          if stnNode.Rec.ValueByName('Code').AsString <> '' then
+          if stnNode.Rec.Code.AsString <> '' then
             ResolveCode(stnNode.Rec);
 
           // 工程量清单排序Code
-          if (stnNode.Rec.ValueByName('B_Code').AsString <> '') then
+          if (stnNode.Rec.B_Code.AsString <> '') then
           begin
-            sIndexCode := B_CodeToIndexCode(stnNode.Rec.ValueByName('B_Code').AsString);
-            if (stnNode.Rec.ValueByName('IndexCode').AsString <> sIndexCode) then
-              stnNode.Rec.ValueByName('IndexCode').AsString := sIndexCode;
+            stnNode.Rec.SetStrValue(stnNode.Rec.IndexCode, sIndexCode);
           end;
         end;
     finally

+ 37 - 36
DataModules/StageDm.pas

@@ -572,48 +572,49 @@ end;
 procedure TStageData.CopyPrePhaseData;
 var
   iRecord: Integer;
-  Rec, NewRec: TsdDataRecord;
+  Rec: TBillsRecord;
+  NewRec: TStageRecord;
 begin
   BeforeBatchOperation;
   try
     with TProjectData(TPhaseData(FPhaseData).ProjectData).BillsData do
       for iRecord := 0 to sddBills.RecordCount - 1 do
       begin
-        Rec := sddBills.Records[iRecord];
-        if (Rec.ValueByName('AddGatherTotalPrice').AsFloat = 0) and
-           (Rec.ValueByName('AddDealTotalPrice').AsFloat = 0) and
-           (Rec.ValueByName('AddQcTotalPrice').AsFloat = 0) and
-           (Rec.ValueByName('AddPcTotalPrice').AsFloat = 0) and
-           (Rec.ValueByName('PM_AddTotalPrice').AsFloat = 0) then Continue;
-
-        NewRec := sddStage.Add;
-        NewRec.ValueByName('BillsID').AsInteger := Rec.ValueByName('ID').AsInteger;
-        NewRec.ValueByName('EndDealQuantity').AsFloat := Rec.ValueByName('AddDealQuantity').AsFloat;
-        NewRec.ValueByName('EndDealTotalPrice').AsFloat := Rec.ValueByName('AddDealTotalPrice').AsFloat;
-        NewRec.ValueByName('EndQcQuantity').AsFloat := Rec.ValueByName('AddQcQuantity').AsFloat;
-        NewRec.ValueByName('EndQcTotalPrice').AsFloat := Rec.ValueByName('AddQcTotalPrice').AsFloat;
-        NewRec.ValueByName('EndQcBGLCode').AsString := Rec.ValueByName('AddQcBGLCode').AsString;
-        NewRec.ValueByName('EndQcBGLNum').AsString := Rec.ValueByName('AddQcBGLNum').AsString;
-        NewRec.ValueByName('EndPcQuantity').AsFloat := Rec.ValueByName('AddPcQuantity').AsFloat;
-        NewRec.ValueByName('EndPcTotalPrice').AsFloat := Rec.ValueByName('AddPcTotalPrice').AsFloat;
-        NewRec.ValueByName('EndPcBGLCode').AsString := Rec.ValueByName('AddPcBGLCode').AsString;
-        NewRec.ValueByName('EndPcBGLNum').AsString := Rec.ValueByName('AddPcBGLNum').AsString;
-        NewRec.ValueByName('EndGatherQuantity').AsFloat := Rec.ValueByName('AddGatherQuantity').AsFloat;
-        NewRec.ValueByName('EndGatherTotalPrice').AsFloat := Rec.ValueByName('AddGatherTotalPrice').AsFloat;
-        NewRec.ValueByName('PreDealQuantity').AsFloat := Rec.ValueByName('AddDealQuantity').AsFloat;
-        NewRec.ValueByName('PreDealTotalPrice').AsFloat := Rec.ValueByName('AddDealTotalPrice').AsFloat;
-        NewRec.ValueByName('PreQcQuantity').AsFloat := Rec.ValueByName('AddQcQuantity').AsFloat;
-        NewRec.ValueByName('PreQcTotalPrice').AsFloat := Rec.ValueByName('AddQcTotalPrice').AsFloat;
-        NewRec.ValueByName('PreQcBGLCode').AsString := Rec.ValueByName('AddQcBGLCode').AsString;
-        NewRec.ValueByName('PreQcBGLNum').AsString := Rec.ValueByName('AddQcBGLNum').AsString;
-        NewRec.ValueByName('PrePcQuantity').AsFloat := Rec.ValueByName('AddPcQuantity').AsFloat;
-        NewRec.ValueByName('PrePcTotalPrice').AsFloat := Rec.ValueByName('AddPcTotalPrice').AsFloat;
-        NewRec.ValueByName('PrePcBGLCode').AsString := Rec.ValueByName('AddPcBGLCode').AsString;
-        NewRec.ValueByName('PrePcBGLNum').AsString := Rec.ValueByName('AddPcBGLNum').AsString;
-        NewRec.ValueByName('PreGatherQuantity').AsFloat := Rec.ValueByName('AddGatherQuantity').AsFloat;
-        NewRec.ValueByName('PreGatherTotalPrice').AsFloat := Rec.ValueByName('AddGatherTotalPrice').AsFloat;
-
-        NewRec.ValueByName('PM_PreTotalPrice').AsFloat := Rec.ValueByName('PM_AddTotalPrice').AsFloat;
+        Rec := TBillsRecord(sddBills.Records[iRecord]);
+        if (Rec.AddGatherTotalPrice.AsFloat = 0) and
+           (Rec.AddDealTotalPrice.AsFloat = 0) and
+           (Rec.AddQcTotalPrice.AsFloat = 0) and
+           (Rec.AddPcTotalPrice.AsFloat = 0) and
+           (Rec.PM_AddTotalPrice.AsFloat = 0) then Continue;
+
+        NewRec := TStageRecord(sddStage.Add);
+        NewRec.BillsID.AsInteger := Rec.ID.AsInteger;
+        NewRec.EndDealQuantity.AsFloat := Rec.AddDealQuantity.AsFloat;
+        NewRec.EndDealTotalPrice.AsFloat := Rec.AddDealTotalPrice.AsFloat;
+        NewRec.EndQcQuantity.AsFloat := Rec.AddQcQuantity.AsFloat;
+        NewRec.EndQcTotalPrice.AsFloat := Rec.AddQcTotalPrice.AsFloat;
+        NewRec.EndQcBGLCode.AsString := Rec.AddQcBGLCode.AsString;
+        NewRec.EndQcBGLNum.AsString := Rec.AddQcBGLNum.AsString;
+        NewRec.EndPcQuantity.AsFloat := Rec.AddPcQuantity.AsFloat;
+        NewRec.EndPcTotalPrice.AsFloat := Rec.AddPcTotalPrice.AsFloat;
+        NewRec.EndPcBGLCode.AsString := Rec.AddPcBGLCode.AsString;
+        NewRec.EndPcBGLNum.AsString := Rec.AddPcBGLNum.AsString;
+        NewRec.EndGatherQuantity.AsFloat := Rec.AddGatherQuantity.AsFloat;
+        NewRec.EndGatherTotalPrice.AsFloat := Rec.AddGatherTotalPrice.AsFloat;
+        NewRec.PreDealQuantity.AsFloat := Rec.AddDealQuantity.AsFloat;
+        NewRec.PreDealTotalPrice.AsFloat := Rec.AddDealTotalPrice.AsFloat;
+        NewRec.PreQcQuantity.AsFloat := Rec.AddQcQuantity.AsFloat;
+        NewRec.PreQcTotalPrice.AsFloat := Rec.AddQcTotalPrice.AsFloat;
+        NewRec.PreQcBGLCode.AsString := Rec.AddQcBGLCode.AsString;
+        NewRec.PreQcBGLNum.AsString := Rec.AddQcBGLNum.AsString;
+        NewRec.PrePcQuantity.AsFloat := Rec.AddPcQuantity.AsFloat;
+        NewRec.PrePcTotalPrice.AsFloat := Rec.AddPcTotalPrice.AsFloat;
+        NewRec.PrePcBGLCode.AsString := Rec.AddPcBGLCode.AsString;
+        NewRec.PrePcBGLNum.AsString := Rec.AddPcBGLNum.AsString;
+        NewRec.PreGatherQuantity.AsFloat := Rec.AddGatherQuantity.AsFloat;
+        NewRec.PreGatherTotalPrice.AsFloat := Rec.AddGatherTotalPrice.AsFloat;
+
+        NewRec.PM_PreTotalPrice.AsFloat := Rec.PM_AddTotalPrice.AsFloat;
       end;
   finally
     AfterBatchOperation;

+ 15 - 15
Frames/BillsCompileFme.pas

@@ -5,7 +5,7 @@ interface
 uses
   BillsCompileDm, UtilMethods, BillsClipboard, sdIDTree, BatchReplaceBillsFrm,
   CheckAndClearFrm, DealBillsFrm, BillsPasteSelectFrm,
-  sdDB,
+  sdDB, BillsTree,
   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
   Dialogs, ActnList, sdGridDBA, sdGridTreeDBA, dxBar, ZJGrid, StdCtrls,
   ExtCtrls;
@@ -110,7 +110,7 @@ implementation
 
 uses
   MainFrm, BatchInsertBillsFrm, ExportExcel, ProjectData, mEncryptEditions,
-  ExcelImport, DetailExcelImport;
+  ExcelImport, DetailExcelImport, mDataRecord;
 
 {$R *.dfm}
 
@@ -240,19 +240,19 @@ end;
 procedure TBillsCompileFrame.zgBillsCompileCellGetColor(Sender: TObject;
   ACoord: TPoint; var AColor: TColor);
 var
-  stnNode: TsdIDTreeNode;
+  stnNode: TBillsIDTreeNode;
   iCreatePhaseID: Integer;
 begin
   if ACoord.Y > stdBillsCompile.IDTree.Count + 2 then Exit;
-  stnNode := stdBillsCompile.IDTree.Items[ACoord.Y - 3];
+  stnNode := TBillsIDTreeNode(stdBillsCompile.IDTree.Items[ACoord.Y - 3]);
   if not Assigned(stnNode) then Exit;
-  iCreatePhaseID := stnNode.Rec.ValueByName('CreatePhaseID').AsInteger;
+  iCreatePhaseID := stnNode.Rec.CreatePhaseID.AsInteger;
   if stnNode.ParentID = 1 then
     AColor := $00FBCAC4
-  else if (stnNode.Rec.ValueByName('B_Code').AsString = '') and (stnNode.Level > 0) then
+  else if (stnNode.Rec.B_Code.AsString = '') and (stnNode.Level > 0) then
     AColor := $00F9E8DF;
   // 书签
-  if stnNode.Rec.ValueByName('HasBookmark').AsBoolean then
+  if stnNode.Rec.HasBookMark.AsBoolean then
     AColor := $00CFE2F9;
   // 根据节点创建期数底色不同
   if iCreatePhaseID > 0 then
@@ -260,7 +260,7 @@ begin
     // 当前期不存在节点,底色为灰色提示用户
     if iCreatePhaseID > TProjectData(FBillsCompileData.ProjectData).PhaseIndex then
       AColor := $00D5D5D5
-    // 当前期新增节点,底色为黄色提示用户  
+    // 当前期新增节点,底色为黄色提示用户
     else if iCreatePhaseID = TProjectData(FBillsCompileData.ProjectData).PhaseIndex then
       AColor := $00A7FDFD;
   end;
@@ -473,19 +473,19 @@ end;
 
 procedure TBillsCompileFrame.actnSetBillsBookmarkExecute(Sender: TObject);
 var
-  Rec: TsdDataRecord;
+  Rec: TBillsRecord;
 begin
-  Rec := stdBillsCompile.IDTree.Selected.Rec;
-  if Rec.ValueByName('HasBookmark').AsBoolean then
+  Rec := TBillsRecord(stdBillsCompile.IDTree.Selected.Rec);
+  if Rec.HasBookMark.AsBoolean then
   begin
-    Rec.ValueByName('HasBookmark').AsBoolean := False;
-    Rec.ValueByName('MarkMemo').AsString := '';
+    Rec.HasBookMark.AsBoolean := False;
+    Rec.MarkMemo.AsString := '';
   end
   else
-    Rec.ValueByName('HasBookmark').AsBoolean := True;
+    Rec.HasBookMark.AsBoolean := True;
   TProjectData(FBillsCompileData.ProjectData).BillsBookmarkData.RefreshBillsBookmark;
   if Assigned(FOnAfterSetBookmark) then
-    FOnAfterSetBookmark(Rec.ValueByName('HasBookmark').AsBoolean);
+    FOnAfterSetBookmark(Rec.HasBookMark.AsBoolean);
   zgBillsCompile.InvalidateRow(zgBillsCompile.CurRow);
 end;
 

+ 7 - 7
Frames/BillsMeasureFme.pas

@@ -189,7 +189,7 @@ procedure TBillsMeasureFrame.zgBillsMeasureCellGetColor(Sender: TObject; ACoord:
 var
   stnNode: TBillsIDTreeNode;
   iCreatePhaseID: Integer;
-  StageRec: TsdDataRecord;
+  StageRec: TStageRecord;
   fDiffer: Double;
 begin
   AColor := clWindow;
@@ -206,7 +206,7 @@ begin
   if TProjectData(FBillsMeasureData.ProjectData).ProjProperties.PhaseCount > 0 then
   begin
     StageRec := TBillsIDTreeNode(stnNode).StageRec;
-    if Assigned(StageRec) and StageRec.ValueByName('HasBookmark').AsBoolean then
+    if Assigned(StageRec) and StageRec.HasBookMark.AsBoolean then
       AColor := $00CFE2F9;
   end;
   // 根据节点创建期数底色不同
@@ -441,16 +441,16 @@ begin
     vNode.StageRec := StageRec;
   end;
 
-  if StageRec.ValueByName('HasBookmark').AsBoolean then
+  if StageRec.HasBookMark.AsBoolean then
   begin
-    StageRec.ValueByName('HasBookmark').AsBoolean := False;
-    StageRec.ValueByName('MarkMemo').AsString := '';
+    StageRec.HasBookMark.AsBoolean := False;
+    StageRec.MarkMemo.AsString := '';
   end
   else
-    StageRec.ValueByName('HasBookmark').AsBoolean := True;
+    StageRec.HasBookMark.AsBoolean := True;
   TProjectData(FBillsMeasureData.ProjectData).BillsBookmarkData.RefreshStageBookmark;
   if Assigned(FOnAfterSetBookmark) then
-    FOnAfterSetBookmark(StageRec.ValueByName('HasBookmark').AsBoolean);
+    FOnAfterSetBookmark(StageRec.HasBookMark.AsBoolean);
   zgBillsMeasure.InvalidateRow(zgBillsMeasure.CurRow);
 end;
 

+ 6 - 3
Frames/ProjectManagerFme.pas

@@ -426,14 +426,17 @@ begin
         vNode.Rec.ValueByName('WebUserID').AsInteger := PHPWeb.UserID;
         vNode.Rec.EndUpdate;
       end;
-      vNode.LocateInControl;
       Result := True;
     except
       Result := False;
     end;
   finally
-    if Recevier.MessageID = 1 then
-      ErrorMessage('当前标段处于打开状态,未能成功接收,请先关闭标段再次接收。');
+    case Recevier.MessageID of
+      0: vNode.LocateInControl;
+      1: ErrorMessage('当前标段处于打开状态,未能成功接收,请先关闭标段再次接收。');
+      2: ErrorMessage('下载数据与审核状态不一致,未能成功接收,请再次接收。');
+      3: ErrorMessage('升级数据失败,未能成功接收,请再次接收。');
+    end;
     Recevier.Free;
     FProjectManagerData.Save;
   end;

+ 41 - 41
Units/ExcelImport.pas

@@ -4,7 +4,7 @@ interface
 
 uses
   Classes, SMXLS, SMCells, ProjectData, MCacheTree, ZhAPI, sdDB,
-  Forms, Controls, ProgressHintFrm;
+  Forms, Controls, ProgressHintFrm, mDataRecord;
 
 type
   TExcelImport = class
@@ -309,16 +309,16 @@ end;
 procedure TBillsExcelImport.WriteNode(ADataSet: TsdDataSet;
   ANode: TBillsCacheNode);
 var
-  Rec: TsdDataRecord;
-begin
-  Rec := ADataSet.Add;
-  Rec.ValueByName('ID').AsInteger := ANode.ID;
-  Rec.ValueByName('ParentID').AsInteger := ANode.ParentID;
-  Rec.ValueByName('NextSiblingID').AsInteger := ANode.NextSiblingID;
-  Rec.ValueByName('Code').AsString := ANode.Code;
-  Rec.ValueByName('B_Code').AsString := ANode.B_Code;
-  Rec.ValueByName('Name').AsString := ANode.Name;
-  Rec.ValueByName('Units').AsString := ANode.Units;
+  Rec: TBillsRecord;
+begin
+  Rec := TBillsRecord(ADataSet.Add);
+  Rec.ID.AsInteger := ANode.ID;
+  Rec.ParentID.AsInteger := ANode.ParentID;
+  Rec.NextSiblingID.AsInteger := ANode.NextSiblingID;
+  Rec.Code.AsString := ANode.Code;
+  Rec.B_Code.AsString := ANode.B_Code;
+  Rec.Name.AsString := ANode.Name;
+  Rec.Units.AsString := ANode.Units;
   //Rec.ValueByName('LockedLevel').AsBoolean := ANode.CanDelete;
 end;
 
@@ -556,7 +556,7 @@ end;
 procedure TBillsEdtExcelImport.WriteNode(ADataSet: TsdDataSet;
   ANode: TBillsCacheNode);
 var
-  Rec: TsdDataRecord;
+  Rec: TBillsRecord;
 begin
   if ANode.Code <> '' then
     UpdateProgressHint('写入读取的Excel数据 ' + ANode.Code)
@@ -565,20 +565,20 @@ begin
   else
     UpdateProgressHint('写入读取的Excel数据 ' + ANode.Name);
 
-  Rec := ADataSet.Add;
-  Rec.ValueByName('ID').AsInteger := ANode.ID;
-  Rec.ValueByName('ParentID').AsInteger := ANode.ParentID;
-  Rec.ValueByName('NextSiblingID').AsInteger := ANode.NextSiblingID;
-  Rec.ValueByName('Code').AsString := ANode.Code;
-  Rec.ValueByName('B_Code').AsString := ANode.B_Code;
-  Rec.ValueByName('Name').AsString := ANode.Name;
-  Rec.ValueByName('Units').AsString := ANode.Units;
-  Rec.ValueByName('Price').AsFloat := PriceRoundTo(ANode.Price);
-  Rec.ValueByName('OrgQuantity').AsFloat := QuantityRoundTo(ANode.Quantity);
-  Rec.ValueByName('DgnQuantity1').AsFloat := QuantityRoundTo(ANode.DgnQuantity1);
-  Rec.ValueByName('DgnQuantity2').AsFloat := QuantityRoundTo(ANode.DgnQuantity2);
-  Rec.ValueByName('DrawingCode').AsString := ANode.DrawingCode;
-  Rec.ValueByName('MemoStr').AsString := ANode.MemoStr;
+  Rec := TBillsRecord(ADataSet.Add);
+  Rec.ID.AsInteger := ANode.ID;
+  Rec.ParentID.AsInteger := ANode.ParentID;
+  Rec.NextSiblingID.AsInteger := ANode.NextSiblingID;
+  Rec.Code.AsString := ANode.Code;
+  Rec.B_Code.AsString := ANode.B_Code;
+  Rec.Name.AsString := ANode.Name;
+  Rec.Units.AsString := ANode.Units;
+  Rec.Price.AsFloat := PriceRoundTo(ANode.Price);
+  Rec.OrgQuantity.AsFloat := QuantityRoundTo(ANode.Quantity);
+  Rec.DgnQuantity1.AsFloat := QuantityRoundTo(ANode.DgnQuantity1);
+  Rec.DgnQuantity2.AsFloat := QuantityRoundTo(ANode.DgnQuantity2);
+  Rec.DrawingCode.AsString := ANode.DrawingCode;
+  Rec.MemoStr.AsString := ANode.MemoStr;
 end;
 
 procedure TBillsEdtExcelImport.WriteNodes(ADataSet: TsdDataSet);
@@ -690,15 +690,15 @@ procedure TBillsPriceExcelImport.UpdateBillsPrice(const AB_Code: string;
   APrice: Double);
 var
   iIndex: Integer;
-  Rec: TsdDataRecord;
+  Rec: TBillsRecord;
 begin
   with FProjectData.BillsData do
   begin
     for iIndex := 0 to sddBills.RecordCount - 1 do
     begin
-      Rec := sddBills.Records[iIndex];
-      if SameText(AB_Code, Rec.ValueByName('B_Code').AsString) then
-        Rec.ValueByName('Price').AsFloat := PriceRoundTo(APrice);
+      Rec := TBillsRecord(sddBills.Records[iIndex]);
+      if SameText(AB_Code, Rec.B_Code.AsString) then
+        Rec.Price.AsFloat := PriceRoundTo(APrice);
     end;
   end;
 end;
@@ -910,25 +910,25 @@ end;
 procedure TGclBillsExcelImport.WriteNode(ADataSet: TsdDataSet;
   ANode: TGclCacheNode);
 var
-  Rec: TsdDataRecord;
+  Rec: TBillsRecord;
 begin
   if ANode.B_Code <> '' then
     UpdateProgressHint('写入读取的Excel数据 ' + ANode.B_Code)
   else
     UpdateProgressHint('写入读取的Excel数据 ' + ANode.Name);
 
-  Rec := ADataSet.Add;
-  Rec.ValueByName('ID').AsInteger := ANode.ID;
+  Rec := TBillsRecord(ADataSet.Add);
+  Rec.ID.AsInteger := ANode.ID;
   if ANode.ParentID = -1 then
-    Rec.ValueByName('ParentID').AsInteger := ParentID
+    Rec.ParentID.AsInteger := ParentID
   else
-    Rec.ValueByName('ParentID').AsInteger := ANode.ParentID;
-  Rec.ValueByName('NextSiblingID').AsInteger := ANode.NextSiblingID;
-  Rec.ValueByName('B_Code').AsString := ANode.B_Code;
-  Rec.ValueByName('Name').AsString := ANode.Name;
-  Rec.ValueByName('Units').AsString := ANode.Units;
-  Rec.ValueByName('Price').AsFloat := PriceRoundTo(ANode.Price);
-  Rec.ValueByName('OrgQuantity').AsFloat := QuantityRoundTo(ANode.Quantity);
+    Rec.ParentID.AsInteger := ANode.ParentID;
+  Rec.NextSiblingID.AsInteger := ANode.NextSiblingID;
+  Rec.B_Code.AsString := ANode.B_Code;
+  Rec.Name.AsString := ANode.Name;
+  Rec.Units.AsString := ANode.Units;
+  Rec.Price.AsFloat := PriceRoundTo(ANode.Price);
+  Rec.OrgQuantity.AsFloat := QuantityRoundTo(ANode.Quantity);
 end;
 
 end.

+ 126 - 64
Units/ProjectCommands.pas

@@ -80,11 +80,22 @@ type
   private
     FTempFolder: string;
     FFileType: string;
+    FXmlDocument: IXMLDocument;
+    // 导入后的节点
     FCurNode: TsdIDTreeNode;
     FProjectName: string;
     FFileName: string;
     FSelect: TsdIDTreeNode;
     FProjectData: TProjectData;
+    // 初次在线审批人,自上次Exe上报/审批
+    FStartAudit: Integer;
+    // 末次在线审批人,自上次Exe上报/审批
+    FEndAudit: Integer;
+    // 文件中的审核状态
+    FOrgAuditStatus: Integer;
+    // 应升级至的审核状态
+    FNewAuditStatus: Integer;
+
     FStageCount: Integer;
     FReply: Boolean;
     FLostStageCount: Integer;
@@ -92,26 +103,37 @@ type
     FNeedUpdate: Boolean;
     FLock: Boolean;
     FMessageID: Integer;
+    FIsReback: Boolean;
 
     function CheckOpen: Boolean;
     function GetNewTender: TsdIDTreeNode;
     procedure GetCurNode;
     procedure LoadProjectInfo(AXmlNode: IXMLNode);
     procedure LoadTenderProperty(AXmlNode: IXMLNode);
-    procedure LoadInfoFromXmlDocument(AXmlNode: IXMLNode);
-    procedure LoadXmlInfo;
-    procedure UpdateData(const AFileName: string);
+    procedure LoadInfoFromXmlDocument;
+    function CheckUpdateStatusValid: Boolean;
+    procedure ReadXmlInfo;
+    function UpdateData(const AFileName: string): Boolean;
   public
     constructor Create(ASelect: TsdIDTreeNode);
     destructor Destroy; override;
 
     function Receive(const AFileName: string): TsdIDTreeNode;
-    procedure ReceiveForLost(const AFileName: string; AStageCount: Integer; AReply: Boolean);
+    // 在线审批使用
+    // 原报、1审(Online)、2审(Online)、3审(Online)、4审、5审(Online)、6审、7审
+    // 则4审在Exe端打开项目时,AStartAudit=1,AEndAudit=3
+    //   6审在Exe端打开项目时,AStartAudit=AEndAudit=5
+    //   7审在Exe端打开项目时,AStartAudit=AEndAudit=0
+    function ReceiveForLost(const AFileName: string; AStartAudit, AEndAudit: Integer; AReply: Boolean = False): TsdIDTreeNode;
     // 供网络版使用
     // 原报已提交,1审已审核并提交后,此时除了2审人以外的参与人接收数据时不可生成二审数据
     property Lock: Boolean read FLock write FLock;
+    // 被打回的数据
+    property IsReback: Boolean read FIsReback write FIsReback;
     // 信息: 0[接收成功]
     //       1[接收失败,应接收节点打开状态]
+    //       2[接收失败,下载文件跟网页状态不一致]
+    //       3[接收失败,升级文件失败]
     property MessageID: Integer read FMessageID;
   end;
 
@@ -279,7 +301,7 @@ function TSubmitProject.Execute: Boolean;
 begin
   FFileType := '.rmf';
   FNeedUpdate := True;
-  FProjectData.LockedDataForSubmit;
+  //FProjectData.LockedDataForSubmit;
   Result := inherited Execute;
 end;
 
@@ -475,6 +497,62 @@ end;
 
 { TReceiveProject }
 
+function TReceiveProject.CheckUpdateStatusValid: Boolean;
+
+  procedure GetCurAuditStatus;
+  begin
+    {if FStageCount > 0 then
+      FLostStageCount := FStageCount - (AXmlNode.Attributes['AuditStatus'] + 1) - 1;
+
+    if FNeedUpdate then
+    begin
+      if FReply then
+        Result := -1
+      else if FStageCount > 0 then
+        Result := FStageCount - 1
+      else
+        Result := AXmlNode.Attributes['AuditStatus'] + 1
+    end
+    else
+      Result := AXmlNode.Attributes['AuditStatus'];}
+  end;
+var
+  ChildNodes: IXMLNodeList;
+  vProjInfo, vXmlElement: IXMLNode;
+begin
+  Result := True;
+  vXmlElement := FXmlDocument.DocumentElement;
+  ChildNodes := vXmlElement.ChildNodes;
+  vProjInfo := ChildNodes.FindNode('ProjectInfo');
+                                                  
+  FFileName := vProjInfo.Attributes['FileName'];
+  FNeedUpdate := vProjInfo.Attributes['NeedUpdate'];
+  FOrgAuditStatus := vProjInfo.Attributes['AuditStatus'];
+  if not FIsReback and FNeedUpdate then
+  begin
+    if FStartAudit <> 0 then
+    begin
+      if (FStartAudit <> FOrgAuditStatus + 1) or (FEndAudit < FStartAudit) then
+        Result := False
+      else
+        FLostStageCount := FEndAudit - FStartAudit + 1 + 1;
+    end
+    else
+      FLostStageCount := 1;
+
+    // 锁定的情况下
+    if FLock then
+      FLostStageCount := FLostStageCount - 1;
+
+    if FReply then
+      FNewAuditStatus := -1
+    else
+      FNewAuditStatus := FOrgAuditStatus + FLostStageCount;
+  end
+  else
+    FNewAuditStatus := FOrgAuditStatus;
+end;
+
 function TReceiveProject.CheckOpen: Boolean;
 begin
   Result := OpenProjectManager.ProjectIndex(FCurNode.ID) <> -1;
@@ -486,14 +564,17 @@ constructor TReceiveProject.Create(ASelect: TsdIDTreeNode);
 begin
   FSelect := ASelect;
   FTempFolder := GenerateTempFolder(GetTempFilePath);
-  FStageCount := -1;
   FReply := False;
   FLock := False;
   FMessageID := 0;
+  FIsReback := False;
+
+  FXmlDocument := TXMLDocument.Create(nil) as IXMLDocument;
 end;
 
 destructor TReceiveProject.Destroy;
 begin
+  FXmlDocument := nil;
   DeleteFileOrFolder(FTempFolder);
   inherited;
 end;
@@ -524,15 +605,16 @@ begin
   Result.Rec.ValueByName('FileName').AsString := ExtractSimpleFileName(GetNewGUIDFileName(GetMyProjectsFilePath));
 end;
 
-procedure TReceiveProject.LoadInfoFromXmlDocument(AXmlNode: IXMLNode);
+procedure TReceiveProject.LoadInfoFromXmlDocument;
 var
   ChildNodes: IXMLNodeList;
-  vProjInfo: IXMLNode;
+  vProjInfo, vXmlElement: IXMLNode;
 begin
-  ChildNodes := AXmlNode.ChildNodes;
+  vXmlElement := FXmlDocument.DocumentElement;
+  ChildNodes := vXmlElement.ChildNodes;
   vProjInfo := ChildNodes.FindNode('ProjectInfo');
   FProjectName := vProjInfo.Attributes['ProjectName'];
-  FFileName := vProjInfo.Attributes['FileName'];
+  
   GetCurNode;
   // 备份旧文件
   // 备份须放在这里的原因是,需要打开xml文件后,才能确认是否要备份文件以及应备份哪个文件
@@ -543,28 +625,7 @@ begin
 end;
 
 procedure TReceiveProject.LoadProjectInfo(AXmlNode: IXMLNode);
-
-  function GetCurAuditStatus: Integer;
-  begin
-    if FStageCount > 0 then
-      FLostStageCount := FStageCount - (AXmlNode.Attributes['AuditStatus'] + 1) - 1;
-    if FNeedUpdate then
-    begin
-      if FReply then
-        Result := -1
-      else if FStageCount > 0 then
-        Result := FStageCount - 1
-      else
-        Result := AXmlNode.Attributes['AuditStatus'] + 1
-    end
-    else
-      Result := AXmlNode.Attributes['AuditStatus'];
-  end;
-
 begin
-  if not FLock then
-    FNeedUpdate := AXmlNode.Attributes['NeedUpdate'];
-
   FCurNode.Rec.ValueByName('DealTotalPrice').AsFloat := AXmlNode.Attributes['DealTotalPrice'];
   FCurNode.Rec.ValueByName('PhaseTotalPrice').AsFloat := AXmlNode.Attributes['PhaseTotalPrice'];
   FCurNode.Rec.ValueByName('EndDealTotalPrice').AsFloat := AXmlNode.Attributes['EndDealTotalPrice'];
@@ -575,7 +636,7 @@ begin
   if AXmlNode.HasAttribute('Deal_BGLTotalPrice') then
     FCurNode.Rec.ValueByName('Deal_BGLTotalPrice').AsFloat := AXmlNode.Attributes['Deal_BGLTotalPrice'];
   FCurNode.Rec.ValueByName('PhaseCount').AsInteger := AXmlNode.Attributes['PhaseCount'];
-  FCurNode.Rec.ValueByName('AuditStatus').AsInteger := GetCurAuditStatus;
+  FCurNode.Rec.ValueByName('AuditStatus').AsInteger := FNewAuditStatus;
   FCurNode.Rec.ValueByName('CreateDate').AsString := FormatDateTime('yyyy-mm-dd', Date);
 
   if G_IsCloud then
@@ -591,65 +652,66 @@ begin
   // ToDo
 end;
 
-procedure TReceiveProject.LoadXmlInfo;
-var
-  FXmlDocument: IXMLDocument;
-  XmlNode: IXMLNode;
-  FRootList: IXMLNodeList;
+procedure TReceiveProject.ReadXmlInfo;
 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;
+  FXmlDocument.LoadFromFile(FTempFolder + '\Info.xml');
+  FXmlDocument.Options := [doNodeAutoCreate,doNodeAutoIndent,doAutoPrefix,doNamespaceDecl];
 end;
 
 function TReceiveProject.Receive(const AFileName: string): TsdIDTreeNode;
 begin
+  Result := nil;
   FFileType := ExtractFileExt(AFileName);
   UnZipFile(AFileName, FTempFolder);
-  LoadXmlInfo;
-  CopyFileOrFolder(FTempFolder + '\' + FFileName,
-    GetMyProjectsFilePath + FCurNode.Rec.ValueByName('FileName').AsString);
-  UpdateData(GetMyProjectsFilePath + FCurNode.Rec.ValueByName('FileName').AsString);
-  Result := FCurNode;
+  ReadXmlInfo;
+  if CheckUpdateStatusValid then
+  begin
+    if UpdateData(FTempFolder + '\' + FFileName) then
+    begin
+      LoadInfoFromXmlDocument;
+      CopyFileOrFolder(FTempFolder + '\' + FFileName,
+        GetMyProjectsFilePath + FCurNode.Rec.ValueByName('FileName').AsString);
+      Result := FCurNode;
+    end
+    else
+      FMessageID := 3;
+  end
+  else
+    FMessageID := 2;
 end;
 
-procedure TReceiveProject.ReceiveForLost(const AFileName: string;
-  AStageCount: Integer; AReply: Boolean);
+function TReceiveProject.ReceiveForLost(const AFileName: string;
+  AStartAudit, AEndAudit: Integer; AReply: Boolean = False): TsdIDTreeNode;
 begin
-  FStageCount := AStageCount;
+  FStartAudit := AStartAudit;
+  FEndAudit := AEndAudit;
   FReply := AReply;
-  Receive(AFileName);
+  Result := Receive(AFileName);
 end;
 
-procedure TReceiveProject.UpdateData(const AFileName: string);
+function TReceiveProject.UpdateData(const AFileName: string): Boolean;
 var
   I: Integer;
 begin
-  if FNeedUpdate then
+  if not IsReback and FNeedUpdate then
   begin
+    Result := False;
     FProjectData := TProjectData.Create;
     try
       FProjectData.OpenForReceive(AFileName);
-      FProjectData.UpdateDataForReceive;
-      for I := 1 to FLostStageCount do
-      begin
-        FProjectData.LockedDataForSubmit;
+      FProjectData.LockedDataForSubmit;
+      for I := 0 to FLostStageCount - 1 do
         FProjectData.UpdateDataForReceive;
-      end;
       if FReply then
         FProjectData.LockedDataForReply;
       FProjectData.SaveForReceive(AFileName);
+      Result := True;
     finally
       FProjectData.Free;
     end;
-  end;
+  end
+  else
+    Result := True;
 end;
 
 { TTenderExport }

+ 10 - 3
Units/mDataRecord.pas

@@ -11,6 +11,7 @@ type
     procedure SetFloatValue(AValue: TsdValue; AFloat: Double);
     procedure SetIntValue(AValue: TsdValue; AInt: Integer);
     procedure SetBoolValue(AValue: TsdValue; ABool: Boolean);
+    procedure SetStrValue(AValue: TsdValue; AStr: string);
 
     procedure AddDifferValue(AValue: TsdValue; ADiffer: Double);
   end;
@@ -24,7 +25,7 @@ type
     // ±¨±íרÓÃ
     FSerialNo: TsdValue;
     FIsLeaf: TsdValue;
-    FLeafXmjID: TsdValue;
+    FLeafXmjParentID: TsdValue;
     FXiangCode: TsdValue;
     FMuCode: TsdValue;
     FJieCode: TsdValue;
@@ -112,7 +113,7 @@ type
 
     property SerialNo: TsdValue read FSerialNo;
     property IsLeaf: TsdValue read FIsLeaf;
-    property LeafXmjID: TsdValue read FLeafXmjID;
+    property LeafXmjParentID: TsdValue read FLeafXmjParentID;
     property XiangCode: TsdValue read FXiangCode;
     property MuCode: TsdValue read FMuCode;
     property JieCode: TsdValue read FJieCode;
@@ -406,7 +407,7 @@ begin
 
   FSerialNo := ValueByName('SerialNo');
   FIsLeaf := ValueByName('IsLeaf');
-  FLeafXmjID := ValueByName('LeafXmjID');
+  FLeafXmjParentID := ValueByName('LeafXmjParentID');
   FXiangCode := ValueByName('XiangCode');
   FMuCode := ValueByName('MuCode');
   FJieCode := ValueByName('JieCode');
@@ -617,4 +618,10 @@ begin
     AValue.AsInteger := AInt;
 end;
 
+procedure TMeasureBaseRecord.SetStrValue(AValue: TsdValue; AStr: string);
+begin
+  if AValue.AsString <> AStr then
+    AValue.AsString := AStr;
+end;
+
 end.