2 Коміти c9c9a9951d ... 2429b424eb

Автор SHA1 Опис Дата
  JimiZhang 2429b424eb Merge branch '10.1.0' of http://112.74.42.187:26903/smartcost/smartcost into 10.1.0 1 місяць тому
  JimiZhang bb5c06b8b5 优化暂估费汇总速度 1 місяць тому

+ 2 - 2
DPRs/ZY/SmartCost.dof

@@ -115,7 +115,7 @@ AutoIncBuild=1
 MajorVer=10
 MinorVer=3
 Release=0
-Build=1339
+Build=1340
 Debug=0
 PreRelease=0
 Special=0
@@ -126,7 +126,7 @@ CodePage=936
 [Version Info Keys]
 CompanyName=珠海纵横创新软件有限公司
 FileDescription=SmartCost 2025专业版
-FileVersion=10.3.0.1339
+FileVersion=10.3.0.1340
 InternalName=SmartCost
 LegalCopyright=版权所有(C) 珠海纵横创新软件有限公司 2003-2024。保留所有权利。
 LegalTrademarks=SmartCost

BIN
DPRs/ZY/SmartCost.res


+ 29 - 1
MainModule/Model/ScBills.pas

@@ -5862,6 +5862,7 @@ var cSum: Currency;
   vGLJRec: TScGLJRecord;
   gljQ, gljFee: Double;
   vProjGLJ: TProjectGLJ;
+  ProjectGLJRec: TScProjectGLJRecord;
 begin
   cSum := 0;
   RQDigit := TScProject(Project).DigitManager.RationQuantityDigit;
@@ -5871,6 +5872,7 @@ begin
   vRationList := TList.Create;
   vGLJList := TList.Create;
   try
+    // 清单
     for i := 0 to BillsTree.Count - 1 do
     begin
       vItem := BillsTree.Items[i];
@@ -5883,7 +5885,7 @@ begin
       begin
         cSum := cSum + vItem.TotalPrice[AIsTender];
       end
-      else
+      (*else
       // 叶子清单没打勾的,要深入到下一层
       begin
         // 定额
@@ -5914,6 +5916,32 @@ begin
             end;
           end;
         end;
+      end;   *)
+    end;
+    // 数量单价
+    for I := 0 to Rations.sdsRations.RecordCount - 1 do
+    begin
+      vRRec := TScRationRecord(Rations.sdsRations[I]);
+      // 如果是工料机当定额用,如果这个工料机是暂估材料,则加上其金额
+      if vRRec.GLJID.Value <> null then
+      begin
+        if vProjGLJ.IsEvaluateGLJ(vRRec.GLJID.AsInteger) then
+          cSum := cSum + vRRec.BuildingFee.AsCurrency;
+      end
+    end;
+    // 工料机
+    for I := 0 to TScProject(Project).GLJ.sdsGLJ.RecordCount - 1 do
+    begin
+      vGLJRec := TScGLJRecord(TScProject(Project).GLJ.sdsGLJ[I]);
+      if not (vGLJRec.Types.AsInteger in [GLJ_Material, GLJ_Device]) then Continue;
+      ProjectGLJRec := TScProjectGLJRecord(vGLJRec.Data);
+      if ProjectGLJRec = nil then
+        ProjectGLJRec := vProjGLJ.LocateGLJ(vGLJRec.GLJID.AsInteger);
+      if (ProjectGLJRec <> nil) and (ProjectGLJRec.IsEvaluate.AsBoolean) then
+      begin
+        gljQ := ScRoundTo(vGLJRec.Quantity.AsFloat * vGLJRec.RationItemQuantity.AsFloat, RQDigit);
+        gljFee :=  ScRoundTo(vGLJRec.BudgetPrice.AsFloat * gljQ, RFeeDigit);
+        cSum := cSum + gljFee;
       end;
     end;
   finally

+ 1 - 0
MainModule/Model/ScGLJ.dfm

@@ -15,6 +15,7 @@ object ScGLJData: TScGLJData
     Active = False
     Filtered = False
     Provider = sapGLJ
