From 871c8d7b5a83c6f59010a776af67614f3f6b9510 Mon Sep 17 00:00:00 2001 From: cp3hnu Date: Fri, 14 Mar 2025 09:01:36 +0800 Subject: [PATCH 1/4] =?UTF-8?q?chore:=20=E4=BC=98=E5=8C=96=E5=BD=93?= =?UTF-8?q?=E5=88=A0=E9=99=A4FormList=E7=9A=84Item=E6=97=B6=EF=BC=8C?= =?UTF-8?q?=E5=A6=82=E6=9E=9C=E6=B2=A1=E6=9C=89=E5=A1=AB=E5=86=99=E5=86=85?= =?UTF-8?q?=E5=AE=B9=EF=BC=8C=E5=88=99=E7=9B=B4=E6=8E=A5=E5=88=A0=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/CreateForm/TrialConfig.tsx | 16 +++--- .../components/CreateForm/ExecuteConfig.tsx | 21 ++++---- .../CreateForm/ParameterRange/index.tsx | 2 +- .../ModelDeployment/CreateVersion/index.tsx | 23 ++++---- .../components/GlobalParamsDrawer/index.tsx | 3 +- react-ui/src/utils/ui.tsx | 53 +++++++++++++++---- 6 files changed, 78 insertions(+), 40 deletions(-) diff --git a/react-ui/src/pages/AutoML/components/CreateForm/TrialConfig.tsx b/react-ui/src/pages/AutoML/components/CreateForm/TrialConfig.tsx index 0d8008fb..6a965e9a 100644 --- a/react-ui/src/pages/AutoML/components/CreateForm/TrialConfig.tsx +++ b/react-ui/src/pages/AutoML/components/CreateForm/TrialConfig.tsx @@ -1,6 +1,6 @@ import SubAreaTitle from '@/components/SubAreaTitle'; import { AutoMLTaskType } from '@/enums'; -import { modalConfirm } from '@/utils/ui'; +import { removeFormListItem } from '@/utils/ui'; import { MinusCircleOutlined, PlusCircleOutlined } from '@ant-design/icons'; import { Button, Col, Flex, Form, Input, InputNumber, Radio, Row, Select } from 'antd'; import { classificationMetrics, regressionMetrics } from './ExecuteConfig'; @@ -72,12 +72,14 @@ function TrialConfig() { type="text" icon={} onClick={() => { - modalConfirm({ - title: '确定要删除该指标权重吗?', - onOk: () => { - remove(name); - }, - }); + removeFormListItem( + form, + 'metrics', + name, + remove, + ['name', 'value'], + '删除后,该该指标权重将不可恢复', + ); }} > {index === fields.length - 1 && ( diff --git a/react-ui/src/pages/HyperParameter/components/CreateForm/ExecuteConfig.tsx b/react-ui/src/pages/HyperParameter/components/CreateForm/ExecuteConfig.tsx index 976b6467..cbd97448 100644 --- a/react-ui/src/pages/HyperParameter/components/CreateForm/ExecuteConfig.tsx +++ b/react-ui/src/pages/HyperParameter/components/CreateForm/ExecuteConfig.tsx @@ -8,7 +8,7 @@ import SubAreaTitle from '@/components/SubAreaTitle'; import { hyperParameterOptimizedModeOptions } from '@/enums'; import { useComputingResource } from '@/hooks/resource'; import { isEmpty } from '@/utils'; -import { modalConfirm } from '@/utils/ui'; +import { modalConfirm, removeFormListItem } from '@/utils/ui'; import { MinusCircleOutlined, PlusCircleOutlined, QuestionCircleOutlined } from '@ant-design/icons'; import { Button, @@ -396,12 +396,14 @@ function ExecuteConfig() { size="middle" icon={} onClick={() => { - modalConfirm({ - title: '确定要删除该参数吗?', - onOk: () => { - remove(name); - }, - }); + removeFormListItem( + form, + 'parameters', + name, + remove, + ['name', 'type'], + '删除后,该参数将不可恢复', + ); }} > {index === fields.length - 1 && ( @@ -460,7 +462,7 @@ function ExecuteConfig() { ); if (arr.length > 0 && arr.length < runParameters.length) { return Promise.reject( - new Error(`手动运行超参数 ${name} 必须全部填写或者都不填写`), + new Error(`手动运行超参数 "${name}" 必须全部填写或者都不填写`), ); } } @@ -518,7 +520,8 @@ function ExecuteConfig() { icon={} onClick={() => { modalConfirm({ - title: '确定要删除该运行参数吗?', + title: '删除后,该运行参数将不可恢复', + content: '是否确认删除?', onOk: () => { remove(name); }, diff --git a/react-ui/src/pages/HyperParameter/components/CreateForm/ParameterRange/index.tsx b/react-ui/src/pages/HyperParameter/components/CreateForm/ParameterRange/index.tsx index 43cd25f2..d33fcf13 100644 --- a/react-ui/src/pages/HyperParameter/components/CreateForm/ParameterRange/index.tsx +++ b/react-ui/src/pages/HyperParameter/components/CreateForm/ParameterRange/index.tsx @@ -68,7 +68,7 @@ function ParameterRange({ type, value, onConfirm }: ParameterRangeProps) { ( - + - = + = - + } disabled={disabled} onClick={() => { - modalConfirm({ - title: '确定要删除该环境变量吗?', - onOk: () => { - remove(name); - }, - }); + removeFormListItem( + form, + 'env_variables', + name, + remove, + ['key', 'value'], + '删除后,该环境变量将不可恢复', + ); }} > {index === fields.length - 1 && ( diff --git a/react-ui/src/pages/Pipeline/components/GlobalParamsDrawer/index.tsx b/react-ui/src/pages/Pipeline/components/GlobalParamsDrawer/index.tsx index e54894ea..f1aa57c9 100644 --- a/react-ui/src/pages/Pipeline/components/GlobalParamsDrawer/index.tsx +++ b/react-ui/src/pages/Pipeline/components/GlobalParamsDrawer/index.tsx @@ -40,7 +40,8 @@ const GlobalParamsDrawer = forwardRef( const removeParameter = (name: number, remove: (param: number) => void) => { modalConfirm({ - title: '确认删除该参数吗?', + title: '删除后,该全局参数将不可恢复', + content: '是否确认删除?', onOk: () => { remove(name); }, diff --git a/react-ui/src/utils/ui.tsx b/react-ui/src/utils/ui.tsx index a3a214ec..d9953a3e 100644 --- a/react-ui/src/utils/ui.tsx +++ b/react-ui/src/utils/ui.tsx @@ -8,7 +8,16 @@ import { removeAllPageCacheState } from '@/hooks/pageCacheState'; import themes from '@/styles/theme.less'; import { type ClientInfo } from '@/types'; import { history } from '@umijs/max'; -import { Modal, Upload, message, type ModalFuncProps, type UploadFile } from 'antd'; +import { + Modal, + Upload, + message, + type FormInstance, + type ModalFuncProps, + type UploadFile, +} from 'antd'; +import { NamePath } from 'antd/es/form/interface'; +import { isEmpty } from './index'; import { closeAllModals } from './modal'; import SessionStorage from './sessionStorage'; @@ -143,16 +152,38 @@ export const limitUploadFileType = (type: string) => { }; /** - * 滚动到底部 - * - * @param {boolean} smooth - Determines if the scroll should be smooth + * 删除 FormList 表单项,如果表单项没有值,则直接删除,否则弹出确认框 + * @param form From实例 + * @param listName FormList 的 name + * @param name FormList 的其中一项 + * @param remove FormList 的删除方法 + * @param fieldNames FormList 的子项名称数组 + * @param confirmTitle 弹出确认框的标题 */ -export const scrollToBottom = (element: HTMLElement | null, smooth: boolean = true) => { - if (element) { - const optons: ScrollToOptions = { - top: element.scrollHeight, - behavior: smooth ? 'smooth' : 'instant', - }; - element.scrollTo(optons); +export const removeFormListItem = ( + form: FormInstance, + listName: NamePath, + name: number, + remove: (name: number) => void, + fieldNames: NamePath[], + confirmTitle: string, +) => { + const fields = fieldNames.map((item) => [listName, name, item].flat()); + const isEmptyField = fields.every((item) => { + const value = form.getFieldValue(item); + return isEmpty(value); + }); + + if (isEmptyField) { + remove(name); + return; } + + modalConfirm({ + title: confirmTitle, + content: '是否确认删除?', + onOk: () => { + remove(name); + }, + }); }; From 83d5ec3b4c1992c210c2e16515afff2b31937137 Mon Sep 17 00:00:00 2001 From: cp3hnu Date: Fri, 14 Mar 2025 09:02:27 +0800 Subject: [PATCH 2/4] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E6=A8=A1=E5=9E=8B?= =?UTF-8?q?=E6=BC=94=E5=8C=96tooltip=E6=8E=A7=E4=BB=B6=E7=9A=84=E4=BD=8D?= =?UTF-8?q?=E7=BD=AE=E4=B8=8D=E6=AD=A3=E7=A1=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Model/components/ModelEvolution/index.tsx | 23 ++++++++++++++----- .../Model/components/ModelMetrics/index.tsx | 9 +++++--- .../Model/components/NodeTooltips/index.less | 2 -- .../Model/components/NodeTooltips/index.tsx | 7 +++++- 4 files changed, 29 insertions(+), 12 deletions(-) diff --git a/react-ui/src/pages/Model/components/ModelEvolution/index.tsx b/react-ui/src/pages/Model/components/ModelEvolution/index.tsx index 63d116ad..3557c12e 100644 --- a/react-ui/src/pages/Model/components/ModelEvolution/index.tsx +++ b/react-ui/src/pages/Model/components/ModelEvolution/index.tsx @@ -45,6 +45,7 @@ function ModelEvolution({ const [enterTooltip, setEnterTooltip] = useState(false); const [nodeTooltipX, setNodeToolTipX] = useState(0); const [nodeTooltipY, setNodeToolTipY] = useState(0); + const [isNodeTooltipLeft, setIsNodeTooltipLeft] = useState(true); const [hoverNodeData, setHoverNodeData] = useState< ModelDepsData | ProjectDependency | TrainDataset | undefined >(undefined); @@ -141,19 +142,28 @@ function ModelEvolution({ const { x, y } = model; const point = graph.getCanvasByPoint(x!, y!); const zoom = graph.getZoom(); - // 更加缩放,调整 tooltip 位置 + + // 根据缩放,调整 tooltip 位置 const offsetX = (nodeWidth * zoom) / 4; const offsetY = (nodeHeight * zoom) / 4; - point.x += offsetX; + // 25 是 `.model-evolution` 的 `padding-left` 值 + const tooltipX = point.x + offsetX + 25; + // 20 是 `.model-evolution` 的 `padding-bottom` 值 + const tooltipY = graphRef.current!.clientHeight - point.y + offsetY + 20; + setNodeToolTipY(tooltipY); + // 如果右边显示不下 const canvasWidth = graphRef.current!.clientWidth; - if (point.x + 300 > canvasWidth + 30) { - point.x = canvasWidth + 30 - 300; + // 300 是 NodeTool 的宽度,canvasWidth + 50 是 `.model-evolution` 的宽度 + if (tooltipX + 300 > canvasWidth + 50) { + setIsNodeTooltipLeft(false); + setNodeToolTipX(canvasWidth + 50 - (point.x - offsetX + 25)); + } else { + setNodeToolTipX(tooltipX); + setIsNodeTooltipLeft(true); } setHoverNodeData(model); - setNodeToolTipX(point.x); - setNodeToolTipY(graphRef.current!.clientHeight - point.y + offsetY); setShowNodeTooltip(true); }); @@ -254,6 +264,7 @@ function ModelEvolution({ resourceId={resourceId} x={nodeTooltipX} y={nodeTooltipY} + isLeft={isNodeTooltipLeft} data={hoverNodeData!} onVersionChange={onVersionChange} onMouseEnter={handleTooltipsMouseEnter} diff --git a/react-ui/src/pages/Model/components/ModelMetrics/index.tsx b/react-ui/src/pages/Model/components/ModelMetrics/index.tsx index 110d28ce..730afaac 100644 --- a/react-ui/src/pages/Model/components/ModelMetrics/index.tsx +++ b/react-ui/src/pages/Model/components/ModelMetrics/index.tsx @@ -150,11 +150,14 @@ function ModelMetrics({ resourceId, identifier, owner, version }: ModelMetricsPr // 表头 const columns: TableProps['columns'] = useMemo(() => { - const first: TableData | undefined = tableData.find( + const firstMetrics: TableData | undefined = tableData.find( (item) => item.metrics_names && item.metrics_names.length > 0, ); - const metricsNames = first?.metrics_names ?? []; - const paramsNames = first?.params_names ?? []; + const firstParams: TableData | undefined = tableData.find( + (item) => item.params_names && item.params_names.length > 0, + ); + const metricsNames = firstMetrics?.metrics_names ?? []; + const paramsNames = firstParams?.params_names ?? []; return [ { title: '基本信息', diff --git a/react-ui/src/pages/Model/components/NodeTooltips/index.less b/react-ui/src/pages/Model/components/NodeTooltips/index.less index eabb979a..420fbacc 100644 --- a/react-ui/src/pages/Model/components/NodeTooltips/index.less +++ b/react-ui/src/pages/Model/components/NodeTooltips/index.less @@ -1,7 +1,5 @@ .node-tooltips { position: absolute; - bottom: -100px; - left: -300px; z-index: 10; width: 300px; padding: 10px; diff --git a/react-ui/src/pages/Model/components/NodeTooltips/index.tsx b/react-ui/src/pages/Model/components/NodeTooltips/index.tsx index 8a0f055e..1e95a5c1 100644 --- a/react-ui/src/pages/Model/components/NodeTooltips/index.tsx +++ b/react-ui/src/pages/Model/components/NodeTooltips/index.tsx @@ -180,6 +180,7 @@ type NodeTooltipsProps = { data: ModelDepsData | ProjectDependency | TrainDataset; x: number; y: number; + isLeft: boolean; onMouseEnter?: () => void; onMouseLeave?: () => void; onVersionChange: (version: string) => void; @@ -190,6 +191,7 @@ function NodeTooltips({ data, x, y, + isLeft, onMouseEnter, onMouseLeave, onVersionChange, @@ -208,10 +210,13 @@ function NodeTooltips({ ) { Component = ; } + const style = isLeft + ? { left: `${x}px`, bottom: `${y}px` } + : { right: `${x}px`, bottom: `${y}px` }; return (
From 011eab8822c15390cea4c4a8dee6d57a623518b6 Mon Sep 17 00:00:00 2001 From: cp3hnu Date: Fri, 14 Mar 2025 10:38:50 +0800 Subject: [PATCH 3/4] =?UTF-8?q?chore:=20=E6=A8=A1=E5=9E=8B=E6=BC=94?= =?UTF-8?q?=E5=8C=96tooltip=E6=B7=BB=E5=8A=A0=E7=AE=AD=E5=A4=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Model/components/ModelEvolution/index.tsx | 37 ++++++++++--- .../Model/components/ModelEvolution/utils.tsx | 2 +- .../Model/components/NodeTooltips/index.less | 52 +++++++++++++++++++ .../Model/components/NodeTooltips/index.tsx | 3 +- 4 files changed, 85 insertions(+), 9 deletions(-) diff --git a/react-ui/src/pages/Model/components/ModelEvolution/index.tsx b/react-ui/src/pages/Model/components/ModelEvolution/index.tsx index 3557c12e..3bc40b40 100644 --- a/react-ui/src/pages/Model/components/ModelEvolution/index.tsx +++ b/react-ui/src/pages/Model/components/ModelEvolution/index.tsx @@ -51,6 +51,8 @@ function ModelEvolution({ >(undefined); const apiData = useRef(undefined); // 接口返回的树形结构 const hierarchyNodes = useRef([]); // 层级迭代树形结构,得到的节点列表 + const leaveNodeTimeout = useRef | null>(null); + const leaveTooltipTimeout = useRef | null>(null); useEffect(() => { initGraph(); @@ -135,6 +137,12 @@ function ModelEvolution({ // 绑定事件 const bindEvents = () => { graph.on('node:mouseenter', (e: G6GraphEvent) => { + // 清除延时关闭tooltip的定时器 + if (leaveNodeTimeout.current) { + clearTimeout(leaveNodeTimeout.current); + leaveNodeTimeout.current = null; + } + const nodeItem = e.item; graph.setItemState(nodeItem, 'hover', true); @@ -144,12 +152,12 @@ function ModelEvolution({ const zoom = graph.getZoom(); // 根据缩放,调整 tooltip 位置 - const offsetX = (nodeWidth * zoom) / 4; - const offsetY = (nodeHeight * zoom) / 4; + // const offsetX = (nodeWidth * zoom) / 4; + const offsetY = (nodeHeight * zoom) / 2; // 25 是 `.model-evolution` 的 `padding-left` 值 - const tooltipX = point.x + offsetX + 25; + const tooltipX = point.x + 25 - 20; // 20 是 `.model-evolution` 的 `padding-bottom` 值 - const tooltipY = graphRef.current!.clientHeight - point.y + offsetY + 20; + const tooltipY = graphRef.current!.clientHeight - point.y + offsetY + 20 + 10; setNodeToolTipY(tooltipY); // 如果右边显示不下 @@ -157,7 +165,7 @@ function ModelEvolution({ // 300 是 NodeTool 的宽度,canvasWidth + 50 是 `.model-evolution` 的宽度 if (tooltipX + 300 > canvasWidth + 50) { setIsNodeTooltipLeft(false); - setNodeToolTipX(canvasWidth + 50 - (point.x - offsetX + 25)); + setNodeToolTipX(canvasWidth + 50 - (point.x + 25) - 20); } else { setNodeToolTipX(tooltipX); setIsNodeTooltipLeft(true); @@ -170,7 +178,9 @@ function ModelEvolution({ graph.on('node:mouseleave', (e: G6GraphEvent) => { const nodeItem = e.item; graph.setItemState(nodeItem, 'hover', false); - setShowNodeTooltip(false); + leaveNodeTimeout.current = setTimeout(() => { + setShowNodeTooltip(false); + }, 100); }); graph.on('node:click', (e: G6GraphEvent) => { @@ -201,6 +211,12 @@ function ModelEvolution({ setShowNodeTooltip(false); setEnterTooltip(false); }); + + // 开始拖拽画布时触发 + graph.on('DRAG_START', () => { + setShowNodeTooltip(false); + setEnterTooltip(false); + }); }; // toggle 展开 @@ -215,11 +231,18 @@ function ModelEvolution({ }; const handleTooltipsMouseEnter = () => { + // 清除延时关闭tooltip的定时器 + if (leaveTooltipTimeout.current) { + clearTimeout(leaveTooltipTimeout.current); + leaveTooltipTimeout.current = null; + } setEnterTooltip(true); }; const handleTooltipsMouseLeave = () => { - setEnterTooltip(false); + leaveTooltipTimeout.current = setTimeout(() => { + setEnterTooltip(false); + }, 100); }; // 获取模型依赖 diff --git a/react-ui/src/pages/Model/components/ModelEvolution/utils.tsx b/react-ui/src/pages/Model/components/ModelEvolution/utils.tsx index c4511e17..dcb4c964 100644 --- a/react-ui/src/pages/Model/components/ModelEvolution/utils.tsx +++ b/react-ui/src/pages/Model/components/ModelEvolution/utils.tsx @@ -33,7 +33,7 @@ export type Rect = { }; export interface TrainDataset extends NodeConfig { - repo_id: number; + repo_id: string; name: string; version: string; identifier: string; diff --git a/react-ui/src/pages/Model/components/NodeTooltips/index.less b/react-ui/src/pages/Model/components/NodeTooltips/index.less index 420fbacc..245cbe5f 100644 --- a/react-ui/src/pages/Model/components/NodeTooltips/index.less +++ b/react-ui/src/pages/Model/components/NodeTooltips/index.less @@ -8,6 +8,30 @@ border-radius: 4px; box-shadow: 0px 3px 6px rgba(146, 146, 146, 0.09); + &::after { + position: absolute; + bottom: -8px; /* 让三角形紧贴 div 底部 */ + left: 12px; /* 控制三角形相对 div 的位置 */ + width: 0; + height: 0; + border-top: 8px solid white; /* 主要颜色 */ + border-right: 8px solid transparent; + border-left: 8px solid transparent; + content: ''; + } + + &::before { + position: absolute; + bottom: -10px; /* 边框略大,形成描边效果 */ + left: 10px; /* 调整边框的偏移量,使其覆盖白色三角形 */ + width: 0; + height: 0; + border-top: 10px solid #eaeaea; /* 这是边框颜色 */ + border-right: 10px solid transparent; + border-left: 10px solid transparent; + content: ''; + } + &__title { margin: 10px 0; color: @text-color; @@ -57,3 +81,31 @@ } } } + +.node-tooltips.node-tooltips--right { + &::after { + position: absolute; + right: 12px; /* 控制三角形相对 div 的位置 */ + bottom: -8px; /* 让三角形紧贴 div 底部 */ + left: auto; + width: 0; + height: 0; + border-top: 8px solid white; /* 主要颜色 */ + border-right: 8px solid transparent; + border-left: 8px solid transparent; + content: ''; + } + + &::before { + position: absolute; + right: 10px; /* 调整边框的偏移量,使其覆盖白色三角形 */ + bottom: -10px; /* 边框略大,形成描边效果 */ + left: auto; + width: 0; + height: 0; + border-top: 10px solid #eaeaea; /* 这是边框颜色 */ + border-right: 10px solid transparent; + border-left: 10px solid transparent; + content: ''; + } +} diff --git a/react-ui/src/pages/Model/components/NodeTooltips/index.tsx b/react-ui/src/pages/Model/components/NodeTooltips/index.tsx index 1e95a5c1..574a5065 100644 --- a/react-ui/src/pages/Model/components/NodeTooltips/index.tsx +++ b/react-ui/src/pages/Model/components/NodeTooltips/index.tsx @@ -2,6 +2,7 @@ import { ResourceInfoTabKeys } from '@/pages/Dataset/components/ResourceInfo'; import { getGitUrl } from '@/utils'; import { formatDate } from '@/utils/date'; import { useNavigate } from '@umijs/max'; +import classNames from 'classnames'; import { ModelDepsData, NodeType, ProjectDependency, TrainDataset } from '../ModelEvolution/utils'; import styles from './index.less'; @@ -215,7 +216,7 @@ function NodeTooltips({ : { right: `${x}px`, bottom: `${y}px` }; return (
Date: Fri, 14 Mar 2025 14:20:44 +0800 Subject: [PATCH 4/4] =?UTF-8?q?=E4=BC=98=E5=8C=96=E5=88=A0=E9=99=A4?= =?UTF-8?q?=E6=9C=8D=E5=8A=A1=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ruoyi/platform/service/impl/ServiceServiceImpl.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/ServiceServiceImpl.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/ServiceServiceImpl.java index 2a30da66..0244bba6 100644 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/ServiceServiceImpl.java +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/ServiceServiceImpl.java @@ -44,6 +44,7 @@ public class ServiceServiceImpl implements ServiceService { private ServiceDao serviceDao; @Resource private AssetWorkflowDao assetWorkflowDao; + @Override public Page queryByPageService(com.ruoyi.platform.domain.Service service, PageRequest pageRequest) { long total = serviceDao.countService(service); @@ -225,9 +226,9 @@ public class ServiceServiceImpl implements ServiceService { String req = HttpUtils.sendPost(argoUrl + modelService + "/delete", JSON.toJSONString(paramMap)); if (StringUtils.isNotEmpty(req)) { Map reqMap = JacksonUtil.parseJSONStr2Map(req); - if ((Integer) reqMap.get("code") == 200) { - return serviceDao.updateServiceVersion(serviceVersion) > 0 ? "删除成功" : "删除失败"; - } +// if ((Integer) reqMap.get("code") == 200) { + return serviceDao.updateServiceVersion(serviceVersion) > 0 ? "删除成功" : "删除失败"; +// } } return "删除失败"; }