Browse Source

Merge remote-tracking branch 'remotes/origin/3.1.6'

Conflicts:
	DataModules/PHPWebDm.pas
	Dprs/CSL/Measure_Cloud.cfg
	Dprs/CSL/Measure_Cloud.dof
	Dprs/CSL/Measure_Cloud.dpr
	Dprs/CSL/Measure_Cloud.res
	Dprs/Pro/Measure.dof
	Dprs/Pro/Measure.dpr
	Dprs/Pro/Measure.res
	Dprs/Pro/Measure_Cloud.dof
	Dprs/Pro/Measure_Cloud.dpr
	Dprs/Pro/Measure_Cloud.res
	Dprs/Pro/Measure_GuangDong.dof
	Dprs/Pro/Measure_GuangDong.dpr
	Dprs/Pro/Measure_GuangDong.res
	Dprs/Pro/Measure_GuangDong_Cloud.dof
	Dprs/Pro/Measure_GuangDong_Cloud.dpr
	Dprs/Pro/Measure_GuangDong_Cloud.res
	Dprs/Pro/Measure_GuangDong_TZ.dof
	Dprs/Pro/Measure_GuangDong_TZ.dpr
	Dprs/Pro/Measure_GuangDong_TZ.res
	Dprs/Pro/Measure_TZ.dof
	Dprs/Pro/Measure_TZ.dpr
	Dprs/Pro/Measure_TZ.res
	Dprs/Trail/Measure.dof
	Dprs/Trail/Measure.dpr
	Dprs/Trail/Measure.res
	Dprs/Trail/Measure_GuangDong.dof
	Dprs/Trail/Measure_GuangDong.dpr
	Dprs/Trail/Measure_GuangDong.res
	Forms/LoginFrm.pas
Chenshilong 8 years ago
parent
commit
f0f899db2e

+ 0 - 17
DataModules/PHPWebDm.dfm

@@ -5,21 +5,4 @@ object PHPWeb: TPHPWeb
   Top = 216
   Height = 226
   Width = 281
-  object IdHTTP: TIdHTTP
-    MaxLineAction = maException
-    ReadTimeout = 0
-    AllowCookies = True
-    ProxyParams.BasicAuthentication = False
-    ProxyParams.ProxyPort = 0
-    Request.ContentLength = -1
-    Request.ContentRangeEnd = 0
-    Request.ContentRangeStart = 0
-    Request.ContentType = 'text/html'
-    Request.Accept = 'text/html, */*'
-    Request.BasicAuthentication = False
-    Request.UserAgent = 'Mozilla/3.0 (compatible; Indy Library)'
-    HTTPOptions = [hoForceEncodeParams]
-    Left = 64
-    Top = 48
-  end
 end

+ 96 - 19
DataModules/PHPWebDm.pas

@@ -20,7 +20,6 @@ type
   TLoginType = (ltCon, ltDisCon, ltLoginFail, ltUpdate, ltIncomplete);
 
   TPHPWeb = class(TDataModule)
-    IdHTTP: TIdHTTP;
     procedure DataModuleCreate(Sender: TObject);
   private
     // 远程服务器上时间
@@ -90,9 +89,12 @@ type
     function ConnectServer(AIP: string; var ACompanyName: string): Integer;  // 新装软件,先弹出设置IP窗口
     function UpDataFile(AUserID, ATenderID, APhaseNo: Integer; AFile, AMD5_JL: string;
       AIsSubmit: Boolean; var AResultStr: string; ACheckPassed: Boolean; ACheckerMemo: string): Boolean;
-    function UpAttachmentFile(AUperID, AWebID, ABillID: Integer; AFile,
-      ACategory, AMemo, APhaseName: string; var ANewFileName: string): Boolean;
-    function GetAttachmentFileList(AWebID: Integer; var vArr: TOVArr): Boolean;
+
+    function UpAttachment(AUperID, AWebID, ABillID, APhase: Integer; AFile, ACategory, AMemo: string; var ANewFileName, AFileID, ADownURL: string): Boolean;
+    function UpAttachmentOnLine(AWebID, ABillID, APhase: Integer; AIDAry: array of  string): Boolean;
+    function DeleteAttachment(AFileID: Integer): Integer;
+    function GetAttachmentList(AWebID: Integer; var vArr: TOVArr): Boolean;
+
     function zip(AFileArr: array of string): string;
     function CheckZip(AZipFile: string; AFileCount: Integer): Boolean;   // 检测zip是否能够正确解压出所有文件。
     function TempName(ALength: Integer = 12): string;
@@ -140,7 +142,7 @@ implementation
 
 uses
   MD5Unit, IdMultipartFormData, VCLUnZip, VCLZip,
-  IniFiles, Forms, UtilMethods, Variants, ConstUnit{, Controls, Windows};
+  IniFiles, Forms, UtilMethods, Variants, ConstUnit, ScUtils;{, Controls, Windows}
 
 var g_PHPWeb: TPHPWeb;
 
@@ -160,6 +162,7 @@ begin
   Result := 'JLZF';
 end;
 
+
 function TPHPWeb.Login(AAccount, APW: string; ALoginType: Integer; var AInfo, ANewExeURL: string): TLoginType;
 var vArr: array of string;
 begin
@@ -296,12 +299,14 @@ var
   sResult, sURL: string;
   J: TCslJson;
   sZipMD5: string;
+  vIdHttp: TIdHTTP;
 begin
   Result := False;
 
   if not FileExists(AFile) then Exit;
 
   IdDataStream := TIdMultiPartFormDataStream.Create;
+  vIdHTTP := TIdHTTP.Create(nil);
   try
     if ACheckPassed then   // 审核通过
     begin
@@ -332,12 +337,13 @@ begin
 
     IdDataStream.Position := 0;
     try
-      sResult := IdHTTP.Post(sURL, IdDataStream);
+      sResult := vIdHTTP.Post(sURL, IdDataStream);
     except
       Abort;
     end;
   finally
     IdDataStream.Free;
+    vIdHttp.Free;
     DeleteFile(AFile);
   end;
 
@@ -410,13 +416,14 @@ var
   vStream: TMemoryStream;
   iFlag: Integer;
   bOK: Boolean;
+  vIdHTTP: TIdHTTP;
 
   procedure SafeDownFile(ASourceURL: string; var ALocalFile: string);
   begin
     Inc(iFlag);
     bOK := False;
     try
-      IdHTTP.Get(ASourceURL, vStream);
+      vIdHTTP.Get(ASourceURL, vStream);
       vStream.SaveToFile(ALocalFile);
       bOK := True;
     except
@@ -435,6 +442,7 @@ begin
     DeleteFile(ALocalFile);
 
   vStream := TMemoryStream.Create;
+  vIdHTTP := TIdHTTP.Create(nil);
   try
     while (not bOK) and (iFlag < 3) do   // 尝试3次
       SafeDownFile(ASourceURL, ALocalFile);
@@ -442,6 +450,7 @@ begin
     Result := bOK;
   finally
     vStream.Free;
+    vIdHTTP.Free;
   end;
 end;
 
@@ -454,22 +463,23 @@ var
   ssResponse: TStringStream;
   bDone: Boolean;
   vJson: TCslJson;
+  vIdHTTP: TIdHTTP;
 begin
   Result := -1;
   postList := TStringList.Create;
   ssResponse := TStringStream.Create('');
+  vIdHTTP := TIdHTTP.Create(nil);
   try
     try
       for i := Low(AInFields) to High(AInFields) do
         postList.Add(Format('%s=%s', [AInFields[i], AInValues[i]]));
-
-      IdHTTP.Post(AURL, postList, ssResponse);
+      vIdHTTP.Post(AURL, postList, ssResponse);
       bDone := True;
     except
       bDone := False;
     end;
 
-    if (bDone) and (Pos('200 OK', IdHTTP.ResponseText) <> 0) then   // 网络已通
+    if (bDone) and (Pos('200 OK', vIdHTTP.ResponseText) <> 0) then   // 网络已通
     begin
       vJson := TCslJson.Create;
       try
@@ -538,6 +548,7 @@ begin
   finally
     postList.Free;
     ssResponse.Free;
+    vIdHTTP.Free;
   end;
 end;
 
@@ -616,13 +627,14 @@ begin
   end;
 end;
 
-function TPHPWeb.UpAttachmentFile(AUperID, AWebID, ABillID: Integer; AFile,
-  ACategory, AMemo, APhaseName: string; var ANewFileName: string): Boolean;
+function TPHPWeb.UpAttachment(AUperID, AWebID, ABillID, APhase: Integer; AFile,
+  ACategory, AMemo: string; var ANewFileName, AFileID, ADownURL: string): Boolean;
 var
   vMPFDS: TIdMultiPartFormDataStream;
   sResult, sURL: string;
   J: TCslJson;
   vArr: array of string;
+  vIdHTTP: TIdHTTP;
 begin
   Result := False;
 
@@ -633,22 +645,32 @@ begin
   end;
 
   vMPFDS := TIdMultiPartFormDataStream.Create;
+  vIdHTTP := TIdHTTP.Create(nil);
   try
     sURL := Format('%stender/attachment/%d/%d/upload', [FMeasureURL, AWebID, AUperID]);
-    vMPFDS.AddFile('upitem', AFile, 'text/plain');
+
+    // 如果文件已被打开,这里会报错。
+    try
+      vMPFDS.AddFile('upitem', AFile, 'text/plain');
+    except
+      MessageHint(0, '当前文件处于打开状态,请关闭文件,重新上传。');
+      Exit;
+    end;
+
     vMPFDS.AddFormField('itemid', IntToStr(ABillID));
-    vMPFDS.AddFormField('Category', ACategory);
-    vMPFDS.AddFormField('Memo', ReplaceCharsForJson(AMemo));
-    vMPFDS.AddFormField('PhaseName', APhaseName);
+    vMPFDS.AddFormField('category', ACategory);
+    vMPFDS.AddFormField('memo', ReplaceCharsForJson(AMemo));
+    vMPFDS.AddFormField('phase', IntToStr(APhase));
 
     vMPFDS.Position := 0;
     try
-      sResult := IdHTTP.Post(sURL, vMPFDS);
+      sResult := vIdHTTP.Post(sURL, vMPFDS);
     except
       Abort;
     end;
   finally
     vMPFDS.Free;
+    vIdHTTP.Free;
   end;
 
   J := TCslJson.Create;
@@ -657,9 +679,11 @@ begin
     if SameText(J.Value['status'], 'true') then
     begin
       Result := True;
-      vArr := VarArrayOf(['onlinefilename']);
+      vArr := VarArrayOf(['onlinefilename', 'imnid', 'fileurl']);
       J.ChildValues('iteminfo', vArr);
       ANewFileName := vArr[0];
+      AFileID := vArr[1];
+      ADownURL := vArr[2];
     end
     else
     begin
@@ -670,7 +694,7 @@ begin
   end;
 end;
 
-function TPHPWeb.GetAttachmentFileList(AWebID: Integer; var vArr: TOVArr): Boolean;
+function TPHPWeb.GetAttachmentList(AWebID: Integer; var vArr: TOVArr): Boolean;
 var sURL: string;
 begin
   sURL := Format('%stender/attachment/%d/list', [FMeasureURL, AWebID]);
@@ -701,6 +725,59 @@ begin
     Result := Copy(AURLProtocol, 9, Length(AURLProtocol) - 8);
 end;
 
+function TPHPWeb.DeleteAttachment(AFileID: Integer): Integer;
+var sURL: string;
+  vArr: array of string;
+begin
+  vArr := VarArrayOf(['msg']);
+  sURL := Format('%stender/attachment/%d/del', [FMeasureURL, AFileID]);
+  Result := Search(sURL, [], [], vArr);
+end;
+
+function TPHPWeb.UpAttachmentOnLine(AWebID, ABillID, APhase: Integer; AIDAry: array of string): Boolean;
+//var
+//  vMPFDS: TIdMultiPartFormDataStream;
+//  sResult, sURL: string;
+//  J: TCslJson;
+//  vArr: array of string;
+begin
+{  Result := False;
+
+  vMPFDS := TIdMultiPartFormDataStream.Create;
+  try
+    sURL := Format('%stender/attachment/%d/%d/upload', [FMeasureURL, AWebID, PHPWeb.UserID]);
+    vMPFDS.AddFormField('itemid', IntToStr(ABillID));
+    vMPFDS.AddFormField('phase', IntToStr(APhase));
+
+    vMPFDS.Position := 0;
+    try
+      sResult := IdHTTP.Post(sURL, vMPFDS);
+    except
+      Abort;
+    end;
+  finally
+    vMPFDS.Free;
+  end;
+
+  J := TCslJson.Create;
+  try
+    J.Text := Utf8ToAnsi(sResult);
+    if SameText(J.Value['status'], 'true') then
+    begin
+      Result := True;
+      vArr := VarArrayOf(['onlinefilename']);
+      J.ChildValues('iteminfo', vArr);
+      ANewFileName := vArr[0];
+    end
+    else
+    begin
+      Result := False;
+    end;
+  finally
+    J.Free;
+  end;  }
+end;
+
 initialization
 
 finalization

+ 29 - 11
DataModules/ReportMemoryDm/rmHaBaiCustomizedDm.pas

@@ -155,7 +155,7 @@ type
     function GetGclChapterCount: Integer;
     function GetGclChapter(AIndex: Integer): TGclChapter;
   public
-    constructor Create(AProjectCount: Integer);
+    constructor Create(AProjectCount: Integer; AIsHaBai: Boolean);
     destructor Destroy;
 
     function AddGclNode(ANode: TMeasureBillsIDTreeNode; AProjectIndex: Integer): TGclNode;
@@ -322,7 +322,7 @@ type
     FDealPayControl: TDealPayControl;
     FDealTotalPrice: Double;
 
-    procedure BeforeGather(AProjectCount: Integer);
+    procedure BeforeGather(AProjectCount: Integer; AIsHaBai: Boolean);
     procedure AfterGather;
 
     procedure OpenProjectData(AProject: TSelectProject);
@@ -364,7 +364,7 @@ var
   iProject: Integer;
 begin
   FhbGatherType := AhbGatherType;
-  BeforeGather(AProjects.Count);
+  BeforeGather(AProjects.Count, AReCalc);
   try
     for iProject := 0 to AProjects.Count - 1 do
       GatherProject(TSelectProject(AProjects.Items[iProject]), iProject);