+    UseSavePoint = False
     AfterRecordChanged = sdsGLJAfterRecordChanged
     OnGetRecordClass = sdsGLJGetRecordClass
     Left = 152

+ 32 - 0
MainModule/Model/ScGLJ.pas

@@ -141,6 +141,7 @@ type
     procedure ReadDigit;
     function GetGLJ(Index: Integer): TScGLJRecord;
     function GetGLJCount: Integer;
+    procedure MapAllGLJ;
   public
     // ɾ³ý¼Ç¼
     procedure DeleteByBillsItemID(ID: Integer);
@@ -320,6 +321,8 @@ end;
 procedure TScGLJData.SetActive(const Value: Boolean);
 begin
   sdsGLJ.Active := Value;
+  if Value then
+    MapAllGLJ;
 end;
 
 function TScGLJData.GetFee(ARationID: Integer; AKind: TScFeeKind): Double;
@@ -1412,4 +1415,33 @@ begin
   end;
 end;
 
+procedure TScGLJData.MapAllGLJ;
+var
+  I, J: Integer;
+  GLJMap: TsdDataSetMasterDetailMap;
+  MasterItem: TsdMasterItem;
+  GLJRec, ProjectGLJRec: TsdDataRecord;
+begin
+  GLJMap := TsdDataSetMasterDetailMap.Create;
+  try
+    GLJMap.MasterDataSet := TScProject(FProject).ProjectGLJ.sdsProjectGLJ;
+    GLJMap.DetailDataSet := sdsGLJ;
+    GLJMap.MasterField := SID;
+    GLJMap.DetailField := SGLJID;
+    GLJMap.CreateMap;
+    for I := 0 to GLJMap.Count - 1 do
+    begin
+      MasterItem := GLJMap[I];
+      ProjectGLJRec := MasterItem.Rec;
+      for J := 0 to MasterItem.Count - 1 do
+      begin
+        GLJRec := MasterItem[J];
+        GLJRec.Data := ProjectGLJRec;
+      end;
+    end;
+  finally
+    GLJMap.Free;
+  end;
+end;
+
 end.

+ 2 - 0
MainModule/Model/ScPersistentData.pas

@@ -1629,6 +1629,8 @@ begin
           begin
             sdGLJ.RationPrice.AsCurrency := ProjectGLJRec.BasePrice.AsCurrency;
             sdGLJ.BudgetPrice.AsCurrency := ProjectGLJRec.BudgetPrice.AsCurrency;
+            // 2026-07-06 zhangyin »º´æGLJ¶ÔÓ¦ProjectGLJ¼Ç¼
+            sdGLJ.Data := ProjectGLJRec;
           end
           else
           begin

+ 2 - 0
MainModule/Model/ScProjectGLJ.pas

@@ -3282,6 +3282,8 @@ begin
                 if GLJRec.RGLJID.AsInteger = GLJRec.RGLJID.AsInteger then
                   GLJRec.RGLJID.AsInteger := ProjectGLJRec.ID.AsInteger;
                 GLJRec.GLJID.AsInteger := ProjectGLJRec.ID.AsInteger;
+                // 2026-07-06 zhangyin 缓存GLJ对应ProjectGLJ记录
+                GLJRec.Data := ProjectGLJRec;
                 // 2020-03-26 zhangyin 单价可能也有误,这里要纠正
                 GLJRec.BudgetPrice.AsCurrency := ProjectGLJRec.BudgetPrice.AsCurrency;
               end;

+ 20 - 0
MainModule/Model/ScRAdjusts.pas

@@ -2100,6 +2100,8 @@ begin
       GLJRec.Name.AsString := ProjectGLJRec.Name.AsString;
       GLJRec.Specs.AsString := ProjectGLJRec.Specs.AsString;
       GLJRec.Units.AsString := ProjectGLJRec.Units.AsString;
+      // 2026-07-06 zhangyin 缓存GLJ对应ProjectGLJ记录
+      GLJRec.Data := ProjectGLJRec;
     end;
     // 2004/5/25 修改Bug: 在定额调整新增工料机时,没有给RationItemQuantity字段赋值,导致汇总改工料机的消耗量时为0
     GLJRec.RationItemQuantity.AsFloat := ScRoundTo(RationRec.Quantity.AsFloat, -iGLJQuantityDigit) ;
@@ -2555,6 +2557,8 @@ begin
             ProjectGLJRec := TScProject(FProject).ProjectGLJ.LocateGLJ(iNewID);
             strCode := ProjectGLJRec.Code.AsString;
             GLJRec.GLJID.AsInteger := iNewID;
+            // 2026-07-06 zhangyin 缓存GLJ对应ProjectGLJ记录
+            GLJRec.Data := ProjectGLJRec;
             GLJRec.Code.AsString := ProjectGLJRec.Code.AsString;
             GLJRec.Name.AsString := ProjectGLJRec.Name.AsString;
             GLJRec.Specs.AsString := ProjectGLJRec.Specs.AsString;
@@ -3546,6 +3550,8 @@ begin
       sdGLJ.BeginUpdate;
       try
         sdGLJ.GLJID.AsInteger := iReplaceGLJID;
+        // 2026-07-06 zhangyin 缓存GLJ对应ProjectGLJ记录
+        sdGLJ.Data := sdProjectGLJ;
         sdGLJ.Code.AsString := strReplaceGLJCode;
         sdGLJ.Name.AsString := aRecord.rName;
 
@@ -3709,6 +3715,8 @@ begin
       pgRec.BudgetPrice.AsCurrency := sdGLJ.BudgetPrice.AsCurrency;
       sdGLJ.GLJID.AsInteger := pgRec.ID.AsInteger;
       sdGLJ.Code.AsString := pgRec.Code.AsString;
+      // 2026-07-06 zhangyin 缓存GLJ对应ProjectGLJ记录
+      sdGLJ.Data := pgRec;
     finally
       sdGLJ.EndUpdate;
     end;
@@ -3808,6 +3816,8 @@ begin
     if orgProjectGLJRec.Types.AsInteger = GLJ_Concrete then
       ResiveConcreteMeasure(aRation, orgProjectGLJRec.Code.AsString, sdGLJ.Quantity.AsFloat, 0);
     sdGLJ.GLJID.AsInteger := newProjectGLJRec.ID.AsInteger;
+    // 2026-07-06 zhangyin 缓存GLJ对应ProjectGLJ记录
+    sdGLJ.Data := newProjectGLJRec;
     sdGLJ.Code.AsString := newProjectGLJRec.Code.AsString;
     sdGLJ.Name.AsString := newProjectGLJRec.Name.AsString;
     sdGLJ.Units.AsString := newProjectGLJRec.Units.AsString;
@@ -4176,6 +4186,8 @@ begin
     sdGLJ.RSpecs.AsString := ProjectGLJRec.Specs.AsString;
     sdGLJ.RUnit.AsString := ProjectGLJRec.Units.AsString;
     sdGLJ.GLJID.AsInteger := aRGLJID;
+    // 2026-07-06 zhangyin 缓存GLJ对应ProjectGLJ记录
+    sdGLJ.Data := ProjectGLJRec;
     sdGLJ.Code.AsString := ProjectGLJRec.Code.AsString;
     sdGLJ.Name.AsString := ProjectGLJRec.Name.AsString;
     sdGLJ.Specs.AsString := ProjectGLJRec.Specs.AsString;
@@ -4513,6 +4525,8 @@ begin
                 sdTem.RationID.AsInteger := sdGLJ.RationID.AsInteger;
                 sdTem.RGLJID.AsInteger := ProjectGLJRec.ID.AsInteger;
                 sdTem.GLJID.AsInteger := sdTem.RGLJID.AsInteger;
