using Prism.Services.Dialogs; using SWS.CAD.Base; using SWS.CAD.ViewModels.myViewModelBase; using SWS.Commons; using SWS.Model; using SWS.Service; using System; using System.Collections.ObjectModel; using System.IO; using System.Linq; using System.Windows; using Unity; namespace SWS.CAD.ViewModels { public class NewDrawingViewModel : DialogBase, IDialogAware { #region 数据绑定 private ObservableCollection _templates; /// /// 图纸模板 /// public ObservableCollection templates { get { return _templates; } set { _templates = value; RaisePropertyChanged(nameof(templates)); } } private ObservableCollection _dwgType; /// /// 图纸类型 /// public ObservableCollection dwgType { get { return _dwgType; } set { _dwgType = value; RaisePropertyChanged(nameof(dwgType)); } } private ec_drawing_file _dwgObj; /// /// 图纸实体对象 /// public ec_drawing_file dwgObj { get { return _dwgObj; } set { _dwgObj = value; RaisePropertyChanged(nameof(dwgObj)); } } private ObservableCollection _dwgMaterialRange; /// /// 材料范围 /// public ObservableCollection dwgMaterialRange { get { return _dwgMaterialRange; } set { _dwgMaterialRange = value; RaisePropertyChanged(nameof(dwgMaterialRange)); } } private ObservableCollection _dwgMaterialCensus; /// /// 统计方式 /// public ObservableCollection dwgMaterialCensus { get { return _dwgMaterialCensus; } set { _dwgMaterialCensus = value; RaisePropertyChanged(nameof(dwgMaterialCensus)); } } private ObservableCollection _dwgStage; /// /// 设计阶段 /// public ObservableCollection dwgStage { get { return _dwgStage; } set { _dwgStage = value; RaisePropertyChanged(nameof(dwgStage)); } } private ObservableCollection _dwgSystem; /// /// 所属系统 /// public ObservableCollection dwgSystem { get { return _dwgSystem; } set { _dwgSystem = value; RaisePropertyChanged(nameof(dwgSystem)); } } private ObservableCollection _dwgCatalogueID; /// /// 图纸目录树,不带图纸文件名,纯目录树 /// public ObservableCollection dwgCatalogueID { get { return _dwgCatalogueID; } set { _dwgCatalogueID = value; RaisePropertyChanged(nameof(dwgCatalogueID)); } } private ObservableCollection _tempCatalogueID; /// /// 图纸目录树,带图纸文件名,用于新建图纸时,遍历判断目录下图纸是否有文件重名 /// public ObservableCollection tempCatalogueID { get { return _tempCatalogueID; } set { _tempCatalogueID = value; } } private Model.TreeModel _SelectedSystemItem; /// /// 所属系统选中项 /// public Model.TreeModel SelectedSystemItem { get { return _SelectedSystemItem; } set { _SelectedSystemItem = value; RaisePropertyChanged(nameof(SelectedSystemItem)); } } private Model.TreeModel _SelectedTemplateItem; /// /// 图纸模板选中项 /// public Model.TreeModel SelectedTemplateItem { get { return _SelectedTemplateItem; } set { _SelectedTemplateItem = value; RaisePropertyChanged(nameof(SelectedTemplateItem)); } } private Model.TreeModel _SelectedCatalogueIDItem; /// /// 图纸目录选中项 /// public Model.TreeModel SelectedCatalogueIDItem { get { return _SelectedCatalogueIDItem; } set { _SelectedCatalogueIDItem = value; RaisePropertyChanged(nameof(SelectedCatalogueIDItem)); } } private bool _IsEnableTemplate; /// /// 模板列表是否可用 /// public bool IsEnableTemplate { get { return _IsEnableTemplate; } set { _IsEnableTemplate = value; OnPropertyChanged(nameof(IsEnableTemplate)); } } #endregion DrawingServce _drawingServce; AnnexesService _annexesService; TemplateFileService _templateFileService; Model.TreeModel curTreeNode = null; string oldDwgFileName = string.Empty; /// /// 窗体模式 0:新建图纸,1:编辑属性 /// int mode = 0; public string Title => ""; public event Action RequestClose; public NewDrawingViewModel() : base() { _drawingServce = GlobalObject.container.Resolve(); // 不要在构造函数里注入,免得报 No parameterless constructor defined for this object _annexesService = GlobalObject.container.Resolve(); _templateFileService = GlobalObject.container.Resolve(); dwgObj = new ec_drawing_file(); templates = new ObservableCollection(); dwgCatalogueID = new ObservableCollection(); dwgMaterialRange = new ObservableCollection(); dwgMaterialCensus = new ObservableCollection(); dwgStage = new ObservableCollection(); } #region 关闭窗体 /// /// 是否能关闭窗体 /// /// public bool CanCloseDialog() { return true; } /// /// 窗体关闭 /// public void OnDialogClosed() { } #endregion #region 窗体打开完成,初始化数据 /// /// 窗体打开完成,初始化数据 /// /// public async void OnDialogOpened(IDialogParameters parameters) { IsBusy=true;BusyContent = "加载中..."; curTreeNode = parameters.GetValue(nameof(ec_drawing_file.DrawingCatalogueID)); //初始化图纸目录树形下拉框 dwgCatalogueID = await _drawingServce.GetDrawingCatalogue("1");//参数给1,server返回的时候默认就没有.dwg的目录树了 tempCatalogueID = await _drawingServce.GetDrawingCatalogue(); //返回带.dwg文件的目录树,方便后续校验是否文件重名 //初始化图纸类型下拉框 dwgType = new ObservableCollection(GlobalObje.DwgType()); //初始化材料范围下拉框 dwgMaterialRange = new ObservableCollection(GlobalObje.DwgMaterialRange()); //初始化材料统计下拉框 dwgMaterialCensus = new ObservableCollection(GlobalObje.DwgMaterialCensus()); //初始化设计阶段下拉框 dwgStage = new ObservableCollection(GlobalObje.DwgStage()); //初始化所属系统下拉框 dwgSystem = new ObservableCollection(GlobalObje.DwgSystem()); //判断窗体是新建图纸或编辑属性 if (curTreeNode.Text.ToLower().EndsWith(".dwg")) { mode = 1;//编辑属性 title = "编辑图纸"; //编辑属性时,禁用模板列表,无需加载 IsEnableTemplate = false; dwgObj = await _drawingServce.GetDrawingFile(curTreeNode.ID); oldDwgFileName = dwgObj.DrawingFileName; InitCombobox(dwgObj); } else { mode = 0; //新建图纸 title = "新建图纸"; IsEnableTemplate = true; dwgObj.DrawingFileName = "新图纸"; dwgObj.OrderID = 0; SelectedCatalogueIDItem = curTreeNode; SelectedSystemItem = dwgSystem[0]; dwgObj.DrawingStage= dwgStage[0].DataItemDetailID; //初始化图纸模板树形下拉框 var allTemplates = await _templateFileService.GetTemplateCatalogue(); allTemplates = allTemplates.Where(x => x.Text == GlobalObject.templateForDrawing).ToList(); templates = new ObservableCollection(allTemplates); } IsBusy = false; BusyContent = ""; OnPropertyChanged(nameof(dwgObj)); } /// /// 编辑属性时,赋值下拉框初始值 /// /// private void InitCombobox(ec_drawing_file dwgFile) { //所属系统下拉框 foreach (var item in dwgSystem) { var node = TreeHelper.GetTreeModel(item, dwgFile.DrawingSystem); if (node != null) { SelectedSystemItem = node; break; } } //图纸目录下拉框 foreach (var item in dwgCatalogueID) { var node = TreeHelper.GetTreeModel(item, dwgFile.DrawingCatalogueID); if (node != null) { SelectedCatalogueIDItem = node; break; } } } #endregion #region 提交数据 /// /// 提交数据 /// /// public override async void ExecuteOKCommandAsync(object para) { //赋值 图纸目录和所属系统 dwgObj.DrawingCatalogueID = SelectedCatalogueIDItem == null ? "" : SelectedCatalogueIDItem.ID; dwgObj.DrawingSystem = SelectedSystemItem == null ? "" : SelectedSystemItem.ID; #region check //id不需要,server端会新建的 if (string.IsNullOrEmpty(dwgObj.DrawingFileName)) { MessageBox.Show("图纸名称不能为空。"); return; } else if (!FileHelper.IsValidFileName(dwgObj.DrawingFileName)) { MessageBox.Show("图纸名称含有特殊字符,请检查。"); return; } else if (string.IsNullOrEmpty(dwgObj.DrawingCatalogueID)) { MessageBox.Show("图纸所在目录不能为空。"); return; } else if (string.IsNullOrEmpty(dwgObj.DrawingType)) { MessageBox.Show("图纸类型不能为空,从列表里选一个。"); return; } else if (SelectedSystemItem == null) { MessageBox.Show("图纸的所属系统不能为空。从列表里选一个。"); return; } #endregion //IsBusy = true; BusyContent = "新建图纸中。"; //#region 是否有重名 //var curDwgs = SelectedCatalogueIDItem.ChildNodes.Select(X => X.Text).ToList(); //if (curDwgs.Any(X => X.ToLower() == dwgObj.DrawingFileName.ToLower() + ".dwg")) //{ // MessageBox.Show($"图纸名称不能和当前目录 {SelectedCatalogueIDItem.Text} 下的其他图纸同名。"); return; //} //#endregion if (mode == 0) { #region 新建图纸 IsBusy = true; BusyContent = "新建图纸中..."; //当文件名结尾没有.dwg时,自动添加文件格式后缀 if (!dwgObj.DrawingFileName.ToLower().EndsWith(".dwg")) { dwgObj.DrawingFileName += ".dwg"; } #region 是否有重名 //用户可能更改目录,所以要判断当前选中目录下是否重名 if (CheckDwgName(SelectedCatalogueIDItem, dwgObj.DrawingFileName)) { MessageBox.Show($"图纸名称不能和当前目录:[{SelectedCatalogueIDItem.Text}] 下的其他图纸同名!"); IsBusy = false; return; } #endregion #region 创建本地图纸 if (SelectedTemplateItem == null) { MessageBox.Show("图纸模板不能为空。从列表里选一个。"); IsBusy = false; return; } //获取模板ID var templateId = SelectedTemplateItem.ID; //根据模板ID获取模板实体 var templatefileDto = await _templateFileService.GetTemplateFile(templateId); if (templatefileDto == null) { MessageBox.Show("请选择模板!"); IsBusy = false; return; } //根据模板实体的FolderId,获取上传文件的实体 var dwgfileDto = await _annexesService.GetAnnexesFile(templatefileDto.FolderId); // 指定新 DWG 文件的保存路径 string folderPath = GlobalObject.GetDwgFileFolder(); string filePath = Path.Combine(folderPath, dwgObj.DrawingFileName); var msg = await _annexesService.DownloadFile(filePath, dwgfileDto.F_Id); if (!string.IsNullOrEmpty(msg)) { MessageBox.Show("模板文件下载失败,信息:" + msg); IsBusy = false; return; } #region annexes 上传文件 var newFolderId = await _annexesService.UploadFile(Path.Combine(folderPath, dwgObj.DrawingFileName), dwgObj.DrawingFileName); #endregion #region 提交数据库,默认是检出状态 dwgObj.CreateUserID = GlobalObject.userInfo.userId; dwgObj.FolderId = newFolderId; dwgObj.FileMD5 = FileHelper.GetFileMD5(Path.Combine(folderPath, dwgObj.DrawingFileName)); dwgObj.IsEngineDWG = 1; dwgObj.IsCheckOut = 1; dwgObj.PCInfo = GlobalObject.GetPCInfo(); dwgObj = await _drawingServce.AddDrawingFile(dwgObj); #endregion IsBusy = false; if (string.IsNullOrEmpty(dwgObj.DrawingFileID)) { MessageBox.Show("新建图纸失败!"); } else { MessageBox.Show("新建图纸成功!"); //新建图纸完,自动打开图纸 msg = General.OpenDwg(filePath); if (!string.IsNullOrEmpty(msg)) { MessageBox.Show($"本地图纸文件:{dwgObj.DrawingFileName} 打开失败,信息:{msg}"); return; } DialogResult res = new DialogResult(ButtonResult.OK); RequestClose.Invoke(res); } #endregion #endregion } else if (mode == 1) { #region 编辑属性 IsBusy = true; BusyContent = "保存图纸中..."; if (!dwgObj.DrawingFileName.ToLower().EndsWith(".dwg")) { dwgObj.DrawingFileName += ".dwg"; } var msg = await _drawingServce.UpdateDrawingFile(dwgObj); if (!string.IsNullOrEmpty(msg)) { MessageBox.Show("修改图纸数据失败,信息:" + msg); return; } IsBusy = false; MessageBox.Show("保存成功!"); //旧图纸文件名和新图纸文件名不一致,则修改本地图纸文件名 if (oldDwgFileName != dwgObj.DrawingFileName) { string folderPath = GlobalObject.GetDwgFileFolder(); var oldFilePath = Path.Combine(folderPath, oldDwgFileName); if (FileHelper.IsFileLocked(oldFilePath)) { MessageBox.Show($"本地图纸文件:[{oldFilePath}]已被打开,无法重命名,请手动处理!"); } else { var newFilePath = Path.Combine(folderPath, dwgObj.DrawingFileName); File.Move(oldFilePath, newFilePath);//本地图纸重命名 } } DialogResult res = new DialogResult(ButtonResult.OK); RequestClose.Invoke(res); #endregion } } #endregion #region 过滤.dwg文件 /// /// 过滤.dwg文件,只留下目录 /// /// 完整的节点 /// private ObservableCollection FilterTree(ObservableCollection nodes, string text) { ObservableCollection result = new ObservableCollection(); foreach (var node in nodes.Where(X => !X.Text.Contains("设计说明") && !X.Text.Contains("材料表"))) { // 先检查节点本身是否匹配 var filteredChildren = FilterTree(node.ChildNodes, text); // 如果节点匹配,或者它有匹配的子节点,添加当前节点到结果 if (!node.Text.ToUpper().EndsWith(text.ToUpper())) { result.Add(new Model.TreeModel { ID = node.ID, Text = node.Text, ChildNodes = filteredChildren }); } } return result; } #endregion #region 校验图纸文件在目录下是否重名 /// /// 校验图纸文件在目录下是否重名 /// /// /// private bool CheckDwgName(Model.TreeModel dwgNode, string name) { if (tempCatalogueID == null) { return false; } Model.TreeModel node = null; foreach (var catalogueId in tempCatalogueID) { //遍历获取当前节点数据 node = TreeHelper.GetTreeModel(catalogueId, dwgNode.ID); if (node != null) { break; } } var curDwgs = node.ChildNodes.Select(X => X.Text).ToList(); if (curDwgs.Any(X => X.ToLower() == dwgObj.DrawingFileName.ToLower())) { //目录节点下有文件重名 return true; } else { return false; } } #endregion } }