@@ -384,7 +384,7 @@ begin
   end;
 end;
 
-procedure TrmHaBaiCustomizedData.BeforeGather(AProjectCount: Integer);
+procedure TrmHaBaiCustomizedData.BeforeGather(AProjectCount: Integer; AIsHaBai: Boolean);
 begin
   cdsCustom2.DisableControls;
   cdsCustom2.Active := True;
@@ -410,7 +410,7 @@ begin
   cdsCustomCS_2.Active := True;
   cdsCustomCS_2.EmptyDataSet;
 
-  FGclControl := TGclControl.Create(AProjectCount);
+  FGclControl := TGclControl.Create(AProjectCount, AIsHaBai);
   FDealPayControl := TDealPayControl.Create;
   FDealTotalPrice := 0;
 end;
@@ -503,7 +503,10 @@ var
            SameText(Rec.ValueByName('Name').AsString, '本期应付') or
            SameText(Rec.ValueByName('Name').AsString, '本期实付') then
           Continue;
-        StageRec := FProjectData.PhaseData.PhasePayData.PayRecord(Rec.ValueByName('ID').AsInteger);
+        if FProjectData.PhaseData.Active then
+          StageRec := FProjectData.PhaseData.PhasePayData.PayRecord(Rec.ValueByName('ID').AsInteger)
+        else
+          StageRec := nil;
         DealPay := FDealPayControl.AddPayNode(Rec.ValueByName('Name').AsString, Rec.ValueByName('IsMinus').AsBoolean);
         if Assigned(StageRec) then
         begin
@@ -520,7 +523,10 @@ var
     Rec, StageRec: TsdDataRecord;
   begin
     Rec := FProjectData.DealPaymentData.DealPayRecord('本期完成计量');
-    StageRec := FProjectData.PhaseData.PhasePayData.PayRecord(Rec.ValueByName('ID').AsInteger);
+    if FProjectData.PhaseData.Active then
+      StageRec := FProjectData.PhaseData.PhasePayData.PayRecord(Rec.ValueByName('ID').AsInteger)
+    else
+      StageRec := nil;
     if not Assigned(StageRec) then Exit;
 
     with FDealPayControl.CompletePayNode do
@@ -536,7 +542,11 @@ var
     Rec, StageRec: TsdDataRecord;
   begin
     Rec := FProjectData.DealPaymentData.DealPayRecord('本期应付');
-    StageRec := FProjectData.PhaseData.PhasePayData.PayRecord(Rec.ValueByName('ID').AsInteger);
+    if FProjectData.PhaseData.Active then
+      StageRec := FProjectData.PhaseData.PhasePayData.PayRecord(Rec.ValueByName('ID').AsInteger)
+    else
+      StageRec := nil;
+
     if not Assigned(StageRec) then Exit;
 
     with FDealPayControl.GatherPayNode do
@@ -1141,7 +1151,7 @@ begin
   end;
 end;
 
-constructor TGclControl.Create(AProjectCount: Integer);
+constructor TGclControl.Create(AProjectCount: Integer; AIsHaBai: Boolean);
 
   function CreateGclChapter(AChapterID: Integer; const AName: string): TGclChapter;
   begin
@@ -1161,8 +1171,16 @@ begin
   CreateGclChapter(5, '隧 道');
   CreateGclChapter(6, '安全设计及预埋管线');
   CreateGclChapter(7, '绿化及环境保护工程');
-  CreateGclChapter(8, '房建工程');
-  CreateGclChapter(9, '机电工程');
+  if AIsHaBai then
+  begin
+    CreateGclChapter(8, '房建工程');
+    CreateGclChapter(9, '机电工程');
+  end
+  else
+  begin
+    CreateGclChapter(8, '机电工程');
+    CreateGclChapter(9, '房建工程');
+  end;
   FOtherGcl := TGclChapter.Create(19, '非标准清单', FProjectCount);
   FGclChapterGather := TGclChapter.Create(20, '第100章至900章合计', FProjectCount);
 end;

+ 12 - 3
Dprs/CSL/Measure_Cloud.dpr

@@ -203,18 +203,27 @@ uses
   DealBillsExcelImport in '..\..\Units\DealBillsExcelImport.pas',
   ExcelImport_Bills in '..\..\Units\ExcelImport_Bills.pas',
   ExcelImport_GclBills in '..\..\Units\ExcelImport_GclBills.pas',
+  UpFileSelectOnLineFrm in '..\..\Forms\UpFileSelectOnLineFrm.pas' {UpFileSelectOnLineForm},
   FileDownLoadFrm in '..\..\Forms\FileDownLoadFrm.pas' {FileDownLoadForm},
   DebugUsers in '..\..\Units\DebugUsers.pas',
+  ScReportHelperUnit in '..\..\..\SmartCost\Reports\UI\ScReportHelperUnit.pas',
   DbTreeImport in '..\..\Units\DbTreeImport.pas',
-  DbTreeDm in '..\..\DataModules\DbTreeDm.pas' {DbTreeData: TDataModule};
+  DbTreeDm in '..\..\DataModules\DbTreeDm.pas',
+  OtherMeasurePhaseDm in '..\..\DataModules\OtherMeasurePhaseDm.pas' {OtherMeasurePhaseData: TDataModule},
+  OtherMeasureOnceDm in '..\..\DataModules\OtherMeasureOnceDm.pas' {OtherMeasureOnceData: TDataModule},
+  OMPhaseRecord in '..\..\Units\DataRecord\OMPhaseRecord.pas',
+  OtherMeasureFme in '..\..\Frames\OtherMeasureFme.pas' {OtherMeasureFrame: TFrame},
+  ProjGatherSelectFme in '..\..\ProjGather\ProjGatherSelectFme.pas' {ProjGatherSelectFrame: TFrame},
+  rpgZoneGatherControl in '..\..\Report\ProjGather\Zone\rpgZoneGatherControl.pas',
+  rpgZoneProjGatherSelectFrm in '..\..\Report\ProjGather\Zone\rpgZoneProjGatherSelectFrm.pas' {rpgZoneProjGatherSelectForm};
 
 {$R *.res}
 
 var
   Mutex: THandle;
   IPForm: TIPForm;
-  sInfo, sURL, sName: string;
   vFDForm: TFileDownLoadForm;
+  sInfo, sURL, sName: string;
 
 begin
   Mutex := CreateMutex(nil, True, G_AppHandleName);
@@ -300,7 +309,7 @@ begin
     if CheckDogExists then
     begin
       Application.CreateForm(TMainForm, MainForm);
-    end;
+  end;
     Application.Run;
   end;
 

+ 0 - 1
Forms/LoginFrm.dfm

@@ -40162,7 +40162,6 @@ object LoginFrm: TLoginFrm
     StyleFocused.BorderStyle = ebsNone
     StyleHot.BorderStyle = ebsNone
     TabOrder = 5
-    OnClick = cbUserClick
     OnKeyDown = cbUserKeyDown
     OnKeyPress = cbUserKeyPress
   end

+ 6 - 46
Forms/LoginFrm.pas

@@ -54,7 +54,6 @@ type
     procedure FormDestroy(Sender: TObject);
     procedure cbUserKeyDown(Sender: TObject; var Key: Word;
       Shift: TShiftState);
-    procedure cbUserClick(Sender: TObject);
     procedure nClearAccountClick(Sender: TObject);
     procedure cbUserKeyPress(Sender: TObject; var Key: Char);
   private
@@ -163,6 +162,12 @@ begin
     wbLogin.Navigate(PHPWeb.LoginBannerURL);
   finally
   end;
+
+  if G_IsTest then
+  begin
+    cbUser.Text := '1835082984@qq.com';
+    edtPW.Text := '123456';
+  end;
 end;
 
 procedure TLoginFrm.btnLoginClick(Sender: TObject);
@@ -348,51 +353,6 @@ begin
   end;
 end;
 
-procedure TLoginFrm.cbUserClick(Sender: TObject);
-// For Test Quickly. chenshilong, 2015-09-30
-//const
-//  AccArr: array[1..11, 1..3] of string = (
-//    ('1', '2636698008@qq.com', 'smartcost3850887'), // 纵横销售演示服务器
-//    ('2', '1971614655@qq.com', '357134933..'),
-//    ('3', '1835082984@qq.com', '123456'),
-//    ('4', '2417587264@qq.com', 'koukou0708'),
-//    ('5', '2609827960@qq.com', 'missling'),
-//    ('6', '1240621850@qq.com', '87654321'),
-//    ('7', '1014149875@qq.com', 'zhbwoai'),
-//    ('8', '1525739553@qq.com', '123456'),
-//    ('9', '1391010261@qq.com', 'missling'),
-//    ('10', '916960227@qq.com', '123456'),
-//    ('11', '916960227@qq.com', '12345678') // 测试服务器
-//  );
-//
-//var
-//  i: Integer;
-//  bEx: Boolean;
-begin
-//  if G_IsTest then
-//  begin
-//    bEx := False;
-//    for i := Low(AccArr) to High(AccArr) do
-//    begin
-//      if AccArr[i, 1] = cbUser.Text then
-//      begin
-//        cbUser.Text := AccArr[i, 2];
-//        edtPW.Text := AccArr[i, 3];
-//        bEx := True;
-//        Break;
-//      end;
-//    end;
-//    if not bEx then
-//    begin
-//      cbUser.Clear;
-//      edtPW.Clear;
-//    end;
-//  end;
-  {$IFDEF _mDebugView}
-  edtPW.Text := GetDebugUsers.GetPassword(cbUser.Text);
-  {$ENDIF}
-end;
-
 procedure TLoginFrm.nClearAccountClick(Sender: TObject);
 begin
   if Application.MessageBox('确定要清空所有记录的帐户信息吗?', '询问', MB_YESNO + MB_ICONQUESTION) = ID_No then

+ 119 - 272
Forms/UpFileFrame.dfm

@@ -62,7 +62,8 @@ object UpFileView: TUpFileView
       Top = 0
       Width = 28
       Height = 30
