Commit 0a94454b authored by jiangzijing's avatar jiangzijing

Merge branch 'feat-20220718' into 'release'

Feat 20220718

See merge request !34
parents dcce10a3 45c5f606
...@@ -86,8 +86,8 @@ const theme = createTheme({ ...@@ -86,8 +86,8 @@ const theme = createTheme({
boxShadow: "none !important", boxShadow: "none !important",
color: "rgba(30, 38, 51, 1)", color: "rgba(30, 38, 51, 1)",
"&:hover": { "&:hover": {
// backgroundColor: "#FFEDED ", backgroundColor: "rgba(240, 242, 245, 1) ",
// border: "1px solid rgba(30, 38, 51, 1)", border: "1px solid rgba(221, 225, 230, 1)",
}, },
}, },
textSecondary: { textSecondary: {
......
...@@ -97,14 +97,12 @@ const ConsoleLayout = observer(() => { ...@@ -97,14 +97,12 @@ const ConsoleLayout = observer(() => {
dropValue={productOpen} dropValue={productOpen}
drop={true} drop={true}
/> />
{/* <ArrowDropDownIcon classes={{ {/* <ArrowDropDownIcon classes={{
root: cx({ root: cx({
[style.ArrowDropDownIconRoot]: true, [style.ArrowDropDownIconRoot]: true,
[style.ArrowDropDownIconRootOpen]: Boolean(productOpen) [style.ArrowDropDownIconRootOpen]: Boolean(productOpen)
}) })
}} /> */} }} /> */}
<Menu <Menu
id="product-menu" id="product-menu"
anchorEl={productAnchorEl} anchorEl={productAnchorEl}
......
...@@ -38,6 +38,7 @@ ...@@ -38,6 +38,7 @@
.taskName { .taskName {
font-size: 14px; font-size: 14px;
font-weight: 500; font-weight: 500;
cursor: pointer;
} }
.taskStatus { .taskStatus {
......
...@@ -13,6 +13,7 @@ import fileIcon from "@/assets/project/fileIcon.svg"; ...@@ -13,6 +13,7 @@ import fileIcon from "@/assets/project/fileIcon.svg";
import dataSetIcon from "@/assets/project/dataSetIcon.svg"; import dataSetIcon from "@/assets/project/dataSetIcon.svg";
type TaskCardProps = { type TaskCardProps = {
id: string;
name: string; name: string;
creator: string; creator: string;
state: string; state: string;
...@@ -24,7 +25,7 @@ type TaskCardProps = { ...@@ -24,7 +25,7 @@ type TaskCardProps = {
}; };
const TaskCard = (props: TaskCardProps) => { const TaskCard = (props: TaskCardProps) => {
const { name, creator, state, completeNum, totalNum, costTime, jobCost, outputs } = props; const { id, name, creator, state, completeNum, totalNum, costTime, jobCost, outputs } = props;
const navigate = useNavigate(); const navigate = useNavigate();
const randerOutputs = useMemo(() => { const randerOutputs = useMemo(() => {
if (outputs) { if (outputs) {
...@@ -62,6 +63,12 @@ const TaskCard = (props: TaskCardProps) => { ...@@ -62,6 +63,12 @@ const TaskCard = (props: TaskCardProps) => {
}); });
} }
} }
// 跳转详情页
const gotoDetail = (id: string) => {
navigate(`/product/cadd/projectJobDetail`, {
state: { taskId: id },
});
}
// 渲染状态图标 // 渲染状态图标
const renderStatusIcon = (data: string) => { const renderStatusIcon = (data: string) => {
switch (data) { switch (data) {
...@@ -140,7 +147,7 @@ const TaskCard = (props: TaskCardProps) => { ...@@ -140,7 +147,7 @@ const TaskCard = (props: TaskCardProps) => {
return <div className={style.cardBox}> return <div className={style.cardBox}>
<div className={style.cardLeft}> <div className={style.cardLeft}>
<div className={style.topLine}> <div className={style.topLine}>
<div className={style.taskName}>{name}</div> <div className={style.taskName} onClick={() => gotoDetail(id)}>{name}</div>
<div className={style.taskStatus} style={{ color: renderTextColor(state), background: renderBackgroundColor(state) }}> <div className={style.taskStatus} style={{ color: renderTextColor(state), background: renderBackgroundColor(state) }}>
<img src={renderStatusIcon(state)} alt="" className={style.statusImg} /> <img src={renderStatusIcon(state)} alt="" className={style.statusImg} />
<span>{renderStatusText(state)}</span> <span>{renderStatusText(state)}</span>
...@@ -152,7 +159,7 @@ const TaskCard = (props: TaskCardProps) => { ...@@ -152,7 +159,7 @@ const TaskCard = (props: TaskCardProps) => {
<div>Progress</div> <div>Progress</div>
<div style={{ color: renderTextColor(state) }}>{completeNum + "/" + totalNum}</div> <div style={{ color: renderTextColor(state) }}>{completeNum + "/" + totalNum}</div>
</div> </div>
<MyProgress color={renderProgressColor(state)} value={(completeNum / totalNum) * 100}/> <MyProgress color={renderProgressColor(state)} value={(completeNum / totalNum) * 100} />
</div> </div>
<div className={style.bottomLine}> <div className={style.bottomLine}>
<img alt="" src={runTime} /> <img alt="" src={runTime} />
......
...@@ -38,6 +38,10 @@ ...@@ -38,6 +38,10 @@
color: #565C66; color: #565C66;
} }
.otherInformationBoxRight{
color: #565C66;
}
.numberDisplay { .numberDisplay {
font-size: 20px; font-size: 20px;
font-weight: 600; font-weight: 600;
...@@ -48,7 +52,7 @@ ...@@ -48,7 +52,7 @@
.verticalLine { .verticalLine {
height: 32px; height: 32px;
border: 1px solid #EBEDF0; border: 1px solid #EBEDF0;
margin-left: 10px; margin-left: 20px;
margin-right: 20px; margin-right: 20px;
} }
......
...@@ -44,19 +44,23 @@ const ProjectOverview = observer(() => { ...@@ -44,19 +44,23 @@ const ProjectOverview = observer(() => {
}, },
}); });
useEffect(() => { useEffect(() => {
getOverview({ if (currentProjectStore.currentProjectInfo.id) {
id: currentProjectStore.currentProjectInfo.id as string, getOverview({
}); id: currentProjectStore.currentProjectInfo.id as string,
});
}
}, [currentProjectStore.currentProjectInfo.id, getOverview]); }, [currentProjectStore.currentProjectInfo.id, getOverview]);
useEffect(() => { useEffect(() => {
getTaskOverviewList({ if (currentProjectStore.currentProjectInfo.id) {
projectId: currentProjectStore.currentProjectInfo.id as string, getTaskOverviewList({
jobName: jobName, projectId: currentProjectStore.currentProjectInfo.id as string,
day: Number(day), jobName: jobName,
page: page, day: Number(day),
size: size, page: page,
}); size: size,
});
}
}, [currentProjectStore.currentProjectInfo.id, getTaskOverviewList, day, jobName]); }, [currentProjectStore.currentProjectInfo.id, getTaskOverviewList, day, jobName]);
const handleKeyWordChangeKeyUp = (e: any) => { const handleKeyWordChangeKeyUp = (e: any) => {
...@@ -64,6 +68,21 @@ const ProjectOverview = observer(() => { ...@@ -64,6 +68,21 @@ const ProjectOverview = observer(() => {
setJobName(e.target.value); setJobName(e.target.value);
} }
} }
const storageUnitFromB = (b: number) => {
if (b <= 0) {
return { data: '0.00', unit: 'KB' };
} else if (b < 1024 * 1024) {
return { data: (b / 1024).toFixed(2), unit: 'KB' };
} else if (b < 1024 * 1024 * 1024) {
return { data: (b / (1024 * 1024)).toFixed(2), unit: 'MB' };
} else if (b < 1024 * 1024 * 1024 * 1024) {
return { data: (b / (1024 * 1024 * 1024)).toFixed(2), unit: 'G' };
} else {
return { data: (b / (1024 * 1024 * 1024 * 1024)).toFixed(2), unit: 'T' };
}
};
if (currentProjectStore.currentProjectInfo.name) { if (currentProjectStore.currentProjectInfo.name) {
if (loading) { if (loading) {
return ( return (
...@@ -90,18 +109,21 @@ const ProjectOverview = observer(() => { ...@@ -90,18 +109,21 @@ const ProjectOverview = observer(() => {
</div> </div>
<div className={style.basicInformationRight}> <div className={style.basicInformationRight}>
<div> <div>
<div className={style.otherInformationBox}>项目总消费</div> <div className={style.otherInformationBoxRight}>项目总消费</div>
<div><span className={style.numberDisplay}>{overviewInfo.projectCost?.toFixed(2)}</span></div> <div><span className={style.numberDisplay}>{overviewInfo.projectCost?.toFixed(2)}</span></div>
</div> </div>
<div className={style.verticalLine}></div> <div className={style.verticalLine}></div>
<div> <div>
<div className={style.otherInformationBox}>项目剩余预算</div> <div className={style.otherInformationBoxRight}>项目剩余预算</div>
<div><span className={style.numberDisplay}>{overviewInfo.projectRemainingBudget?.toFixed(2)}</span></div> <div><span className={style.numberDisplay}>{overviewInfo.projectRemainingBudget?.toFixed(2)}</span></div>
</div> </div>
<div className={style.verticalLine}></div> <div className={style.verticalLine}></div>
<div> <div>
<div className={style.otherInformationBox}>项目存储大小</div> <div className={style.otherInformationBoxRight} style={{ marginRight: '20px' }}>项目存储大小</div>
<div><span className={style.numberDisplay}>{overviewInfo.projectStorage?.toFixed(2)}</span> G</div> <div>
<span className={style.numberDisplay}>{overviewInfo.projectStorage !== undefined ? storageUnitFromB(overviewInfo.projectStorage).data : ''}</span>
{overviewInfo.projectStorage !== undefined ? storageUnitFromB(overviewInfo.projectStorage).unit : ''}
</div>
</div> </div>
</div> </div>
</div> </div>
...@@ -134,6 +156,7 @@ const ProjectOverview = observer(() => { ...@@ -134,6 +156,7 @@ const ProjectOverview = observer(() => {
{/* 任务列表卡片渲染 */} {/* 任务列表卡片渲染 */}
{taskList.length > 0 && taskList.map((item: any) => { {taskList.length > 0 && taskList.map((item: any) => {
return <TaskCard return <TaskCard
id={item.id}
name={item.name} name={item.name}
creator={item.creator} creator={item.creator}
state={item.state} state={item.state}
......
...@@ -23,7 +23,7 @@ import InformationDisplay from "@/components/CommonComponents/InformationDisplay ...@@ -23,7 +23,7 @@ import InformationDisplay from "@/components/CommonComponents/InformationDisplay
import classnames from "classnames"; import classnames from "classnames";
import { TextField } from "@mui/material"; import { TextField } from "@mui/material";
import LoadingButton from "@mui/lab/LoadingButton"; import LoadingButton from "@mui/lab/LoadingButton";
import InputAdornment from '@mui/material/InputAdornment'; import InputAdornment from "@mui/material/InputAdornment";
import { useMessage } from "@/components/MySnackbar"; import { useMessage } from "@/components/MySnackbar";
import Loading from "@/views/Loading"; import Loading from "@/views/Loading";
import MyDialog from "@/components/mui/MyDialog"; import MyDialog from "@/components/mui/MyDialog";
...@@ -59,6 +59,13 @@ const BaseInfo = observer(() => { ...@@ -59,6 +59,13 @@ const BaseInfo = observer(() => {
).name; ).name;
// 弹窗显示控制 // 弹窗显示控制
const [dialogOpen, setDialogOpen] = useState(false); const [dialogOpen, setDialogOpen] = useState(false);
// 打开弹窗时重置表单
useEffect(() => {
if (dialogOpen) {
setDeleteProjectName("");
}
}, [dialogOpen]);
// 是否拥有编辑权限 // 是否拥有编辑权限
const hasEditAuth = useMemo(() => { const hasEditAuth = useMemo(() => {
if (!currentUserName) { if (!currentUserName) {
...@@ -75,7 +82,10 @@ const BaseInfo = observer(() => { ...@@ -75,7 +82,10 @@ const BaseInfo = observer(() => {
}, [currentUserName, projectInfo]); }, [currentUserName, projectInfo]);
const { run, loading } = useMyRequest(getProject, { const { run, loading } = useMyRequest(getProject, {
onSuccess: (result: any) => { onSuccess: (result: any) => {
setProjectInfo({ ...result.data, projectBudget: result.data.projectBudget.toFixed(2) }); setProjectInfo({
...result.data,
projectBudget: result.data.projectBudget.toFixed(2),
});
}, },
}); });
useEffect(() => { useEffect(() => {
...@@ -184,43 +194,50 @@ const BaseInfo = observer(() => { ...@@ -184,43 +194,50 @@ const BaseInfo = observer(() => {
}); });
}; };
const budgetChange = (e: any) => { const checkBudget = (budget: string, showMessage = false) => {
let inputValue = e.target.value.replace('.', '') let help = "";
if (inputValue.indexOf('.') !== -1) { if (budget) {
setBudgetCheck({ if (isNaN(Number(budget)) || Number(budget) > 10000000 || Number(budget) < 0) {
error: true, help = "格式错误,请输入0~10000000之间的数值,结果最高保留两位小数。";
help: "格式错误,请输入正确的金额,可精确至分(两位小数)", setBudgetCheck({
}); error: true,
return help,
} });
if (isNaN(Number(inputValue))) { showMessage && message.error(help);
setBudgetCheck({ return false;
error: true, } else {
help: "格式错误,请输入正确的金额,可精确至分(两位小数)", setBudgetCheck({
}); error: false,
return help: "",
});
return true;
}
} else { } else {
setProjectInfo({ help = "格式错误,请输入0~10000000之间的数值,结果最高保留两位小数。";
...projectInfo,
projectBudget: e.target.value
})
setBudgetCheck({ setBudgetCheck({
error: false, error: true,
help: "", help,
}); });
showMessage && message.error(help);
return false;
} }
} }
const budgetBlur = (e: any) => {
const budgetChange = (e: any) => {
setProjectInfo({ setProjectInfo({
...projectInfo, ...projectInfo,
projectBudget: Number(e.target.value).toFixed(2) projectBudget: e.target.value,
})
setBudgetCheck({
error: false,
help: "",
}); });
checkBudget(e.target.value);
} }
const budgetBlur = (e: any) => {
setProjectInfo({
...projectInfo,
projectBudget: Number(e.target.value) ? Number(e.target.value).toFixed(2) : e.target.value,
});
};
const { run: updateProjectRun, loading: updateLoading } = useMyRequest( const { run: updateProjectRun, loading: updateLoading } = useMyRequest(
updateProject, updateProject,
{ {
...@@ -235,7 +252,7 @@ const BaseInfo = observer(() => { ...@@ -235,7 +252,7 @@ const BaseInfo = observer(() => {
// 修改项目 // 修改项目
const handleClickUpdate = () => { const handleClickUpdate = () => {
if (checkName(projectInfo.name, true)) { if (checkName(projectInfo.name, true) && checkBudget(projectInfo.projectBudget, true)) {
updateProjectRun({ ...projectInfo, product: "cadd" }); updateProjectRun({ ...projectInfo, product: "cadd" });
} else { } else {
return; return;
...@@ -312,9 +329,9 @@ const BaseInfo = observer(() => { ...@@ -312,9 +329,9 @@ const BaseInfo = observer(() => {
size="small" size="small"
sx={{ sx={{
width: "560px", width: "560px",
'& .MuiOutlinedInput-root': { "& .MuiOutlinedInput-root": {
height: '36px' height: "36px",
} },
}} }}
/> />
{/* <input {/* <input
...@@ -390,12 +407,14 @@ const BaseInfo = observer(() => { ...@@ -390,12 +407,14 @@ const BaseInfo = observer(() => {
size="small" size="small"
sx={{ sx={{
width: "560px", width: "560px",
'& .MuiOutlinedInput-root': { "& .MuiOutlinedInput-root": {
height: '36px' height: "36px",
} },
}} }}
InputProps={{ InputProps={{
startAdornment: <InputAdornment position="start">¥</InputAdornment>, startAdornment: (
<InputAdornment position="start">¥</InputAdornment>
),
}} }}
/> />
</div> </div>
...@@ -426,10 +445,10 @@ const BaseInfo = observer(() => { ...@@ -426,10 +445,10 @@ const BaseInfo = observer(() => {
删除项目将删除其存储的数据和所有相关资源,并且已删除的项目无法恢复!请谨慎操作! 删除项目将删除其存储的数据和所有相关资源,并且已删除的项目无法恢复!请谨慎操作!
</div> </div>
<MyButton <MyButton
text='删除项目' text="删除项目"
variant="contained" variant="contained"
onClick={() => setDialogOpen(true)} onClick={() => setDialogOpen(true)}
color='error' color="error"
// style={{ // style={{
// backgroundColor: "#fff", // backgroundColor: "#fff",
// color: "#FF4E4E", // color: "#FF4E4E",
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment