VmMaintainerInfo.cs 18 KB

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