-      Hint = #25991#20214#24050#19979#36733#65292#28857#20987#25171#24320#25991#20214
+      Hint = #22312#32447#39044#35272
+      Visible = False
       Layout = pbsImageLeft
       Spacing = 4
       ImageNormal.Data = {
@@ -343,290 +344,136 @@ object UpFileView: TUpFileView
       ShowHint = True
       OnClick = btnPlayClick
     end
-    object btnFolder: TPNGButton
+    object btnDelete: TPNGButton
       Left = 31
       Top = 0
       Width = 23
       Height = 30
-      Hint = #28857#20987#25171#24320#25991#20214#25152#22312#30340#25991#20214#22841
+      Hint = #32447#19978#31227#38500
       Layout = pbsImageLeft
       Spacing = 4
       ImageNormal.Data = {
         89504E470D0A1A0A0000000D4948445200000018000000180806000000E0773D
-        F8000000097048597300000B1300000B1301009A9C1800000A4D694343505068
-        6F746F73686F70204943432070726F66696C65000078DA9D53775893F7163EDF
-        F7650F5642D8F0B1976C81002223AC08C81059A21092006184101240C585880A
-        561415119C4855C482D50A489D88E2A028B867418A885A8B555C38EE1FDCA7B5
-        7D7AEFEDEDFBD7FBBCE79CE7FCCE79CF0F8011122691E6A26A003952853C3AD8
-        1F8F4F48C4C9BD80021548E0042010E6CBC26705C50000F00379787E74B03FFC
-        01AF6F00020070D52E2412C7E1FF83BA50265700209100E02212E70B01905200
-        C82E54C81400C81800B053B3640A009400006C797C422200AA0D00ECF4493E05
-        00D8A993DC1700D8A21CA908008D0100992847240240BB00605581522C02C0C2
-        00A0AC40222E04C0AE018059B632470280BD0500768E58900F4060008099422C
-        CC0020380200431E13CD03204C03A030D2BFE0A95F7085B8480100C0CB95CD97
-        4BD23314B895D01A77F2F0E0E221E2C26CB142611729106609E4229C979B2313
-        48E7034CCE0C00001AF9D1C1FE383F90E7E6E4E1E666E76CEFF4C5A2FE6BF06F
-        223E21F1DFFEBC8C020400104ECFEFDA5FE5E5D60370C701B075BF6BA95B00DA
-        560068DFF95D33DB09A05A0AD07AF98B7938FC401E9EA150C83C1D1C0A0B0BED
-        2562A1BD30E38B3EFF33E16FE08B7EF6FC401EFEDB7AF000719A4099ADC0A383
-        FD71616E76AE528EE7CB0442316EF7E723FEC7857FFD8E29D1E234B15C2C158A
-        F15889B850224DC779B952914421C995E212E97F32F11F96FD0993770D00AC86
-        4FC04EB607B5CB6CC07EEE01028B0E58D27600407EF32D8C1A0B910010673432
-        79F7000093BFF98F402B0100CD97A4E30000BCE8185CA894174CC608000044A0
-        812AB041070CC114ACC00E9CC11DBCC01702610644400C24C03C104206E4801C
-        0AA11896411954C03AD804B5B0031AA0119AE110B4C131380DE7E0125C81EB70
-        170660189EC218BC86090441C8081361213A8811628ED822CE0817998E042261
-        48349280A420E988145122C5C872A402A9426A915D4823F22D7214398D5C40FA
-        90DBC820328AFC8ABC47319481B25103D4027540B9A81F1A8AC6A073D174340F
-        5D8096A26BD11AB41E3D80B6A2A7D14BE87574007D8A8E6380D1310E668CD961
-        5C8C87456089581A26C71663E55835568F35631D583776151BC09E61EF082402
-        8B8013EC085E8410C26C82909047584C5843A825EC23B412BA085709838431C2
-        272293A84FB4257A12F9C478623AB1905846AC26EE211E219E255E270E135F93
-        48240EC992E44E0A21259032490B496B48DB482DA453A43ED210699C4C26EB90
-        6DC9DEE408B280AC209791B7900F904F92FBC9C3E4B7143AC588E24C09A22452
-        A494124A35653FE504A59F324299A0AA51CDA99ED408AA883A9F5A496DA07650
-        2F5387A91334759A25CD9B1643CBA42DA3D5D09A696769F7682FE974BA09DD83
-        1E4597D097D26BE807E9E7E983F4770C0D860D83C7486228196B197B19A718B7
-        192F994CA605D39799C85430D7321B9967980F986F55582AF62A7C1591CA1295
-        3A9556957E95E7AA545573553FD579AA0B54AB550FAB5E567DA64655B350E3A9
-        09D416ABD5A91D55BBA936AECE5277528F50CF515FA3BE5FFD82FA630DB28685
-        46A08648A35463B7C6198D2116C63265F15842D6725603EB2C6B984D625BB2F9
-        EC4C7605FB1B762F7B4C534373AA66AC6691669DE671CD010EC6B1E0F039D99C
-        4ACE21CE0DCE7B2D032D3F2DB1D66AAD66AD7EAD37DA7ADABEDA62ED72ED16ED
-        EBDAEF75709D409D2C9DF53A6D3AF77509BA36BA51BA85BADB75CFEA3ED363EB
-        79E909F5CAF50EE9DDD147F56DF4A3F517EAEFD6EFD11F373034083690196C31
-        3863F0CC9063E86B9869B8D1F084E1A811CB68BA91C468A3D149A327B826EE87
-        67E33578173E66AC6F1C62AC34DE65DC6B3C61626932DBA4C4A4C5E4BE29CD94
-        6B9A66BAD1B4D374CCCCC82CDCACD8ACC9EC8E39D59C6B9E61BED9BCDBFC8D85
-        A5459CC54A8B368BC796DA967CCB05964D96F7AC98563E567956F556D7AC49D6
-        5CEB2CEB6DD6576C501B579B0C9B3A9BCBB6A8AD9BADC4769B6DDF14E2148F29
-        D229F5536EDA31ECFCEC0AEC9AEC06ED39F661F625F66DF6CF1DCC1C121DD63B
-        743B7C727475CC766C70BCEBA4E134C3A9C4A9C3E957671B67A1739DF33517A6
-        4B90CB1297769717536DA78AA76E9F7ACB95E51AEEBAD2B5D3F5A39BBB9BDCAD
-        D96DD4DDCC3DC57DABFB4D2E9B1BC95DC33DEF41F4F0F758E271CCE39DA79BA7
-        C2F390E72F5E765E595EFBBD1E4FB39C269ED6306DC8DBC45BE0BDCB7B603A3E
-        3D65FACEE9033EC63E029F7A9F87BEA6BE22DF3DBE237ED67E997E07FC9EFB3B
-        FACBFD8FF8BFE179F216F14E056001C101E501BD811A81B3036B031F049904A5
-        0735058D05BB062F0C3E15420C090D591F72936FC017F21BF96333DC672C9AD1
-        15CA089D155A1BFA30CC264C1ED6118E86CF08DF107E6FA6F94CE9CCB60888E0
-        476C88B81F69199917F97D14292A32AA2EEA51B453747174F72CD6ACE459FB67
-        BD8EF18FA98CB93BDB6AB6727667AC6A6C526C63EC9BB880B8AAB8817887F845
-        F1971274132409ED89E4C4D8C43D89E37302E76C9A339CE49A54967463AEE5DC
-        A2B917E6E9CECB9E773C593559907C3885981297B23FE5832042502F184FE5A7
-        6E4D1D13F2849B854F45BEA28DA251B1B7B84A3C92E69D5695F638DD3B7D43FA
-        68864F4675C633094F522B79911992B923F34D5644D6DEACCFD971D92D39949C
-        949CA3520D6996B42BD730B728B74F662B2B930DE479E66DCA1B9387CAF7E423
-        F973F3DB156C854CD1A3B452AE500E164C2FA82B785B185B78B848BD485AD433
-        DF66FEEAF9230B82167CBD90B050B8B0B3D8B87859F1E022BF45BB16238B5317
-        772E315D52BA647869F0D27DCB68CBB296FD50E2585255F26A79DCF28E5283D2
-        A5A5432B82573495A994C9CB6EAEF45AB9631561956455EF6A97D55B567F2A17
-        955FAC70ACA8AEF8B046B8E6E2574E5FD57CF5796DDADADE4AB7CAEDEB48EBA4
-        EB6EACF759BFAF4ABD6A41D5D086F00DAD1BF18DE51B5F6D4ADE74A17A6AF58E
-        CDB4CDCACD03356135ED5BCCB6ACDBF2A136A3F67A9D7F5DCB56FDADABB7BED9
-        26DAD6BFDD777BF30E831D153BDEEF94ECBCB52B78576BBD457DF56ED2EE82DD
-        8F1A621BBABFE67EDDB847774FC59E8F7BA57B07F645EFEB6A746F6CDCAFBFBF
-        B2096D52368D1E483A70E59B806FDA9BED9A77B5705A2A0EC241E5C127DFA67C
-        7BE350E8A1CEC3DCC3CDDF997FB7F508EB48792BD23ABF75AC2DA36DA03DA1BD
-        EFE88CA39D1D5E1D47BEB7FF7EEF31E36375C7358F579EA09D283DF1F9E48293
-        E3A764A79E9D4E3F3DD499DC79F74CFC996B5D515DBD6743CF9E3F1774EE4CB7
-        5FF7C9F3DEE78F5DF0BC70F422F762DB25B74BAD3DAE3D477E70FDE148AF5B6F
-        EB65F7CBED573CAE74F44DEB3BD1EFD37FFA6AC0D573D7F8D72E5D9F79BDEFC6
-        EC1BB76E26DD1CB825BAF5F876F6ED17770AEE4CDC5D7A8F78AFFCBEDAFDEA07
-        FA0FEA7FB4FEB165C06DE0F860C060CFC3590FEF0E09879EFE94FFD387E1D247
-        CC47D52346238D8F9D1F1F1B0D1ABDF264CE93E1A7B2A713CFCA7E56FF79EB73
-        ABE7DFFDE2FB4BCF58FCD8F00BF98BCFBFAE79A9F372EFABA9AF3AC723C71FBC
-        CE793DF1A6FCADCEDB7DEFB8EFBADFC7BD1F9928FC40FE50F3D1FA63C7A7D04F
-        F73EE77CFEFC2FF784F3FB25D29F330000000467414D410000B18E7CFB519300
-        00060E4944415478DA6D957B6C53551CC7BFF7DEB6B7EDBADE751D5DC718DB10
-        456522415E2191006A82CF441222FA9F6810FF3242E21364243E42302426FC41
-        14228880A051C14778880CC4814CB66E830DD8D87B6BF7687BDBAE8FFBF677BB
-        0DD9E849CECDBDE79EF3FBFC5EE7F7630CC3C0C41868D9D1A3A98C5B578D2E8E
-        E1829A2AF71B0CD79F8E8903AAA2F4E99AD26FE5ED414D4EC7144992180606EF
-        12B267A5D104400B5307733720DAB753F494540AA98406590CC322C761B75AC0
-        DAF2A0A88639154547861E838AA2F6C9522644A707A464A2438A450F330C17B5
-        B11C6C6061E40244BAB689857E27A9940755F7201557210D76C0AD8BE0792BC0
-        D2E4383A353E591B0CCE06C95A8CFACBB5EF284A7A67933484C64C0836F3FFBD
-        80ED62A1CF29E89A66FE016B71219E2A46ACE50ACA8A5840377719B8A39EB960
-        A880671E369E3DB8E3D050ED7B3A1D4DE94A6E17453AAB454F16600A31B29094
-        5A86E1A606CCF273E380A9C340BFAD102B2EEED6BB23C16A56653F61C0E83901
-        E10E024C736401E62A4380A45C8A50A01EF79758CC15B0ECD4406AD01CB3F0E2
-        F9BDB77F9103157C823B089979D5608C1C80DBDBC482694E41D3F4AC1BCCA448
-        29251868200B8AB92C80B771530CA08DCED9F8A0E1C78F0FA16E614F485C6D89
-        319BC9DA5DB47D3260A47D9B28149105AA69819105A4153F0102A8F0B1F4CDC2
-        61B74C180FDDD0216A71B8F2E6E2FBE67F365D28EDB59FB8DDF669A83FD4C7A6
-        9805B465781260B88D005EFB244046F5A3B7A111E545A67B58B89CD6AC7053F3
-        1A04718E55B1343503FCB5C45BBF3FD48AF3E1F817FFB605C0C4987524E2E864
-        C0AD8FC47C8FFD4E90B300AD183D0428F35256528A0A79765377FCA9F72354BA
-        107F75D56141220F8511E9DD0B953DDEA611FD9D9A1B17C188CC76DA563D0930
-        749300053CC5E07F80A413A0BE11FE02C06AB1C0EBB2E22C1344BC74253AA237
-        70ECFA7EBCEE7E0E8A2D76355E31B3725FEDEF85ED43ED602239008337B68AF9
-        EE710026003E74D637C1EF066CAC81EBDE0CB4F217703B528F33BD47108A6430
-        D75D85950B9EC4D1E61AFC7CEDB7B1088DE400845AB78AAE7CDB589A8E5BA0C0
-        878E7F9B50E450D0E849C353F50A3AA3F538DB7F088AC622916130AB683101DB
-        70BEFB12DD1BDD3C645AB081005F4D02045BB688CE3C9B6068E341A6A95BFCB8
-        79A981FC9D46E1A32FA38B84D7040F836378241515A3B28291D4280647E3884A
-        0A627286721B0A05792909A89F0CB8B6457438AD82AE8FC780B2460C1B686D6F
-        41EFE23970399CF8A3EF2078CE41B58A2EA1A2202E498866D208A7D3184E2621
-        D2371B654E413656DF730F069A3F141D8E31806116158B805B814E1852022785
-        415C2BEC4189DD059DBCA0D263022066321849A7104A25908AAA5126C9ACA692
-        7A85B1E400F03C379EA67A167023D00D3519477E8115471C2DE874C550E27441
-        52B52C20214B089305DD3191FC0E23A2649E21179FD49A49C9EE2980DEC0FBA2
-        C36E1D2B15A4216315703DD08551318A4ABF07051E1E3B472FA34788C1677722
-        21C9E4FF14C2E11496F11578CA362F56FDEB89F286D3A1183A7214BBCEBA7745
-        170559A34C3008C0F2029AAE76511CC2985122A07C9A800C95E25DC9CBE82648
-        01CFA32322628DF400DEAE5C8EC6A0145BB5E6F30A31238B39AB69EB854DDDDE
-        C2BC992A996F90159C9D000D5D880C47E02B72A1ACD84D8D8485443D60D7E825
-        B40B11C88A86B5E987B17EC6220442E9F8AA35BBAA64551F1AAB27944D7703CE
-        7DF7FA9202C17ECCEF776721366A6E7F9C6D090EF40FB30FCFF615974F17A85C
-        5045A5B62853129890734C07DEC442AC9FBE04ADE14C82002B24451F2071A615
-        D224C09F475E435C4CCF2B2BF3FC54EC73CD727BBCD85C7DFCEBBD876BBFDCF4
-        EA32DFF34F3C389F326C2555D4C7F2793E5F61759C4AB5613EEFC723DE520CC4
-        D5F4D3AFEC5E1B8E65CE9038F91E1791058845D3E62D9E593A3DFFC48373EF7B
-        74F3F6E3FBF71EAADDF8D2B355D2869716229E90A82DB333C801CBEC36CB72AF
-        DDF1386767AB8E9FBFD974FAAFB65FAE34F67DABA8FAAD9C3130016441B68718
-        865EF1C09CB27D3BF7D47C73E087BA0304C01BEB16219194B25DCDBC2BE6A477
-        1B012B3EDB7321F5F7D59EA109CD27C67F955E86A07AD779FC0000000049454E
-        44AE426082}
+        F8000000097048597300000B1300000B1301009A9C1800000149694343505068
+        6F746F73686F70204943432070726F66696C65000078DAAD8E3D4BC35014404F
+        AA2888D40A411CDF242D68A5D8C18CE987ADA0886987B65B9B3ED2D236092FCF
+        6A7F84A35B0717FF81B3B383E02038F913DC04A70E0E11323888E099CE3D702F
+        175275BB52AAA63230F1B5726A25D16A77C4EA332B2C0140D78DC2D3C65113C0
+        0F7CC90F3E5F31005EF6EC4AA9CADF587343A5810570D297910B461D185DEA50
+        83710F98BD51A8C178044CD574CA60BC01692FF67720DD8B7D01A455ABDD81D4
+        3A607AB10BC0ECC55E044C2DAF34403908676AE80DB4C8BA3951B02C4BD8FDA0
+        27456316693989C4B1EF062A0C5457CB7E5ED8E3B17086DE4047C291915453D9
+        CF13FF0DC066BCECD44A225BB0ACC31CFF4CABDD11B17D9C6300C6D653D212DC
+        0B35FD562375F0FB9CDC986FC3D91D2C2F9256BC86DB5DD8B849DA4E0132FBF0
+        30FF02D75C586FBAA536520000055E4944415478DA8D947D4C136718C0DFBB6B
+        7BA5BDAB7CD44AD15640C04427B89138158D894830D91F32095BD4A873BA1897
+        4CAD645BB6E95F5BB28F64C9B63FCC7046E74734DA6D14D9DCFE50834A011117
+        9C7C48624433E568E929F49A7ED2DE9EE7B8EBBA816E6FF2E6DABBF7FDFDDEE7
+        7D9EF7A55AE6CC21D8529393C46036AF3397966E3AE0F536FD1E8D76937F3513
+        4D93269B8DF0F04CE20B598689294233CC52DBA2456F9FE8ED6D3E1208FC9A39
+        874201C219965D57BA7DBBDB6436670FB7B5097BAF5D6BF8231EF73E4F202793
+        28A928D9B8B1D562B33946BBBA425F74746CF584429EB4C0939747688097EDD8
+        E1A609C90E7474101E20015114F683E47686245330097019E0A5F5F5AD269E77
+        F82F5F26C6DC5C92A428E9D3CECE6D1E495224D445A7B3A678CB96F3344D2B70
+        0C1B26127EF66C223E7922EC6B6F4F47A20938F83D897058B989E31C3E80E356
+        5138C66A257159963EEFE9D9D63C31E1A1DAAAABCF14AD5DBBE9B13A88509412
+        3A76943C999810F679BD8A0405DF0280A3E98AE2BA3A05EEBF7449591405DFB4
+        C5CD292A229786867EDB3338B881AACCCA7AF9CB952B9B73AD567BC8E723324A
+        A06B4F1E80A22409EF747636F483E47B9BADBCB2BEFE67D66452E014265A85E3
+        788BDD4E46C361D1D5D3E3EA8B46CF6154A45CAFAFFA66CD1A776E76B63D2808
+        5383B163125102DBF238187C747A60E0E37D0D0DEFE7715CB14F855310B1B672
+        0B14CC682C26EEBD71A371201E77033A4C69092C3718AABE5EB5CA9D6BB1D8A5
+        D1D1A9EDCA10610273162E2449962563B09D14CA55388A78842712E2DEEE6E84
+        9F076444497266192A92AA2A778ED96C0FA10400CA80789C24A351C2E8F5242E
+        8A448EC5A6B606130BCF5973E7123FCB8AAE81817FC0A70934C9572B56B8F340
+        32FEE001494E4C9064284464906024506D84D6E908ADCA15B8D128EE9F013EA3
+        00DB62907CB664C969DEE72B8C42240A10C058290C3E018EFF4DB02D82D138F2
+        DEE0E08703B1D834B822C0D2438B9CF13206A1BF6EB1BC75B0A6E688CFEB2593
+        E3E3845125B43ADE60B110736121F9A8B7F7939660F0107946A34EA97791D260
+        726A2A791565B5B5E7CD914899FFE245E5938E61F0CE51B6461399F2F389A0D7
+        3F6CECEBDBDC178B75CC28F040DD2A11E001C3CA21A4A278FDFA563A1C760817
+        2E28C0F4EAD5DF8C2AC0FF98038161843DBDBD0D20F14E13FCA80A5253A7B8A2
+        08E03A808FB6B428001D548EB6F7069E2704AA09E10C44C36448FEA42861F7AD
+        5BD3248A4039B9B072843319702C4B654BA0730031C0D5213F7D4A1281801289
+        4E8B06BE5B0A0AC8C3544AD879F366437F8684FA017200115414D6D6B6329188
+        43F078942AD1E00CF4EC79F3C82396F51D1B1E6EDA5D52B2730145CD8DF8FD4A
+        745A6E1855722F9110767475A525D44F05052FCEAFAE6EA1013E02701A739DB1
+        3284074C26ACF303508A2797188D5587972E753B29CA1E1B1B9B92E07855C241
+        E2EF86C3C2CEEEEED76E4722EDD4F5D5ABCFCC723A373D3C7BF6EF3DC76D0151
+        8EC341C6007E6070B031B3CE5F60D9AAA6CA4AF702BDDE1E83EDD26B126D5170
+        9B1EEFEFFFE5CD3B775EA57659ADAF6CCECF3F4BFC7E3E02D700AE0493882B7F
+        6A368BAEBB771B673A442839BA6C99BB8C65ED0998A73318881EE6727031DE4F
+        24C2BBAE5FFFA02D186C524E721DC7D5B98A8B4FCA63637C14C2CE763AC938C7
+        898D43438DFDCF38A19AE4D8F2E5EEC570ADA06416E4E0412A15DE7AE5CAA176
+        493A0A43A4F45551C7F375AEF9F34F596499830B5B7CF7DEBDE7C2D312C8C909
+        B8BB5ECACFB7DF97A4C8F6AB570F02FC3B844FBB8B40B2A1C66A7DE3F0C84833
+        C0DDFF05D75A7956D6AAFDA5A5AE13C3C3D7AE4AD27178154C97E90CE30DEA33
+        FE7FE0194D8F05083D96F9F22F2F189250BDF7C0B10000000049454E44AE4260
+        82}
       ImageOver.Data = {
         89504E470D0A1A0A0000000D4948445200000018000000180806000000E0773D
-        F8000000097048597300000B1300000B1301009A9C1800000A4D694343505068
-        6F746F73686F70204943432070726F66696C65000078DA9D53775893F7163EDF
-        F7650F5642D8F0B1976C81002223AC08C81059A21092006184101240C585880A
-        561415119C4855C482D50A489D88E2A028B867418A885A8B555C38EE1FDCA7B5
-        7D7AEFEDEDFBD7FBBCE79CE7FCCE79CF0F8011122691E6A26A003952853C3AD8
-        1F8F4F48C4C9BD80021548E0042010E6CBC26705C50000F00379787E74B03FFC
-        01AF6F00020070D52E2412C7E1FF83BA50265700209100E02212E70B01905200
-        C82E54C81400C81800B053B3640A009400006C797C422200AA0D00ECF4493E05
-        00D8A993DC1700D8A21CA908008D0100992847240240BB00605581522C02C0C2
-        00A0AC40222E04C0AE018059B632470280BD0500768E58900F4060008099422C
-        CC0020380200431E13CD03204C03A030D2BFE0A95F7085B8480100C0CB95CD97
-        4BD23314B895D01A77F2F0E0E221E2C26CB142611729106609E4229C979B2313
-        48E7034CCE0C00001AF9D1C1FE383F90E7E6E4E1E666E76CEFF4C5A2FE6BF06F
-        223E21F1DFFEBC8C020400104ECFEFDA5FE5E5D60370C701B075BF6BA95B00DA
-        560068DFF95D33DB09A05A0AD07AF98B7938FC401E9EA150C83C1D1C0A0B0BED
-        2562A1BD30E38B3EFF33E16FE08B7EF6FC401EFEDB7AF000719A4099ADC0A383
-        FD71616E76AE528EE7CB0442316EF7E723FEC7857FFD8E29D1E234B15C2C158A
-        F15889B850224DC779B952914421C995E212E97F32F11F96FD0993770D00AC86
-        4FC04EB607B5CB6CC07EEE01028B0E58D27600407EF32D8C1A0B910010673432
-        79F7000093BFF98F402B0100CD97A4E30000BCE8185CA894174CC608000044A0
-        812AB041070CC114ACC00E9CC11DBCC01702610644400C24C03C104206E4801C
-        0AA11896411954C03AD804B5B0031AA0119AE110B4C131380DE7E0125C81EB70
-        170660189EC218BC86090441C8081361213A8811628ED822CE0817998E042261
-        48349280A420E988145122C5C872A402A9426A915D4823F22D7214398D5C40FA
-        90DBC820328AFC8ABC47319481B25103D4027540B9A81F1A8AC6A073D174340F
-        5D8096A26BD11AB41E3D80B6A2A7D14BE87574007D8A8E6380D1310E668CD961
-        5C8C87456089581A26C71663E55835568F35631D583776151BC09E61EF082402
-        8B8013EC085E8410C26C82909047584C5843A825EC23B412BA085709838431C2
-        272293A84FB4257A12F9C478623AB1905846AC26EE211E219E255E270E135F93
-        48240EC992E44E0A21259032490B496B48DB482DA453A43ED210699C4C26EB90
-        6DC9DEE408B280AC209791B7900F904F92FBC9C3E4B7143AC588E24C09A22452
-        A494124A35653FE504A59F324299A0AA51CDA99ED408AA883A9F5A496DA07650
-        2F5387A91334759A25CD9B1643CBA42DA3D5D09A696769F7682FE974BA09DD83
-        1E4597D097D26BE807E9E7E983F4770C0D860D83C7486228196B197B19A718B7
-        192F994CA605D39799C85430D7321B9967980F986F55582AF62A7C1591CA1295
-        3A9556957E95E7AA545573553FD579AA0B54AB550FAB5E567DA64655B350E3A9
-        09D416ABD5A91D55BBA936AECE5277528F50CF515FA3BE5FFD82FA630DB28685
-        46A08648A35463B7C6198D2116C63265F15842D6725603EB2C6B984D625BB2F9
-        EC4C7605FB1B762F7B4C534373AA66AC6691669DE671CD010EC6B1E0F039D99C
-        4ACE21CE0DCE7B2D032D3F2DB1D66AAD66AD7EAD37DA7ADABEDA62ED72ED16ED
-        EBDAEF75709D409D2C9DF53A6D3AF77509BA36BA51BA85BADB75CFEA3ED363EB
-        79E909F5CAF50EE9DDD147F56DF4A3F517EAEFD6EFD11F373034083690196C31
-        3863F0CC9063E86B9869B8D1F084E1A811CB68BA91C468A3D149A327B826EE87
-        67E33578173E66AC6F1C62AC34DE65DC6B3C61626932DBA4C4A4C5E4BE29CD94
-        6B9A66BAD1B4D374CCCCC82CDCACD8ACC9EC8E39D59C6B9E61BED9BCDBFC8D85
-        A5459CC54A8B368BC796DA967CCB05964D96F7AC98563E567956F556D7AC49D6
-        5CEB2CEB6DD6576C501B579B0C9B3A9BCBB6A8AD9BADC4769B6DDF14E2148F29
-        D229F5536EDA31ECFCEC0AEC9AEC06ED39F661F625F66DF6CF1DCC1C121DD63B
-        743B7C727475CC766C70BCEBA4E134C3A9C4A9C3E957671B67A1739DF33517A6
-        4B90CB1297769717536DA78AA76E9F7ACB95E51AEEBAD2B5D3F5A39BBB9BDCAD
-        D96DD4DDCC3DC57DABFB4D2E9B1BC95DC33DEF41F4F0F758E271CCE39DA79BA7
-        C2F390E72F5E765E595EFBBD1E4FB39C269ED6306DC8DBC45BE0BDCB7B603A3E
-        3D65FACEE9033EC63E029F7A9F87BEA6BE22DF3DBE237ED67E997E07FC9EFB3B
-        FACBFD8FF8BFE179F216F14E056001C101E501BD811A81B3036B031F049904A5
-        0735058D05BB062F0C3E15420C090D591F72936FC017F21BF96333DC672C9AD1
-        15CA089D155A1BFA30CC264C1ED6118E86CF08DF107E6FA6F94CE9CCB60888E0
-        476C88B81F69199917F97D14292A32AA2EEA51B453747174F72CD6ACE459FB67
-        BD8EF18FA98CB93BDB6AB6727667AC6A6C526C63EC9BB880B8AAB8817887F845
-        F1971274132409ED89E4C4D8C43D89E37302E76C9A339CE49A54967463AEE5DC
-        A2B917E6E9CECB9E773C593559907C3885981297B23FE5832042502F184FE5A7
-        6E4D1D13F2849B854F45BEA28DA251B1B7B84A3C92E69D5695F638DD3B7D43FA
-        68864F4675C633094F522B79911992B923F34D5644D6DEACCFD971D92D39949C
-        949CA3520D6996B42BD730B728B74F662B2B930DE479E66DCA1B9387CAF7E423
-        F973F3DB156C854CD1A3B452AE500E164C2FA82B785B185B78B848BD485AD433
-        DF66FEEAF9230B82167CBD90B050B8B0B3D8B87859F1E022BF45BB16238B5317
-        772E315D52BA647869F0D27DCB68CBB296FD50E2585255F26A79DCF28E5283D2
-        A5A5432B82573495A994C9CB6EAEF45AB9631561956455EF6A97D55B567F2A17
-        955FAC70ACA8AEF8B046B8E6E2574E5FD57CF5796DDADADE4AB7CAEDEB48EBA4
-        EB6EACF759BFAF4ABD6A41D5D086F00DAD1BF18DE51B5F6D4ADE74A17A6AF58E
-        CDB4CDCACD03356135ED5BCCB6ACDBF2A136A3F67A9D7F5DCB56FDADABB7BED9
-        26DAD6BFDD777BF30E831D153BDEEF94ECBCB52B78576BBD457DF56ED2EE82DD
-        8F1A621BBABFE67EDDB847774FC59E8F7BA57B07F645EFEB6A746F6CDCAFBFBF
-        B2096D52368D1E483A70E59B806FDA9BED9A77B5705A2A0EC241E5C127DFA67C
-        7BE350E8A1CEC3DCC3CDDF997FB7F508EB48792BD23ABF75AC2DA36DA03DA1BD
-        EFE88CA39D1D5E1D47BEB7FF7EEF31E36375C7358F579EA09D283DF1F9E48293
-        E3A764A79E9D4E3F3DD499DC79F74CFC996B5D515DBD6743CF9E3F1774EE4CB7
-        5FF7C9F3DEE78F5DF0BC70F422F762DB25B74BAD3DAE3D477E70FDE148AF5B6F
-        EB65F7CBED573CAE74F44DEB3BD1EFD37FFA6AC0D573D7F8D72E5D9F79BDEFC6
-        EC1BB76E26DD1CB825BAF5F876F6ED17770AEE4CDC5D7A8F78AFFCBEDAFDEA07
-        FA0FEA7FB4FEB165C06DE0F860C060CFC3590FEF0E09879EFE94FFD387E1D247
-        CC47D52346238D8F9D1F1F1B0D1ABDF264CE93E1A7B2A713CFCA7E56FF79EB73
-        ABE7DFFDE2FB4BCF58FCD8F00BF98BCFBFAE79A9F372EFABA9AF3AC723C71FBC
-        CE793DF1A6FCADCEDB7DEFB8EFBADFC7BD1F9928FC40FE50F3D1FA63C7A7D04F
-        F73EE77CFEFC2FF784F3FB25D29F330000000467414D410000B18E7CFB519300
-        0006274944415478DA6D956D7054D519C7FFE7DC977D4D3609141202C92602A2
-        806DD5A9D48E14DBCE94B1F5433B52DBA91F6A09D6A19D2662453FF84167FA62
-        C769671C9CD131B4682DE9B4A3C288682494420B6A51498448A2249184842CD9
-        647337BB7BF7BE9ED3E76E0C9D0D7B76E7CCECDD739FDF79FECF1B935262613D
-        B9FBD098AA7AD592F917558D4FDA9698D07439319D712E0BE18E43F813E0A149
-        E13B59262D5B8249AE5695DE957E9E7686C58B95013A8E196B5647134AD8C464
-        CAC3E5291D4C0DA1B68ACE30178AE2BA0AF72CC6BC2B52BAE366D14D91E9CB46
-        D61BB1ED7C17E37C56321DAAA64008762DE091B663466DA42AA14781DA652EB8
-        5640DFC702AEAF4053753ACD117C98129CE6D034DA1586F56B0BE8EDEBDF0D61
-        3DAD858661442E4191EAB580DD3B8E19550410BE40F0381EE748DE60E0E8C902
-        746D29381774E1D2775E1611EC022D2D218C784FFFFEC5F01B8F091F30855B59
-        A24708501D89278490F02503A7FF5AD6E5F1DFB319A86AC33C60F1A2D7137A0E
-        5D5F7E408C66269FE01EFF0D03131501BFDAF14FA33A144F7881E44CD20D19AE
-        BB318BD31FA549FFC6520C39C954669F6EFC857A0567EA770D1F504E274339E5
-        6538EC7EC96465405528F040CCCB405E24D7E670662045C0865296288A560EA0
-        83F58D2A72FCF95FEF5FF7C6AD632963AB9A650F93727F0C2E54067878C75123
-        BE0090F349D7B43A8FBEC149B24400CEE7837DD5B8C05CDA45F3F561B89923BB
-        A67F7A22FCFAF085DFA62652E3DC64379381F4220F7A8CA8164FF8F48C910FC1
-        DE4C80FE4FC7E17A2BA070462918299DE55CA25E0CC07CF024AAF77D1D3332DD
-        EEFCA007C7B3C6331F5CE803CBB21F9281BF970176B51D3122049098F720F0A1
-        F9BA3CCE0F5D8269AD20A30C9148B424DD72790EABDB19FE55FC0FD61C5C8FA9
-        B4FD68F167FF5E72765AEC3E3E7812CC604F929927CA000F1120AAC5128222F7
-        7F400103C3632898F5D0748E782C8AA5CE20366CAFC690FE31FE36DA897B4E75
-        405D39F5A1F33DDEB2F7BDC37543534360998A80B78D901A4B04DA2EC46065D2
-        C4F0E80872C5E554540A5AC35770DBB6465C8C9DC59BCE9F91CA58D818BD09DF
-        6CB90BFB53DD38D87F783E7BA62B0076B5751BBA122DC52020043158952CE2E2
-        F810E60A754892F1CD6DEB30EE0EA09BBF4015CE91B3185A977C05C3B3177062
-        F45D981E9500D51979F000013A1701DE32141E2189E4D5226A6A71303A7E1ED5
-        0E70E7CE1B30610DA047ED84C24228B81EF28E8B69338F2BF939CCDA2EB28E45
-        A50C9782BC89EE77A60CD01100583881A0C84AC5465913C9C0B77A71E38F6388
-        E93174B3E7115222F0A8DA0BAE8B39DBC6AC55C44CB18874A100837EF359F636
-        1CB9F59A3AE8683B6C701E4D04E5E9F912757594E7E620E01711BFBE1FE7367D
-        8086709C3A250820AE020CCBC274D144CACCC19CF56659816D858ED34CAD0060
-        082582064617444D8D80699FA79E94A734AD43F81B0731DC3C8186681CB6E797
-        0039C7C60C79309A354877C88C6BDD257DD9ED9F2315461703B61FA253E11220
-        08745DAD44D13E87109B2219D6C17697A0EA5B7BF059F3249685A3C8D90EE96F
-        6266C6C41D731B11EBDB927D4BEE69EE3D92CA62A442B36BDF7EC0608CD2143E
-        8240D7D55042F8BD049840B6B89A92230987821ADAF25C095213A2369D31B0F9
-        B5EF23DC70373C7B24FBEC9E5F240DCB312A76D3F61D5DE4D4D2269A5625406D
-        82512C7A11512E216FAFA21BB7528FA066E73BE05FEDC4272D63705C1F5F7BF5
-        1EF8D5DF862A3E99FBC3B31D1B1C4F4C7D3E3FDDF25EB4F3A9DB5C6FC93F8468
-        6C82F468E06888E88727A573913B72E3F2396B0D659742F285A86DBBF03775E2
-        684D3FB6F5DC072FBA15DCFF2CF7CC73BFDC62BBE232990BBCB0CB07CECF7F87
-        88367D53D65C7BC0F357B4261271A4AF3CBE6F6FD73B2F3CF493DB97A9D1EF7E
-        8966C99D9E1FBBC59355558CC65754EB83EB36A2C03622AEA78AFB5E6EDF3693
-        B57AC89C73ED3CD8F914A27A3A18364D59B3F5F5686CFD17D3538FBFB877FF3B
-        0FDEFB9D0D7653F3BDE411D58550575289DCEE7AD1CD1E5B7A87E3E81BAAB557
-        CF1E7F6FF0D0E98FC6FFEA7AE2D3CA138D00B150FAF33E249259FBE63F19D37B
-        FEF2D22BEFBF4400AC6AFE11C2DA2CC5472189FCE00C153BD7855493274E7599
-        A73E1C9B5AB8F9C2FA1FA1576598C255B4970000000049454E44AE426082}
+        F8000000097048597300000B1300000B1301009A9C1800000149694343505068
+        6F746F73686F70204943432070726F66696C65000078DAAD8E3D4BC35014404F
+        AA2888D40A411CDF242D68A5D8C18CE987ADA0886987B65B9B3ED2D236092FCF
+        6A7F84A35B0717FF81B3B383E02038F913DC04A70E0E11323888E099CE3D702F
+        175275BB52AAA63230F1B5726A25D16A77C4EA332B2C0140D78DC2D3C65113C0
+        0F7CC90F3E5F31005EF6EC4AA9CADF587343A5810570D297910B461D185DEA50
+        83710F98BD51A8C178044CD574CA60BC01692FF67720DD8B7D01A455ABDD81D4
+        3A607AB10BC0ECC55E044C2DAF34403908676AE80DB4C8BA3951B02C4BD8FDA0
+        27456316693989C4B1EF062A0C5457CB7E5ED8E3B17086DE4047C291915453D9
+        CF13FF0DC066BCECD44A225BB0ACC31CFF4CABDD11B17D9C6300C6D653D212DC
+        0B35FD562375F0FB9CDC986FC3D91D2C2F9256BC86DB5DD8B849DA4E0132FBF0
+        30FF02D75C586FBAA53652000005A84944415478DA8D947D6C13651CC77FCF5D
+        7B7DDFBAEEADB751D8962010CCC6C401A60485608C2E0262900C844C27B2A07F
+        80D32C03063A10D4C444A2338C09928180BBC84BA6D1A8216132FF2028381893
+        2D9B736BD66DD0ADB475D76BD73B7FCFB3B2976CA0CFE5EE69EF9EE7FBF93DBF
+        37B28B7B16E888693218F9F49549098F16550CD6D60C43F71598328C50CAAD84
+        24A28311FA5753F111059E181664253EBEED90FFE2B956F5E2F71377100AA0E2
+        3ACEBEF28945C592C362B05FF9FD376FF9E0A7EBC2D0DFF43080A629F854F316
+        CD7DB9213DC5EEBADD7223B477F0AB4D5EADE5FC18A0823C053C8ABB97BC22F1
+        00F6AE5BD721D596025DA121EF4E84C89320E380288A6B28BE78DEA606BBD5E4
+        EAB8D1045653329E8704770D9ED9ECD59A198454E9D63F5D505054CF738489A3
+        59A0E2D6546B3274FFE3F7560C554F38C928C0CE1C1343F18D0D768BC9D57EF3
+        32731787EF134DA9208316AC1CBAB0B957BB7A9E1C72EC3BB5686141D18DAB57
+        467D4A08A86A0C393148B1A480271C40C8E7718811B6724F22409FB770EE7A26
+        DE71F317EA2620C053A7D153C16C7B0E1C1D6CFDE1B47264353143F6E2838E57
+        CFCDB03A445FE00EA81482B7C6E651488F12F256F80FAF5310F21AF74C6EE1BC
+        4DDF5A4C0657474B23103C31109E41E8BE744B26B445877D7B03753BC2D0FD35
+        193D78B2FB43C70E698639411C08F43337516B401D611B53CC69D0AA043DC782
+        97F6ED99B7A53CCB6CCA6943710ED7113C315D4FAF34B308ED31C5B7FBDE9132
+        3446C2CDC3643C7CE9EE83496F48338C36F16EB02F9E82F74131164057463644
+        04013A6F51F11873271547A742AA3903C5A3BEDD815A2A5E8F1B6516E4C94948
+        21DBA44CC12CFA427DEC335BA02A3012A3A92C801CF1A0E610BE47004430B031
+        48170AA09333F9DE93CF4C129F02B80F39602F955C7AB3E80D74C2C8C81D88AA
+        DD28EAA327C6501AB0B06C38F36CB353BF183A79B36FEF34E2D302E83020A4DC
+        BCF164B2D29D158AFD8C52094C981001F420B08CE171B6EBE7431B6FEEFD4096
+        762AD03B453C0E304E83084316C9DFF25946F19176EF4F10519B41CFAC16D84D
+        AD32F159E0B0CC81D240C3FE3EED5A253C6090D2782F1A1D7A0C172D7F2EAF20
+        7B6DBD43093FD2E9A9665F0462427113B39D277A7CEAC12ECC86DB9CF077D5F0
+        990D61E8FD755A4005B78A55A04A38F4336B61790B73D634E894B0EB76CF474C
+        5037663DCA120BE8509CDE3CEE144DB3A195F0DEB2D0492CC6DEA6298077E280
+        18163F009F978FE2028AB7F71CA0D268B91DBF0BF417BAC58596F847012C1E14
+        4E2139701D88777BF0F8140803D0CE82D99E979FFD62835E915DED9EFD71CB93
+        465D825732A6A2D9E8C48CF54138D283273120DC803387400E9CE699705553BD
+        DB02C7B0E2C721E46D8C01062D6F41F65A1447B778DE05BA4507284E7866A528
+        2C8116CED45F1B6EAA79D3B4AC64092199F7140F0318B0B3EA083D1301D1E282
+        4635EADDEAAF1D8390727E4D7EEEACE72EF091B0EB4FCF1ED6B2685AEA69BEE3
+        E5149642376FC53CAF7F0B37D51961A6FB636B91F418E1C460D80B062C3E0306
+        5D8843D2AC4EF8312A7B5FF7D7BD24C35F97497562E529675266D11F5DDB99E5
+        023870E6192843580E5DBCCD57254B6513F3DC0819EE4F6CC5929BD78B217900
+        8C08317214800AD83E6639B2A064A0E5BB63E1EA17C81C6E45E15661EE698874
+        D8026A132EB2B0A272EA5740AFCE86E5FF4DD974454421D58925D272DE20CAF2
+        5D30F00298F114E9D654B8148B0EAFBD73BAC2AF5DAB61952C92F96B2A0CCBEB
+        B448B72DA436A2F8F3D0C727FAAAC267CB1E54A1F72187ED5BA4426C2BB2EC03
+        5742065C56D5E1C2FEE39501ADF90B5C121C6B1522C945C8D213699A666D03F0
+        BDAF5C78A8F83864A6FB685289B421214DBC140EC9AB064EEC46F15A2A3EA517
+        2164F5323EB7F8FCC8C573282EFD97F838247BE90663E18EB34A63A35F6BFE12
+        5F0526F4A2294388CF91FF233EA9CF00AB5965E2CB7F01ADCF605006FF4B6B00
+        00000049454E44AE426082}
       ButtonStyle = pbsNoFrame
       ParentShowHint = False
       ShowHint = True
