mirror of https://gitee.com/cf-fz/WebCAD.git
!2807 优化:文件历史记录数据匹配算法优化
parent
2ef0152036
commit
9fd4791230
@ -0,0 +1,265 @@
|
||||
import { Button, Checkbox, HTMLTable, Intent } from "@blueprintjs/core";
|
||||
import { observable } from "mobx";
|
||||
import { observer } from "mobx-react";
|
||||
import React from "react";
|
||||
import { app } from "../../ApplicationServices/Application";
|
||||
import { FileHistoryFilesUrl, FileUrls } from "../../Common/HostUrl";
|
||||
import { PostJson, RequestStatus } from "../../Common/Request";
|
||||
import { StoreageKeys } from "../../Common/StoreageKeys";
|
||||
import { FileServer } from "../../DatabaseServices/FileServer";
|
||||
import { ModalState } from "../../UI/Components/Modal/ModalInterface";
|
||||
import { AppToaster } from "../../UI/Components/Toaster";
|
||||
import { FetchFile1 } from "./OperLog";
|
||||
import { HistoryProp } from "./OperLogsModal";
|
||||
|
||||
@observer
|
||||
export class OpenHistoryList extends React.Component<HistoryProp, {}>
|
||||
{
|
||||
LastOper = "";
|
||||
CanOpenFileDataMap: Map<number, number> = new Map(); //this.props.data -> this.props.files
|
||||
@observable CanOpen: boolean = false;
|
||||
|
||||
constructor(props)
|
||||
{
|
||||
super(props);
|
||||
if (this.props.newFileId)
|
||||
this.CanOpen = true;
|
||||
|
||||
this.ParseData();
|
||||
}
|
||||
|
||||
ParseData = () =>
|
||||
{
|
||||
for (let i = 0, j = 0; j < this.props.data.length; j++)
|
||||
{
|
||||
if (i >= this.props.files.length)
|
||||
break;
|
||||
let data = this.props.data[j];
|
||||
|
||||
if (data.oper_type_name !== "修改" && data.oper_type_name !== "新建")
|
||||
continue;
|
||||
|
||||
let date = new Date(data.oper_date);
|
||||
let timeNum =
|
||||
(date.getMonth() + 1) * Math.pow(60, 4) +
|
||||
date.getDate() * Math.pow(60, 3) +
|
||||
date.getHours() * Math.pow(60, 2) +
|
||||
date.getMinutes() * 60 +
|
||||
date.getSeconds(); //时分秒转换number 好比较
|
||||
|
||||
for (; i < this.props.files.length; i++)
|
||||
{
|
||||
let canOpenFile = this.props.files[i];
|
||||
let str = canOpenFile.split("-");
|
||||
let canOpenFileDateNum =
|
||||
parseInt(str[str.length - 5]) * Math.pow(60, 4) +
|
||||
parseInt(str[str.length - 4]) * Math.pow(60, 3) +
|
||||
parseInt(str[str.length - 3]) * Math.pow(60, 2) +
|
||||
parseInt(str[str.length - 2]) * 60 +
|
||||
parseInt(str[str.length - 1]); //时分秒转换number 好比较
|
||||
|
||||
if (canOpenFileDateNum - 10 > timeNum)
|
||||
continue;
|
||||
|
||||
if (Math.abs(timeNum - canOpenFileDateNum) < 10)
|
||||
this.CanOpenFileDataMap.set(j, i++);
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
AllDataList = () =>
|
||||
{
|
||||
let count = 0;
|
||||
return (
|
||||
<>
|
||||
{
|
||||
this.props.data.map((data, i) =>
|
||||
{
|
||||
if (data.oper_type_name === "打开")
|
||||
if (this.LastOper === "打开")
|
||||
return;
|
||||
this.LastOper = data.oper_type_name;
|
||||
|
||||
if (data.oper_type_name === "修改")
|
||||
count++;
|
||||
if (this.props.newFileId && count > 20) return;
|
||||
|
||||
let canOpenFileIndex = this.CanOpenFileDataMap.get(i);
|
||||
let file = this.props.files[canOpenFileIndex];
|
||||
|
||||
return <tr key={data.oper_date}>
|
||||
<td>{data.oper_type_name}</td>
|
||||
<td
|
||||
style={{
|
||||
textOverflow: "ellipsis",
|
||||
overflow: "hidden",
|
||||
whiteSpace: "nowrap",
|
||||
maxWidth: 150
|
||||
}}
|
||||
title={`${data.oper_user}`}
|
||||
>
|
||||
{data.oper_user}
|
||||
</td>
|
||||
<td>
|
||||
{data.oper_date}
|
||||
{
|
||||
file && <Button
|
||||
className="histroyBtn"
|
||||
value={file}
|
||||
text="打开"
|
||||
onClick={async (e) =>
|
||||
{
|
||||
this.HandleOpen(e.currentTarget.value);
|
||||
}}
|
||||
/>
|
||||
}
|
||||
</td>
|
||||
</tr>;
|
||||
})
|
||||
}
|
||||
</>
|
||||
);
|
||||
};
|
||||
|
||||
CanOpenDataList = () =>
|
||||
{
|
||||
let count = 0;
|
||||
return (
|
||||
<>
|
||||
{
|
||||
this.props.data.map((data, i) =>
|
||||
{
|
||||
if (data.oper_type_name !== "新建" && data.oper_type_name !== "修改") return;
|
||||
|
||||
let canOpenFileIndex = this.CanOpenFileDataMap.get(i);
|
||||
let file = this.props.files[canOpenFileIndex];
|
||||
|
||||
if (file)
|
||||
{
|
||||
count++;
|
||||
if (this.props.newFileId && count > 20) return;
|
||||
return <tr>
|
||||
<td>{data.oper_type_name}</td>
|
||||
<td
|
||||
style={{
|
||||
textOverflow: "ellipsis",
|
||||
overflow: "hidden",
|
||||
whiteSpace: "nowrap",
|
||||
maxWidth: 150
|
||||
}}
|
||||
title={`${data.oper_user}`}
|
||||
>
|
||||
{data.oper_user}
|
||||
</td>
|
||||
<td>
|
||||
{data.oper_date}
|
||||
<Button
|
||||
className="histroyBtn"
|
||||
value={file}
|
||||
text="打开"
|
||||
onClick={(e) =>
|
||||
{
|
||||
this.HandleOpen(e.currentTarget.value);
|
||||
}} />
|
||||
</td>
|
||||
</tr>;
|
||||
}
|
||||
})
|
||||
}
|
||||
</>
|
||||
);
|
||||
};
|
||||
|
||||
HandleOpen = async (fileTitle: string) =>
|
||||
{
|
||||
const { fileId, newFileId, files, userName } = this.props;
|
||||
let status: boolean = true;
|
||||
if (newFileId)
|
||||
{
|
||||
let server = FileServer.GetInstance();
|
||||
if (fileId != newFileId)
|
||||
{
|
||||
server._CurrentFilePath = "";
|
||||
server.m_CurFileId = newFileId;
|
||||
|
||||
let code = await server.GetFileMD5(newFileId);
|
||||
if (code)
|
||||
{
|
||||
let data = await PostJson(FileUrls.detail, { file_id: newFileId });
|
||||
if (data.err_code === RequestStatus.Ok && data.files?.name)
|
||||
{
|
||||
server.currentFileInfo.name = data.files.name;
|
||||
server.CurrentFileMd5 = code;
|
||||
}
|
||||
|
||||
localStorage.setItem(StoreageKeys.LastOpenFileId, data.files?.file_id || "");
|
||||
}
|
||||
}
|
||||
|
||||
status = await this.OnClickOpenFile(userName, newFileId, fileTitle);
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
status = await this.OnClickOpenFile(userName, fileId, fileTitle);
|
||||
}
|
||||
|
||||
if (!status)
|
||||
{
|
||||
AppToaster.show({
|
||||
message: "打开图纸失败,请尝试打开其他历史记录图纸",
|
||||
timeout: 3000,
|
||||
intent: Intent.DANGER,
|
||||
});
|
||||
return;
|
||||
}
|
||||
if (this.props.isNotToaster)
|
||||
app.Editor.ModalManage.m_PromisRes({ Status: ModalState.Ok });
|
||||
app.Editor.ModalManage.Destory();
|
||||
};
|
||||
|
||||
OnClickOpenFile = async (userName: string, fileId: string, fileTitle: string) =>
|
||||
{
|
||||
try
|
||||
{
|
||||
let url = FileHistoryFilesUrl + encodeURIComponent(userName + "//" + fileId + "//" + fileTitle);
|
||||
let cadf = await FetchFile1(url + ".cad");
|
||||
app.OpenFile(cadf);
|
||||
return true;
|
||||
}
|
||||
catch {
|
||||
return false;
|
||||
}
|
||||
};
|
||||
|
||||
render()
|
||||
{
|
||||
return (
|
||||
<HTMLTable bordered={true} interactive={true} style={{ lineHeight: 0.5, width: "100%", padding: "5px 5px 0px 5px", border: "1px solid #DBDCDD" }}>
|
||||
<thead>
|
||||
<tr>
|
||||
<th style={{ width: 50 }}>操作</th>
|
||||
<th style={{ width: 190 }}>用户名</th>
|
||||
<th>日期
|
||||
<Checkbox
|
||||
label="只显示能还原记录"
|
||||
style={{ position: 'absolute', right: "10px", fontSize: "12px", top: "15px" }}
|
||||
checked={this.CanOpen}
|
||||
onClick={(e) =>
|
||||
{
|
||||
this.LastOper = "";
|
||||
this.CanOpen = !this.CanOpen;
|
||||
e.currentTarget.blur();
|
||||
}} />
|
||||
</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{this.CanOpen ? this.CanOpenDataList() : this.AllDataList()}
|
||||
</tbody>
|
||||
</HTMLTable>
|
||||
);
|
||||
}
|
||||
}
|
Loading…
Reference in new issue