+                // 2026-07-06 zhangyin 缓存GLJ对应ProjectGLJ记录
+                sdTem.Data := ProjectGLJRec;
                 sdTem.RCode.AsString := ProjectGLJRec.Code.AsString;
                 sdTem.Code.AsString := sdTem.RCode.AsString;   // ?
                 sdTem.RSpecs.AsString := ProjectGLJRec.Specs.AsString;
@@ -4902,6 +4916,8 @@ begin
       end;
     end;
     GLJRec.GLJID.AsInteger := ProjectGLJRec.ID.AsInteger;
+    // 2026-07-06 zhangyin 缓存GLJ对应ProjectGLJ记录
+    GLJRec.Data := ProjectGLJRec;
     GLJRec.Name.AsString := ProjectGLJRec.Name.AsString;
     GLJRec.Specs.AsString := ProjectGLJRec.Specs.AsString;
     GLJRec.Units.AsString := ProjectGLJRec.Units.AsString;
@@ -4918,6 +4934,8 @@ begin
     if ProjectGLJRec <> nil then
     begin
       GLJRec.GLJID.AsInteger := ProjectGLJRec.ID.AsInteger;
+      // 2026-07-06 zhangyin 缓存GLJ对应ProjectGLJ记录
+      GLJRec.Data := ProjectGLJRec;
       GLJRec.Code.AsString := ProjectGLJRec.Code.AsString;
       GLJRec.Name.AsString := ProjectGLJRec.Name.AsString;
       GLJRec.Specs.AsString := ProjectGLJRec.Specs.AsString;
@@ -4934,6 +4952,8 @@ begin
       ProjectGLJRec := Proj.ProjectGLJ.AddNewGLJ(iID, True);
       try
         GLJRec.GLJID.AsInteger := ProjectGLJRec.ID.AsInteger;
+        // 2026-07-06 zhangyin 缓存GLJ对应ProjectGLJ记录
+        GLJRec.Data := ProjectGLJRec;
         GLJRec.Code.AsString := ProjectGLJRec.Code.AsString;
         if GLJRec.Specs.Tag = 1 then
           ProjectGLJRec.Specs.AsString := GLJRec.Specs.AsString

+ 4 - 0
MainModule/Model/ScRations.pas

@@ -4677,6 +4677,8 @@ begin
           if ProjectGLJRec <> nil then
           begin
             Rec.GLJID.AsInteger := ProjectGLJRec.ID.AsInteger;
+            // 2026-07-06 zhangyin 缓存GLJ对应ProjectGLJ记录
+            Rec.Data := ProjectGLJRec;
             Rec.Code.AsString := ProjectGLJRec.Code.AsString;
             Rec.Name.AsString := ProjectGLJRec.Name.AsString;
             Rec.Specs.AsString := ProjectGLJRec.Specs.AsString;
@@ -4690,6 +4692,8 @@ begin
             ProjectGLJRec := TScProject(FProject).ProjectGLJ.AddNewGLJ(Rec.GLJID.AsInteger, True);
             try
               Rec.GLJID.AsInteger := ProjectGLJRec.ID.AsInteger;
+              // 2026-07-06 zhangyin 缓存GLJ对应ProjectGLJ记录
+              Rec.Data := ProjectGLJRec;
               Rec.Code.AsString := ProjectGLJRec.Code.AsString;
               if Rec.Specs.Tag = 1 then
                 ProjectGLJRec.Specs.AsString := Rec.Specs.AsString

+ 2 - 0
MainModule/Model/ScXMLSavers.pas

@@ -4028,6 +4028,8 @@ begin
         scGljRec.BillsItemID.AsInteger := ABillItemID;
         scGljRec.RationID.AsInteger := ARationID;
         scGljRec.GLJID.AsInteger := iGljID;
+        // 2026-07-06 zhangyin »º´æGLJ¶ÔÓ¦ProjectGLJ¼Ç¼
+        scGljRec.Data := PGLJRec;
         scGljRec.BudgetPrice.AsCurrency := PGLJRec.BudgetPrice.AsCurrency;
 
         scGljRec.RGLJID.AsInteger := iRGljID;