-      OnClick = btnFolderClick
+      OnClick = btnDeleteClick
     end
   end
   object pnlOrder: TPanel

+ 35 - 30
Forms/UpFileFrame.pas

@@ -23,7 +23,7 @@ type
     cxHintStyleController1: TcxHintStyleController;
     pnlPlay: TPanel;
     btnPlay: TPNGButton;
-    btnFolder: TPNGButton;
+    btnDelete: TPNGButton;
     pnlOrder: TPanel;
     btnUp: TSpeedButton;
     btnCancel: TSpeedButton;
@@ -32,7 +32,7 @@ type
     procedure btnPlayClick(Sender: TObject);
     procedure lblFileClick(Sender: TObject);
     procedure FrameClick(Sender: TObject);
-    procedure btnFolderClick(Sender: TObject);
+    procedure btnDeleteClick(Sender: TObject);
   private
     FOwner: TObject;
     FData: TUpFile;
@@ -123,11 +123,11 @@ end;
 
 procedure TUpFileView.btnCancelClick(Sender: TObject);
 begin
-  TUpFileManageView(Owner).DeleteViewAndData(Self);
+  TUpFileManageView(Owner).DeleteViewAndData(Self, False);
 end;
 
 procedure TUpFileView.btnUpClick(Sender: TObject);
