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