VmMaintainerInfo.cs 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629
  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. WinMaintainerProjectAsset win = new WinMaintainerProjectAsset();
  120. LoadParameter.StartParameter(win, new LoadParameter(Id));
  121. win.Show(this.GetNavigationBar());
  122. }
  123. public bool CanAddContract(object parameter)
  124. {
  125. return true;
  126. }
  127. /// <summary>
  128. /// 进入项目信息
  129. /// </summary>
  130. /// <param name="parameter"></param>
  131. [Command]
  132. public void GoToProject(object parameter)
  133. {
  134. var item = parameter as ProjectMaintainerAssetItem;
  135. WinManitainerProjectInfo win = new WinManitainerProjectInfo();
  136. var p = new MaintainerParameter();
  137. p.Project.Id = item.ProjectId;
  138. p.Maintainer.Id = Id;
  139. LoadParameter.StartParameter(win, new LoadParameter(p));
  140. win.Show(this.GetNavigationBar());
  141. }
  142. public bool CanGoToProject(object parameter)
  143. {
  144. return true;
  145. }
  146. /// <summary>
  147. /// 保存功能
  148. /// </summary>
  149. /// <param name="parameter"></param>
  150. [Command]
  151. public void SaveCommand(object parameter)
  152. {
  153. MessageTip.Show(this.GetWindow(), "保存");
  154. }
  155. public bool CanSaveCommand(object parameter)
  156. {
  157. return true;
  158. }
  159. #endregion
  160. #region 维护设备族相关命令
  161. /// <summary>
  162. /// 增加维护型号
  163. /// </summary>
  164. /// <param name="parameter"></param>
  165. [Command]
  166. public void AddProductTypeCommand(object parameter)
  167. {
  168. WinAddProductType win = new WinAddProductType();
  169. win.Owner = this.GetWindow();
  170. LoadParameter.StartParameter(win, new LoadParameter(Id));
  171. if (win.ShowDialog() == true)
  172. {
  173. ///todo 是不是要刷新,因为可能连续添加;
  174. LoadProductTypeItems(Id);
  175. }
  176. }
  177. public bool CanAddProductTypeCommand(object parameter)
  178. {
  179. return true;
  180. }
  181. /// <summary>
  182. /// 删除型号命令
  183. /// </summary>
  184. /// <param name="parameter"></param>
  185. [Command]
  186. public void DeleteCommand(object parameter)
  187. {
  188. TreeNavigationItem<BasePropertyChanged> item = parameter as TreeNavigationItem<BasePropertyChanged>;
  189. if (item == null)
  190. return;
  191. BrandInfoShowItem showItem = item.RefItem as BrandInfoShowItem;
  192. if (showItem == null)
  193. return;
  194. var result = MessageTip.Show(this.GetWindow(), "是否要删除", "提示", MessageBoxButton.YesNo);
  195. if (result == MessageBoxResult.Yes)
  196. {
  197. var flag=DeleteItem(Id, showItem.ProductTypes.Select(p=>p.Id).ToList());
  198. if (flag)
  199. {
  200. if (Brands != null)
  201. {
  202. if (DataSource != null)
  203. {
  204. DataSource.RemoveAll(p => showItem.ProductTypes.Any(s => s.Id == p.ProductTypeId));
  205. }
  206. Brands.Remove(item);
  207. }
  208. }
  209. else
  210. {
  211. MessageTip.Show(this.GetWindow(), BllFactory<ProductDirectoryBll>.Instance.ErrorMessage, "失败");
  212. }
  213. }
  214. }
  215. public bool CanDeleteCommand(object parameter)
  216. {
  217. return true;
  218. }
  219. /// <summary>
  220. /// 查看型号
  221. /// </summary>
  222. /// <param name="parameter"></param>
  223. [Command]
  224. public void ScanProductTypeCommand(object parameter)
  225. {
  226. BrandInfoShowItem showItem = (parameter as TreeNavigationItem<BasePropertyChanged>)?.RefItem as BrandInfoShowItem;
  227. if (showItem == null)
  228. return;
  229. WinUpdateProductType win = new WinUpdateProductType();
  230. win.Title = "查看维修型号";
  231. win.Owner = this.GetWindow();
  232. EditParameter pa = new EditParameter(Id, showItem.BrandId);
  233. LoadParameter.StartParameter(win, new LoadParameter(pa));
  234. if (win.ShowDialog() == true)
  235. {
  236. LoadProductTypeItems(Id);
  237. }
  238. }
  239. public bool CanScanProductTypeCommand(object parameter)
  240. {
  241. return true;
  242. }
  243. /// <summary>
  244. /// 编辑型号
  245. /// </summary>
  246. /// <param name="parameter"></param>
  247. [Command]
  248. public void EditProductTypeCommand(object parameter)
  249. {
  250. BrandInfoShowItem showItem = (parameter as TreeNavigationItem<BasePropertyChanged>)?.RefItem as BrandInfoShowItem;
  251. if (showItem == null)
  252. return;
  253. WinUpdateProductType win = new WinUpdateProductType();
  254. win.Title = "编辑维修型号";
  255. win.Owner = this.GetWindow();
  256. EditParameter pa = new EditParameter(Id, showItem.BrandId) { IsEdit = true };
  257. LoadParameter.StartParameter(win, new LoadParameter(pa));
  258. if (win.ShowDialog() == true)
  259. {
  260. LoadProductTypeItems(Id);
  261. }
  262. }
  263. public bool CanEditProductTypeCommand(object parameter)
  264. {
  265. return true;
  266. }
  267. /// <summary>
  268. /// 刷新动画
  269. /// </summary>
  270. /// <param name="parameter"></param>
  271. [Command]
  272. public void RefreshCommand(object parameter)
  273. {
  274. var item = parameter as ProjectMaintainerAssetItem;
  275. if (item != null)
  276. {
  277. item.IsLoading = true;
  278. TaskUtil.StartSTATask((obj) =>
  279. {
  280. var useItem = obj as ProjectMaintainerAssetItem;
  281. if (useItem == null)
  282. return;
  283. try
  284. {
  285. BllFactory<ProjectBll>.Instance.ProjectSync(useItem.ProjectId);
  286. Thread.Sleep(3000);//立即执行偶尔导致连接取消
  287. var projects = BllFactory<MaintainerBll>.Instance.GetProjectItems(Id);
  288. foreach (var project in projects)
  289. {
  290. if (project.Id == useItem.ProjectId)
  291. {
  292. useItem.ValidityAssetCount = project.TotalCount;
  293. useItem.NearOutDateAssetCount = project.NearlyExpireCount;
  294. }
  295. }
  296. }
  297. catch (Exception ex)
  298. {
  299. MessageTipEx.Show(ex);
  300. }
  301. finally
  302. {
  303. useItem.IsLoading = false;
  304. }
  305. }, item);
  306. }
  307. }
  308. public bool CanRefreshCommand(object parameter)
  309. {
  310. return true;
  311. }
  312. #endregion
  313. #region 公开方法
  314. /// <summary>
  315. /// 更新指定字段信息
  316. /// </summary>
  317. /// <param name="field"></param>
  318. /// <returns></returns>
  319. public bool SingleUpdateVenderItem(string field)
  320. {
  321. MaintainerItem item = new MaintainerItem();
  322. item.Id = this.Id;
  323. SetFieldValue(item, field);
  324. var result = BllFactory<MaintainerBll>.Instance.Update(item);
  325. if (!result)
  326. {
  327. MessageTip.Show(this.GetWindow(), BllFactory<MaintainerBll>.Instance.ErrorMessage ?? string.Empty);
  328. }
  329. return result;
  330. }
  331. private void SetFieldValue(MaintainerItem item, string field)
  332. {
  333. if (field == "Name")
  334. {
  335. item.Name = this.Name;
  336. return;
  337. }
  338. if (field == "Url")
  339. {
  340. item.Website = this.Url;
  341. return;
  342. }
  343. }
  344. #endregion
  345. #region 私有方法
  346. /// <summary>
  347. /// 加载厂商信息
  348. /// </summary>
  349. /// <param name="venderId">厂商Id</param>
  350. private void LoadVenderItem(string venderId)
  351. {
  352. #region 加载厂商信息
  353. var venderItem = BllFactory<MaintainerBll>.Instance.GetAllItems().FirstOrDefault(c => c.Id == venderId);
  354. Name = venderItem.Name;
  355. Url = venderItem.Website;
  356. #endregion
  357. }
  358. /// <summary>
  359. /// 加载项目数据
  360. /// </summary>
  361. /// <param name="venderId"></param>
  362. private void LoadProjectAssetItems(string venderId)
  363. {
  364. ProjectAssetItems = new ObservableCollection<ProjectMaintainerAssetItem>();
  365. var projects = BllFactory<MaintainerBll>.Instance.GetProjectItems(venderId);
  366. foreach (var project in projects)
  367. {
  368. var item=new ProjectMaintainerAssetItem() {ProjectId = project.Id, ProjectLocalName = project.Name};
  369. item.ValidityAssetCount = project.TotalCount;
  370. item.NearOutDateAssetCount = project.NearlyExpireCount;
  371. ProjectAssetItems.Add(item);
  372. }
  373. }
  374. private void LoadProductTypeItems(string venderId)
  375. {
  376. Root = new TreeNavigation<BasePropertyChanged>();
  377. Root.CurrentItemChanged = ChangeSelectedItem;
  378. Root.Items.AddRange(GetFamilys(venderId, new ProdcutTypeCondition()));
  379. Root.CurrentItem = Root.Items.FirstOrDefault();
  380. }
  381. /// <summary>
  382. /// 删除指定厂商下的品牌信息
  383. /// </summary>
  384. /// <param name="venderId"></param>
  385. /// <param name="productTypeIds"></param>
  386. private bool DeleteItem(string venderId, List<string> productTypeIds)
  387. {
  388. return BllFactory<ProductDirectoryBll>.Instance.Delete(venderId, new List<string>(productTypeIds));
  389. }
  390. #endregion
  391. #region 关联型号相关
  392. private void ChangeSelectedItem(TreeNavigationItem<BasePropertyChanged> item)
  393. {
  394. if (item == null)
  395. return;
  396. if (item.Level > 1)
  397. return;
  398. item.Nodes.Clear();
  399. if (item.Level == 1)
  400. {
  401. ShowDataItem showItem = item.RefItem as ShowDataItem;
  402. ProdcutTypeCondition condition = new ProdcutTypeCondition();
  403. condition.FamilyCode = showItem?.Id;
  404. item.Nodes.AddRange(GetBrands(condition));
  405. }
  406. item.CurrentItem = item.Nodes.FirstOrDefault();
  407. }
  408. /// <summary>
  409. /// 产品信息数据源
  410. /// </summary>
  411. private List<ProductTypeDetailItem> DataSource { get; set; }
  412. private List<TreeNavigationItem<BasePropertyChanged>> GetFamilys(string maintainerId,ProdcutTypeCondition condition)
  413. {
  414. List<TreeNavigationItem<BasePropertyChanged>> results = new List<TreeNavigationItem<BasePropertyChanged>>();
  415. DataSource = BllFactory<ProductDirectoryBll>.Instance.GetAllItems(maintainerId) ?? new List<ProductTypeDetailItem>();
  416. var familys = ProductTypeManager.GetFamilys(new ProdcutTypeCondition(DataSource));
  417. if (familys.Count > 1)
  418. {
  419. //当关联设备族大于一个时,才显示全部选项
  420. results.Add(new TreeNavigationItem<BasePropertyChanged>() { RefItem = new ShowDataItem() { Name = "全部", FamilyCode = "All", Id = "All" } });
  421. }
  422. familys.ForEach(f => results.Add(new TreeNavigationItem<BasePropertyChanged>() { RefItem = f }));
  423. return results;
  424. }
  425. private List<TreeNavigationItem<BasePropertyChanged>> GetBrands(ProdcutTypeCondition condition)
  426. {
  427. List<TreeNavigationItem<BasePropertyChanged>> results = new List<TreeNavigationItem<BasePropertyChanged>>();
  428. var useDataSource = DataSource;
  429. if (condition.FamilyCode != "All")
  430. {
  431. useDataSource = DataSource.Where(p => p.FamilyCode == condition.FamilyCode).ToList();
  432. }
  433. List<BrandInfoShowItem> brands = new List<BrandInfoShowItem>();
  434. var comparer = new TComparer<ShowDataItem>((s1, s2) => s1.Id == s2.Id);
  435. var group1 = useDataSource.GroupBy(c => new ShowDataItem() { Id = c.BrandId, Name = c.BrandName, FamilyCode = c.FamilyCode }, comparer);
  436. foreach (var groupItem1 in group1)
  437. {
  438. BrandInfoShowItem brand = new BrandInfoShowItem();
  439. brand.FamilyCode = groupItem1.Key.FamilyCode;
  440. brand.BrandId = groupItem1.Key.Id;
  441. brand.BrandName = groupItem1.Key.Name;
  442. var group2 = groupItem1.GroupBy(c => new ShowDataItem() { Id = c.ProductId, Name = c.ProductName, FamilyCode = c.FamilyCode }, comparer);
  443. foreach (var groupItem2 in group2)
  444. {
  445. #region 增加产品
  446. ShowDataItem showItem = new ShowDataItem();
  447. showItem.Id = groupItem2.Key.Id;
  448. showItem.Name = groupItem2.Key.Name;
  449. brand.Products.Add(showItem);
  450. #endregion
  451. #region 增加产品型号
  452. brand.ProductTypes.AddRange(groupItem2.Select(p => new ShowDataItem() { Id = p.ProductTypeId, Name = p.ProductTypeName }));
  453. #endregion
  454. }
  455. brands.Add(brand);
  456. }
  457. brands.ForEach(b => results.Add(new TreeNavigationItem<BasePropertyChanged>() { RefItem = b }));
  458. return results;
  459. }
  460. #endregion
  461. }
  462. #region 前台显示类
  463. /// <summary>
  464. /// 项目维修资产
  465. /// </summary>
  466. public class ProjectMaintainerAssetItem : BasePropertyChanged
  467. {
  468. public string ProjectId { get; set; }
  469. private string m_ProjectLocalName;
  470. /// <summary>
  471. /// 项目本地名称
  472. /// </summary>
  473. public string ProjectLocalName
  474. {
  475. get { return this.m_ProjectLocalName; }
  476. set
  477. {
  478. this.m_ProjectLocalName = value;
  479. RaisePropertyChanged(() => this.ProjectLocalName);
  480. }
  481. }
  482. private int m_ValidityAssetCount;
  483. /// <summary>
  484. /// 有效期内的资产
  485. /// </summary>
  486. public int ValidityAssetCount
  487. {
  488. get { return this.m_ValidityAssetCount; }
  489. set
  490. {
  491. this.m_ValidityAssetCount = value;
  492. RaisePropertyChanged(() => this.ValidityAssetCount);
  493. }
  494. }
  495. private int m_NearOutDateAssetCount;
  496. /// <summary>
  497. /// 即将超期资产
  498. /// </summary>
  499. public int NearOutDateAssetCount
  500. {
  501. get { return this.m_NearOutDateAssetCount; }
  502. set
  503. {
  504. this.m_NearOutDateAssetCount = value;
  505. RaisePropertyChanged(() => this.NearOutDateAssetCount);
  506. }
  507. }
  508. private bool m_IsLoading;
  509. /// <summary>
  510. /// 加载数据
  511. /// </summary>
  512. public bool IsLoading
  513. {
  514. get { return this.m_IsLoading; }
  515. set
  516. {
  517. this.m_IsLoading = value;
  518. RaisePropertyChanged(nameof(this.IsLoading));
  519. }
  520. }
  521. }
  522. /// <summary>
  523. /// 品牌信息显示
  524. /// </summary>
  525. public class BrandInfoShowItem : BasePropertyChanged
  526. {
  527. public BrandInfoShowItem()
  528. {
  529. Products = new List<ShowDataItem>();
  530. ProductTypes = new List<ShowDataItem>();
  531. }
  532. /// <summary>
  533. /// 种族名称
  534. /// </summary>
  535. public string FamilyName { get; set; }
  536. /// <summary>
  537. /// 种族编码
  538. /// </summary>
  539. public string FamilyCode { get; set; }
  540. /// <summary>
  541. /// 品牌Id
  542. /// </summary>
  543. public string BrandId { get; set; }
  544. private string m_BrandName;
  545. /// <summary>
  546. /// 品牌名称
  547. /// </summary>
  548. public string BrandName
  549. {
  550. get { return this.m_BrandName; }
  551. set
  552. {
  553. this.m_BrandName= value;
  554. RaisePropertyChanged(() => this.BrandName);
  555. }
  556. }
  557. private List<ShowDataItem> m_Products;
  558. /// <summary>
  559. /// 产品名称
  560. /// </summary>
  561. public List<ShowDataItem> Products
  562. {
  563. get { return this.m_Products; }
  564. set
  565. {
  566. this.m_Products = value;
  567. RaisePropertyChanged(() => this.Products);
  568. }
  569. }
  570. private List<ShowDataItem> m_ProductTypes;
  571. /// <summary>
  572. /// 产品类型名称
  573. /// </summary>
  574. public List<ShowDataItem> ProductTypes
  575. {
  576. get { return this.m_ProductTypes; }
  577. set
  578. {
  579. this.m_ProductTypes = value;
  580. RaisePropertyChanged(() => this.ProductTypes);
  581. }
  582. }
  583. }
  584. #endregion
  585. }