-var sWebName, sPhase: string;
+var sWebName, sPhase, sID, sDownURL: string;
 begin
   Screen.Cursor := crHourGlass;
   try
@@ -144,39 +144,42 @@ begin
 
     if G_IsCloud then
     begin
-      if PHPWeb.UpAttachmentFile(PHPWeb.UserID, TProjectData(FProjectData).WebID, Data.BillID,
-        Data.OrgFile, Data.Category, Data.Memo, IntToStr(Data.Phase), sWebName) then
+      if PHPWeb.UpAttachment(PHPWeb.UserID, TProjectData(FProjectData).WebID, Data.BillID, Data.Phase,
+        Data.OrgFile, Data.Category, Data.Memo, sWebName, sID, sDownURL) then
       begin
   //      TUpFileManageView(Owner).Rec.ValueByName('HasAttachment').AsBoolean := True;
         CopyFile(PChar(Data.OrgFile), PChar(Data.LocalFile), False);
         Data.Status := ufsNormal;
+        Data.ID := StrToInt(sID);
+        Data.DownURL := sDownURL;
+        FrameClick(Sender);
       end
       else
       begin
         Application.MessageBox('当前附件上传失败,请重试!', '系统提示', MB_OK);
         Data.Status := ufsNeedUp;
       end;
-    end
-    else
-    begin
-      if FileExists(Data.LocalFile) then
-        if Application.MessageBox('已存在同名的本地附件,该附件将会被覆盖,是否继续?', '询问', MB_YESNO + MB_ICONQUESTION) = ID_No then
-        begin
-          Data.Status := ufsNeedUp;
-          Exit;
-        end;
-
-      if Data.Owner.LocalSaveToDB(Data) > -1 then
-      begin
-        CopyFile(PChar(Data.OrgFile), PChar(Data.LocalFile), False);
-        Data.Status := ufsNormal;
-      end
-      else
-      begin
-        Application.MessageBox('当前附件保存失败,请重试!', '系统提示', MB_OK);
-        Data.Status := ufsNeedUp;
-      end;
     end;
