瀏覽代碼

方案筹划 筹划方案编辑

zhaoen 4 月之前
父節點
當前提交
2305772d14

+ 126 - 117
public/CherryMarkdown/CherryMarkdown/drawio_demo/Actions.js

@@ -30,20 +30,20 @@ Actions.prototype.init = function()
 	{
 		window.openNew = true;
 		window.openKey = 'open';
-		
+
 		ui.openFile();
 	});
 	this.addAction('import...', function()
 	{
 		window.openNew = false;
 		window.openKey = 'import';
-		
+
 		// Closes dialog after open
 		window.openFile = new OpenFile(mxUtils.bind(this, function()
 		{
 			ui.hideDialog();
 		}));
-		
+
 		window.openFile.setConsumer(mxUtils.bind(this, function(xml, filename)
 		{
 			try
@@ -65,7 +65,16 @@ Actions.prototype.init = function()
 	}).isEnabled = isGraphEnabled;
 	//this.addAction('exportAs', function() { ui.savePng(); }, null, null, Editor.ctrlKey + '+Shift+S').isEnabled = isGraphEnabled;
 	this.addAction('exportAsPng', function() { ui.savePng(); }, null, null, ).isEnabled = isGraphEnabled;
-	this.addAction('exportAsXml', function() { ui.saveXml(); }, null, null, ).isEnabled = isGraphEnabled;
+	this.addAction('exportAsXml', function () {
+		// 1. 获取当前绘图的 XML 数据(draw.io 核心 API)
+		var xml = editor.getGraphXml(); // editor 是当前绘图编辑器实例
+		// 2. 存储 XML 到 window 全局变量(供外部调用)
+		window.drawIoXml = xml;
+		// 3. 触发自定义事件(通知父页面 XML 已就绪)
+		window.dispatchEvent(new CustomEvent('xmlReady', { detail: xml }));
+		// 4. 保留原下载逻辑(可选)
+		ui.saveXml();
+	}, null, null,).isEnabled = isGraphEnabled;
 	this.addAction('xmlImport', function()
 	{
 		var dlg = new EditDiagramDialog(ui);
@@ -75,7 +84,7 @@ Actions.prototype.init = function()
 	//this.addAction('pageSetup...', function() { ui.showDialog(new PageSetupDialog(ui).container, 320, 220, true, true); }).isEnabled = isGraphEnabled;
 	this.addAction('print...', function() { ui.showDialog(new PrintDialog(ui).container, 300, 180, true, true); }, null, 'sprite-print', Editor.ctrlKey + '+P');
 	this.addAction('preview', function() { mxUtils.show(graph, null, 10, 10); });
-	
+
 	// Edit actions
 	this.addAction('undo', function() { ui.undo(); }, null, 'sprite-undo', Editor.ctrlKey + '+Z');
 	this.addAction('redo', function() { ui.redo(); }, null, 'sprite-redo', (!mxClient.IS_WIN) ? Editor.ctrlKey + '+Shift+Z' : Editor.ctrlKey + '+Y');
@@ -96,11 +105,11 @@ Actions.prototype.init = function()
 			try
 			{
 				var cells = mxClipboard.paste(graph);
-				
+
 				if (cells != null)
 				{
 					var includeEdges = true;
-					
+
 					for (var i = 0; i < cells.length && includeEdges; i++)
 					{
 						includeEdges = includeEdges && graph.model.isEdge(cells[i]);
@@ -111,11 +120,11 @@ Actions.prototype.init = function()
 					var dx = t.x;
 					var dy = t.y;
 					var bb = null;
-					
+
 					if (cells.length == 1 && includeEdges)
 					{
 						var geo = graph.getCellGeometry(cells[0]);
-						
+
 						if (geo != null)
 						{
 							bb = geo.getTerminalPoint(true);
@@ -123,12 +132,12 @@ Actions.prototype.init = function()
 					}
 
 					bb = (bb != null) ? bb : graph.getBoundingBoxFromGeometry(cells, includeEdges);
-					
+
 					if (bb != null)
 					{
 						var x = Math.round(graph.snap(graph.popupMenuHandler.triggerX / s - dx));
 						var y = Math.round(graph.snap(graph.popupMenuHandler.triggerY / s - dy));
-						
+
 						graph.cellsMoved(cells, x - bb.x, y - bb.y);
 					}
 				}
@@ -139,15 +148,15 @@ Actions.prototype.init = function()
 			}
 		}
 	});
-	
+
 	this.addAction('copySize', function(evt)
 	{
 		var cell = graph.getSelectionCell();
-		
+
 		if (graph.isEnabled() && cell != null && graph.getModel().isVertex(cell))
 		{
 			var geo = graph.getCellGeometry(cell);
-			
+
 			if (geo != null)
 			{
 				ui.copiedSize = new mxRectangle(geo.x, geo.y, geo.width, geo.height);
@@ -160,23 +169,23 @@ Actions.prototype.init = function()
 		if (graph.isEnabled() && !graph.isSelectionEmpty() && ui.copiedSize != null)
 		{
 			graph.getModel().beginUpdate();
-			
+
 			try
 			{
 				var cells = graph.getSelectionCells();
-				
+
 				for (var i = 0; i < cells.length; i++)
 				{
 					if (graph.getModel().isVertex(cells[i]))
 					{
 						var geo = graph.getCellGeometry(cells[i]);
-						
+
 						if (geo != null)
 						{
 							geo = geo.clone();
 							geo.width = ui.copiedSize.width;
 							geo.height = ui.copiedSize.height;
-							
+
 							graph.getModel().setGeometry(cells[i], geo);
 						}
 					}
@@ -188,23 +197,23 @@ Actions.prototype.init = function()
 			}
 		}
 	}, null, null, 'Alt+Shit+V');
-	
+
 	function deleteCells(includeEdges)
 	{
 		// Cancels interactive operations
 		graph.escape();
 		var cells = graph.getDeletableCells(graph.getSelectionCells());
-		
+
 		if (cells != null && cells.length > 0)
 		{
 			var parents = graph.model.getParents(cells);
 			graph.removeCells(cells, includeEdges);
-			
+
 			// Selects parents for easier editing of groups
 			if (parents != null)
 			{
 				var select = [];
-				
+
 				for (var i = 0; i < parents.length; i++)
 				{
 					if (graph.model.contains(parents[i]) &&
@@ -214,12 +223,12 @@ Actions.prototype.init = function()
 						select.push(parents[i]);
 					}
 				}
-				
+
 				graph.setSelectionCells(select);
 			}
 		}
 	};
-	
+
 	this.addAction('delete', function(evt)
 	{
 		deleteCells(evt != null && mxEvent.isShiftDown(evt));
@@ -268,7 +277,7 @@ Actions.prototype.init = function()
 	this.addAction('enterGroup', function() { graph.enterGroup(); }, null, null, Editor.ctrlKey + '+Shift+End');
 	this.addAction('collapse', function() { graph.foldCells(true); }, null, null, Editor.ctrlKey + '+Home');
 	this.addAction('expand', function() { graph.foldCells(false); }, null, null, Editor.ctrlKey + '+End');
-	
+
 	// Arrange actions
 	this.addAction('toFront', function() { graph.orderCells(false); }, null, null, Editor.ctrlKey + '+Shift+F');
 	this.addAction('toBack', function() { graph.orderCells(true); }, null, null, Editor.ctrlKey + '+Shift+B');
@@ -311,22 +320,22 @@ Actions.prototype.init = function()
 	this.addAction('editTooltip...', function()
 	{
 		var graph = ui.editor.graph;
-		
+
 		if (graph.isEnabled() && !graph.isSelectionEmpty())
 		{
 			var cell = graph.getSelectionCell();
 			var tooltip = '';
-			
+
 			if (mxUtils.isNode(cell.value))
 			{
 				var tmp = cell.value.getAttribute('tooltip');
-				
+
 				if (tmp != null)
 				{
 					tooltip = tmp;
 				}
 			}
-			
+
 	    	var dlg = new TextareaDialog(ui, mxResources.get('editTooltip') + ':', tooltip, function(newValue)
 			{
 				graph.setTooltipForCell(cell, newValue);
@@ -338,7 +347,7 @@ Actions.prototype.init = function()
 	this.addAction('openLink', function()
 	{
 		var link = graph.getLinkForCell(graph.getSelectionCell());
-		
+
 		if (link != null)
 		{
 			graph.openLink(link);
@@ -347,12 +356,12 @@ Actions.prototype.init = function()
 	this.addAction('editLink...', function()
 	{
 		var graph = ui.editor.graph;
-		
+
 		if (graph.isEnabled() && !graph.isSelectionEmpty())
 		{
 			var cell = graph.getSelectionCell();
 			var value = graph.getLinkForCell(cell) || '';
-			
+
 			ui.showLinkDialog(value, mxResources.get('apply'), function(link)
 			{
 				link = mxUtils.trim(link);
@@ -367,24 +376,24 @@ Actions.prototype.init = function()
 			ui.showLinkDialog('', mxResources.get('insert'), function(link, docs)
 			{
 				link = mxUtils.trim(link);
-				
+
 				if (link.length > 0)
 				{
 					var icon = null;
 					var title = graph.getLinkTitle(link);
-					
+
 					if (docs != null && docs.length > 0)
 					{
 						icon = docs[0].iconUrl;
 						title = docs[0].name || docs[0].type;
 						title = title.charAt(0).toUpperCase() + title.substring(1);
-						
+
 						if (title.length > 30)
 						{
 							title = title.substring(0, 30) + '...';
 						}
 					}
-					
+
 					var pt = graph.getFreeInsertPoint();
             		var linkCell = new mxCell(title, new mxGeometry(pt.x, pt.y, 100, 40),
 	            	    	'fontColor=#0000EE;fontStyle=4;rounded=1;overflow=hidden;' + ((icon != null) ?
@@ -405,7 +414,7 @@ Actions.prototype.init = function()
             		{
             			graph.getModel().endUpdate();
             		}
-            		
+
             	    graph.setSelectionCell(linkCell);
             	    graph.scrollCellToVisible(graph.getSelectionCell());
 				}
@@ -415,7 +424,7 @@ Actions.prototype.init = function()
 	this.addAction('link...', mxUtils.bind(this, function()
 	{
 		var graph = ui.editor.graph;
-		
+
 		if (graph.isEnabled())
 		{
 			if (graph.cellEditor.isContentEditing())
@@ -423,7 +432,7 @@ Actions.prototype.init = function()
 				var elt = graph.getSelectedElement();
 				var link = graph.getParentByName(elt, 'A', graph.cellEditor.textarea);
 				var oldValue = '';
-				
+
 				// Workaround for FF returning the outermost selected element after double
 				// click on a DOM hierarchy with a link inside (but not as topmost element)
 				if (link == null && elt != null && elt.getElementsByTagName != null)
@@ -431,7 +440,7 @@ Actions.prototype.init = function()
 					// Finds all links in the selected DOM and uses the link
 					// where the selection text matches its text content
 					var links = elt.getElementsByTagName('a');
-					
+
 					for (var i = 0; i < links.length && link == null; i++)
 					{
 						if (links[i].textContent == elt.textContent)
@@ -446,9 +455,9 @@ Actions.prototype.init = function()
 				{
 					oldValue = link.getAttribute('href') || '';
 				}
-				
+
 				var selState = graph.cellEditor.saveSelection();
-				
+
 				ui.showLinkDialog(oldValue, mxResources.get('apply'), mxUtils.bind(this, function(value)
 				{
 		    		graph.cellEditor.restoreSelection(selState);
@@ -472,7 +481,7 @@ Actions.prototype.init = function()
 	this.addAction('autosize', function()
 	{
 		var cells = graph.getSelectionCells();
-		
+
 		if (cells != null)
 		{
 			graph.getModel().beginUpdate();
@@ -481,7 +490,7 @@ Actions.prototype.init = function()
 				for (var i = 0; i < cells.length; i++)
 				{
 					var cell = cells[i];
-					
+
 					if (graph.getModel().getChildCount(cell))
 					{
 						graph.updateGroupBounds([cell], 20);
@@ -514,12 +523,12 @@ Actions.prototype.init = function()
 	this.addAction('formattedText', function()
 	{
     	var state = graph.getView().getState(graph.getSelectionCell());
-    	
+
     	if (state != null)
     	{
 	    	var value = '1';
 	    	graph.stopEditing();
-			
+
 			graph.getModel().beginUpdate();
 			try
 			{
@@ -527,36 +536,36 @@ Actions.prototype.init = function()
 		    	{
 		    		value = null;
 		    		var label = graph.convertValueToString(state.cell);
-		    		
+
 		    		if (mxUtils.getValue(state.style, 'nl2Br', '1') != '0')
 					{
 						// Removes newlines from HTML and converts breaks to newlines
 						// to match the HTML output in plain text
 						label = label.replace(/\n/g, '').replace(/<br\s*.?>/g, '\n');
 					}
-		    		
+
 		    		// Removes HTML tags
 	    			var temp = document.createElement('div');
 	    			temp.innerHTML = label;
 	    			label = mxUtils.extractTextWithWhitespace(temp.childNodes);
-	    			
+
 					graph.cellLabelChanged(state.cell, label);
 		    	}
 		    	else
 		    	{
 		    		// Converts HTML tags to text
 		    		var label = mxUtils.htmlEntities(graph.convertValueToString(state.cell), false);
-		    		
+
 		    		if (mxUtils.getValue(state.style, 'nl2Br', '1') != '0')
 					{
 						// Converts newlines in plain text to breaks in HTML
 						// to match the plain text output
 		    			label = label.replace(/\n/g, '<br/>');
 					}
-		    		
+
 		    		graph.cellLabelChanged(state.cell, graph.sanitizeHtml(label));
 		    	}
-		
+
 		       	graph.setCellStyles('html', value);
 				ui.fireEvent(new mxEventObject('styleChanged', 'keys', ['html'],
 						'values', [(value != null) ? value : '0'], 'cells',
@@ -572,9 +581,9 @@ Actions.prototype.init = function()
 	{
     	var state = graph.getView().getState(graph.getSelectionCell());
     	var value = 'wrap';
-    	
+
 		graph.stopEditing();
-    	
+
     	if (state != null && state.style[mxConstants.STYLE_WHITE_SPACE] == 'wrap')
     	{
     		value = null;
@@ -586,7 +595,7 @@ Actions.prototype.init = function()
 	{
 		var value = '0';
     	var state = graph.getView().getState(graph.getSelectionCell());
-    	
+
     	if (state != null)
     	{
     		value = state.style[mxConstants.STYLE_ROTATION] || value;
@@ -599,7 +608,7 @@ Actions.prototype.init = function()
 				graph.setCellStyles(mxConstants.STYLE_ROTATION, newValue);
 			}
 		}, mxResources.get('enterValue') + ' (' + mxResources.get('rotation') + ' 0-360)');
-		
+
 		ui.showDialog(dlg.container, 375, 80, true, true);
 		dlg.init();
 	});
@@ -618,14 +627,14 @@ Actions.prototype.init = function()
 		{
 			this.get('pageView').funct();
 		}
-		
+
 		var fmt = graph.pageFormat;
 		var ps = graph.pageScale;
 		var cw = graph.container.clientWidth - 10;
 		var ch = graph.container.clientHeight - 10;
 		var scale = Math.floor(20 * Math.min(cw / fmt.width / ps, ch / fmt.height / ps)) / 20;
 		graph.zoomTo(scale);
-		
+
 		if (mxUtils.hasScrollbars(graph.container))
 		{
 			var pad = graph.getPagePadding();
@@ -639,15 +648,15 @@ Actions.prototype.init = function()
 		{
 			this.get('pageView').funct();
 		}
-		
+
 		var fmt = graph.pageFormat;
 		var ps = graph.pageScale;
 		var cw = graph.container.clientWidth - 10;
 		var ch = graph.container.clientHeight - 10;
-		
+
 		var scale = Math.floor(20 * Math.min(cw / (2 * fmt.width) / ps, ch / fmt.height / ps)) / 20;
 		graph.zoomTo(scale);
-		
+
 		if (mxUtils.hasScrollbars(graph.container))
 		{
 			var pad = graph.getPagePadding();
@@ -661,14 +670,14 @@ Actions.prototype.init = function()
 		{
 			this.get('pageView').funct();
 		}
-		
+
 		var fmt = graph.pageFormat;
 		var ps = graph.pageScale;
 		var cw = graph.container.clientWidth - 10;
 
 		var scale = Math.floor(20 * cw / fmt.width / ps) / 20;
 		graph.zoomTo(scale);
-		
+
 		if (mxUtils.hasScrollbars(graph.container))
 		{
 			var pad = graph.getPagePadding();
@@ -681,7 +690,7 @@ Actions.prototype.init = function()
 		var dlg = new FilenameDialog(this.editorUi, parseInt(graph.getView().getScale() * 100), mxResources.get('apply'), mxUtils.bind(this, function(newValue)
 		{
 			var val = parseInt(newValue);
-			
+
 			if (!isNaN(val) && val > 0)
 			{
 				graph.zoomTo(val / 100);
@@ -695,7 +704,7 @@ Actions.prototype.init = function()
 		var dlg = new FilenameDialog(this.editorUi, parseInt(graph.pageScale * 100), mxResources.get('apply'), mxUtils.bind(this, function(newValue)
 		{
 			var val = parseInt(newValue);
-			
+
 			if (!isNaN(val) && val > 0)
 			{
 				ui.setPageScale(val / 100);
@@ -715,7 +724,7 @@ Actions.prototype.init = function()
 	action.setToggleAction(true);
 	action.setSelectedCallback(function() { return graph.isGridEnabled(); });
 	action.setEnabled(false);
-	
+
 	action = this.addAction('guides', function()
 	{
 		graph.graphHandler.guidesEnabled = !graph.graphHandler.guidesEnabled;
@@ -724,21 +733,21 @@ Actions.prototype.init = function()
 	action.setToggleAction(true);
 	action.setSelectedCallback(function() { return graph.graphHandler.guidesEnabled; });
 	action.setEnabled(false);
-	
+
 	action = this.addAction('tooltips', function()
 	{
 		graph.tooltipHandler.setEnabled(!graph.tooltipHandler.isEnabled());
 	});
 	action.setToggleAction(true);
 	action.setSelectedCallback(function() { return graph.tooltipHandler.isEnabled(); });
-	
+
 	action = this.addAction('collapseExpand', function()
 	{
 		var change = new ChangePageSetup(ui);
 		change.ignoreColor = true;
 		change.ignoreImage = true;
 		change.foldingEnabled = !graph.foldingEnabled;
-		
+
 		graph.model.execute(change);
 	});
 	action.setToggleAction(true);
@@ -786,22 +795,22 @@ Actions.prototype.init = function()
 	action.setSelectedCallback(function() { return ui.editor.autosave; });
 	action.isEnabled = isGraphEnabled;
 	action.visible = false;
-	
+
 	// Help actions
 	this.addAction('help', function()
 	{
 		var ext = '';
-		
+
 		if (mxResources.isLanguageSupported(mxClient.language))
 		{
 			ext = '_' + mxClient.language;
 		}
-		
+
 		graph.openLink(RESOURCES_PATH + '/help' + ext + '.html');
 	});
-	
+
 	var showingAbout = false;
-	
+
 	this.put('about', new Action(mxResources.get('about') + ' Graph Editor...', function()
 	{
 		if (!showingAbout)
@@ -810,11 +819,11 @@ Actions.prototype.init = function()
 			{
 				showingAbout = false;
 			});
-			
+
 			showingAbout = true;
 		}
 	}, null, null, 'F1'));
-	
+
 	// Font style actions
 	var toggleFontStyle = mxUtils.bind(this, function(key, style, fn, shortcut)
 	{
@@ -827,19 +836,19 @@ Actions.prototype.init = function()
 			else
 			{
 				graph.stopEditing(false);
-				
+
 				graph.getModel().beginUpdate();
 				try
 				{
 					graph.toggleCellStyleFlags(mxConstants.STYLE_FONTSTYLE, style);
-					
+
 					// Removes bold and italic tags and CSS styles inside labels
 					if ((style & mxConstants.FONT_BOLD) == mxConstants.FONT_BOLD)
 					{
 						graph.updateLabelElements(graph.getSelectionCells(), function(elt)
 						{
 							elt.style.fontWeight = null;
-							
+
 							if (elt.nodeName == 'B')
 							{
 								graph.replaceElement(elt);
@@ -851,7 +860,7 @@ Actions.prototype.init = function()
 						graph.updateLabelElements(graph.getSelectionCells(), function(elt)
 						{
 							elt.style.fontStyle = null;
-							
+
 							if (elt.nodeName == 'I')
 							{
 								graph.replaceElement(elt);
@@ -863,7 +872,7 @@ Actions.prototype.init = function()
 						graph.updateLabelElements(graph.getSelectionCells(), function(elt)
 						{
 							elt.style.textDecoration = null;
-							
+
 							if (elt.nodeName == 'U')
 							{
 								graph.replaceElement(elt);
@@ -878,11 +887,11 @@ Actions.prototype.init = function()
 			}
 		}, null, null, shortcut);
 	});
-	
+
 	toggleFontStyle('bold', mxConstants.FONT_BOLD, function() { document.execCommand('bold', false, null); }, Editor.ctrlKey + '+B');
 	toggleFontStyle('italic', mxConstants.FONT_ITALIC, function() { document.execCommand('italic', false, null); }, Editor.ctrlKey + '+I');
 	toggleFontStyle('underline', mxConstants.FONT_UNDERLINE, function() { document.execCommand('underline', false, null); }, Editor.ctrlKey + '+U');
-	
+
 	// Color actions
 	this.addAction('fontColor...', function() { ui.menus.pickColor(mxConstants.STYLE_FONTCOLOR, 'forecolor', '000000'); });
 	this.addAction('strokeColor...', function() { ui.menus.pickColor(mxConstants.STYLE_STROKECOLOR); });
@@ -890,7 +899,7 @@ Actions.prototype.init = function()
 	this.addAction('gradientColor...', function() { ui.menus.pickColor(mxConstants.STYLE_GRADIENTCOLOR); });
 	this.addAction('backgroundColor...', function() { ui.menus.pickColor(mxConstants.STYLE_LABEL_BACKGROUNDCOLOR, 'backcolor'); });
 	this.addAction('borderColor...', function() { ui.menus.pickColor(mxConstants.STYLE_LABEL_BORDERCOLOR); });
-	
+
 	// Format actions
 	this.addAction('vertical', function() { ui.menus.toggleStyle(mxConstants.STYLE_HORIZONTAL, true); });
 	this.addAction('shadow', function() { ui.menus.toggleStyle(mxConstants.STYLE_SHADOW); });
@@ -980,7 +989,7 @@ Actions.prototype.init = function()
 	    		var state = graph.view.getState(cells[0]);
 	    		var style = (state != null) ? state.style : graph.getCellStyle(cells[0]);
 	    		var value = (mxUtils.getValue(style, mxConstants.STYLE_ROUNDED, '0') == '1') ? '0' : '1';
-	    		
+
 				graph.setCellStyles(mxConstants.STYLE_ROUNDED, value);
 				graph.setCellStyles(mxConstants.STYLE_CURVED, null);
 				ui.fireEvent(new mxEventObject('styleChanged', 'keys', [mxConstants.STYLE_ROUNDED, mxConstants.STYLE_CURVED],
@@ -1011,12 +1020,12 @@ Actions.prototype.init = function()
 	{
 		var state = graph.view.getState(graph.getSelectionCell());
 		var value = '1';
-		
+
 		if (state != null && graph.getFoldingImage(state) != null)
 		{
-			value = '0';	
+			value = '0';
 		}
-		
+
 		graph.setCellStyles('collapsible', value);
 		ui.fireEvent(new mxEventObject('styleChanged', 'keys', ['collapsible'],
 				'values', [value], 'cells', graph.getSelectionCells()));
@@ -1024,11 +1033,11 @@ Actions.prototype.init = function()
 	this.addAction('editStyle...', mxUtils.bind(this, function()
 	{
 		var cells = graph.getSelectionCells();
-		
+
 		if (cells != null && cells.length > 0)
 		{
 			var model = graph.getModel();
-			
+
 	    	var dlg = new TextareaDialog(this.editorUi, mxResources.get('editStyle') + ':',
 	    		model.getStyle(cells[0]) || '', function(newValue)
 			{
@@ -1058,33 +1067,33 @@ Actions.prototype.init = function()
 	this.addAction('addWaypoint', function()
 	{
 		var cell = graph.getSelectionCell();
-		
+
 		if (cell != null && graph.getModel().isEdge(cell))
 		{
 			var handler = editor.graph.selectionCellsHandler.getHandler(cell);
-			
+
 			if (handler instanceof mxEdgeHandler)
 			{
 				var t = graph.view.translate;
 				var s = graph.view.scale;
 				var dx = t.x;
 				var dy = t.y;
-				
+
 				var parent = graph.getModel().getParent(cell);
 				var pgeo = graph.getCellGeometry(parent);
-				
+
 				while (graph.getModel().isVertex(parent) && pgeo != null)
 				{
 					dx += pgeo.x;
 					dy += pgeo.y;
-					
+
 					parent = graph.getModel().getParent(parent);
 					pgeo = graph.getCellGeometry(parent);
 				}
-				
+
 				var x = Math.round(graph.snap(graph.popupMenuHandler.triggerX / s - dx));
 				var y = Math.round(graph.snap(graph.popupMenuHandler.triggerY / s - dy));
-				
+
 				handler.addPointAt(handler.state, x, y);
 			}
 		}
@@ -1093,7 +1102,7 @@ Actions.prototype.init = function()
 	{
 		// TODO: Action should run with "this" set to action
 		var rmWaypointAction = ui.actions.get('removeWaypoint');
-		
+
 		if (rmWaypointAction.handler != null)
 		{
 			// NOTE: Popupevent handled and action updated in Menus.createPopupMenu
@@ -1103,22 +1112,22 @@ Actions.prototype.init = function()
 	this.addAction('clearWaypoints', function()
 	{
 		var cells = graph.getSelectionCells();
-		
+
 		if (cells != null)
 		{
 			cells = graph.addAllEdges(cells);
-			
+
 			graph.getModel().beginUpdate();
 			try
 			{
 				for (var i = 0; i < cells.length; i++)
 				{
 					var cell = cells[i];
-					
+
 					if (graph.getModel().isEdge(cell))
 					{
 						var geo = graph.getCellGeometry(cell);
-			
+
 						if (geo != null)
 						{
 							geo = geo.clone();
@@ -1155,14 +1164,14 @@ Actions.prototype.init = function()
 			var title = mxResources.get('image') + ' (' + mxResources.get('url') + '):';
 	    	var state = graph.getView().getState(graph.getSelectionCell());
 	    	var value = '';
-	    	
+
 	    	if (state != null)
 	    	{
 	    		value = state.style[mxConstants.STYLE_IMAGE] || value;
 	    	}
-	    	
+
 	    	var selectionState = graph.cellEditor.saveSelection();
-	    	
+
 	    	ui.showImageDialog(title, value, function(newValue, w, h)
 			{
 	    		// Inserts image into HTML text
@@ -1174,11 +1183,11 @@ Actions.prototype.init = function()
 	    		else
 	    		{
 					var cells = graph.getSelectionCells();
-					
+
 					if (newValue != null && (newValue.length > 0 || cells.length > 0))
 					{
 						var select = null;
-						
+
 						graph.getModel().beginUpdate();
 			        	try
 			        	{
@@ -1191,13 +1200,13 @@ Actions.prototype.init = function()
 			    				select = cells;
 		            	    		graph.fireEvent(new mxEventObject('cellsInserted', 'cells', select));
 			    			}
-			    			
+
 			        		graph.setCellStyles(mxConstants.STYLE_IMAGE, (newValue.length > 0) ? newValue : null, cells);
-			        		
+
 			        		// Sets shape only if not already shape with image (label or image)
 			        		var state = graph.view.getState(cells[0]);
 			        		var style = (state != null) ? state.style : graph.getCellStyle(cells[0]);
-			        		
+
 			        		if (style[mxConstants.STYLE_SHAPE] != 'image' && style[mxConstants.STYLE_SHAPE] != 'label')
 			        		{
 			        			graph.setCellStyles(mxConstants.STYLE_SHAPE, 'image', cells);
@@ -1206,14 +1215,14 @@ Actions.prototype.init = function()
 			        		{
 			        			graph.setCellStyles(mxConstants.STYLE_SHAPE, null, cells);
 			        		}
-				        	
+
 				        	if (graph.getSelectionCount() == 1)
 				        	{
 					        	if (w != null && h != null)
 					        	{
 					        		var cell = cells[0];
 					        		var geo = graph.getModel().getGeometry(cell);
-					        		
+
 					        		if (geo != null)
 					        		{
 					        			geo = geo.clone();
@@ -1228,7 +1237,7 @@ Actions.prototype.init = function()
 			        	{
 			        		graph.getModel().endUpdate();
 			        	}
-			        	
+
 			        	if (select != null)
 			        	{
 			        		graph.setSelectionCells(select);
@@ -1299,7 +1308,7 @@ Actions.prototype.init = function()
 			this.outlineWindow.window.setVisible(!this.outlineWindow.window.isVisible());
 		}
 	}), null, null, Editor.ctrlKey + '+Shift+O');
-	
+
 	action.setToggleAction(true);
 	action.setSelectedCallback(mxUtils.bind(this, function() { return this.outlineWindow != null && this.outlineWindow.window.isVisible(); }));
 };
@@ -1310,7 +1319,7 @@ Actions.prototype.init = function()
 Actions.prototype.addAction = function(key, funct, enabled, iconCls, shortcut)
 {
 	var title;
-	
+
 	if (key.substring(key.length - 3) == '...')
 	{
 		key = key.substring(0, key.length - 3);
@@ -1320,7 +1329,7 @@ Actions.prototype.addAction = function(key, funct, enabled, iconCls, shortcut)
 	{
 		title = mxResources.get(key);
 	}
-	
+
 	return this.put(key, new Action(title, funct, enabled, iconCls, shortcut));
 };
 
@@ -1330,7 +1339,7 @@ Actions.prototype.addAction = function(key, funct, enabled, iconCls, shortcut)
 Actions.prototype.put = function(name, action)
 {
 	this.actions[name] = action;
-	
+
 	return action;
 };
 

+ 40 - 0
src/api/planningScheme/index.js

@@ -8,6 +8,30 @@ export function planningSchemePage(params) {
     });
 }
 
+export function synergismSchemePage(params) {
+    return request({
+        url: "/api/v1/planning-scheme/user-roles-page",
+        method: "post",
+        params: params,
+    });
+}
+
+export function getSynergismScheme(params) {
+    return request({
+        url: "/api/v1/planning-scheme/get",
+        method: "get",
+        params,
+    });
+}
+
+export function planningSchemeUpdateMeasurement(data) {
+    return request({
+        url: "/api/v1/planning-scheme/update-measurement",
+        method: "post",
+        data,
+    });
+}
+
 export function planningSchemeUpdate(data) {
     return request({
         url: "/api/v1/planning-scheme/update",
@@ -32,6 +56,14 @@ export function planningSchemeUpdateTarget(data) {
     });
 }
 
+export function planningSchemeUpdateUserRole(data) {
+    return request({
+        url: "/api/v1/planning-scheme/update-user-role",
+        method: "post",
+        data,
+    });
+}
+
 export function schemeChapterInsert(data) {
     return request({
         url: "/api/v1/schemechapter/insert",
@@ -40,6 +72,14 @@ export function schemeChapterInsert(data) {
     });
 }
 
+export function schemeChapterInsertPlan(data) {
+    return request({
+        url: "/api/v1/schemechapter/insert-plan",
+        method: "post",
+        data,
+    });
+}
+
 export function schemeChapterTree(params) {
     return request({
         url: "/api/v1/schemechapter/tree",

+ 8 - 0
src/api/system/user/userManagement.js

@@ -19,6 +19,14 @@ export function getList(data) {
   });
 }
 
+//  查询所有用户
+export function getAlluser() {
+  return request({
+    url: "/api/v1/system/user/list",
+    method: "post",
+  });
+}
+
 export function getListByTenant(data) {
   return request({
     url: "/api/v1/system/user/findPageByTenant",

+ 3 - 1
src/components/Components/TaskUserCard.vue

@@ -46,7 +46,9 @@
             :disabled="!isTaskTypeOverflow"
           >
             <span ref="taskNameRef" class="info-value dark-value text-ellipsis">
-              {{ this.$getDictNameByValue('task_type',plan.taskType+'') || "-" }}
+              {{
+                this.$getDictNameByValue("task_type", plan.taskType + "") || "-"
+              }}
             </span>
           </el-tooltip>
         </div>

+ 135 - 0
src/components/DrawioEmbed/index.vue

@@ -0,0 +1,135 @@
+<template>
+  <div class="drawio-container">
+    <iframe
+      ref="drawioIframe"
+      src="/CherryMarkdown/CherryMarkdown/drawio_demo.html"
+      width="100%"
+      height="600"
+      frameborder="0"
+      @load="onIframeLoad"
+    ></iframe>
+  </div>
+</template>
+
+<script>
+  export default {
+    name: "DrawioEmbed",
+    data() {
+      return {
+        isReady: false, // 内部维护就绪状态
+        result: { xmlData: "", base64: "" },
+      };
+    },
+    mounted() {
+      window.addEventListener("message", this.handleMessage);
+    },
+    beforeDestroy() {
+      window.removeEventListener("message", this.handleMessage);
+    },
+    methods: {
+      // iframe加载完成
+      onIframeLoad() {
+        console.log("iframe加载完成,等待就绪");
+      },
+
+      // 处理子页面消息
+      handleMessage(event) {
+        const { eventName, value } = event.data || {};
+
+        // 标记就绪状态
+        if (eventName === "ready") {
+          this.isReady = true;
+          console.log("draw.io已就绪");
+        }
+
+        // 接收数据返回结果
+        if (eventName === "getData:success") {
+          this.result = value;
+        }
+      },
+
+      // 发送消息到子页面
+      sendMessage(eventName, value) {
+        const iframe = this.$refs.drawioIframe;
+        if (iframe && iframe.contentWindow) {
+          iframe.contentWindow.postMessage(
+            { eventName, value },
+            "*" // 生产环境替换为实际域名
+          );
+        }
+      },
+
+      // 核心方法:加载数据(内部处理就绪判断)
+      setData(xmlData) {
+        return new Promise((resolve, reject) => {
+          // 验证XML
+          if (!xmlData) {
+            reject("XML数据不能为空");
+            return;
+          }
+
+          // 已就绪直接发送
+          if (this.isReady) {
+            this.sendMessage("setData", xmlData);
+            resolve();
+            return;
+          }
+
+          // 未就绪则等待(最多10秒)
+          let timerCount = 0;
+          const timer = setInterval(() => {
+            timerCount++;
+
+            if (this.isReady) {
+              clearInterval(timer);
+              this.sendMessage("setData", xmlData);
+              resolve();
+            } else if (timerCount >= 100) {
+              // 100 * 100ms = 10秒
+              clearInterval(timer);
+              reject("等待draw.io就绪超时");
+            }
+          }, 100);
+        });
+      },
+
+      // 核心方法:获取数据
+      getData() {
+        return new Promise((resolve, reject) => {
+          if (!this.isReady) {
+            reject("draw.io尚未就绪");
+            return;
+          }
+
+          // 发送获取请求
+          this.sendMessage("getData", "");
+
+          // 等待结果返回(最多5秒)
+          let timerCount = 0;
+          const timer = setInterval(() => {
+            timerCount++;
+
+            if (this.result.xmlData) {
+              clearInterval(timer);
+              resolve(this.result);
+              // 清空缓存,避免下次获取旧数据
+              this.result = { xmlData: "", base64: "" };
+            } else if (timerCount >= 50) {
+              // 50 * 100ms = 5秒
+              clearInterval(timer);
+              reject("获取数据超时");
+            }
+          }, 100);
+        });
+      },
+    },
+  };
+</script>
+
+<style scoped>
+  .drawio-container {
+    width: 100%;
+    height: 100%;
+    border: 1px solid #eee;
+  }
+</style>

+ 0 - 1
src/components/GlobalComponents/OverallCard.vue

@@ -203,7 +203,6 @@
       //查看测量方案
       viewMeasPlan(status) {
         if (status !== "已编制") {
-          this.$message.warning("请先编制方案后,再查看!");
           this.$emit("link-to", { type: "meas", isOk: status });
         } else {
           this.$emit("link-to", { type: "meas", isOk: status });

+ 122 - 97
src/views/planningSchem/childsPlan/measPlan.vue

@@ -57,7 +57,7 @@
       <el-steps :active="currentStep" finish-status="success" align-center class="mb-8">
         <el-step title="开始筹划"></el-step>
         <el-step title="发起协同"></el-step>
-        <el-step title="选择方案模板"></el-step>
+        <!--<el-step title="选择方案模板"></el-step>-->
       </el-steps>
 
       <div class="min-h-[400px] transition-all duration-300 ease-in-out">
@@ -72,7 +72,7 @@
 
           <!-- 半自动筹划页面 -->
           <div v-if="planningType === 'semi'">
-            <semi-plan-create></semi-plan-create>
+            <semi-plan-create :planInfo="planInfo" :dataJson="planJson" @save-plan="savePlanJson"></semi-plan-create>
           </div>
         </div>
 
@@ -85,94 +85,106 @@
               <h2 class="text-xl font-bold">发起协同</h2>
             </div>
             <el-divider></el-divider>
-            <p class="text-gray-400 mb-6">
-              查看自动和半自动筹划完毕的各个专业组方案详情信息
-            </p>
-
-            <el-row :gutter="20">
-              <el-col :span="8" v-for="(plan, index) in planList" :key="index">
-                <el-card
-                    :class="`bg-black border-2 border-gray-700 rounded-md ${selectedPlan && selectedPlan.name === plan.name ? 'border-blue-500 shadow-lg' : ''}`"
-                    shadow="hover"
-                >
-                  <div class="flex flex-col items-center">
-                    <i alt="方案图标" class="el-icon-document text-4xl mb-4"/>
-                    <h3 class="font-bold mb-2">{{ plan.name }}</h3>
-                    <p class="text-gray-400 text-sm mb-2">{{ plan.desc }}</p>
-                    <el-button  @click="handlePlanSelect(plan)" class="blue-btn w-full text-base">查看筹划方案</el-button>
-                  </div>
-                </el-card>
-              </el-col>
-            </el-row>
-
-            <!-- 发起协同工作区域 -->
-            <div class="mt-8">
-              <div class="flex items-center mb-4">
-
-                <i class="el-icon-user mr-3 text-yellow-400"></i>
-                <h3 class="font-bold">发起协同工作</h3>
-              </div>
-              <p class="text-gray-400 mb-6">
-                选择相关专业组或专业组人员,发起协同工作,让各专业组的方案筹划编制人共同参与方案制定
+
+            <div class="flex justify-center items-center mb-2">
+              <el-button type="success" style="width: 200px" @click="showUserSelectDialog">发起协同</el-button>
+            </div>
+
+            <div v-if="selectedUsers" class="flex flex-col justify-center items-center mb-2">
+              <p class="text-gray-400 text-base mb-1">已选协同人员:</p>
+              <p class="text-blue-400 text-base">
+                {{ selectedUsers.map(user => user.username).join('、') }}
               </p>
-              <el-row :gutter="20">
-                <el-col :span="8" v-for="(group, index) in groupList" :key="index">
-                  <el-card class="bg-gray-800 border border-gray-700 rounded-md">
-                    <div class="text-center">
-                      <h3 class="font-bold text-lg text-blue-400 mb-4 border-b border-blue-200">{{ group.title }}</h3>
-                      <h4 class="font-bold mb-2">{{ group.name }}</h4>
-                      <!-- 回显已选人员 -->
-                      <div v-if="groupCollaborators[group.name] && groupCollaborators[group.name].length" class="mb-2">
-                        <p class="text-gray-400 text-sm mb-1">已选协同人员:</p>
-                        <p class="text-blue-400 text-sm">
-                          {{ groupCollaborators[group.name].map(user => user.name).join('、') }}
-                        </p>
-                      </div>
-                      <el-button type="success" class="w-full" @click="showUserSelectDialog(group)">发起协同</el-button>
-
-                    </div>
-                  </el-card>
-                </el-col>
-              </el-row>
             </div>
+
+            <!--<p class="text-gray-400 mb-6">-->
+            <!--  查看自动和半自动筹划完毕的各个专业组方案详情信息-->
+            <!--</p>-->
+
+            <!--<el-row :gutter="20">-->
+            <!--  <el-col :span="8" v-for="(plan, index) in planList" :key="index">-->
+            <!--    <el-card-->
+            <!--        :class="`bg-black border-2 border-gray-700 rounded-md ${selectedPlan && selectedPlan.name === plan.name ? 'border-blue-500 shadow-lg' : ''}`"-->
+            <!--        shadow="hover"-->
+            <!--    >-->
+            <!--      <div class="flex flex-col items-center">-->
+            <!--        <i alt="方案图标" class="el-icon-document text-4xl mb-4"/>-->
+            <!--        <h3 class="font-bold mb-2">{{ plan.name }}</h3>-->
+            <!--        <p class="text-gray-400 text-sm mb-2">{{ plan.desc }}</p>-->
+            <!--        <el-button  @click="handlePlanSelect(plan)" class="blue-btn w-full text-base">查看筹划方案</el-button>-->
+            <!--      </div>-->
+            <!--    </el-card>-->
+            <!--  </el-col>-->
+            <!--</el-row>-->
+
+            <!--&lt;!&ndash; 发起协同工作区域 &ndash;&gt;-->
+            <!--<div class="mt-8">-->
+            <!--  <div class="flex items-center mb-4">-->
+
+            <!--    <i class="el-icon-user mr-3 text-yellow-400"></i>-->
+            <!--    <h3 class="font-bold">发起协同工作</h3>-->
+            <!--  </div>-->
+            <!--  <p class="text-gray-400 mb-6">-->
+            <!--    选择相关专业组或专业组人员,发起协同工作,让各专业组的方案筹划编制人共同参与方案制定-->
+            <!--  </p>-->
+            <!--  <el-row :gutter="20">-->
+            <!--    <el-col :span="8" v-for="(group, index) in groupList" :key="index">-->
+            <!--      <el-card class="bg-gray-800 border border-gray-700 rounded-md">-->
+            <!--        <div class="text-center">-->
+            <!--          <h3 class="font-bold text-lg text-blue-400 mb-4 border-b border-blue-200">{{ group.title }}</h3>-->
+            <!--          <h4 class="font-bold mb-2">{{ group.name }}</h4>-->
+            <!--          &lt;!&ndash; 回显已选人员 &ndash;&gt;-->
+            <!--          <div v-if="groupCollaborators[group.name] && groupCollaborators[group.name].length" class="mb-2">-->
+            <!--            <p class="text-gray-400 text-sm mb-1">已选协同人员:</p>-->
+            <!--            <p class="text-blue-400 text-sm">-->
+            <!--              {{ groupCollaborators[group.name].map(user => user.name).join('、') }}-->
+            <!--            </p>-->
+            <!--          </div>-->
+            <!--          <el-button type="success" class="w-full" @click="showUserSelectDialog(group)">发起协同</el-button>-->
+
+            <!--        </div>-->
+            <!--      </el-card>-->
+            <!--    </el-col>-->
+            <!--  </el-row>-->
+            <!--</div>-->
           </el-card>
         </div>
 
         <!-- 步骤四内容:选择方案模板(原步骤三) -->
-        <div v-if="currentStep === 2" class="animate-fadeIn space-y-6">
-          <el-card class="bg-gray-800 border-none mb-8">
-            <div class="flex items-center mb-6">
-              <i class="el-icon-copy-document mr-3 text-blue-400"></i>
-              <h2 class="text-xl font-bold">选择综合方案模板</h2>
-            </div>
-            <p class="text-gray-400 mb-6">
-              请选择合适的方案模板,系统将根据您选择的模板生成初步方案框架
-            </p>
-
-            <el-row :gutter="20">
-              <el-col :span="8" v-for="(template, index) in templateList" :key="index">
-                <el-card
-                    :class="`bg-gray-800 border-2 border-gray-700 rounded-md transition-all duration-300 ${selectedTemplate === index ? 'border-blue-500 shadow-lg transform scale-[1.02]' : ''}`"
-                >
-                  <div class="flex justify-between items-start mb-3">
-                    <h3 class="font-bold">{{ template.name }}</h3>
-                    <el-tag type="info" size="mini">
-                      {{ template.type }}
-                    </el-tag>
-                  </div>
-                  <p class="text-gray-400 mb-4 text-sm h-20">
-                    {{ template.description }}
-                  </p>
-                  <div class="text-gray-500 text-xs mb-4">
-                    <p>适用任务类型: {{ template.suitableTaskTypes.join('、') }}</p>
-                    <p>最近更新: {{ template.lastUpdated }}</p>
-                  </div>
-                  <el-button @click="selectedTemplate = index" class="blue-btn w-full text-base">选择此模板</el-button>
-                </el-card>
-              </el-col>
-            </el-row>
-          </el-card>
-        </div>
+        <!--<div v-if="currentStep === 2" class="animate-fadeIn space-y-6">-->
+        <!--  <el-card class="bg-gray-800 border-none mb-8">-->
+        <!--    <div class="flex items-center mb-6">-->
+        <!--      <i class="el-icon-copy-document mr-3 text-blue-400"></i>-->
+        <!--      <h2 class="text-xl font-bold">选择综合方案模板</h2>-->
+        <!--    </div>-->
+        <!--    <p class="text-gray-400 mb-6">-->
+        <!--      请选择合适的方案模板,系统将根据您选择的模板生成初步方案框架-->
+        <!--    </p>-->
+
+        <!--    <el-row :gutter="20">-->
+        <!--      <el-col :span="8" v-for="(template, index) in templateList" :key="index">-->
+        <!--        <el-card-->
+        <!--            :class="`bg-gray-800 border-2 border-gray-700 rounded-md transition-all duration-300 ${selectedTemplate === index ? 'border-blue-500 shadow-lg transform scale-[1.02]' : ''}`"-->
+        <!--        >-->
+        <!--          <div class="flex justify-between items-start mb-3">-->
+        <!--            <h3 class="font-bold">{{ template.name }}</h3>-->
+        <!--            <el-tag type="info" size="mini">-->
+        <!--              {{ template.type }}-->
+        <!--            </el-tag>-->
+        <!--          </div>-->
+        <!--          <p class="text-gray-400 mb-4 text-sm h-20">-->
+        <!--            {{ template.description }}-->
+        <!--          </p>-->
+        <!--          <div class="text-gray-500 text-xs mb-4">-->
+        <!--            <p>适用任务类型: {{ template.suitableTaskTypes.join('、') }}</p>-->
+        <!--            <p>最近更新: {{ template.lastUpdated }}</p>-->
+        <!--          </div>-->
+        <!--          <el-button @click="selectedTemplate = index" class="blue-btn w-full text-base">选择此模板</el-button>-->
+        <!--        </el-card>-->
+        <!--      </el-col>-->
+        <!--    </el-row>-->
+        <!--  </el-card>-->
+        <!--</div>-->
       </div>
 
       <!-- 底部按钮 -->
@@ -183,7 +195,7 @@
             @click="nextStep"
             :disabled="!canProceedToNextStep"
         >
-          {{ currentStep === 2 ? '完成' : '下一步' }}
+          {{ currentStep === 1 ? '完成' : '下一步' }}
         </el-button>
       </div>
       <!-- 选人弹窗 -->
@@ -199,7 +211,7 @@
               :key="user.id"
               :label="user"
           >
-            {{ user.name }}
+            {{ user.username }}
           </el-checkbox>
         </el-checkbox-group>
         <div slot="footer" class="dialog-footer">
@@ -214,6 +226,8 @@
 <script>
 import autoPlanCreate from "@/views/planningSchem/comprehensive/components/autoPlanCreate.vue";
 import semiPlanCreate from "@/views/planningSchem/comprehensive/components/semiPlanCreate.vue";
+import {getAlluser, getList} from "@/api/system/user/userManagement";
+import {planningSchemeUpdateMeasurement} from "@/api/planningScheme";
 export default {
   components:{
     autoPlanCreate,
@@ -312,10 +326,6 @@ export default {
       selectedGroup: null, // 存储当前点击的要发起协同的组
       selectedUsers: [], // 存储选中的人员
       userList: [ // 模拟人员列表数据
-        { id: 1, name: '张三' },
-        { id: 2, name: '李四' },
-        { id: 3, name: '王五' },
-        { id: 4, name: '赵六' }
       ],
       groupCollaborators: {}, // 存储每个组已选的协同人员
 
@@ -345,7 +355,9 @@ export default {
         equipment: '',
         startDate: '',
         endDate: ''
-      }
+      },
+      planJson:null,
+      planInfo:JSON.parse(this.$route.query.plan),
     };
   },
   computed: {
@@ -382,10 +394,16 @@ export default {
     }
   },
   mounted() {
-    console.log(typeof this.$route.query.isOk)
+    console.log(typeof this.$route.query)
     this.getStates()
+    this.getUserTree()
   },
   methods: {
+    getUserTree(){
+      getList({pageNo:1,pageSize:9999,orgIdGroup:'org_all'}).then((res)=>{
+        this.userList = res.data.rows
+      })
+    },
     getStates(){
       const stetes =this.$route.query.isOk
       switch (stetes) {
@@ -436,7 +454,7 @@ export default {
       if (!this.canProceedToNextStep) return;
 
       // 如果是最后一步,提交表单
-      if (this.currentStep === 2) {
+      if (this.currentStep === 1) {
         this.submitForm();
         return;
       }
@@ -458,6 +476,10 @@ export default {
     },
     // 提交表单
     submitForm() {
+      const planId = JSON.parse(this.$route.query.plan).id
+      const userIds = this.selectedUsers.map(user => user.id);
+      planningSchemeUpdateMeasurement({id:planId,schemeContent:this.planJson,userIds:userIds})
+
       // 这里可以添加表单验证和提交逻辑
       this.$message.success('筹划方案创建成功!');
       // 提交成功后返回主界面
@@ -466,16 +488,19 @@ export default {
       }, 1500);
     },
 
+    savePlanJson(data){
+      this.planJson = data.planJson
+      this.$message.success('草稿保存成功!')
+    },
+
     // 显示选人弹窗
-    showUserSelectDialog(group) {
-      this.selectedGroup = group;
+    showUserSelectDialog() {
       this.showSelectUserDialog = true;
       // 如果该组之前有选过人员,回显选中状态
-      this.selectedUsers = this.groupCollaborators[group.name] || [];
+      this.selectedUsers = [];
     },
     // 确认选择人员
     confirmSelectUsers() {
-      this.groupCollaborators[this.selectedGroup.name] = this.selectedUsers;
       this.showSelectUserDialog = false;
     },
     // 取消选择人员

+ 96 - 23
src/views/planningSchem/comprehensive/components/associationTask.vue

@@ -1,7 +1,7 @@
 <template>
   <div class="create-plan-page bg-gray-900 text-white min-h-screen p-6">
     <div class="flex justify-between items-center mb-8">
-      <h1 class="text-2xl font-bold">选择试验任务</h1>
+      <h1 class="text-2xl font-bold">新增方案</h1>
       <el-button class="blue-btn" @click="back">返回主界面</el-button>
     </div>
 
@@ -12,34 +12,61 @@
         <el-card class="bg-gray-800 border-none mb-8">
           <div class="flex items-center mb-2">
             <i class="el-icon-document mr-3 text-blue-400"></i>
-            <h2 class="text-xl font-bold">选择试验任务</h2>
+            <h2 class="text-xl font-bold">选择总体方案</h2>
           </div>
           <el-divider></el-divider>
           <p class="text-gray-400 mb-6">
-            请选择要创建筹划方案的试验任务,系统将根据任务要求自动推荐相应的方案类型
+            请选择要创建筹划方案的总体方案,系统将总体方案展示对应子任务
           </p>
 
           <el-row :gutter="20">
-            <el-col :span="8" v-for="(task, index) in taskList" :key="index">
+            <el-col :span="8" v-for="(plan, index) in planList" :key="index">
               <el-card
-                  :class="`bg-gray-800 border-4 border-gray-700 rounded-md transition-all duration-300 ${selectedTask && selectedTask.name === task.name ? 'border-blue-500 shadow-lg transform scale-[1.02]' : ''}`"
+                  :class="`bg-gray-800 border-4 border-gray-700 rounded-md transition-all duration-300 ${selectedPlan && selectedPlan.taskName === plan.taskName ? 'border-blue-500 shadow-lg transform scale-[1.02]' : ''}`"
               >
                 <div class="flex justify-between items-start mb-3">
-                  <h3 class="text-lg font-bold">{{ task.name }}</h3>
-                  <el-tag
-                      :type="getTagType(task.status)"
-                      size="mini"
-                  >
-                    {{ task.statusText }}
-                  </el-tag>
+                  <h3 class="text-lg font-bold"> {{ plan.taskName || "-" }}</h3>
+                  <!--<el-tag effect="dark" class="info-value">-->
+                  <!--  {{ plan.taskStatus }}-->
+                  <!--</el-tag>-->
                 </div>
                 <ul class="text-gray-400 space-y-2 mb-4">
-                  <li>任务代号: {{ task.code }}</li>
-                  <li>开始时间: {{ task.startTime }}</li>
-                  <li>结束时间: {{ task.endTime }}</li>
-                  <li>任务类型: {{ task.type }}</li>
+                  <li>任务代号: {{ plan.taskCode || "-" }}</li>
+                  <li>任务类型: {{ $getDictNameByValue('task_type',plan.taskType+'') || "-" }}</li>
+                  <li>任务时间: {{ plan.testTime || "-" }}</li>
+                  <li>创建时间: {{ plan.createTime || "-" }}</li>
                 </ul>
-                <el-button @click="handleTaskSelect(task)" class="blue-btn w-full text-lg">选择此任务</el-button>
+                <el-button @click="handleTaskSelect(plan)" class="blue-btn w-full text-lg">选择此方案</el-button>
+              </el-card>
+            </el-col>
+          </el-row>
+        </el-card>
+
+        <el-card v-if="selectedPlan" class="bg-gray-800 border-none mb-8">
+          <div class="flex items-center mb-2">
+            <i class="el-icon-document mr-3 text-blue-400"></i>
+            <h2 class="text-xl font-bold">选择子任务</h2>
+          </div>
+          <el-divider></el-divider>
+          <el-row :gutter="20">
+            <el-col :span="8" v-for="(plan, index) in subPlanList" :key="index">
+              <el-card
+                  :class="`bg-gray-800 border-4 border-gray-700 rounded-md transition-all duration-300 ${selectedSubPlan && selectedSubPlan.subTaskName === plan.subTaskName ? 'border-blue-500 shadow-lg transform scale-[1.02]' : ''}`"
+              >
+                <div class="flex justify-between items-start mb-3">
+                  <h3 class="text-lg font-bold"> {{ plan.subTaskName || "-" }}</h3>
+                  <!--<el-tag effect="dark" class="info-value">-->
+                  <!--  {{ plan.taskStatus }}-->
+                  <!--</el-tag>-->
+                </div>
+                <ul class="text-gray-400 space-y-2 mb-4">
+                  <li>任务代号: {{ plan.subTaskCode || "-" }}</li>
+                  <li>任务类型: {{ $getDictNameByValue('task_type',plan.subTaskType+'') || "-" }}</li>
+                  <li>任务时间: {{ plan.subTestTime || "-" }}</li>
+                  <li>打击维度: {{ plan.fightAway || "对陆" }}</li>
+                  <li>创建时间: {{ plan.createTime || "-" }}</li>
+                </ul>
+                <el-button @click="handleTaskSelectSub(plan)" class="blue-btn w-full text-lg">选择此任务</el-button>
               </el-card>
             </el-col>
           </el-row>
@@ -53,7 +80,7 @@
       <el-button
           class="blue-btn"
           @click="confirmSelection"
-          :disabled="!selectedTask"
+          :disabled="!selectedTask && !selectedSubPlan"
       >
         确认选择
       </el-button>
@@ -62,7 +89,11 @@
 </template>
 
 <script>
+import {findPageTask, findSubTaskPage} from "@/api/taskMage/taskMage";
+import {schemeChapterInsertPlan} from "@/api/planningScheme";
+
 export default {
+
   data() {
     return {
       selectedTask: null,
@@ -94,12 +125,53 @@ export default {
           endTime: '2023-10-31',
           type: '综合验证'
         }
-      ]
+      ],
+      planList:[],
+      subPlanList:[],
+      selectedPlan:null,
+      selectedSubPlan:null,
+      dist:{},
     };
   },
+  computed:{
+  },
+  created() {
+    this.dict.task_type= this.$getDictList('task_type')
+  },
+  mounted() {
+
+    this.handleQuery()
+  },
   methods: {
-    handleTaskSelect(task) {
-      this.selectedTask = task;
+    async handleQuery() {
+      const params = {
+        taskName_LIKE:'',
+        taskType_EQ:'',
+        pageNo:1,
+        pageSize:9999
+      }
+      // 查询逻辑
+      const res = await findPageTask(params)
+      this.planList = res.data.rows
+      // this.pagination.total = res.data.total
+    },
+    async handleTaskSelect(plan) {
+      await this.handleQuerySubPlan(plan)
+      this.selectedPlan = plan;
+      this.selectedSubPlan = null;
+    },
+    handleTaskSelectSub(plan){
+      this.selectedSubPlan = plan;
+
+    },
+    async handleQuerySubPlan(plan){
+      const params = {
+        subTaskId_EQ:plan.id,
+        pageNo:1,
+        pageSize:9999
+      }
+      const res = await findSubTaskPage(params);
+      this.subPlanList = res.data.rows
     },
     getTagType(status) {
       if (status === 'creatable') return 'success';
@@ -110,9 +182,10 @@ export default {
       this.$router.push({path: '/scheme/comprehensive'});
     },
     confirmSelection() {
-      // 处理选中任务后的逻辑
-      this.$message.success(`已选择任务: ${this.selectedTask.name}`);
       // 可以在这里添加跳转或其他处理逻辑
+      schemeChapterInsertPlan({taskId:this.selectedPlan.id,subTaskId:this.selectedSubPlan.id})
+      this.$message.success('新增方案成功')
+      this.back()
     }
   }
 };

+ 9 - 2
src/views/planningSchem/comprehensive/components/autoPlanCreate.vue

@@ -79,9 +79,16 @@
             <span>判别线</span>
           </div>
           <!-- 网格画布(模拟) -->
-          <div class="w-full bg-black bg-opacity-20 bg-blue-850 border border-blue-700 flex items-center justify-center" style="min-height: 400px;max-height: 500px">
+          <div class="w-full bg-black bg-opacity-20 bg-blue-850 border border-blue-700 flex items-center justify-center" style="min-height: 400px;">
             <!--<span class="text-blue-400">网格画布区域(可结合Canvas等实现交互)</span>-->
-            <img src="@/assets/plan_images/靶标.jpg" class="max-w-full max-h-full object-contain" style="max-height: 500px" />
+            <!--<img src="@/assets/plan_images/靶标.jpg" class="max-w-full max-h-full object-contain" style="max-height: 500px" />-->
+            <iframe
+                src="/CherryMarkdown/CherryMarkdown/drawio_demo.html"
+            class="border-none"
+            style="height: 700px;width: 100%"
+            frameborder="0"
+            allowfullscreen
+            ></iframe>
           </div>
           <div class="text-sm bg-blue-400 bg-opacity-20 rounded-md p-4 mt-2">
             操作提示: 点击BB区位可选中,拖拽可调整位置,双击可查看详情,使用右侧配置区设置参数后点击"生成方案"按钮。

+ 99 - 74
src/views/planningSchem/comprehensive/components/semiPlanCreate.vue

@@ -24,34 +24,34 @@
           <div class="p-4 mb-4 bg-black bg-opacity-20 rounded-md">
             <el-card shadow="hover" class="p-3 mb-2 text-white bg-gray-100 bg-opacity-20 border-l-8 border-blue-400">
               <div class="flex justify-between items-center mb-2">
-                <span class="text-blue-300 font-blod">试验区域</span>
+                <span class="text-blue-300 font-blod">任务名称</span>
               </div>
               <div class="flex text-sm mt-2">
-                <span>500m x 800m</span>
+                <span>{{ planInfo.taskName }}</span>
               </div>
             </el-card>
             <el-card shadow="hover" class="p-3 mb-2 text-white bg-gray-100 bg-opacity-20 border-l-8 border-blue-400">
               <div class="flex justify-between items-center mb-2">
-                <span class="text-blue-300 font-blod">装备数量</span>
+                <span class="text-blue-300 font-blod">任务类型</span>
               </div>
               <div class="flex text-sm mt-2">
-                <span>>8套</span>
+                <span>{{ $getDictNameByValue('task_type',planInfo.taskType+'') || "-" }}</span>
               </div>
             </el-card>
             <el-card shadow="hover" class="p-3 mb-2 text-white bg-gray-100 bg-opacity-20 border-l-8 border-blue-400">
               <div class="flex justify-between items-center mb-2">
-                <span class="text-blue-300 font-blod">布设密度</span>
+                <span class="text-blue-300 font-blod">布设算法</span>
               </div>
               <div class="flex text-sm mt-2">
-                <span>中等</span>
+                <span>{{ activeTab }}</span>
               </div>
             </el-card>
             <el-card shadow="hover" class="p-3 text-white bg-gray-100 bg-opacity-20 border-l-8 border-blue-400">
               <div class="flex justify-between items-center mb-2">
-                <span class="text-blue-300 font-blod">任务类型</span>
+                <span class="text-blue-300 font-blod">设备数量</span>
               </div>
               <div class="flex text-sm mt-2">
-                <span>综合试验</span>
+                <span>{{ algorithmParams.eqNumber1 }}</span>
               </div>
             </el-card>
           </div>
@@ -77,7 +77,7 @@
               border
               size="small"
               highlight-current-row
-              @row-click="selectTemplate"
+              @row-click=""
               class="mb-4 bg-gray-800 bg-opacity-30 border-gray-600"
           >
             <el-table-column
@@ -114,26 +114,26 @@
             <el-tab-pane label="随机布设" name="random">
               <div class="bg-gray-400 bg-opacity-30 p-4 rounded">
                 <h2 class="text-lg font-semibold mb-4">随机布设参数</h2>
-                <el-form :model="randomParams" label-width="120px">
+                <el-form :model="algorithmParams" label-width="120px">
                   <el-form-item label="随机种子">
-                    <el-input v-model="randomParams.randomSeed" placeholder="请输入随机种子"></el-input>
+                    <el-input v-model="algorithmParams.randomSeed" placeholder="请输入随机种子"></el-input>
                   </el-form-item>
                   <el-form-item label="布设密度">
-                    <el-select v-model="randomParams.layoutDensity" placeholder="请选择布设密度">
+                    <el-select v-model="algorithmParams.layoutDensity" placeholder="请选择布设密度">
                       <el-option label="低等密度" value="low"></el-option>
                       <el-option label="中等密度" value="medium"></el-option>
                       <el-option label="高等密度" value="high"></el-option>
                     </el-select>
                   </el-form-item>
                   <el-form-item label="最小间距(m)">
-                    <el-input v-model.number="randomParams.minSpacing" placeholder="请输入最小间距"></el-input>
+                    <el-input v-model.number="algorithmParams.minSpacing1" placeholder="请输入最小间距"></el-input>
                   </el-form-item>
                   <div style="border-top: 1px solid #737877;margin-bottom: 10px"></div>
                   <el-form-item label="装备数量">
-                    <el-input v-model.number="randomParams.minSpacing" placeholder="请输入最小间距"></el-input>
+                    <el-input v-model.number="algorithmParams.eqNumber1"></el-input>
                   </el-form-item>
                   <el-form-item label="装备类型">
-                    <el-input v-model.number="randomParams.minSpacing" placeholder="请输入最小间距"></el-input>
+                    <el-input v-model="algorithmParams.eqType1"></el-input>
                   </el-form-item>
                 </el-form>
               </div>
@@ -142,23 +142,23 @@
               <div class="bg-gray-400 bg-opacity-30 p-4 rounded">
                 <h2 class="text-lg font-semibold mb-4">网格布设参数</h2>
                 <!-- 可根据需求添加网格布设相关表单元素 -->
-                <el-form :model="randomParams" label-width="120px">
+                <el-form :model="algorithmParams" label-width="120px">
                   <el-form-item label="布设密度">
-                    <el-select v-model="randomParams.layoutDensity" placeholder="请选择布设密度">
+                    <el-select v-model="algorithmParams.layoutDensity2" placeholder="请选择布设密度">
                       <el-option label="低等密度" value="low"></el-option>
                       <el-option label="中等密度" value="medium"></el-option>
                       <el-option label="高等密度" value="high"></el-option>
                     </el-select>
                   </el-form-item>
                   <el-form-item label="网格间距(m)">
-                    <el-input v-model.number="randomParams.minSpacing" placeholder="请输入最小间距"></el-input>
+                    <el-input v-model.number="algorithmParams.minSpacing2" ></el-input>
                   </el-form-item>
                   <div style="border-top: 1px solid #737877;margin-bottom: 10px"></div>
                   <el-form-item label="装备数量">
-                    <el-input v-model.number="randomParams.minSpacing" placeholder="请输入最小间距"></el-input>
+                    <el-input v-model.number="algorithmParams.eqNumber2" ></el-input>
                   </el-form-item>
                   <el-form-item label="装备类型">
-                    <el-input v-model.number="randomParams.minSpacing" placeholder="请输入最小间距"></el-input>
+                    <el-input v-model="algorithmParams.eqType2"></el-input>
                   </el-form-item>
                 </el-form>
               </div>
@@ -167,19 +167,19 @@
               <div class="bg-gray-400 bg-opacity-30 p-4 rounded">
                 <h2 class="text-lg font-semibold mb-4">聚类布设参数</h2>
                 <!-- 可根据需求添加聚类布设相关表单元素 -->
-                <el-form :model="randomParams" label-width="120px">
+                <el-form :model="algorithmParams" label-width="120px">
                   <el-form-item label="聚类中心">
-                    <el-input v-model="randomParams.randomCenter" placeholder="请输入聚类中心"></el-input>
+                    <el-input v-model="algorithmParams.randomCenter" placeholder="请输入聚类中心"></el-input>
                   </el-form-item>
                   <el-form-item label="聚类半径(m)">
-                    <el-input v-model.number="randomParams.minSpacing" placeholder="请输入最小间距"></el-input>
+                    <el-input v-model.number="algorithmParams.minSpacing3" ></el-input>
                   </el-form-item>
                   <div style="border-top: 1px solid #737877;margin-bottom: 10px"></div>
                   <el-form-item label="装备数量">
-                    <el-input v-model.number="randomParams.minSpacing" placeholder="请输入最小间距"></el-input>
+                    <el-input v-model.number="algorithmParams.eqNumber3" ></el-input>
                   </el-form-item>
                   <el-form-item label="装备类型">
-                    <el-input v-model.number="randomParams.minSpacing" placeholder="请输入最小间距"></el-input>
+                    <el-input v-model="algorithmParams.eqType3" ></el-input>
                   </el-form-item>
                 </el-form>
               </div>
@@ -208,9 +208,9 @@
 
           <!-- 操作控制 -->
           <div class="space-y-2 mt-4">
-            <el-button type="success" size="small" @click="back">完成编制</el-button>
-            <el-button type="warning" size="small" @click="back">保存草稿</el-button>
-            <el-button type="danger" size="small" @click="back">清空布设</el-button>
+            <!--<el-button type="success" size="small" @click="back">完成编制</el-button>-->
+            <el-button type="warning" size="small" @click="save">保存草稿</el-button>
+            <!--<el-button type="danger" size="small" @click="back">清空布设</el-button>-->
           </div>
         </div>
 
@@ -232,39 +232,8 @@
           <div class="flex items-center mb-4">
             <h3 class="text-lg font-bold" style="color: #4fc2f7">方案信息</h3>
           </div>
-          <div class="grid gap-4 grid-cols-4 p-4 mb-4 bg-black bg-opacity-20 rounded-md">
-            <el-card shadow="hover" class="p-3 text-white bg-gray-100 bg-opacity-20 border-l-8 border-blue-400">
-              <div class="flex justify-between items-center mb-2">
-                <span class="text-blue-300 font-blod">方案名称</span>
-              </div>
-              <div class="flex text-sm mt-2">
-                <span>BB布设方案-001</span>
-              </div>
-            </el-card>
-            <el-card shadow="hover" class="p-3 text-white bg-gray-100 bg-opacity-20 border-l-8 border-blue-400">
-              <div class="flex justify-between items-center mb-2">
-                <span class="text-blue-300 font-blod">创建时间</span>
-              </div>
-              <div class="flex text-sm mt-2">
-                <span>2025-08-20 11:05:30</span>
-              </div>
-            </el-card>
-            <el-card shadow="hover" class="p-3 text-white bg-gray-100 bg-opacity-20 border-l-8 border-blue-400">
-              <div class="flex justify-between items-center mb-2">
-                <span class="text-blue-300 font-blod">方案状态</span>
-              </div>
-              <div class="flex text-sm mt-2">
-                <span>编制中</span>
-              </div>
-            </el-card>
-            <el-card shadow="hover" class="p-3 text-white bg-gray-100 bg-opacity-20 border-l-8 border-blue-400">
-              <div class="flex justify-between items-center mb-2">
-                <span class="text-blue-300 font-blod">编制人员</span>
-              </div>
-              <div class="flex text-sm mt-2">
-                <span>张三</span>
-              </div>
-            </el-card>
+          <div class="flex p-4 mb-4 bg-black bg-opacity-20 rounded-md">
+            <span class="mr-4">{{ schemeInfo.measurementRequirements }}</span>
           </div>
           <!-- 图例 -->
           <div class="flex items-center text-base mb-2">
@@ -280,7 +249,8 @@
           <!-- 网格画布(模拟) -->
           <div class="w-full bg-black bg-opacity-20 bg-blue-850 border border-blue-700 flex items-center justify-center" style="min-height: 400px">
             <!--<span class="text-blue-400">网格画布区域(可结合Canvas等实现交互)</span>-->
-            <img src="@/assets/plan_images/靶标.jpg" class="w-full h-full" />
+            <!--<img src="@/assets/plan_images/靶标.jpg" class="w-full h-full" />-->
+            <DrawioEmbed ref="drawioRef" />
           </div>
           <div class="text-sm bg-blue-400 bg-opacity-20 rounded-md p-4 mt-2">
             操作提示: 点击BB区位可选中,拖拽可调整位置,双击可查看详情,使用右侧配置区设置参数后点击"生成方案"按钮。
@@ -328,10 +298,26 @@
 <script>
 import WangEditor from "@/components/Components/WangEditor.vue";
 import QAChat from "@/components/Components/QAChat.vue"
+import DrawioEmbed from "@/components/DrawioEmbed/index.vue";
+import {getSynergismScheme} from "@/api/planningScheme";
+
 export default {
+  props:{
+    dataJson:{
+      type:String,
+      default: null,
+    },
+    planInfo:{
+      type:Object,
+      default: ()=>{
+        return {}
+      }
+    }
+  },
   components:{
     WangEditor,
-    QAChat
+    QAChat,
+    DrawioEmbed
   },
   data() {
     return {
@@ -379,20 +365,21 @@ export default {
         '无人机蓝军系统',
         '大气状态分析仪'
       ],
-      planInfo: [
-        {
-          name: 'BB布设方案-001',
-          createTime: '2024-01-15 14:30',
-          status: '编制中',
-          editor: '张三'
-        }
-      ],
       activeTab: 'random',
-      randomParams: {
+      algorithmParams: {
         randomCenter: '1,1,1',
         randomSeed: '12345',
         layoutDensity: 'medium',
-        minSpacing: 50,
+        layoutDensity2: 'medium',
+        minSpacing1: 50,
+        minSpacing2: 50,
+        minSpacing3: 50,
+        eqNumber1:5,
+        eqNumber2:5,
+        eqNumber3:5,
+        eqType1:'',
+        eqType2:'',
+        eqType3:'',
       },
       // 悬浮球相关
       floatTop: 200,
@@ -408,7 +395,8 @@ export default {
         { time: '2025-08-20 11:05', operation: '创建方案', user: '张三' },
         { time: '2025-08-20 11:10', operation: '修改随机参数', user: '张三' },
         { time: '2025-08-20 11:15', operation: '保存草稿', user: '张三' }
-      ]
+      ],
+      schemeInfo:{}
     };
   },
   computed: {
@@ -426,6 +414,33 @@ export default {
     }
   },
   methods: {
+    async loadDefaultData(xml) {
+      try {
+        await this.$refs.drawioRef.setData(xml)
+        console.log('数据加载成功')
+      } catch (err) {
+        console.error('加载失败:', err)
+      }
+    },
+    async getXmlData() {
+      try {
+        const data = await this.$refs.drawioRef.getData()
+        console.log('获取数据成功:', data)
+        return data
+      } catch (err) {
+        console.error('获取失败:', err)
+      }
+    },
+    async save(){
+      const xml = await this.getXmlData()
+      const planJson = JSON.stringify({
+        algorithmJson:this.algorithmParams,   // 布设算法
+        textJson: this.content,   // 富文本
+        xml: xml
+      })
+
+      this.$emit("save-plan", { planJson: planJson });
+    },
     handleUse(plan) {
       // 执行“使用”逻辑
       console.log('正在使用方案:', plan.planName);
@@ -493,6 +508,16 @@ export default {
   },
   // 监听窗口大小变化,调整悬浮球位置
   mounted() {
+    getSynergismScheme({id:this.planInfo.id}).then((res)=>{
+      this.schemeInfo = res.data;
+    })
+    if(this.dataJson){
+      const data = JSON.parse(this.dataJson)
+      console.log(data)
+      this.algorithmParams = data.algorithmJson;
+      this.content = data.textJson;
+      this.loadDefaultData(data.xml.xmlData);
+    }
     window.addEventListener('resize', () => {
       this.floatLeft = Math.min(this.floatLeft, window.innerWidth - 80);
     });

+ 2 - 2
src/views/planningSchem/comprehensive/index.vue

@@ -538,8 +538,8 @@ export default {
         console.log("靶标方案未导入,显示上传组件")
         this.selectPlan = plan;
         this.showTargetUpload = true;
-      } else if (val.type === "meas") {
-        this.$router.push({path: "/childPlan/measPlan", query: {val, plan}})
+      } else if (val.type === "meas" && plan.measurementSchemeStatus === '未编制' ) {
+        this.$router.push({path: "/childPlan/measPlan", query: {plan:JSON.stringify(plan)}})
       } else {
         // 已导入/已编制状态正常跳转
         this.navigateTo(val.type, val.isOk);

+ 17 - 17
src/views/programPlanning/collaborativePlanning/CollaborativeCard.vue

@@ -9,24 +9,24 @@
 
         </div>
         <el-tooltip
-            :content="plan.planName"
+            :content="plan.taskName"
             placement="top"
             :disabled="!isPlanNameOverflow"
         >
           <h3 ref="planNameRef" class="plan-name" style="color: #e0e6ed">
-            {{ plan.planName }}
+            {{ plan.taskName }}
           </h3>
         </el-tooltip>
-        <el-tag
-            type="info"
-            class="plan-status"
-            effect="dark"
-        >
-          {{ plan.type }}
-        </el-tag>
+        <!--<el-tag-->
+        <!--    type="info"-->
+        <!--    class="plan-status"-->
+        <!--    effect="dark"-->
+        <!--&gt;-->
+        <!--  {{ plan.type }}-->
+        <!--</el-tag>-->
       </div>
     </template>
-    
+
     <div class="plan-content">
       <div class="plan-main-info">
         <div class="info-row">
@@ -54,9 +54,9 @@
           </el-tooltip>
         </div>
         <div class="info-row">
-          <span class="info-label dark-label">开始时间:</span>
+          <span class="info-label dark-label">任务时间:</span>
           <el-tooltip
-            :content="plan.startTime"
+            :content="plan.testTime"
             placement="top"
             :disabled="!isStartTimeOverflow"
           >
@@ -64,7 +64,7 @@
               ref="startTimeRef"
               class="info-value dark-value text-ellipsis"
             >
-              {{ plan.startTime || "-" }}
+              {{ plan.testTime || "-" }}
             </span>
           </el-tooltip>
         </div>
@@ -81,7 +81,7 @@
               class="plan-status"
               effect="dark"
           >
-            {{ plan.status }}
+            {{ plan.okStatus }}
           </el-tag>
         </div>
         <div class="info-row">
@@ -94,7 +94,7 @@
             effect="dark"
             class="info-value"
           >
-            {{ plan.compileStatus }}
+            {{ plan.compilingStatus }}
           </el-tag>
         </div>
       </div>
@@ -176,14 +176,14 @@
           已确认: "success",
           未确认: "warning",
         };
-        return statusMap[this.plan.status] || "info";
+        return statusMap[this.plan.okStatus] || "info";
       },
       compileStatusTagType() {
         const statusMap = {
           已编制: "success",
           未编制: "warning",
         };
-        return statusMap[this.plan.compileStatus] || "info";
+        return statusMap[this.plan.compilingStatus] || "info";
       },
     },
     mounted() {

+ 203 - 123
src/views/programPlanning/collaborativePlanning/collaborativeCreate_CL.vue

@@ -24,34 +24,34 @@
           <div class="p-4 mb-4 bg-black bg-opacity-20 rounded-md">
             <el-card shadow="hover" class="p-3 mb-2 text-white bg-gray-100 bg-opacity-20 border-l-8 border-blue-400">
               <div class="flex justify-between items-center mb-2">
-                <span class="text-blue-300 font-blod">试验区域</span>
+                <span class="text-blue-300 font-blod">任务名称</span>
               </div>
               <div class="flex text-sm mt-2">
-                <span>500m x 800m</span>
+                <span>{{ planInfo.taskName }}</span>
               </div>
             </el-card>
             <el-card shadow="hover" class="p-3 mb-2 text-white bg-gray-100 bg-opacity-20 border-l-8 border-blue-400">
               <div class="flex justify-between items-center mb-2">
-                <span class="text-blue-300 font-blod">装备数量</span>
+                <span class="text-blue-300 font-blod">任务类型</span>
               </div>
               <div class="flex text-sm mt-2">
-                <span>>8套</span>
+                <span>{{ $getDictNameByValue('task_type',planInfo.taskType+'') || "-" }}</span>
               </div>
             </el-card>
             <el-card shadow="hover" class="p-3 mb-2 text-white bg-gray-100 bg-opacity-20 border-l-8 border-blue-400">
               <div class="flex justify-between items-center mb-2">
-                <span class="text-blue-300 font-blod">布设密度</span>
+                <span class="text-blue-300 font-blod">布设算法</span>
               </div>
               <div class="flex text-sm mt-2">
-                <span>中等</span>
+                <span>{{ activeTab }}</span>
               </div>
             </el-card>
             <el-card shadow="hover" class="p-3 text-white bg-gray-100 bg-opacity-20 border-l-8 border-blue-400">
               <div class="flex justify-between items-center mb-2">
-                <span class="text-blue-300 font-blod">任务类型</span>
+                <span class="text-blue-300 font-blod">设备数量</span>
               </div>
               <div class="flex text-sm mt-2">
-                <span>综合试验</span>
+                <span>{{ algorithmParams.eqNumber1 }}</span>
               </div>
             </el-card>
           </div>
@@ -131,153 +131,185 @@
             <h3 class="text-lg font-bold" style="color: #4fc2f7">布设算法</h3>
           </div>
           <el-tabs type="card" stretch v-model="activeTab" class="mb-6">
-            <el-tab-pane label="视场覆盖" name="random">
+            <el-tab-pane label="随机布设" name="随机布设">
               <div class="bg-gray-400 bg-opacity-30 p-4 rounded">
-                <h2 class="text-lg font-semibold mb-4">视场覆盖参数</h2>
-                <el-form :model="randomParams" label-width="120px">
+                <h2 class="text-lg font-semibold mb-4">随机布设参数</h2>
+                <el-form :model="algorithmParams" :disabled="!isEdit" label-width="120px">
                   <el-form-item label="随机种子">
-                    <el-input v-model="randomParams.randomSeed" placeholder="请输入随机种子"></el-input>
+                    <el-input v-model="algorithmParams.randomSeed" placeholder="请输入随机种子"></el-input>
                   </el-form-item>
                   <el-form-item label="布设密度">
-                    <el-select v-model="randomParams.layoutDensity" placeholder="请选择布设密度">
+                    <el-select v-model="algorithmParams.layoutDensity" placeholder="请选择布设密度">
                       <el-option label="低等密度" value="low"></el-option>
                       <el-option label="中等密度" value="medium"></el-option>
                       <el-option label="高等密度" value="high"></el-option>
                     </el-select>
                   </el-form-item>
                   <el-form-item label="最小间距(m)">
-                    <el-input v-model.number="randomParams.minSpacing" placeholder="请输入最小间距"></el-input>
+                    <el-input v-model.number="algorithmParams.minSpacing1" placeholder="请输入最小间距"></el-input>
+                  </el-form-item>
+                  <div style="border-top: 1px solid #737877;margin-bottom: 10px"></div>
+                  <el-form-item label="装备数量">
+                    <el-input v-model.number="algorithmParams.eqNumber1"></el-input>
+                  </el-form-item>
+                  <el-form-item label="装备类型">
+                    <el-input v-model="algorithmParams.eqType1"></el-input>
                   </el-form-item>
                 </el-form>
               </div>
             </el-tab-pane>
-            <el-tab-pane label="路径追踪" name="grid">
+            <el-tab-pane label="网格布设" name="网格布设">
               <div class="bg-gray-400 bg-opacity-30 p-4 rounded">
-                <h2 class="text-lg font-semibold mb-4">路径追踪参数</h2>
+                <h2 class="text-lg font-semibold mb-4">网格布设参数</h2>
                 <!-- 可根据需求添加网格布设相关表单元素 -->
-                <el-form :model="randomParams" label-width="120px">
+                <el-form :model="algorithmParams" :disabled="!isEdit" label-width="120px">
                   <el-form-item label="布设密度">
-                    <el-select v-model="randomParams.layoutDensity" placeholder="请选择布设密度">
+                    <el-select v-model="algorithmParams.layoutDensity2" placeholder="请选择布设密度">
                       <el-option label="低等密度" value="low"></el-option>
                       <el-option label="中等密度" value="medium"></el-option>
                       <el-option label="高等密度" value="high"></el-option>
                     </el-select>
                   </el-form-item>
                   <el-form-item label="网格间距(m)">
-                    <el-input v-model.number="randomParams.minSpacing" placeholder="请输入最小间距"></el-input>
+                    <el-input v-model.number="algorithmParams.minSpacing2" ></el-input>
                   </el-form-item>
-                </el-form>
-              </div>
-            </el-tab-pane>
-            <el-tab-pane label="多传感器融合布设" name="cluster">
-              <div class="bg-gray-400 bg-opacity-30 p-4 rounded">
-                <h2 class="text-lg font-semibold mb-4">多传感器融合布设参数</h2>
-                <!-- 可根据需求添加聚类布设相关表单元素 -->
-                <el-form :model="randomParams" label-width="120px">
-                  <el-form-item label="聚类中心">
-                    <el-input v-model="randomParams.randomCenter" placeholder="请输入聚类中心"></el-input>
+                  <div style="border-top: 1px solid #737877;margin-bottom: 10px"></div>
+                  <el-form-item label="装备数量">
+                    <el-input v-model.number="algorithmParams.eqNumber2" ></el-input>
                   </el-form-item>
-                  <el-form-item label="聚类半径(m)">
-                    <el-input v-model.number="randomParams.minSpacing" placeholder="请输入最小间距"></el-input>
+                  <el-form-item label="装备类型">
+                    <el-input v-model="algorithmParams.eqType2"></el-input>
                   </el-form-item>
                 </el-form>
               </div>
             </el-tab-pane>
-            <el-tab-pane label="动态调整" name="auto">
+            <el-tab-pane label="聚类布设" name="聚类布设">
               <div class="bg-gray-400 bg-opacity-30 p-4 rounded">
-                <h2 class="text-lg font-semibold mb-4">动态调整参数</h2>
+                <h2 class="text-lg font-semibold mb-4">聚类布设参数</h2>
                 <!-- 可根据需求添加聚类布设相关表单元素 -->
-                <el-form :model="randomParams" label-width="120px">
+                <el-form :model="algorithmParams" :disabled="!isEdit" label-width="120px">
                   <el-form-item label="聚类中心">
-                    <el-input v-model="randomParams.randomCenter" placeholder="请输入聚类中心"></el-input>
+                    <el-input v-model="algorithmParams.randomCenter" placeholder="请输入聚类中心"></el-input>
                   </el-form-item>
                   <el-form-item label="聚类半径(m)">
-                    <el-input v-model.number="randomParams.minSpacing" placeholder="请输入最小间距"></el-input>
+                    <el-input v-model.number="algorithmParams.minSpacing3" ></el-input>
+                  </el-form-item>
+                  <div style="border-top: 1px solid #737877;margin-bottom: 10px"></div>
+                  <el-form-item label="装备数量">
+                    <el-input v-model.number="algorithmParams.eqNumber3" ></el-input>
+                  </el-form-item>
+                  <el-form-item label="装备类型">
+                    <el-input v-model="algorithmParams.eqType3" ></el-input>
                   </el-form-item>
                 </el-form>
               </div>
             </el-tab-pane>
           </el-tabs>
-
-          <!-- BB装备配置 -->
-          <el-card class="bg-gray-400 bg-opacity-30 border-none">
-            <div class="text-lg font-bold mb-2">装备配置</div>
-            <el-form label-position="top" size="small" label-width="60px">
-              <el-form-item label="装备数量">
-                <el-input value="12"></el-input>
-              </el-form-item>
-              <el-form-item label="装备类型">
-                <el-select placeholder="请选择" style="width: 100%">
-                  <el-option
-                      v-for="type in equipmentTypes"
-                      :key="type"
-                      :label="type"
-                      :value="type"
-                  ></el-option>
-                </el-select>
-              </el-form-item>
-            </el-form>
-          </el-card>
+          <!--<el-tabs type="card" stretch v-model="activeTab" class="mb-6">-->
+          <!--  <el-tab-pane label="视场覆盖" name="random">-->
+          <!--    <div class="bg-gray-400 bg-opacity-30 p-4 rounded">-->
+          <!--      <h2 class="text-lg font-semibold mb-4">视场覆盖参数</h2>-->
+          <!--      <el-form :model="randomParams" label-width="120px">-->
+          <!--        <el-form-item label="随机种子">-->
+          <!--          <el-input v-model="randomParams.randomSeed" placeholder="请输入随机种子"></el-input>-->
+          <!--        </el-form-item>-->
+          <!--        <el-form-item label="布设密度">-->
+          <!--          <el-select v-model="randomParams.layoutDensity" placeholder="请选择布设密度">-->
+          <!--            <el-option label="低等密度" value="low"></el-option>-->
+          <!--            <el-option label="中等密度" value="medium"></el-option>-->
+          <!--            <el-option label="高等密度" value="high"></el-option>-->
+          <!--          </el-select>-->
+          <!--        </el-form-item>-->
+          <!--        <el-form-item label="最小间距(m)">-->
+          <!--          <el-input v-model.number="randomParams.minSpacing" placeholder="请输入最小间距"></el-input>-->
+          <!--        </el-form-item>-->
+          <!--      </el-form>-->
+          <!--    </div>-->
+          <!--  </el-tab-pane>-->
+          <!--  <el-tab-pane label="路径追踪" name="grid">-->
+          <!--    <div class="bg-gray-400 bg-opacity-30 p-4 rounded">-->
+          <!--      <h2 class="text-lg font-semibold mb-4">路径追踪参数</h2>-->
+          <!--      &lt;!&ndash; 可根据需求添加网格布设相关表单元素 &ndash;&gt;-->
+          <!--      <el-form :model="randomParams" label-width="120px">-->
+          <!--        <el-form-item label="布设密度">-->
+          <!--          <el-select v-model="randomParams.layoutDensity" placeholder="请选择布设密度">-->
+          <!--            <el-option label="低等密度" value="low"></el-option>-->
+          <!--            <el-option label="中等密度" value="medium"></el-option>-->
+          <!--            <el-option label="高等密度" value="high"></el-option>-->
+          <!--          </el-select>-->
+          <!--        </el-form-item>-->
+          <!--        <el-form-item label="网格间距(m)">-->
+          <!--          <el-input v-model.number="randomParams.minSpacing" placeholder="请输入最小间距"></el-input>-->
+          <!--        </el-form-item>-->
+          <!--      </el-form>-->
+          <!--    </div>-->
+          <!--  </el-tab-pane>-->
+          <!--  <el-tab-pane label="多传感器融合布设" name="cluster">-->
+          <!--    <div class="bg-gray-400 bg-opacity-30 p-4 rounded">-->
+          <!--      <h2 class="text-lg font-semibold mb-4">多传感器融合布设参数</h2>-->
+          <!--      &lt;!&ndash; 可根据需求添加聚类布设相关表单元素 &ndash;&gt;-->
+          <!--      <el-form :model="randomParams" label-width="120px">-->
+          <!--        <el-form-item label="聚类中心">-->
+          <!--          <el-input v-model="randomParams.randomCenter" placeholder="请输入聚类中心"></el-input>-->
+          <!--        </el-form-item>-->
+          <!--        <el-form-item label="聚类半径(m)">-->
+          <!--          <el-input v-model.number="randomParams.minSpacing" placeholder="请输入最小间距"></el-input>-->
+          <!--        </el-form-item>-->
+          <!--      </el-form>-->
+          <!--    </div>-->
+          <!--  </el-tab-pane>-->
+          <!--  <el-tab-pane label="动态调整" name="auto">-->
+          <!--    <div class="bg-gray-400 bg-opacity-30 p-4 rounded">-->
+          <!--      <h2 class="text-lg font-semibold mb-4">动态调整参数</h2>-->
+          <!--      &lt;!&ndash; 可根据需求添加聚类布设相关表单元素 &ndash;&gt;-->
+          <!--      <el-form :model="randomParams" label-width="120px">-->
+          <!--        <el-form-item label="聚类中心">-->
+          <!--          <el-input v-model="randomParams.randomCenter" placeholder="请输入聚类中心"></el-input>-->
+          <!--        </el-form-item>-->
+          <!--        <el-form-item label="聚类半径(m)">-->
+          <!--          <el-input v-model.number="randomParams.minSpacing" placeholder="请输入最小间距"></el-input>-->
+          <!--        </el-form-item>-->
+          <!--      </el-form>-->
+          <!--    </div>-->
+          <!--  </el-tab-pane>-->
+          <!--</el-tabs>-->
+
+          <!--&lt;!&ndash; BB装备配置 &ndash;&gt;-->
+          <!--<el-card class="bg-gray-400 bg-opacity-30 border-none">-->
+          <!--  <div class="text-lg font-bold mb-2">装备配置</div>-->
+          <!--  <el-form label-position="top" size="small" label-width="60px">-->
+          <!--    <el-form-item label="装备数量">-->
+          <!--      <el-input value="12"></el-input>-->
+          <!--    </el-form-item>-->
+          <!--    <el-form-item label="装备类型">-->
+          <!--      <el-select placeholder="请选择" style="width: 100%">-->
+          <!--        <el-option-->
+          <!--            v-for="type in equipmentTypes"-->
+          <!--            :key="type"-->
+          <!--            :label="type"-->
+          <!--            :value="type"-->
+          <!--        ></el-option>-->
+          <!--      </el-select>-->
+          <!--    </el-form-item>-->
+          <!--  </el-form>-->
+          <!--</el-card>-->
 
           <!-- 操作控制 -->
-          <div class="space-y-2 mt-4">
+          <div v-if="isEdit" class="space-y-2 mt-4">
             <el-button type="success" size="small" @click="back">完成编制</el-button>
             <el-button type="warning" size="small" @click="back">保存草稿</el-button>
-            <el-button type="danger" size="small" @click="back">清空布设</el-button>
+            <!--<el-button type="danger" size="small" @click="back">清空布设</el-button>-->
           </div>
         </div>
 
         <!-- 右侧主内容区 -->
         <div class="flex-1 space-y-4 p-6 bg-gray-400 bg-opacity-20 backdrop-blur-lg border-gray-50 rounded-xl">
-          <!-- 布设状态 -->
-          <div class="flex items-center mb-4">
-            <h3 class="text-lg font-bold" style="color: #4fc2f7">布设状态</h3>
-          </div>
-          <div class="flex flex-col p-4 bg-black bg-opacity-20 mb-2">
-            <div class="">
-              <p>已布设测量装备数量: <span class="text-blue-300">0</span></p>
-              <p>当前算法: <span class="text-blue-300">路径追踪</span></p>
-              <p>布设密度: <span class="text-blue-300">中等</span></p>
-              <p>覆盖面积: <span class="text-blue-300">0%</span></p>
-            </div>
-          </div>
 
           <div class="flex items-center mb-4">
             <h3 class="text-lg font-bold" style="color: #4fc2f7">方案信息</h3>
           </div>
-          <div class="grid gap-4 grid-cols-4 p-4 mb-4 bg-black bg-opacity-20 rounded-md">
-            <el-card shadow="hover" class="p-3 text-white bg-gray-100 bg-opacity-20 border-l-8 border-blue-400">
-              <div class="flex justify-between items-center mb-2">
-                <span class="text-blue-300 font-blod">方案名称</span>
-              </div>
-              <div class="flex text-sm mt-2">
-                <span>测量装备布设方案-001</span>
-              </div>
-            </el-card>
-            <el-card shadow="hover" class="p-3 text-white bg-gray-100 bg-opacity-20 border-l-8 border-blue-400">
-              <div class="flex justify-between items-center mb-2">
-                <span class="text-blue-300 font-blod">创建时间</span>
-              </div>
-              <div class="flex text-sm mt-2">
-                <span>2025-08-20 11:05:30</span>
-              </div>
-            </el-card>
-            <el-card shadow="hover" class="p-3 text-white bg-gray-100 bg-opacity-20 border-l-8 border-blue-400">
-              <div class="flex justify-between items-center mb-2">
-                <span class="text-blue-300 font-blod">方案状态</span>
-              </div>
-              <div class="flex text-sm mt-2">
-                <span>编制中</span>
-              </div>
-            </el-card>
-            <el-card shadow="hover" class="p-3 text-white bg-gray-100 bg-opacity-20 border-l-8 border-blue-400">
-              <div class="flex justify-between items-center mb-2">
-                <span class="text-blue-300 font-blod">编制人员</span>
-              </div>
-              <div class="flex text-sm mt-2">
-                <span>张三</span>
-              </div>
-            </el-card>
+          <div class="flex p-4 mb-4 bg-black bg-opacity-20 rounded-md">
+            <span class="mr-4">{{ schemeInfo.measurementRequirements }}</span>
           </div>
           <!-- 图例 -->
           <div class="flex items-center text-base mb-2">
@@ -293,17 +325,20 @@
           <!-- 网格画布(模拟) -->
           <div class="w-full bg-black bg-opacity-20 bg-blue-850 border border-blue-700 flex items-center justify-center" style="min-height: 400px">
             <!--<span class="text-blue-400">网格画布区域(可结合Canvas等实现交互)</span>-->
-            <img src="@/assets/plan_images/观测方案.jpg" class="w-full h-full" />
-          </div>
-          <div class="text-sm bg-blue-400 bg-opacity-20 rounded-md p-4 mt-2">
-            操作提示: 点击BB区位可选中,拖拽可调整位置,双击可查看详情,使用右侧配置区设置参数后点击"生成方案"按钮。
+            <!--<img src="@/assets/plan_images/观测方案.jpg" class="w-full h-full" />-->
+            <DrawioEmbed ref="drawioRef" />
+            <!--<img v-else :src="" class="w-full h-full" />-->
           </div>
 
+          <!--<div class="text-sm bg-blue-400 bg-opacity-20 rounded-md p-4 mt-2">-->
+          <!--  操作提示: 点击BB区位可选中,拖拽可调整位置,双击可查看详情,使用右侧配置区设置参数后点击"生成方案"按钮。-->
+          <!--</div>-->
+
           <!-- 方案信息 -->
           <WangEditor
               v-model="content"
               :height="400"
-              :disabled="false"
+              :disabled="!isEdit"
               @change="handleContentChange"
           />
         </div>
@@ -341,14 +376,17 @@
 <script>
 import WangEditor from "@/components/Components/WangEditor.vue";
 import QAChat from "@/components/Components/QAChat.vue"
+import DrawioEmbed from "@/components/DrawioEmbed/index.vue";
+import {getSynergismScheme, planningSchemeUpdate} from "@/api/planningScheme";
 export default {
   components:{
+    DrawioEmbed,
     WangEditor,
     QAChat
   },
   data() {
     return {
-
+      dist:{},
       content:'',
       selectedTemplate: null,
 
@@ -385,27 +423,29 @@ export default {
           applicableScenario: '精密试验'
         }
       ],
-      selectedAlgorithm: 'random',
       equipmentTypes: [
         '陆地模拟蓝军B系统',
         '发烟罐模拟蓝军模拟系统',
         '无人机蓝军系统',
         '大气状态分析仪'
       ],
-      planInfo: [
-        {
-          name: 'BB布设方案-001',
-          createTime: '2024-01-15 14:30',
-          status: '编制中',
-          editor: '张三'
-        }
-      ],
-      activeTab: 'random',
-      randomParams: {
+      planInfo: JSON.parse(this.$route.query.plan),
+      isEdit:this.$route.query.isEdit === 'true' ? true : false,
+      activeTab: '随机布设',
+      algorithmParams: {
         randomCenter: '1,1,1',
         randomSeed: '12345',
         layoutDensity: 'medium',
-        minSpacing: 50,
+        layoutDensity2: 'medium',
+        minSpacing1: 50,
+        minSpacing2: 50,
+        minSpacing3: 50,
+        eqNumber1:5,
+        eqNumber2:5,
+        eqNumber3:5,
+        eqType1:'',
+        eqType2:'',
+        eqType3:'',
       },
       // 悬浮球相关
       floatTop: 200,
@@ -421,7 +461,8 @@ export default {
         { time: '2025-08-20 11:05', operation: '创建方案', user: '张三' },
         { time: '2025-08-20 11:10', operation: '修改随机参数', user: '张三' },
         { time: '2025-08-20 11:15', operation: '保存草稿', user: '张三' }
-      ]
+      ],
+      schemeInfo:{},
     };
   },
   computed: {
@@ -439,6 +480,34 @@ export default {
     }
   },
   methods: {
+    async fetchData(){
+      await getSynergismScheme({id:this.planInfo.id}).then((res)=>{
+        this.schemeInfo = res.data;
+        if(res.data.schemeContent){
+          const data = JSON.parse(res.data.schemeContent)
+          this.algorithmParams = data.algorithmJson;
+          this.content = data.textJson;
+          this.loadDefaultData(data.xml.xmlData);
+        }
+      })
+    },
+    async loadDefaultData(xml) {
+      try {
+        await this.$refs.drawioRef.setData(xml)
+        console.log('数据加载成功')
+      } catch (err) {
+        console.error('加载失败:', err)
+      }
+    },
+    async getXmlData() {
+      try {
+        const data = await this.$refs.drawioRef.getData()
+        console.log('获取数据成功:', data)
+        return data
+      } catch (err) {
+        console.error('获取失败:', err)
+      }
+    },
     handleUse(plan) {
       // 执行“使用”逻辑
       console.log('正在使用方案:', plan.planName);
@@ -453,7 +522,16 @@ export default {
       console.log('编辑器内容变化:', html)
       // 可以在这里处理内容,如实时保存等
     },
-    back(){
+    async back(){
+      const xml = await this.getXmlData()
+      const planJson = JSON.stringify({
+        algorithmJson:this.algorithmParams,   // 布设算法
+        textJson: this.content,   // 富文本
+        xml: xml
+      })
+
+      await planningSchemeUpdate({id:this.schemeInfo.id,schemeContent:planJson,version:this.schemeInfo.version})
+
       this.$message.success('操作成功')
       this.$router.push({ path: '/scheme/collaborative' })
     },
@@ -506,6 +584,8 @@ export default {
   },
   // 监听窗口大小变化,调整悬浮球位置
   mounted() {
+    console.log(this.$route.query.isEdit)
+    this.fetchData()
     window.addEventListener('resize', () => {
       this.floatLeft = Math.min(this.floatLeft, window.innerWidth - 80);
     });

+ 63 - 119
src/views/programPlanning/collaborativePlanning/index.vue

@@ -5,7 +5,7 @@
       <template #query-form>
         <el-form-item label="任务名称">
           <el-input
-              v-model="queryForm.name"
+              v-model="queryForm.taskName"
               placeholder="请输入任务名称"
               clearable
           />
@@ -45,11 +45,11 @@
         <el-pagination
             @size-change="handleSizeChange"
             @current-change="handleCurrentChange"
-            :current-page="pagination.currentPage"
+            :current-page="queryForm.pageNo"
             :page-sizes="[10, 20, 50, 100]"
-            :page-size="pagination.pageSize"
+            :page-size="queryForm.pageSize"
             layout="total, sizes, prev, pager, next, jumper"
-            :total="pagination.total"
+            :total="total"
         />
       </template>
 
@@ -82,6 +82,7 @@
 import DarkLayout from '@/components/GlobalComponents/DarkLayout.vue'
 import CollaborativeCard from './CollaborativeCard.vue'
 import DarkDialog from "@/components/Components/DarkDialog.vue";
+import {planningSchemeUpdateUserRole, synergismSchemePage} from "@/api/planningScheme";
 
 export default {
   components: {
@@ -106,137 +107,78 @@ export default {
       dialogVisible: false,
       currentPlan: {}, // 当前选中的任务数据
       queryForm: {
-        name: '',
-        taskCode: ''
-      },
-      planList: [
-        {
-          id: 'plan-001',
-          planName: '东海靶场2023年度-干扰保障方案',
-          taskName: '新型导弹打击试验',
-          taskCode: 'DH-2023-001',
-          startTime: '2023-06-15',
-          endTime: '2023-06-20',
-          compileStatus: '已编制',
-          secretLevel: '秘密',
-          secretYears: '10年',
-          status: '已确认',
-          type:'干扰方案'
-        },
-        {
-          id: 'plan-002',
-          planName: '南海靶场电子-干扰保障方案',
-          taskName: '电子对抗演练',
-          taskCode: 'NH-2023-002',
-          startTime: '2023-07-10',
-          endTime: '2023-07-15',
-          compileStatus: '未编制',
-          secretLevel: '机密',
-          secretYears: '5年',
-          status: '未确认',
-          type:'干扰方案',
-        },
-        {
-          id: 'plan-003',
-          planName: '东海靶场2023年度靶标保障方案',
-          taskName: '新型导弹打击试验',
-          taskCode: 'DH-2023-001',
-          startTime: '2023-06-15',
-          endTime: '2023-06-20',
-          compileStatus: '已编制',
-          secretLevel: '秘密',
-          secretYears: '10年',
-          status: '已确认',
-          type:'测量方案',
-        },
-        {
-          id: 'plan-004',
-          planName: '南海靶场电子对抗方案',
-          taskName: '电子对抗演练',
-          taskCode: 'NH-2023-002',
-          startTime: '2023-07-10',
-          endTime: '2023-07-15',
-          compileStatus: '未编制',
-          secretLevel: '机密',
-          secretYears: '5年',
-          status: '未确认',
-          type:'测量方案',
-        },
-        {
-          id: 'plan-005',
-          planName: '东海靶场2023年度靶标保障方案',
-          taskName: '新型导弹打击试验',
-          taskCode: 'DH-2023-001',
-          startTime: '2023-06-15',
-          endTime: '2023-06-20',
-          compileStatus: '已编制',
-          secretLevel: '秘密',
-          secretYears: '10年',
-          status: '已确认',
-          type:'靶标方案',
-        },
-        {
-          id: 'plan-006',
-          planName: '南海靶场电子对抗方案',
-          taskName: '电子对抗演练',
-          taskCode: 'NH-2023-002',
-          startTime: '2023-07-10',
-          endTime: '2023-07-15',
-          compileStatus: '未编制',
-          secretLevel: '机密',
-          secretYears: '5年',
-          status: '未确认',
-          type:'靶标方案',
-        },
-        {
-          id: 'plan-007',
-          planName: '南海靶场电子-干扰保障方案',
-          taskName: '电子对抗演练',
-          taskCode: 'NH-2023-002',
-          startTime: '2023-07-10',
-          endTime: '2023-07-15',
-          compileStatus: '未编制',
-          secretLevel: '机密',
-          secretYears: '5年',
-          status: '未确认',
-          type:'干扰方案',
-        },
-      ],
-      pagination: {
-        currentPage: 1,
-        pageSize: 10,
-        total: 0
+        taskName: '',
+        taskCode: '',
+        pageNo:1,
+        pageSize:10
       },
+      planList:[],
+      total:0,
       showAdvancedSearch: false
     }
   },
+  mounted() {
+    this.fetchData()
+  },
   methods: {
     handleClose(done) {
       // 可以在这里添加关闭前的确认逻辑
       done()
     },
-    handleSelect(plan) {
+    async handleSelect(plan) {
+      try {
+        // 1. 弹出确认框
+        await this.$confirm(
+            `是否确认此方案 "${plan.taskName}" ?`,
+            '提示',
+            {
+              confirmButtonText: '确认',
+              cancelButtonText: '取消',
+              type: 'warning'
+            }
+        );
+
+        // 2. 用户点击“确认”后执行接口调用
+        const response = await planningSchemeUpdateUserRole({ planningId: plan.id });
+
+        if (response.code === 0) {
+          this.$message.success('方案确认成功');
+          // 可选:刷新列表或跳转
+          this.handleQuery(); // 刷新当前列表
+        } else {
+          this.$message.error(response.msg || '确认失败');
+        }
+
+      } catch (error) {
+        // 用户点击“取消”或接口报错
+        if (error !== 'cancel') {
+          this.$message.error('操作失败,请重试');
+        }
+        // 如果是取消,静默处理
+      }
     },
     handleEdit(plan) {
       //跳转页面
-      if(plan.type === '靶标方案') this.$router.push({ path: '/home/collaborativeCreate' });
-      if(plan.type === '干扰方案') this.$router.push({ path: '/home/collaborativeCreate_GR' });
-      if(plan.type === '测量方案') this.$router.push({ path: '/home/collaborativeCreate_Cl' });
-
+      // if(plan.type === '靶标方案') this.$router.push({ path: '/home/collaborativeCreate' });
+      // if(plan.type === '干扰方案') this.$router.push({ path: '/home/collaborativeCreate_GR' });
+      this.$router.push({ path: '/home/collaborativeCreate_Cl',query:{plan:JSON.stringify(plan),isEdit:'true'}});
     },
     viewDetails(plan) {
-      console.log("000")
-      this.currentPlan = plan
-      this.dialogVisible = true
-      console.log(111)
+      this.$router.push({ path: '/home/collaborativeCreate_Cl',query:{plan:JSON.stringify(plan),isEdit:'false'} });
     },
     handleQuery() {
       // 查询逻辑
+      synergismSchemePage(this.queryForm).then((res)=>{
+        this.planList = res.data.records
+        this.total = res.data.total
+      })
     },
     resetQuery() {
       this.queryForm = {
-        name: '',
-        taskCode: ''
+        taskName: '',
+        taskCode: '',
+        pageNo: 1,
+        pageSize: 10,
       }
       this.handleQuery()
     },
@@ -244,15 +186,17 @@ export default {
       this.$router.push({ path: '/home/collaborativeCreate' });
     },
     handleSizeChange(val) {
-      this.pagination.pageSize = val
-      this.fetchData()
+      this.queryForm.pageSize = val
+      this.handleQuery()
     },
     handleCurrentChange(val) {
-      this.pagination.currentPage = val
-      this.fetchData()
+      this.queryForm.pageNo = val
+      this.handleQuery()
     },
     fetchData() {
       // 获取数据逻辑
+      this.queryForm.pageNo = 1
+      this.handleQuery()
     }
   }
 }