VmMaintainerInfo.cs 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685
  1. 
  2. ///////////////////////////////////////////////////////////////////////////////
  3. //文件名称: VmMaintainerInfo.cs
  4. //文件描述: 维修商信息
  5. //创 建 者: xls
  6. //创建日期: 2018/5/24 22:07:12
  7. //版 本 号:1.0.0.0
  8. ////////////////////////////////////////////////////////////////////////////////
  9. using System;
  10. using System.Collections.Generic;
  11. using System.Collections.ObjectModel;
  12. using System.Linq;
  13. using System.Text;
  14. using System.Threading;
  15. using System.Threading.Tasks;
  16. using System.Windows;
  17. using Com.FirmLib.Bll;
  18. using Com.FirmLib.Entity;
  19. using Com.FirmLib.UI.Common;
  20. using Com.FirmLib.UI.Maintainer.Mode;
  21. using FWindSoft.Data;
  22. using FWindSoft.DataFramework;
  23. using FWindSoft.MVVM;
  24. using FWindSoft.Tools;
  25. using FWindSoft.Wpf;
  26. namespace Com.FirmLib.UI.Maintainer
  27. {
  28. public class VmMaintainerInfo : BaseViewModel
  29. {
  30. #region 初始化
  31. public VmMaintainerInfo()
  32. {
  33. Init();
  34. }
  35. private void Init()
  36. {
  37. }
  38. public void Init(LoadParameter parameter)
  39. {
  40. //获取到了维修厂商Id
  41. Id = parameter.Parameter as string;
  42. LoadVenderItem(Id);
  43. LoadProjectAssetItems(Id);
  44. LoadProductTypeItems(Id);
  45. }
  46. #endregion
  47. #region 属性相关
  48. public string Id { get; protected set; }
  49. private string m_Name;
  50. /// <summary>
  51. /// 厂家名称
  52. /// </summary>
  53. public string Name
  54. {
  55. get { return this.m_Name; }
  56. set
  57. {
  58. this.m_Name = value;
  59. RaisePropertyChanged(() => this.Name);
  60. }
  61. }
  62. private string m_Url;
  63. /// <summary>
  64. /// 厂家url
  65. /// </summary>
  66. public string Url
  67. {
  68. get { return this.m_Url; }
  69. set
  70. {
  71. this.m_Url = value;
  72. RaisePropertyChanged(() => this.Url);
  73. }
  74. }
  75. private ObservableCollection<ProjectMaintainerAssetItem> m_ProjectAssetItems;
  76. /// <summary>
  77. /// 项目资产条目
  78. /// </summary>
  79. public ObservableCollection<ProjectMaintainerAssetItem> ProjectAssetItems
  80. {
  81. get { return this.m_ProjectAssetItems; }
  82. set
  83. {
  84. this.m_ProjectAssetItems = value;
  85. RaisePropertyChanged(() => this.ProjectAssetItems);
  86. }
  87. }
  88. #endregion
  89. #region 维护产品组相关
  90. private TreeNavigation<BasePropertyChanged> m_Root;
  91. /// <summary>
  92. /// 根元素
  93. /// </summary>
  94. public TreeNavigation<BasePropertyChanged> Root
  95. {
  96. get { return this.m_Root; }
  97. set
  98. {
  99. this.m_Root = value;
  100. RaisePropertyChanged(nameof(this.Root));
  101. }
  102. }
  103. /// <summary>
  104. /// 当前显示品牌集合
  105. /// </summary>
  106. public TNodeCollection<TreeNavigationItem<BasePropertyChanged>> Brands
  107. {
  108. get { return Root.CurrentItem.Nodes; }
  109. }
  110. #endregion
  111. #region 命令相关
  112. /// <summary>
  113. /// 添加项目资产
  114. /// </summary>
  115. /// <param name="parameter"></param>
  116. [Command]
  117. public void AddProjectAsset(object parameter)
  118. {
  119. try
  120. {
  121. WinMaintainerProjectAsset win = new WinMaintainerProjectAsset();
  122. LoadParameter.StartParameter(win, new LoadParameter(Id));
  123. win.Show(this.GetNavigationBar());
  124. }
  125. catch (Exception ex)
  126. {
  127. MessageTipEx.Show(ex);
  128. }
  129. }
  130. public bool CanAddContract(object parameter)
  131. {
  132. return true;
  133. }
  134. /// <summary>
  135. /// 进入项目信息
  136. /// </summary>
  137. /// <param name="parameter"></param>
  138. [Command]
  139. public void GoToProject(object parameter)
  140. {
  141. try
  142. {
  143. var item = parameter as ProjectMaintainerAssetItem;
  144. WinManitainerProjectInfo win = new WinManitainerProjectInfo();
  145. var p = new MaintainerParameter();
  146. p.Project.Id = item.ProjectId;
  147. p.Maintainer.Id = Id;
  148. LoadParameter.StartParameter(win, new LoadParameter(p));
  149. win.Show(this.GetNavigationBar());
  150. }
  151. catch (Exception ex)
  152. {
  153. MessageTipEx.Show(ex);
  154. }
  155. }
  156. public bool CanGoToProject(object parameter)
  157. {
  158. return true;
  159. }
  160. /// <summary>
  161. /// 保存功能
  162. /// </summary>
  163. /// <param name="parameter"></param>
  164. [Command]
  165. public void SaveCommand(object parameter)
  166. {
  167. MessageTip.Show(this.GetWindow(), "保存");
  168. }
  169. public bool CanSaveCommand(object parameter)
  170. {
  171. return true;
  172. }
  173. #endregion
  174. #region 维护设备族相关命令
  175. /// <summary>
  176. /// 增加维护型号
  177. /// </summary>
  178. /// <param name="parameter"></param>
  179. [Command]
  180. public void AddProductTypeCommand(object parameter)
  181. {
  182. try
  183. {
  184. WinAddProductType win = new WinAddProductType();
  185. win.Owner = this.GetWindow();
  186. LoadParameter.StartParameter(win, new LoadParameter(Id));
  187. if (win.ShowDialog() == true)
  188. {
  189. ///todo 是不是要刷新,因为可能连续添加;
  190. LoadProductTypeItems(Id);
  191. }
  192. }
  193. catch (Exception ex)
  194. {
  195. MessageTipEx.Show(ex);
  196. }
  197. }
  198. public bool CanAddProductTypeCommand(object parameter)
  199. {
  200. return true;
  201. }
  202. /// <summary>
  203. /// 删除型号命令
  204. /// </summary>
  205. /// <param name="parameter"></param>
  206. [Command]
  207. public void DeleteCommand(object parameter)
  208. {
  209. try
  210. {
  211. TreeNavigationItem<BasePropertyChanged> item = parameter as TreeNavigationItem<BasePropertyChanged>;
  212. if (item == null)
  213. return;
  214. BrandInfoShowItem showItem = item.RefItem as BrandInfoShowItem;
  215. if (showItem == null)
  216. return;
  217. var result = MessageTip.Show(this.GetWindow(), "是否要删除", "提示", MessageBoxButton.YesNo);
  218. if (result == MessageBoxResult.Yes)
  219. {
  220. var flag = DeleteItem(Id, showItem.ProductTypes.Select(p => p.Id).ToList());
  221. if (flag)
  222. {
  223. if (Brands != null)
  224. {
  225. if (DataSource != null)
  226. {
  227. DataSource.RemoveAll(p => showItem.ProductTypes.Any(s => s.Id == p.ProductTypeId));
  228. }
  229. Brands.Remove(item);
  230. }
  231. }
  232. else
  233. {
  234. MessageTip.Show(this.GetWindow(), BllFactory<ProductDirectoryBll>.Instance.ErrorMessage, "失败");
  235. }
  236. }
  237. }
  238. catch (Exception ex)
  239. {
  240. MessageTipEx.Show(ex);
  241. }
  242. }
  243. public bool CanDeleteCommand(object parameter)
  244. {
  245. return true;
  246. }
  247. /// <summary>
  248. /// 查看型号
  249. /// </summary>
  250. /// <param name="parameter"></param>
  251. [Command]
  252. public void ScanProductTypeCommand(object parameter)
  253. {
  254. try
  255. {
  256. BrandInfoShowItem showItem = (parameter as TreeNavigationItem<BasePropertyChanged>)?.RefItem as BrandInfoShowItem;
  257. if (showItem == null)
  258. return;
  259. WinUpdateProductType win = new WinUpdateProductType();
  260. win.Title = "查看维修型号";
  261. win.Owner = this.GetWindow();
  262. EditParameter pa = new EditParameter(Id, showItem.BrandId);
  263. LoadParameter.StartParameter(win, new LoadParameter(pa));
  264. if (win.ShowDialog() == true)
  265. {
  266. LoadProductTypeItems(Id);
  267. }
  268. }
  269. catch (Exception ex)
  270. {
  271. MessageTipEx.Show(ex);
  272. }
  273. }
  274. public bool CanScanProductTypeCommand(object parameter)
  275. {
  276. return true;
  277. }
  278. /// <summary>
  279. /// 编辑型号
  280. /// </summary>
  281. /// <param name="parameter"></param>
  282. [Command]
  283. public void EditProductTypeCommand(object parameter)
  284. {
  285. try
  286. {
  287. BrandInfoShowItem showItem = (parameter as TreeNavigationItem<BasePropertyChanged>)?.RefItem as BrandInfoShowItem;
  288. if (showItem == null)
  289. return;
  290. WinUpdateProductType win = new WinUpdateProductType();
  291. win.Title = "编辑维修型号";
  292. win.Owner = this.GetWindow();
  293. EditParameter pa = new EditParameter(Id, showItem.BrandId) { IsEdit = true };
  294. LoadParameter.StartParameter(win, new LoadParameter(pa));
  295. if (win.ShowDialog() == true)
  296. {
  297. LoadProductTypeItems(Id);
  298. }
  299. }
  300. catch (Exception ex)
  301. {
  302. MessageTipEx.Show(ex);
  303. }
  304. }
  305. public bool CanEditProductTypeCommand(object parameter)
  306. {
  307. return true;
  308. }
  309. /// <summary>
  310. /// 刷新动画
  311. /// </summary>
  312. /// <param name="parameter"></param>
  313. [Command]
  314. public void RefreshCommand(object parameter)
  315. {
  316. try
  317. {
  318. var item = parameter as ProjectMaintainerAssetItem;
  319. if (item != null)
  320. {
  321. item.IsLoading = true;
  322. TaskUtil.StartSTATask((obj) =>
  323. {
  324. var useItem = obj as ProjectMaintainerAssetItem;
  325. if (useItem == null)
  326. return;
  327. try
  328. {
  329. BllFactory<ProjectBll>.Instance.ProjectSync(useItem.ProjectId);
  330. Thread.Sleep(3000);//立即执行偶尔导致连接取消
  331. var projects = BllFactory<MaintainerBll>.Instance.GetProjectItems(Id);
  332. foreach (var project in projects)
  333. {
  334. if (project.Id == useItem.ProjectId)
  335. {
  336. useItem.ValidityAssetCount = project.TotalCount;
  337. useItem.NearOutDateAssetCount = project.NearlyExpireCount;
  338. }
  339. }
  340. }
  341. catch (Exception ex)
  342. {
  343. MessageTipEx.Show(ex);
  344. }
  345. finally
  346. {
  347. useItem.IsLoading = false;
  348. }
  349. }, item);
  350. }
  351. }
  352. catch (Exception ex)
  353. {
  354. MessageTipEx.Show(ex);
  355. }
  356. }
  357. public bool CanRefreshCommand(object parameter)
  358. {
  359. return true;
  360. }
  361. #endregion
  362. #region 公开方法
  363. /// <summary>
  364. /// 更新指定字段信息
  365. /// </summary>
  366. /// <param name="field"></param>
  367. /// <returns></returns>
  368. public bool SingleUpdateVenderItem(string field)
  369. {
  370. MaintainerItem item = new MaintainerItem();
  371. item.Id = this.Id;
  372. SetFieldValue(item, field);
  373. var result = BllFactory<MaintainerBll>.Instance.Update(item);
  374. if (!result)
  375. {
  376. MessageTip.Show(this.GetWindow(), BllFactory<MaintainerBll>.Instance.ErrorMessage ?? string.Empty);
  377. }
  378. return result;
  379. }
  380. private void SetFieldValue(MaintainerItem item, string field)
  381. {
  382. if (field == "Name")
  383. {
  384. item.Name = this.Name;
  385. return;
  386. }
  387. if (field == "Url")
  388. {
  389. item.Website = this.Url;
  390. return;
  391. }
  392. }
  393. #endregion
  394. #region 私有方法
  395. /// <summary>
  396. /// 加载厂商信息
  397. /// </summary>
  398. /// <param name="venderId">厂商Id</param>
  399. private void LoadVenderItem(string venderId)
  400. {
  401. #region 加载厂商信息
  402. var venderItem = BllFactory<MaintainerBll>.Instance.GetAllItems().FirstOrDefault(c => c.Id == venderId);
  403. Name = venderItem.Name;
  404. Url = venderItem.Website;
  405. #endregion
  406. }
  407. /// <summary>
  408. /// 加载项目数据
  409. /// </summary>
  410. /// <param name="venderId"></param>
  411. private void LoadProjectAssetItems(string venderId)
  412. {
  413. ProjectAssetItems = new ObservableCollection<ProjectMaintainerAssetItem>();
  414. var projects = BllFactory<MaintainerBll>.Instance.GetProjectItems(venderId);
  415. foreach (var project in projects)
  416. {
  417. var item=new ProjectMaintainerAssetItem() {ProjectId = project.Id, ProjectLocalName = project.Name};
  418. item.ValidityAssetCount = project.TotalCount;
  419. item.NearOutDateAssetCount = project.NearlyExpireCount;
  420. ProjectAssetItems.Add(item);
  421. }
  422. }
  423. private void LoadProductTypeItems(string venderId)
  424. {
  425. Root = new TreeNavigation<BasePropertyChanged>();
  426. Root.CurrentItemChanged = ChangeSelectedItem;
  427. Root.Items.AddRange(GetFamilys(venderId, new ProdcutTypeCondition()));
  428. Root.CurrentItem = Root.Items.FirstOrDefault();
  429. }
  430. /// <summary>
  431. /// 删除指定厂商下的品牌信息
  432. /// </summary>
  433. /// <param name="venderId"></param>
  434. /// <param name="productTypeIds"></param>
  435. private bool DeleteItem(string venderId, List<string> productTypeIds)
  436. {
  437. return BllFactory<ProductDirectoryBll>.Instance.Delete(venderId, new List<string>(productTypeIds));
  438. }
  439. #endregion
  440. #region 关联型号相关
  441. private void ChangeSelectedItem(TreeNavigationItem<BasePropertyChanged> item)
  442. {
  443. if (item == null)
  444. return;
  445. if (item.Level > 1)
  446. return;
  447. item.Nodes.Clear();
  448. if (item.Level == 1)
  449. {
  450. ShowDataItem showItem = item.RefItem as ShowDataItem;
  451. ProdcutTypeCondition condition = new ProdcutTypeCondition();
  452. condition.FamilyCode = showItem?.Id;
  453. item.Nodes.AddRange(GetBrands(condition));
  454. }
  455. item.CurrentItem = item.Nodes.FirstOrDefault();
  456. }
  457. /// <summary>
  458. /// 产品信息数据源
  459. /// </summary>
  460. private List<ProductTypeDetailItem> DataSource { get; set; }
  461. private List<TreeNavigationItem<BasePropertyChanged>> GetFamilys(string maintainerId,ProdcutTypeCondition condition)
  462. {
  463. List<TreeNavigationItem<BasePropertyChanged>> results = new List<TreeNavigationItem<BasePropertyChanged>>();
  464. DataSource = BllFactory<ProductDirectoryBll>.Instance.GetAllItems(maintainerId) ?? new List<ProductTypeDetailItem>();
  465. var familys = ProductTypeManager.GetFamilys(new ProdcutTypeCondition(DataSource));
  466. if (familys.Count > 1)
  467. {
  468. //当关联设备族大于一个时,才显示全部选项
  469. results.Add(new TreeNavigationItem<BasePropertyChanged>() { RefItem = new ShowDataItem() { Name = "全部", FamilyCode = "All", Id = "All" } });
  470. }
  471. familys.ForEach(f => results.Add(new TreeNavigationItem<BasePropertyChanged>() { RefItem = f }));
  472. return results;
  473. }
  474. private List<TreeNavigationItem<BasePropertyChanged>> GetBrands(ProdcutTypeCondition condition)
  475. {
  476. List<TreeNavigationItem<BasePropertyChanged>> results = new List<TreeNavigationItem<BasePropertyChanged>>();
  477. var useDataSource = DataSource;
  478. if (condition.FamilyCode != "All")
  479. {
  480. useDataSource = DataSource.Where(p => p.FamilyCode == condition.FamilyCode).ToList();
  481. }
  482. List<BrandInfoShowItem> brands = new List<BrandInfoShowItem>();
  483. var comparer = new TComparer<ShowDataItem>((s1, s2) => s1.Id == s2.Id);
  484. var group1 = useDataSource.GroupBy(c => new ShowDataItem() { Id = c.BrandId, Name = c.BrandName, FamilyCode = c.FamilyCode }, comparer);
  485. foreach (var groupItem1 in group1)
  486. {
  487. BrandInfoShowItem brand = new BrandInfoShowItem();
  488. brand.FamilyCode = groupItem1.Key.FamilyCode;
  489. brand.BrandId = groupItem1.Key.Id;
  490. brand.BrandName = groupItem1.Key.Name;
  491. var group2 = groupItem1.GroupBy(c => new ShowDataItem() { Id = c.ProductId, Name = c.ProductName, FamilyCode = c.FamilyCode }, comparer);
  492. foreach (var groupItem2 in group2)
  493. {
  494. #region 增加产品
  495. ShowDataItem showItem = new ShowDataItem();
  496. showItem.Id = groupItem2.Key.Id;
  497. showItem.Name = groupItem2.Key.Name;
  498. brand.Products.Add(showItem);
  499. #endregion
  500. #region 增加产品型号
  501. brand.ProductTypes.AddRange(groupItem2.Select(p => new ShowDataItem() { Id = p.ProductTypeId, Name = p.ProductTypeName }));
  502. #endregion
  503. }
  504. brands.Add(brand);
  505. }
  506. brands.ForEach(b => results.Add(new TreeNavigationItem<BasePropertyChanged>() { RefItem = b }));
  507. return results;
  508. }
  509. #endregion
  510. }
  511. #region 前台显示类
  512. /// <summary>
  513. /// 项目维修资产
  514. /// </summary>
  515. public class ProjectMaintainerAssetItem : BasePropertyChanged
  516. {
  517. public string ProjectId { get; set; }
  518. private string m_ProjectLocalName;
  519. /// <summary>
  520. /// 项目本地名称
  521. /// </summary>
  522. public string ProjectLocalName
  523. {
  524. get { return this.m_ProjectLocalName; }
  525. set
  526. {
  527. this.m_ProjectLocalName = value;
  528. RaisePropertyChanged(() => this.ProjectLocalName);
  529. }
  530. }
  531. private int m_ValidityAssetCount;
  532. /// <summary>
  533. /// 有效期内的资产
  534. /// </summary>
  535. public int ValidityAssetCount
  536. {
  537. get { return this.m_ValidityAssetCount; }
  538. set
  539. {
  540. this.m_ValidityAssetCount = value;
  541. RaisePropertyChanged(() => this.ValidityAssetCount);
  542. }
  543. }
  544. private int m_NearOutDateAssetCount;
  545. /// <summary>
  546. /// 即将超期资产
  547. /// </summary>
  548. public int NearOutDateAssetCount
  549. {
  550. get { return this.m_NearOutDateAssetCount; }
  551. set
  552. {
  553. this.m_NearOutDateAssetCount = value;
  554. RaisePropertyChanged(() => this.NearOutDateAssetCount);
  555. }
  556. }
  557. private bool m_IsLoading;
  558. /// <summary>
  559. /// 加载数据
  560. /// </summary>
  561. public bool IsLoading
  562. {
  563. get { return this.m_IsLoading; }
  564. set
  565. {
  566. this.m_IsLoading = value;
  567. RaisePropertyChanged(nameof(this.IsLoading));
  568. }
  569. }
  570. }
  571. /// <summary>
  572. /// 品牌信息显示
  573. /// </summary>
  574. public class BrandInfoShowItem : BasePropertyChanged
  575. {
  576. public BrandInfoShowItem()
  577. {
  578. Products = new List<ShowDataItem>();
  579. ProductTypes = new List<ShowDataItem>();
  580. }
  581. /// <summary>
  582. /// 种族名称
  583. /// </summary>
  584. public string FamilyName { get; set; }
  585. /// <summary>
  586. /// 种族编码
  587. /// </summary>
  588. public string FamilyCode { get; set; }
  589. /// <summary>
  590. /// 品牌Id
  591. /// </summary>
  592. public string BrandId { get; set; }
  593. private string m_BrandName;
  594. /// <summary>
  595. /// 品牌名称
  596. /// </summary>
  597. public string BrandName
  598. {
  599. get { return this.m_BrandName; }
  600. set
  601. {
  602. this.m_BrandName= value;
  603. RaisePropertyChanged(() => this.BrandName);
  604. }
  605. }
  606. private List<ShowDataItem> m_Products;
  607. /// <summary>
  608. /// 产品名称
  609. /// </summary>
  610. public List<ShowDataItem> Products
  611. {
  612. get { return this.m_Products; }
  613. set
  614. {
  615. this.m_Products = value;
  616. RaisePropertyChanged(() => this.Products);
  617. }
  618. }
  619. private List<ShowDataItem> m_ProductTypes;
  620. /// <summary>
  621. /// 产品类型名称
  622. /// </summary>
  623. public List<ShowDataItem> ProductTypes
  624. {
  625. get { return this.m_ProductTypes; }
  626. set
  627. {
  628. this.m_ProductTypes = value;
  629. RaisePropertyChanged(() => this.ProductTypes);
  630. }
  631. }
  632. }
  633. #endregion
  634. }