+//    else
+//    begin
+//      if FileExists(Data.LocalFile) then
+//        if Application.MessageBox('已存在同名的本地附件,该附件将会被覆盖,是否继续?', '询问', MB_YESNO + MB_ICONQUESTION) = ID_No then
+//        begin
+//          Data.Status := ufsNeedUp;
+//          Exit;
+//        end;
+//
+//      if Data.Owner.LocalSaveToDB(Data) > -1 then
+//      begin
+//        CopyFile(PChar(Data.OrgFile), PChar(Data.LocalFile), False);
+//        Data.Status := ufsNormal;
+//      end
+//      else
+//      begin
+//        Application.MessageBox('当前附件保存失败,请重试!', '系统提示', MB_OK);
+//        Data.Status := ufsNeedUp;
+//      end;
+//    end;
   finally
     Screen.Cursor := crDefault;
   end;
@@ -215,7 +218,7 @@ begin
     ufsNormal:
     begin
       pnlOrder.Visible := False;
-      pnlPlay.Visible := FileExists(Data.LocalFile);
+      pnlPlay.Visible := True;
       lblInfo.Visible := True;
       lblInfo.Font.Color := clBlack;
       lblInfo.Caption := Data.UperName;
@@ -260,10 +263,12 @@ begin
   Application.ProcessMessages;
 end;
 
-procedure TUpFileView.btnFolderClick(Sender: TObject);
+procedure TUpFileView.btnDeleteClick(Sender: TObject);
 begin
-  FrameClick(Sender);
-  ShellExecute(Handle, nil, PChar('explorer.exe'), PChar('/e,/select,' + Data.LocalFile), nil, SW_Show);
+  if Application.MessageBox('确定要在线上移除该附件吗?', '询问', MB_YESNO + MB_ICONQUESTION) = ID_No then
+    Exit;
+  TUpFileManageView(Owner).DeleteViewAndData(Self, True);
+  //ShellExecute(Handle, nil, PChar('explorer.exe'), PChar('/e,/select,' + Data.LocalFile), nil, SW_Show);
 end;
 
 procedure TUpFileView.SetProjectData(const Value: TObject);

+ 18 - 3
Forms/UpFileManageFrame.dfm

@@ -358,7 +358,7 @@ object UpFileManageView: TUpFileManageView
       OnClick = btnEditClick
     end
     object btnEditNo: TPNGButton
-      Left = 324
+      Left = 273
       Top = 216
       Width = 51
       Height = 24
@@ -445,7 +445,7 @@ object UpFileManageView: TUpFileManageView
       Width = 51
       Height = 24
       Font.Charset = DEFAULT_CHARSET
-      Font.Color = 46336
+      Font.Color = clBlue
       Font.Height = -13
       Font.Name = #24494#36719#38597#40657
       Font.Style = []
@@ -478,6 +478,7 @@ object UpFileManageView: TUpFileManageView
         401CF38041C7A81B89D445293D26EA85C23123A93F012797324CF856D3B70000
         000049454E44AE426082}
       ButtonStyle = pbsFlat
+      Enabled = False
       OnClick = btnDownClick
     end
     object Shape4: TShape
@@ -606,7 +607,7 @@ object UpFileManageView: TUpFileManageView
       ParentFont = False
     end
     object btnEditYes: TPNGButton
-      Left = 271
+      Left = 324
       Top = 216
       Width = 51
       Height = 24
@@ -714,4 +715,18 @@ object UpFileManageView: TUpFileManageView
     Left = 200
     Top = 16
   end
+  object pmUp: TPopupMenu
+    AutoHotkeys = maManual
+    Left = 144
+    Top = 8
+    object miLocalUp: TMenuItem
+      Caption = #26412#22320#19978#20256
+      OnClick = miLocalUpClick
+    end
+    object miServerUp: TMenuItem
+      Caption = #20174#39033#30446#25991#20214#36873#25321
+      Visible = False
+      OnClick = miServerUpClick
+    end
+  end
 end

+ 144 - 77
Forms/UpFileManageFrame.pas

@@ -11,7 +11,8 @@ interface
 
 uses
   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
-  Dialogs, StdCtrls, ExtCtrls, PNGButton, UpFileFrame, UpFileManageUnit, sdDB;
+  Dialogs, StdCtrls, ExtCtrls, PNGButton, UpFileFrame, UpFileManageUnit, sdDB,
+  Menus, Buttons;
 
 type
   TUpFileManageView = class(TFrame)
@@ -45,17 +46,23 @@ type
     edtFileName: TEdit;
     sbFile: TScrollBox;
     tDelView: TTimer;
+    pmUp: TPopupMenu;
+    miLocalUp: TMenuItem;
+    miServerUp: TMenuItem;
     procedure btnEditClick(Sender: TObject);
     procedure btnEditYesClick(Sender: TObject);
     procedure btnEditNoClick(Sender: TObject);
     procedure btnSelectUpFileClick(Sender: TObject);
     procedure tDelViewTimer(Sender: TObject);
     procedure btnDownClick(Sender: TObject);
+    procedure miLocalUpClick(Sender: TObject);
+    procedure miServerUpClick(Sender: TObject);
   private
     FDetailIsEdit: Boolean;
     FSelected: TUpFileView;
     FDatas: TUpFiles;
     FWaitForDelete: TUpFileView;
+    FDeleteAttachmentOnLine: Boolean;
     FOwner: TObject;
     FProjectData: TObject;
     FRec: TsdDataRecord;
@@ -75,10 +82,11 @@ type
     procedure SetOwner(const Value: TObject);
     procedure SetProjectData(const Value: TObject);
     procedure SetRec(const Value: TsdDataRecord);
+    procedure SelectUpFile;
 
   public
     constructor Create(AOwner: TComponent); override;
-    procedure DeleteViewAndData(AView: TUpFileView);
+    procedure DeleteViewAndData(AView: TUpFileView; ANeedDeleteOnLine: Boolean);
     procedure DoOnBillChange(ARec: TsdDataRecord);
 
     property ProjectData: TObject read FProjectData write SetProjectData;
@@ -93,7 +101,7 @@ type
 implementation
 
 uses PHPWebDm, ProjectData, IdGlobal, ProjectFme, ConstUnit, MainFrm,
-  BillsMeasureDm, UtilMethods;
+  BillsMeasureDm, UtilMethods, UpFileSelectOnLineFrm;
 
 
 {$R *.dfm}
@@ -111,6 +119,8 @@ begin
   lblUpTime.Caption := '';
   lblCategory.Caption := '';
   mmMemo.Clear;
+  btnEdit.Enabled := False;
+  btnDown.Enabled := False;
 end;
 
 procedure TUpFileManageView.DetailIntoEditStatus;
@@ -156,7 +166,7 @@ begin
   if (FRec <> nil) {and (FRec.ValueByName('HasAttachment').AsBoolean = True)} then
     for i := 0 to Datas.Count - 1 do
     begin
-      if Datas[i].BillID = FRec.ValueByName('ID').AsInteger then
+      if (Datas[i].BillID = FRec.ValueByName('ID').AsInteger) and (Datas[i].Phase = TProjectData(FProjectData).PhaseIndex) then
         AddUpFileView(Datas[i]);
     end;
 end;
@@ -180,7 +190,8 @@ begin
     mmMemo.Text := vFile.Memo;
   end;
 
-  btnEdit.Enabled := edtFileName.Text <> '';
+  btnEdit.Enabled := (edtFileName.Text <> '') and (PHPWeb.UserID = vFile.UperID); // TProjectData(FProjectData).CurUserIsAuthor;
+  btnDown.Enabled := (edtFileName.Text <> '');
 end;
 
 procedure TUpFileManageView.RefreshOtherFileFrames;
@@ -267,65 +278,11 @@ begin
 end;
 
 procedure TUpFileManageView.btnSelectUpFileClick(Sender: TObject);
-var vODlg: TOpenDialog;
-  i, iBillID, iPhase: Integer;
-  vFile: TUpFile;
-  sFile, sName: string;
-  iV: Int64;
+var
+  P: TPoint;
 begin
-  vODlg := TOpenDialog.Create(nil);
-  vODlg.Options := vODlg.Options + [ofAllowMultiSelect];
-
-  if vODlg.Execute then
-  begin
-    for i := 0 to vODlg.Files.Count - 1 do
-    begin
-      sFile := vODlg.Files[i];
-      iV := FileSizeByName(sFile);
-      if iV >= 10485760 then
-      begin
-        Application.MessageBox(PChar('“' + sFile + '”过大,单个文件上传不能超过10M!'), '提示', MB_OK + MB_ICONINFORMATION);
-        Continue;
-      end;
-
-      with MainForm.CurProjectFrame.dxsbViewControl do
-      begin
-        if SelectedItem = Groups[0].Items[0] then
-          iBillID := TProjectData(FProjectData).BillsCompileData.BillsCompileTree.Selected.ID
-        else if SelectedItem = Groups[0].Items[1] then
-          iBillID := TProjectData(FProjectData).BillsMeasureData.BillsMeasureTree.Selected.ID;
-      end;
-
-      iPhase := TProjectData(FProjectData).PhaseIndex;
-      sName := ExtractFileName(sFile);
-
-      vFile := Datas.Add(iBillID, iPhase);
-      vFile.OrgFile := sFile;
-      vFile.Category := '台帐附件';
-      vFile.Memo := '我的备注';
-      vFile.LocalFile := Datas.Path + sName;
-      vFile.DisplayName := sName;
-      vFile.Status := ufsNeedUp;
-
-      if G_IsCloud then
-      begin
-        // 添加到类→上传到服务器,生成ID→再到类中修改ID。为什么不先上传到服务器生成ID
-        // 再添加到类并设置ID这样可以一气呵成呢?因为需要给用户一个交互界面让用户可以批量
-        // 操作并决定取消某几个上传。这个交互界面的数据来自类。
-        vFile.WebID := TProjectData(FProjectData).WebID;
-        vFile.UperID := PHPWeb.UserID;
-        vFile.UperName := PHPWeb.RealName;
-        vFile.UpTime := FormatDateTime('yyyy-mm-dd hh:mm', Now);
-      end
-      else
-      begin
-        //
-      end;
-
-      AddUpFileView(vFile);
-    end;
-  end;
-  Application.ProcessMessages;
+  GetCursorPos(P);
+  pmUp.Popup(P.X, P.Y);
 end;
 
 procedure TUpFileManageView.SetDatas(const Value: TUpFiles);
@@ -337,7 +294,9 @@ procedure TUpFileManageView.AddUpFileView(AUpFile: TUpFile);
 var vVew: TUpFileView;
 begin
   vVew := TUpFileView.Create(Self);
-  vVew.Name := Format('UpFileView%d', [AUpFile.No]);    // 此时ID尚末获取,不能用ID
+// 先删再增会重复。
+//  vVew.Name := Format('UpFileView%d', [AUpFile.No]);    // 此时ID尚末获取,不能用ID
+  vVew.Name := Format('UpFileView_%s', [PHPWeb.TempName]);
   vVew.Owner := Self;
   vVew.ProjectData := FProjectData;
   vVew.parent := sbFile;
@@ -345,9 +304,10 @@ begin
   vVew.Data := AUpFile;
 end;
 
-procedure TUpFileManageView.DeleteViewAndData(AView: TUpFileView);
+procedure TUpFileManageView.DeleteViewAndData(AView: TUpFileView; ANeedDeleteOnLine: Boolean);
 begin
   WaitForDelete := AView;
+  FDeleteAttachmentOnLine := ANeedDeleteOnLine;
   tDelView.Enabled := True;
 end;
 
@@ -356,6 +316,12 @@ var vUpFile: TUpFile;
 begin
   tDelView.Enabled := False;
   vUpFile := WaitForDelete.Data;
+  if FDeleteAttachmentOnLine then
+    if PHPWeb.DeleteAttachment(vUpFile.ID) <> 1 then
+    begin
+      Application.MessageBox('线上附件移除失败,请重试!', '警告', MB_OK + MB_ICONWARNING);
+      Exit;
+    end;
   WaitForDelete.Free;
   Datas.Delete(vUpFile);
 end;
@@ -378,23 +344,40 @@ begin
 end;
 
 procedure TUpFileManageView.btnDownClick(Sender: TObject);
-var sFile: string;
+var svDlg: TSaveDialog;
+  sFile: string;
 begin
   if not Assigned(Selected) then Exit;
 
-  Screen.Cursor := crHourGlass;
+  svDlg := TSaveDialog.Create(nil);
+  svDlg.InitialDir := ExtractFilePath(Application.ExeName) + 'UserData\';
+  svDlg.FileName := Selected.Data.DisplayName;
+
   try
-    Selected.Data.Status := ufsDowning;
-    sFile := Selected.Data.LocalFile;
-    if PHPWeb.DownFile(Selected.Data.DownURL, sFile) then
-    begin
-      Selected.Data.Status := ufsNormal;
-    end
-    else
-    begin
-      Selected.Data.Status := ufsDownFail;
-    end;
+    if svDlg.Execute then
+    begin 
+      if FileExists(svDlg.FileName) then
+       begin
+         if Application.MessageBox('文件已存在,是否覆盖?', '询问', MB_YESNO) = ID_NO then
+           Exit;
+       end;
+
+      Screen.Cursor := crHourGlass;
+      Selected.Data.Status := ufsDowning;
+      sFile := svDlg.FileName;
+      if PHPWeb.DownFile(Selected.Data.DownURL, sFile) then
+      begin
+        Selected.Data.Status := ufsNormal;
+      end
+      else
+      begin
+        Selected.Data.Status := ufsDownFail;
+      end;
+    end 
+    else 
+      Exit;
   finally
+    svDlg.Free;
     Screen.Cursor := crDefault;
   end;
 end;
@@ -448,4 +431,88 @@ begin
   lblBillName.Update;
 end;
 
