MFloor.cs 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555
  1. /* ==============================================================================
  2. * 功能描述:MProject
  3. * 创 建 者:Garrett
  4. * 创建日期:2018/3/8 15:52:54
  5. * ==============================================================================*/
  6. using System;
  7. using System.Collections.Generic;
  8. using System.ComponentModel;
  9. using System.IO;
  10. using System.Linq;
  11. using System.Windows;
  12. using System.Xml.Serialization;
  13. using SAGA.DotNetUtils;
  14. using SAGA.DotNetUtils.Serializer;
  15. using SAGA.MBI.Common;
  16. using SAGA.MBI.FileStream;
  17. using SAGA.MBI.JsonConvert;
  18. using SAGA.MBI.Login;
  19. using SAGA.MBI.RequestData;
  20. using SAGA.MBI.Tools;
  21. using Newtonsoft.Json.Linq;
  22. using SAGA.DotNetUtils.Others;
  23. using SAGA.DotNetUtils.WPF;
  24. using SAGA.DotNetUtils.WPF.UserControl.ComboboxTreeView;
  25. using SAGA.MBI.CmbData;
  26. using SAGA.MBI.DataArrange;
  27. using SAGA.MBI.Calc;
  28. using SAGA.MBI.WinView.CommonView;
  29. using SAGA.RevitUtils;
  30. namespace SAGA.MBI.Model
  31. {
  32. [Serializable]
  33. [XmlRoot("MFloor")]
  34. public class MFloor : MFileBase
  35. {
  36. public MFloor()
  37. {
  38. UserControlUp = new UcMFMFloorUp();
  39. UserControlDown = new UcMFMFloorDown();
  40. FloorCmbVm = new FloorCmbVm();
  41. }
  42. private MFloorLock m_FloorLock;
  43. /// <summary>
  44. /// 楼层锁状态
  45. /// </summary>
  46. [XmlIgnore]
  47. public MFloorLock FloorLock
  48. {
  49. get
  50. {
  51. m_FloorLock = LockConvert.QueryFloorLockState(Id);
  52. return m_FloorLock;
  53. }
  54. set
  55. {
  56. //m_FloorLock = LockConvert.QueryFloorLockState(Id);
  57. NotifyPropertyChanged(nameof(FloorLock));
  58. }
  59. }
  60. public override string ToString()
  61. {
  62. string diplay = base.ToString();
  63. ////如果被他人锁定,优先显示被锁定
  64. //var floorLock = FloorLock;
  65. //if (floorLock.LockState == MFloorLockState.LockByOther|| floorLock.LockState == MFloorLockState.LockBySelf)
  66. //{
  67. // diplay = $"{base.ToString()}({floorLock.UserName}正在编辑)";
  68. //}
  69. //else if (ModifyType != FloorModifyType.None)
  70. //{
  71. // diplay = "new";
  72. //}
  73. //else
  74. //{
  75. // if (IsMissFile)
  76. // {
  77. // diplay += " (缺模型文件)";
  78. // }
  79. //}
  80. return diplay;
  81. }
  82. public string ToStringCheckLock
  83. {
  84. get
  85. {
  86. string diplay = base.ToString();
  87. //如果被他人锁定,优先显示被锁定
  88. var floorLock = FloorLock;
  89. if (floorLock.LockState == MFloorLockState.LockByOther || floorLock.LockState == MFloorLockState.LockBySelf)
  90. {
  91. diplay = $"{base.ToString()}({floorLock.UserName}正在编辑)";
  92. }
  93. else if (ModifyType != FloorModifyType.None)
  94. {
  95. diplay = "new";
  96. }
  97. else
  98. {
  99. if (IsMissFile)
  100. {
  101. diplay += " (缺模型文件)";
  102. }
  103. }
  104. return diplay;
  105. }
  106. }
  107. #region Path
  108. /// <summary>
  109. /// 判断是否缺少文件依据是:
  110. /// 1,该层的模型文件是否存在
  111. /// 2,存在,不缺少
  112. /// 3,不存在,判断是楼层顺序号是否为空
  113. /// </summary>
  114. public bool IsMissFile
  115. {
  116. get
  117. {
  118. bool result = false;
  119. //首先判断文件是否存在
  120. if (!File.Exists(FullPath))
  121. {
  122. //判断云端是否存在版本信息
  123. var vision = DalVisionOperate.GetCloudFileVision(this.Id);
  124. result = vision.Vision == 0;
  125. }
  126. return result;
  127. }
  128. set => NotifyPropertyChanged(nameof(IsMissFile));
  129. }
  130. private string m_TipLabelText;
  131. /// <summary>
  132. /// 提示信息
  133. /// </summary>
  134. public string TipLabelText
  135. {
  136. get { return m_TipLabelText; }
  137. set
  138. {
  139. m_TipLabelText = value;
  140. NotifyPropertyChanged("TipLabelText");
  141. }
  142. }
  143. /// <summary>
  144. /// revit文件的名称
  145. /// </summary>
  146. public string RevitName
  147. {
  148. get
  149. {
  150. return this.Id;
  151. //return CommonTool.GetFloorRevitFileName(this.Sequence);
  152. }
  153. }
  154. private FloorModifyType m_ModifyType;
  155. public FloorModifyType ModifyType
  156. {
  157. get { return m_ModifyType; }
  158. set
  159. {
  160. m_ModifyType = value;
  161. NotifyPropertyChanged("ModifyType");
  162. }
  163. }
  164. public string FullPath { get { return Path.Combine(LocalPath, this.RevitName + ".rvt"); } }
  165. #endregion
  166. #region CloudProperty
  167. public string BuildingId { get; set; }
  168. private int _Sequence;
  169. /// <summary>
  170. /// 楼层顺序号
  171. /// </summary>
  172. [Description("FloorSequenceID")]
  173. public int Sequence
  174. {
  175. set
  176. {
  177. _Sequence = value;
  178. NotifyPropertyChanged("Sequence");
  179. }
  180. get { return _Sequence; }
  181. }
  182. private string m_FloorType;
  183. [Description("FloorType")]
  184. public string FloorType
  185. {
  186. get { return m_FloorType; }
  187. set
  188. {
  189. m_FloorType = value;
  190. NotifyPropertyChanged("FloorType");
  191. FloorCmbVm.TreeFloorTypeInfoCur = DalCMBTreeView.GetItemByCode(FloorCmbVm.TreeFloorTypeInfos, FloorType);
  192. }
  193. }
  194. private string m_Area;
  195. [Description("Area")]
  196. public string Area
  197. {
  198. get { return m_Area; }
  199. set
  200. {
  201. m_Area = value;
  202. NotifyPropertyChanged("Area");
  203. }
  204. }
  205. private string m_NetHeight;
  206. [Description("NetHeight")]
  207. public string NetHeight
  208. {
  209. get { return m_NetHeight; }
  210. set
  211. {
  212. m_NetHeight = value;
  213. NotifyPropertyChanged("NetHeight");
  214. }
  215. }
  216. private FloorCmbVm m_FloorCmbVm;
  217. [XmlIgnore]
  218. public FloorCmbVm FloorCmbVm
  219. {
  220. get { return m_FloorCmbVm; }
  221. set
  222. {
  223. m_FloorCmbVm = value;
  224. //NotifyPropertyChanged("ProvinceCityVm");
  225. }
  226. }
  227. #endregion
  228. #region OverrideMethod
  229. /// <summary>
  230. /// 类备份,用于取消更改
  231. /// </summary>
  232. /// <returns></returns>
  233. public override void Clone()
  234. {
  235. m_MFileBaseBak = SerializerByXml.Clone<MFloor>(this);
  236. //FileOperateBase.Serialize(MBIConst.MBITempSettingPath, "CloneFile.xml", this);
  237. //m_MFileBaseBak = FileOperateBase.Deserialize<MFloor>(MBIConst.MBITempSettingPath, "CloneFile.xml");
  238. }
  239. public override void SetJsonProperty(string json)
  240. {
  241. JObject jObject = JObject.Parse(json);
  242. this.Name = (string)jObject["FloorName"];
  243. this.LocalId = (string)jObject["FloorLocalID"];
  244. this.LocalName = (string)jObject["FloorLocalName"];
  245. base.SetJsonProperty(json);
  246. FloorCmbVm.NotifyAction = NotifyPropertyChanged;
  247. }
  248. public override JObject GetJsonProperty()
  249. {
  250. FloorType = DalCMBTreeView.GetCodeByItem(FloorCmbVm.TreeFloorTypeInfoCur);
  251. JObject jObject = base.GetJsonProperty();
  252. jObject.Add("FloorLocalID", CommonTool.GetPropertyJArray(LocalId));
  253. jObject.Add("FloorLocalName", CommonTool.GetPropertyJArray(LocalName));
  254. return jObject;
  255. }
  256. #endregion
  257. #region Save
  258. /// <summary>
  259. /// 能否保存
  260. /// </summary>
  261. /// <returns></returns>
  262. public bool CanSave()
  263. {
  264. //如果执行删除命令,不进行空校验
  265. if (ModifyType == FloorModifyType.ItemDel)
  266. return true;
  267. if (LocalName.IsNullOrEmpty())
  268. {
  269. MessageBox.Show("本地名称不能为空");
  270. return false;
  271. }
  272. if (Sequence == 0)
  273. {
  274. MessageBox.Show("楼层顺序码不能为零");
  275. return false;
  276. }
  277. return true;
  278. }
  279. public bool Save(TreeNodeItem treeNode)
  280. {
  281. if (!CanSave()) return false;
  282. #region 楼层序列号是否重复
  283. List<MFloor> floors = DalProjectTree.GetAllFloors();
  284. var curFloors = floors.Where(t => t.Sequence == Sequence);
  285. if (curFloors.Count() >= 2)
  286. {
  287. MessageShowBase.Infomation("楼层序列号重复");
  288. return false;
  289. }
  290. #endregion
  291. return this.Save();
  292. }
  293. public override bool Save()
  294. {
  295. bool result = true;
  296. try
  297. {
  298. #region 文件操作
  299. //更新文件服务器
  300. OperateFile();
  301. #endregion
  302. #region 更新信息点
  303. switch (ModifyType)
  304. {
  305. case FloorModifyType.None:
  306. case FloorModifyType.ItemChange:
  307. case FloorModifyType.ItemAddUp:
  308. case FloorModifyType.ItemAddDown:
  309. case FloorModifyType.ParentAdd:
  310. result = base.Save();
  311. break;
  312. case FloorModifyType.ItemDel:
  313. //删除数据平台数据
  314. result = ModeFileConvert.DelFloor(this.Id);
  315. //有锁的,解锁
  316. DalLock.UnLockFloor(this.Id, false);
  317. break;
  318. }
  319. #endregion
  320. }
  321. catch (Exception e)
  322. {
  323. MessageShowBase.Show(e);
  324. result = false;
  325. }
  326. finally
  327. {
  328. ResetProperty();
  329. }
  330. return result;
  331. }
  332. private void ResetProperty()
  333. {
  334. ModifyType = FloorModifyType.None;
  335. //更新路径显示
  336. if (!IsMissFile)
  337. {
  338. this.PathDisplay = this.FullPath;
  339. TipLabelText = "";
  340. }
  341. BeCopyPath = "";
  342. State = false;
  343. this.Clone();
  344. }
  345. /// <summary>
  346. /// 更新文件服务器文件
  347. /// </summary>
  348. private void OperateFile()
  349. {
  350. try
  351. {
  352. if (ModifyType == FloorModifyType.ItemDel)
  353. {
  354. FloorFileOperate.DelFile(FullPath);
  355. }
  356. else
  357. {
  358. if (BeCopyPath.IsNotNullEmpty() && DalVisionOperate.IsNotSameFile(BeCopyPath, Id))
  359. {
  360. if (FloorFileOperate.CopyFile(BeCopyPath, LocalPath, RevitName))
  361. DalModeFileManange.UploadDataByIntersectOldAndNew(this);
  362. //if (DalModeFileManange.UploadDataByIntersectOldAndNew(this));
  363. //if (DalModeFileManange.UploadDataByDelAllThenReUpload(this))
  364. //UpLoadFileRequest.CloseUploadWindow(FloorFileOperate.UploadFile(this.FullPath), true);
  365. }
  366. }
  367. }
  368. catch (Exception e)
  369. {
  370. MessageShowBase.Show(e);
  371. }
  372. }
  373. #endregion
  374. /// <summary>
  375. /// 向云平台要一个新的楼层
  376. /// </summary>
  377. public void GetNewFloor()
  378. {
  379. string addJson = ModeFileRequest.AddFloor(this.BuildingId, GetJsonProperty());
  380. if (addJson.IsSuccessRequest())
  381. {
  382. JObject jObject = JObject.Parse(addJson);
  383. this.Id = (string)jObject["id"];
  384. this.Name = (string)jObject["FloorName"];
  385. if (DalLock.LockFloor(this.Id, false))
  386. {
  387. //获取楼层的加锁状态
  388. this.FloorLock = LockConvert.QueryFloorLockState(this.Id);
  389. }
  390. }
  391. else
  392. {
  393. MessageBox.Show("增加楼层失败");
  394. }
  395. }
  396. /// <summary>
  397. /// 解锁并重新下载模型
  398. /// </summary>
  399. /// <param name="param"></param>
  400. [Command]
  401. public void ReDownLoad(object param)
  402. {
  403. bool tipResult = false;
  404. #region 下载前的提示信息
  405. string floorfullName = DalProjectTree.GetFloorFullName(Id);
  406. string tip = $"请确认,本操作将从云端重新获取【{floorfullName}】最新的模型文件到本地,本地已有此楼层模型文件将被覆盖!";
  407. WinCommonTip winTip = new WinCommonTip();
  408. //默认为null,有提示
  409. tipResult = winTip.Show(tip, "", title: "重要提示");
  410. #endregion
  411. if (!tipResult) return;
  412. #region 下载并解锁
  413. string msg1 = "", msg2 = "", tip0, tip1 = "";
  414. var downloadResult = DalUploadFloor.ReDownLoadFile(this, ref msg1);
  415. if (downloadResult == true)
  416. {
  417. //清除旧的日志
  418. ProjectLogManager.ClearFiles(Id);
  419. var unlockResult = LockConvert.UnLockFloor(this.Id, ref msg2);
  420. if (unlockResult)
  421. {
  422. tip0 = $"{msg1}\r\n您的编辑权限已被释放";
  423. tip1 = "若需更改模型文件请重新申请编辑权限";
  424. }
  425. else
  426. {
  427. tip0 = $"{msg1}";
  428. if (FloorLock.LockState != MFloorLockState.ULock)
  429. {
  430. tip0 = $"{msg1}\r\n您的编辑权限释放失败,请重试";
  431. tip1 = $"失败原因:{msg2}";
  432. }
  433. }
  434. }
  435. else if (downloadResult == null)
  436. {
  437. //清除旧的日志
  438. ProjectLogManager.ClearFiles(Id);
  439. var unlockResult = LockConvert.UnLockFloor(this.Id, ref msg2);
  440. if (unlockResult)
  441. {
  442. tip0 = $"{msg1}\r\n您的编辑权限已被释放";
  443. tip1 = "若需更改模型文件请重新申请编辑权限";
  444. }
  445. else
  446. {
  447. tip0 = $"{msg1}";
  448. if (FloorLock.LockState != MFloorLockState.ULock)
  449. {
  450. tip0 = $"{msg1}\r\n您的编辑权限释放失败,请重试";
  451. tip1 = $"失败原因:{msg2}";
  452. }
  453. }
  454. }
  455. else
  456. {
  457. tip0 = $"{msg1}";
  458. tip1 = "失败原因:请检查网络后重试!";
  459. }
  460. WinCommonTip winEndTip = new WinCommonTip();
  461. winEndTip.Show(tip0, tip1, buttonStyle: MessageBoxButton.OK);
  462. //刷新解锁按钮
  463. FloorLock = FloorLock;
  464. //刷新树的显示
  465. var tv = DalModeFileManange.GetFloorTreeById(this.Id);
  466. tv.Item.TvItemName = tv.Item.TvItemName;
  467. #endregion
  468. }
  469. public bool CanReDownLoad(object param)
  470. {
  471. return true;
  472. }
  473. /// <summary>
  474. /// 解锁并重新下载模型
  475. /// </summary>
  476. /// <param name="param"></param>
  477. [Command]
  478. public void Lock(object param)
  479. {
  480. if (DalLock.LockFloor(this.Id, true))
  481. {
  482. FloorLock = FloorLock;
  483. //刷新树的显示
  484. var tv = DalModeFileManange.GetFloorTreeById(this.Id);
  485. tv.Item.TvItemName = tv.Item.TvItemName;
  486. }
  487. }
  488. public bool CanLock(object param)
  489. {
  490. return true;
  491. }
  492. }
  493. public enum FloorModifyType
  494. {
  495. None = 0,
  496. ItemChange,
  497. ParentAdd,
  498. ItemAddUp,
  499. ItemAddDown,
  500. ItemDel
  501. }
  502. }