+procedure TUpFileManageView.SelectUpFile;
+var vODlg: TOpenDialog;
+  i, iBillID: Integer;
+  vFile: TUpFile;
+  sFile, sName: string;
+  iV: Int64;
+begin
+  vODlg := TOpenDialog.Create(nil);
+  vODlg.Options := vODlg.Options + [ofAllowMultiSelect];
+
+  if vODlg.Execute then
+  begin
+    for i := 0 to vODlg.Files.Count - 1 do
+    begin
+      sFile := vODlg.Files[i];
+      iV := FileSizeByName(sFile);
+      if iV >= 10485760 then
+      begin
+        Application.MessageBox(PChar('“' + sFile + '”过大,单个文件上传不能超过10M!'), '提示', MB_OK + MB_ICONINFORMATION);
+        Continue;
+      end;
+
+      with MainForm.CurProjectFrame.dxsbViewControl do
+      begin
+        if SelectedItem = Groups[0].Items[0] then
+          iBillID := TProjectData(FProjectData).BillsCompileData.BillsCompileTree.Selected.ID
+        else if SelectedItem = Groups[0].Items[1] then
+          iBillID := TProjectData(FProjectData).BillsMeasureData.BillsMeasureTree.Selected.ID;
+      end;
+
+      sName := ExtractFileName(sFile);
+
+      vFile := Datas.Add(iBillID);
+      vFile.Phase := TProjectData(FProjectData).PhaseIndex;
+      vFile.OrgFile := sFile;
+      vFile.Category := '台帐附件';
+      vFile.Memo := '我的备注';
+      vFile.LocalFile := Datas.Path + sName;
+      vFile.DisplayName := sName;
+      vFile.Status := ufsNeedUp;
+
+      if G_IsCloud then
+      begin
+        // 添加到类→上传到服务器,生成ID→再到类中修改ID。为什么不先上传到服务器生成ID
+        // 再添加到类并设置ID这样可以一气呵成呢?因为需要给用户一个交互界面让用户可以批量
+        // 操作并决定取消某几个上传。这个交互界面的数据来自类。
+        vFile.WebID := TProjectData(FProjectData).WebID;
+        vFile.UperID := PHPWeb.UserID;
+        vFile.UperName := PHPWeb.RealName;
+        vFile.UpTime := FormatDateTime('yyyy-mm-dd hh:mm', Now);
+      end
+      else
+      begin
+        //
+      end;
+
+      AddUpFileView(vFile);
+    end;
+  end;
+  Application.ProcessMessages;
+end;
+
+procedure TUpFileManageView.miLocalUpClick(Sender: TObject);
+begin
+  SelectUpFile;
+end;
+
+procedure TUpFileManageView.miServerUpClick(Sender: TObject);
+var
+  vForm: TUpFileSelectOnLineForm;
+begin
+  vForm := TUpFileSelectOnLineForm.Create(nil);
+  try
+    vForm.InitData(FDatas.List);
+    if vForm.ModalResult = mrOK then
+    begin
+      vForm.UpOnlineFiles;
+    end;
+  finally
+    vForm.Free;
+  end;
+
+end;
+
 end.

+ 169 - 0
Forms/UpFileSelectOnLineFrm.dfm

@@ -0,0 +1,169 @@
+object UpFileSelectOnLineForm: TUpFileSelectOnLineForm
+  Left = 1121
+  Top = 282
+  BorderStyle = bsDialog
+  Caption = #32447#19978#36873#25321#38468#20214
+  ClientHeight = 467
+  ClientWidth = 631
+  Color = clBtnFace
+  Font.Charset = ANSI_CHARSET
+  Font.Color = clWindowText
+  Font.Height = -13
+  Font.Name = #24494#36719#38597#40657
+  Font.Style = []
+  OldCreateOrder = False
+  Position = poMainFormCenter
+  PixelsPerInch = 96
+  TextHeight = 19
+  object ZJGrid1: TZJGrid
+    Left = 5
+    Top = 5
+    Width = 621
+    Height = 428
+    Options = [goRangeSelect, goRowSizing, goColSizing, goCellNotMaintainData, goFixedRowShowNo, goFixedColShowNo, goAlwaysShowSelection]
+    OptionsEx = []
+    ColCount = 4
+    RowCount = 2
+    ShowGridLine = False
+    DefaultColWidth = 70
+    DefaultFixedColWidth = 30
+    Selection.AlphaBlend = False
+    Selection.TransparentColor = False
+    FrozenCol = 0
+    FrozenRow = 0
+    Font.Charset = ANSI_CHARSET
+    Font.Color = clWindowText
+    Font.Height = -13
+    Font.Name = #23435#20307
+    Font.Style = []
+    ParentFont = False
+  end
+  object btnOK: TButton
+    Left = 470
+    Top = 437
+    Width = 75
+    Height = 25
+    Caption = #30830#23450
+    ModalResult = 1
+    TabOrder = 1
+  end
+  object btnCancel: TButton
+    Left = 550
+    Top = 437
+    Width = 75
+    Height = 25
+    Caption = #21462#28040
+    ModalResult = 2
+    TabOrder = 2
+  end
+  object ZjGridDBA1: TZjGridDBA
+    Columns = <
+      item
+        Title.Caption = #38468#20214#21517#31216
+        Title.CaptionAcrossCols = '1'
+        Title.Font.Charset = GB2312_CHARSET
+        Title.Font.Color = clWindowText
+        Title.Font.Height = -12
+        Title.Font.Name = #23435#20307
+        Title.Font.Style = []
+        Alignment = taLeftJustify
+        Font.Charset = GB2312_CHARSET
+        Font.Color = clWindowText
+        Font.Height = -12
+        Font.Name = #23435#20307
+        Font.Style = []
+        FieldName = 'Name'
+        Width = 400
+        ReadOnly = True
+      end
+      item
+        Title.Caption = #19978#20256#32773
+        Title.CaptionAcrossCols = '1'
+        Title.Font.Charset = GB2312_CHARSET
+        Title.Font.Color = clWindowText
+        Title.Font.Height = -12
+        Title.Font.Name = #23435#20307
+        Title.Font.Style = []
+        Alignment = taCenter
+        Font.Charset = GB2312_CHARSET
+        Font.Color = clWindowText
+        Font.Height = -12
+        Font.Name = #23435#20307
+        Font.Style = []
+        FieldName = 'Uper'
+        ReadOnly = True
+      end
+      item
+        Title.Caption = #36873#25321
+        Title.CaptionAcrossCols = '1'
+        Title.Font.Charset = GB2312_CHARSET
+        Title.Font.Color = clWindowText
+        Title.Font.Height = -12
+        Title.Font.Name = #23435#20307
+        Title.Font.Style = []
+        Alignment = taCenter
+        Font.Charset = GB2312_CHARSET
+        Font.Color = clWindowText
+        Font.Height = -12
+        Font.Name = #23435#20307
+        Font.Style = []
+        FieldName = 'Select'
+        Width = 50
+        ReadOnly = False
+      end>
+    DataSet = cdsFiles
+    Grid = ZJGrid1
+    ExtendRowCount = 1
+    Options = [aoAllowEdit, aoAutoInsert, aoAllowUpMove, aoAllowDownMove]
+    Left = 384
+    Top = 88
+  end
+  object cdsFiles: TClientDataSet
+    Active = True
+    Aggregates = <>
+    FieldDefs = <
+      item
+        Name = 'ID'
+        DataType = ftString
+        Size = 20
+      end
+      item
+        Name = 'Name'
+        DataType = ftString
+        Size = 255
+      end
+      item
+        Name = 'Uper'
+        DataType = ftString
+        Size = 20
+      end
+      item
+        Name = 'Select'
+        DataType = ftBoolean
+      end>
+    IndexDefs = <>
+    FetchOnDemand = False
+    Params = <>
+    StoreDefs = True
+    Left = 416
+    Top = 88
+    Data = {
+      720000009619E0BD010000001800000004000000000003000000720002494401
+      00490000000100055749445448020002001400044E616D650200490000000100
+      05574944544802000200FF000455706572010049000000010005574944544802
+      00020014000653656C65637402000300000000000000}
+    object cdsFilesID: TStringField
+      FieldName = 'ID'
+    end
+    object cdsFilesName: TStringField
+      FieldName = 'Name'
+      Size = 255
+    end
+    object cdsFilesUper: TStringField
+      FieldName = 'Uper'
+    end
+    object cdsFilesSelect: TBooleanField
+      FieldName = 'Select'
+    end
+  end
+end

+ 77 - 0
Forms/UpFileSelectOnLineFrm.pas

@@ -0,0 +1,77 @@
+unit UpFileSelectOnLineFrm;
+
+interface
+
+uses
+  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
+  Dialogs, StdCtrls, DB, DBClient, ZjGridDBA, ZJGrid;
+
+type
+  TUpFileSelectOnLineForm = class(TForm)
+    ZJGrid1: TZJGrid;
+    ZjGridDBA1: TZjGridDBA;
+    cdsFiles: TClientDataSet;
+    btnOK: TButton;
+    btnCancel: TButton;
+    cdsFilesID: TStringField;
+    cdsFilesName: TStringField;
+    cdsFilesUper: TStringField;
+    cdsFilesSelect: TBooleanField;
+  private
+    { Private declarations }
+  public
+    { Public declarations }
+    procedure InitData(AList: TList);
+    procedure UpOnlineFiles;
+  end;
+
+implementation
+
+uses UpFileManageUnit, Math, PHPWebDm;
+
+{$R *.dfm}
+
+{ TUpFileSelectOnLineForm }
+
+procedure TUpFileSelectOnLineForm.InitData(AList: TList);
+var i: Integer;
+  vFile: TUpFile;
+begin
+  if AList.Count = 0 then Exit;
+
+  if cdsFiles.RecordCount > 0 then
+    cdsFiles.EmptyDataSet;
+
+  for i := 0 to AList.Count - 1 do
+  begin
+    vFile := TUpFile(AList[i]);
+    cdsFiles.Append;
+    cdsFilesID.AsInteger := vFile.ID;
+    cdsFilesName.AsString := vFile.DisplayName;
+    cdsFilesUper.AsString := vFile.UperName;
+    cdsFiles.Post;
+  end;
+end;
+
+procedure TUpFileSelectOnLineForm.UpOnlineFiles;
+var L: Integer;
+  vA: array of string;
+begin
+  if cdsFiles.RecordCount = 0 then Exit;
+  L := 0;
+  cdsFiles.First;
+  while not cdsfiles.Eof do
+  begin
+    if cdsFilesSelect.AsBoolean = True then
+    begin
+      Inc(L);
+      SetLength(vA, L);
+      vA[L - 1] := cdsFilesID.AsString;
+    end;
+    cdsFiles.Next;
+  end;
+//  if L > 0 then       AAAAA
+//    PHPWeb.UpAttachment(PHPWeb.UserID, );
+end;
+
+end.

+ 0 - 1
Frames/ProjectFme.dfm

@@ -228,7 +228,6 @@ object ProjectFrame: TProjectFrame
           Left = 366
           Top = 0
           Caption = #38468'  '#20214
-          Enabled = False
           ImageIndex = 6
           Style = tbsCheck
           Visible = False

+ 2 - 2
Frames/ProjectFme.pas

@@ -528,8 +528,8 @@ procedure TProjectFrame.dxsbViewControlItemClick(Sender: TObject;
       if (Item.Tag = xbiBillsCompile.Tag) or (Item.Tag = xbiBillsMeasure.Tag) then
         CheckUpFile;
 
-    tobtnUpFile.Enabled := Item.Tag = xbiBillsMeasure.Tag;
-    if (tobtnUpFile.Enabled = False) and (jpsAssistant.ActivePage = jpsAssistantUpFile) then
+    tobtnUpFile.Visible := Item.Tag = xbiBillsMeasure.Tag;
+    if (tobtnUpFile.Visible = False) and (jpsAssistant.ActivePage = jpsAssistantUpFile) then
       jpsAssistant.ActivePage := jpsAssistantStandardBills;
   end;
 

+ 2 - 2
Frames/ProjectManagerFme.pas

@@ -1485,7 +1485,7 @@ begin
     (CurRec.ValueByName('WebID').AsInteger = AWebID) and
     (CurRec.ValueByName('Type').AsInteger = 1) then
   begin
-    GetLocalValues(vRec);
+    GetLocalValues(CurRec);
     Exit;
   end;
 
@@ -1526,7 +1526,7 @@ begin
     (CurRec.ValueByName('WebID').AsInteger = AWebID) and
     (CurRec.ValueByName('Type').AsInteger = 1) then
   begin
-    Result := vRec.ValueByName('WebMD5').AsString;
+    Result := CurRec.ValueByName('WebMD5').AsString;
     Exit;
   end;
 

+ 4 - 3
Units/PhaseData.pas

@@ -286,12 +286,13 @@ procedure TPhaseData.CheckAuditCount;
 var
   iAuditCount: Integer;
 begin
-  if FPhaseProperty.AuditCount = 0 then
-  begin
+  // ¸ÄÎªÇ¿ÖÆ¼ìÑé
+  //if FPhaseProperty.AuditCount = 0 then
+  //begin
     iAuditCount := GetRealAuditCount;
     if iAuditCount <> FPhaseProperty.AuditCount then
       FPhaseProperty.AuditCount := iAuditCount;
-  end;
+  //end;
 end;
 
 function TPhaseData.GetIsLastStage: Boolean;

+ 7 - 7
Units/ProjectCommands.pas

@@ -743,9 +743,9 @@ begin
   sFileName := ExtractSimpleFileName(FResultFile);
   CopyFileOrFolder(FFileName, FTempFolder + '\' + sFileName);
 
-  if not G_IsCloud then   // 云版不导出附件,云版的运作机制是从网上下载
-    if AExportAttachment then
-      CopyFolder(FAttachmentPath, FTempFolder + '\' + sFileName + '[附件包]');
+//  if not G_IsCloud then   // 云版不导出附件,云版的运作机制是从网上下载
+//    if AExportAttachment then
+//      CopyFolder(FAttachmentPath, FTempFolder + '\' + sFileName + '[附件包]');
 
   ZipFolder(FTempFolder, FResultFile);
 end;
@@ -1012,11 +1012,11 @@ begin
   GetNewNode;
   LoadXmlInfo;
   sFile := FTempFolder + '\' + FTenderFileName;
-  sFJ := sFile + '[附件包]';
+//  sFJ := sFile + '[附件包]';
   CopyFileOrFolder(sFile, GetMyProjectsFilePath + FNewNode.Rec.ValueByName('FileName').AsString);
-  if not G_IsCloud then          // 云版附件从服务器获取,不导入。
-    if DirectoryExists(sFJ) then
-      CopyFolder(sFJ, GetMyProjectsFilePath + 'Attachment\' + FNewNode.Rec.ValueByName('FileName').AsString);
+//  if not G_IsCloud then          // 云版附件从服务器获取,不导入。
+//    if DirectoryExists(sFJ) then
+//      CopyFolder(sFJ, GetMyProjectsFilePath + 'Attachment\' + FNewNode.Rec.ValueByName('FileName').AsString);
 end;
 
 procedure TTenderImport.GetNewNode;

+ 114 - 95
Units/UpFileManageUnit.pas

@@ -96,9 +96,9 @@ type
     FPath: string;
 
     // -------------业务扩展,单机版本地也要存储管理附件,以下这部分适用于单机版。
-    FLocalCon: TADOConnection;
-    FLocalQue: TADOQuery;
-    FLocalQue2: TADOQuery;
+//    FLocalCon: TADOConnection;
+//    FLocalQue: TADOQuery;
+//    FLocalQue2: TADOQuery;
 
     function GetItem(Index: Integer): TUpFile;
     procedure Clear;
@@ -108,24 +108,26 @@ type
     constructor Create;
     destructor Destroy; override;
     function Add(AUpFile: TUpFile): Integer; overload;                          // 返回索引号
-    function Add(ABillID, APhase: Integer): TUpFile; overload;
-
+    function Add(ABillID: Integer): TUpFile; overload;
+    function Find(AID: Integer): TUpFile;
     procedure Delete(AIndex: Integer); overload;
     procedure Delete(AUpFile: TUpFile); overload;
     procedure Exchange(AUpFile1, AUpFile2: TUpFile);
     procedure LoadDatas;
-    function LocalSaveToDB(AUpFile: TUpFile): Integer;                          // 返回ID
+//    function LocalSaveToDB(AUpFile: TUpFile): Integer;                          // 返回ID
 
     property Item[Index: Integer]: TUpFile read GetItem; default;
     property Count: Integer read GetCount;
     property ProjectData: TObject read FProjectData write SetProjectData;
     property Path: string read FPath;
+    property List: TList read FList;
   end;
 
 
 implementation
 
-uses ProjectData, Forms, PHPWebDm, CslJson, ConstUnit, UtilMethods;
+uses ProjectData, Forms, PHPWebDm, CslJson, ConstUnit, UtilMethods,
+  StdConvs;
 
 { TUpFile }
 
@@ -194,21 +196,22 @@ constructor TUpFiles.Create;
 begin
   FList := TList.Create;
 
-  if not G_IsCloud then
-  begin
-    FLocalCon := TADOConnection.Create(nil);
-    FLocalCon.LoginPrompt := False;
-
-    FLocalQue := TADOQuery.Create(nil);
-    FLocalQue.Connection := FLocalCon;
-
-    FLocalQue2 := TADOQuery.Create(nil);
-    FLocalQue2.Connection := FLocalCon;
-  end;
+//  if not G_IsCloud then
+//  begin
+//    FLocalCon := TADOConnection.Create(nil);
+//    FLocalCon.LoginPrompt := False;
+//
+//    FLocalQue := TADOQuery.Create(nil);
+//    FLocalQue.Connection := FLocalCon;
+//
+//    FLocalQue2 := TADOQuery.Create(nil);
+//    FLocalQue2.Connection := FLocalCon;
+//  end;
 end;
 
 procedure TUpFiles.Delete(AUpFile: TUpFile);
 begin
+  if AUpFile = nil then Exit;
   FList.Remove(AUpFile);
 end;
 
@@ -223,15 +226,15 @@ begin
   Clear;
   FList.Free;
 
-  if not G_IsCloud then
-  begin
-    FLocalQue.Close;
-    FLocalQue.Free;
-    FLocalQue2.Close;
-    FLocalQue2.Free;
-    FLocalCon.Close;
-    FLocalCon.Free;
-  end;
+//  if not G_IsCloud then
+//  begin
+//    FLocalQue.Close;
+//    FLocalQue.Free;
+//    FLocalQue2.Close;
+//    FLocalQue2.Free;
+//    FLocalCon.Close;
+//    FLocalCon.Free;
+//  end;
 
   inherited;
 end;
@@ -260,53 +263,53 @@ end;
 
 procedure TUpFiles.LoadDatas;
 var vArrFile: TOVArr;
-  i, iBillID, iPhase: Integer;
+  i, iBillID: Integer;
   vFile: TUpFile;
 begin
   if G_IsCloud then
   begin
-    if PHPWeb.GetAttachmentFileList(TProjectData(FProjectData).WebID, vArrFile) then
+    if PHPWeb.GetAttachmentList(TProjectData(FProjectData).WebID, vArrFile) then
     begin
       for i := Low(vArrFile) to High(vArrFile) do
       begin
         iBillID := StrToInt(vArrFile[i, 4]);
-        iPhase := 0;  // AAAAA
-        vFile := Add(iBillID, iPhase);
-        vFile.ID := StrToInt(vArrFile[i, 9]);
-        vFile.WebID := TProjectData(FProjectData).WebID;
+        vFile := Add(iBillID);    // AAAAA
+        vFile.DownURL := vArrFile[i, 0];
+        vFile.DisplayName := vArrFile[i, 1];
+        vFile.LocalFile := FPath + vArrFile[i, 1];
+        vFile.UperName := vArrFile[i, 3];
         vFile.Category := vArrFile[i, 5];
         vFile.Memo := vArrFile[i, 6];
         vFile.UperID := StrToInt(vArrFile[i, 7]);
-        vFile.UperName := vArrFile[i, 3];
         vFile.UpTime := vArrFile[i, 8];
-        vFile.LocalFile := FPath + vArrFile[i, 1];
-        vFile.DisplayName := vArrFile[i, 1];
-        vFile.DownURL := vArrFile[i, 0];
+        vFile.ID := StrToInt(vArrFile[i, 9]);
+        vFile.Phase := StrToInt(vArrFile[i, 10]);     // vArrFile[i, 2] 文件扩展名
+        vFile.WebID := TProjectData(FProjectData).WebID;
         vFile.Status := ufsNormal;
       end;
     end;
-  end
-  else
-  begin
-    FLocalQue.Close;
-    FLocalQue.SQL.Text := 'Select * from AttachmentFile order by ID';
-    FLocalQue.Open;
-    FLocalQue.First;
-
-    while not FLocalQue.Eof do
-    begin
-      iBillID := FLocalQue.FieldByName('BillID').AsInteger;
-      iPhase := FLocalQue.FieldByName('Phase').AsInteger;
-      vFile := Add(iBillID, iPhase);
-      vFile.ID := FLocalQue.FieldByName('ID').AsInteger;
-      vFile.LocalFile := FPath + FLocalQue.FieldByName('FileName').AsString;
-      vFile.DisplayName := FLocalQue.FieldByName('FileName').AsString;
-
-      FLocalQue.Next;
-    end;
-
-    FLocalCon.Close;
   end;
+//  else
+//  begin
+//    FLocalQue.Close;
+//    FLocalQue.SQL.Text := 'Select * from AttachmentFile order by ID';
+//    FLocalQue.Open;
+//    FLocalQue.First;
+//
+//    while not FLocalQue.Eof do
+//    begin
+//      iBillID := FLocalQue.FieldByName('BillID').AsInteger;
+//      iPhase := FLocalQue.FieldByName('Phase').AsInteger;
+//      vFile := Add(iBillID, iPhase);
+//      vFile.ID := FLocalQue.FieldByName('ID').AsInteger;
+//      vFile.LocalFile := FPath + FLocalQue.FieldByName('FileName').AsString;
+//      vFile.DisplayName := FLocalQue.FieldByName('FileName').AsString;
+//
+//      FLocalQue.Next;
+//    end;
+//
+//    FLocalCon.Close;
+//  end;
 end;
 
 procedure TUpFile.SetID(const Value: Integer);
@@ -345,24 +348,24 @@ begin
     FPath := PHPWeb.WebPath + 'Projects\' + IntToStr(TProjectData(FProjectData).WebID) + '\Attachment\';
     if not DirectoryExists(FPath) then
       ForceDirectories(FPath);
-  end
-  else
-  begin
-    FPath := ExtractFilePath(Application.ExeName) + '我的项目\Attachment\' + ExtractFileName(TProjectData(FProjectData).FileName) + '\';
-    if not DirectoryExists(FPath) then
-      ForceDirectories(FPath);
-
-    sLAFM := FPath + 'LocalAttachmentFileManager.dat';
-    sModelFile := ExtractFilePath(Application.ExeName) + 'Data\LocalAttachmentFileManager.dat';
-    if not FileExists(sLAFM) then
-      if not CopyFile(PChar(sModelFile), PChar(sLAFM), True) then
-      begin
-        Application.MessageBox(PChar('本地附件管理库模板文件“' + sModelFile + '”丢失或被占用无法复制。'), '警告', MB_OK + MB_ICONWARNING);
-        Exit;
-      end;
-
-    FLocalCon.ConnectionString := Format('Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s;Persist Security Info=False;', [sLAFM]);
   end;
+//  else
+//  begin
+//    FPath := ExtractFilePath(Application.ExeName) + '我的项目\Attachment\' + ExtractFileName(TProjectData(FProjectData).FileName) + '\';
+//    if not DirectoryExists(FPath) then
+//      ForceDirectories(FPath);
+//
+//    sLAFM := FPath + 'LocalAttachmentFileManager.dat';
+//    sModelFile := ExtractFilePath(Application.ExeName) + 'Data\LocalAttachmentFileManager.dat';
+//    if not FileExists(sLAFM) then
+//      if not CopyFile(PChar(sModelFile), PChar(sLAFM), True) then
+//      begin
+//        Application.MessageBox(PChar('本地附件管理库模板文件“' + sModelFile + '”丢失或被占用无法复制。'), '警告', MB_OK + MB_ICONWARNING);
+//        Exit;
+//      end;
+//
+//    FLocalCon.ConnectionString := Format('Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s;Persist Security Info=False;', [sLAFM]);
+//  end;
 end;
 
 procedure TUpFile.SetOwner(const Value: TUpFiles);
@@ -392,14 +395,13 @@ begin
     FIcon.Handle := sInfo.hIcon;
 end;
 
-function TUpFiles.Add(ABillID, APhase: Integer): TUpFile;
+function TUpFiles.Add(ABillID: Integer): TUpFile;
 var vFile: TUpFile;
 begin
   vFile := TUpFile.Create;
   vFile.No := Add(vFile);
   vFile.Owner := Self;
   vFile.BillID := ABillID;
-  vFile.Phase := APhase;
   Result := vFile;
 end;
 
@@ -408,24 +410,24 @@ begin
   FOrgFile := Value;
 end;
 
-function TUpFiles.LocalSaveToDB(AUpFile: TUpFile): Integer;
-begin
-  try
-    FLocalQue2.Close;
-    FLocalQue2.SQL.Text := 'Select * from AttachmentFile where 1 < 0';
-    FLocalQue2.Open;
-    FLocalQue2.Append;
-    FLocalQue2.FieldByName('BillID').AsInteger := AUpFile.BillID;
-    FLocalQue2.FieldByName('Phase').AsInteger := AUpFile.Phase;
-    FLocalQue2.FieldByName('FileName').AsString := AUpFile.DisplayName;
-    FLocalQue2.Post;
-    Result := FLocalQue2.FieldByName('ID').AsInteger;
-    FLocalQue2.Close;
-  except
-    Result := -1;
-    Application.MessageBox('本地保存失败,请重试!', '警告', MB_OK + MB_ICONWARNING);
-  end;
-end;
+//function TUpFiles.LocalSaveToDB(AUpFile: TUpFile): Integer;
+//begin
+//  try
+//    FLocalQue2.Close;
+//    FLocalQue2.SQL.Text := 'Select * from AttachmentFile where 1 < 0';
+//    FLocalQue2.Open;
+//    FLocalQue2.Append;
+//    FLocalQue2.FieldByName('BillID').AsInteger := AUpFile.BillID;
+//    FLocalQue2.FieldByName('Phase').AsInteger := AUpFile.Phase;
+//    FLocalQue2.FieldByName('FileName').AsString := AUpFile.DisplayName;
+//    FLocalQue2.Post;
+//    Result := FLocalQue2.FieldByName('ID').AsInteger;
+//    FLocalQue2.Close;
+//  except
+//    Result := -1;
+//    Application.MessageBox('本地保存失败,请重试!', '警告', MB_OK + MB_ICONWARNING);
+//  end;
+//end;
 
 procedure TUpFile.SetPhase(const Value: Integer);
 begin
@@ -442,4 +444,21 @@ begin
   Result := ExtractFileExt(DisplayName);
 end;
 
+function TUpFiles.Find(AID: Integer): TUpFile;
+var i: Integer;
+  vUpFile: TUpFile;
+begin
+  vUpFile := nil;
+  for i := 0 to FList.Count - 1 do
+  begin
+   vUpFile := TUpFile(FList[i]);
+   if vUpFile.ID = AID then
+   begin
+     Result := vUpFile;
+     Break;
+   end;
+  end;
+end;
+
+
 end.

+ 6 - 1
Units/UtilMethods.pas

@@ -872,12 +872,14 @@ end;
 {Zip}
 procedure ZipFolder(AFileFolder, AFileName: string);
 var
+  sTempFile: string;
   vZip: TVCLZip;
 begin
+  sTempFile := GetTempFileName;
   vZip := TVCLZip.Create(nil);
   try
     vZip.FilesList.Clear;
-    vZip.ZipName := AFileName;
+    vZip.ZipName := sTempFile;
     vzip.RootDir := AFileFolder;
     vZip.OverwriteMode := Always;
     //vZip.AddDirEntriesOnRecurse:=True;
@@ -885,8 +887,11 @@ begin
     //vZip.RecreateDirs := True;
     vZip.FilesList.Add(AFileFolder + '\*.*');
     vZip.Zip;
+    CopyFileOrFolder(sTempFile, AFileName);
   finally
     vZip.Free;
+    if FileExists(sTempFile) then
+      DeleteFile(sTempFile);
   end;
 end;