Browse Source

mxg:初始化

mengxiangge 5 years ago
parent
commit
6f4e589e94
100 changed files with 10327 additions and 0 deletions
  1. BIN
      Dlls/CEFSharpWPF.dll
  2. BIN
      Dlls/CefSharp.Core.dll
  3. BIN
      Dlls/CefSharp.dll
  4. BIN
      Dlls/DataGridExtensions.dll
  5. BIN
      Dlls/FWindSoft.Wpf.dll
  6. BIN
      Dlls/FWindSoft.dll
  7. BIN
      Dlls/INIFileParser.dll
  8. BIN
      Dlls/Newtonsoft.Json.dll
  9. BIN
      Dlls/SAGA.DotNetUtils.dll
  10. BIN
      Dlls/SAGA.RevitUtils.dll
  11. BIN
      Dlls/WPG.dll
  12. 355 0
      FirmLib/Com.FirmLib.UI/BllCommon/AssetManager.cs
  13. 149 0
      FirmLib/Com.FirmLib.UI/BllCommon/AssetSelector.cs
  14. 64 0
      FirmLib/Com.FirmLib.UI/BllCommon/AssetShowItemUtils.cs
  15. 151 0
      FirmLib/Com.FirmLib.UI/BllCommon/BaseAssetItem.cs
  16. 22 0
      FirmLib/Com.FirmLib.UI/BllCommon/Commands.cs
  17. 18 0
      FirmLib/Com.FirmLib.UI/BllCommon/CommomUtils.cs
  18. 57 0
      FirmLib/Com.FirmLib.UI/BllCommon/ContactInformationEditor.xaml
  19. 28 0
      FirmLib/Com.FirmLib.UI/BllCommon/ContactInformationEditor.xaml.cs
  20. 43 0
      FirmLib/Com.FirmLib.UI/BllCommon/ContactInformationInput.xaml
  21. 33 0
      FirmLib/Com.FirmLib.UI/BllCommon/ContactInformationInput.xaml.cs
  22. 73 0
      FirmLib/Com.FirmLib.UI/BllCommon/ContactInformationItem.cs
  23. 47 0
      FirmLib/Com.FirmLib.UI/BllCommon/DateTimeManager.cs
  24. 113 0
      FirmLib/Com.FirmLib.UI/BllCommon/EquipmentFamilyManager.cs
  25. 62 0
      FirmLib/Com.FirmLib.UI/BllCommon/FileItem.cs
  26. 53 0
      FirmLib/Com.FirmLib.UI/BllCommon/FileUtils.cs
  27. 246 0
      FirmLib/Com.FirmLib.UI/BllCommon/ProductTypeManager.cs
  28. 54 0
      FirmLib/Com.FirmLib.UI/BllCommon/ProjectIdManager.cs
  29. 60 0
      FirmLib/Com.FirmLib.UI/BllCommon/ProjectManager.cs
  30. 544 0
      FirmLib/Com.FirmLib.UI/Com.FirmLib.UI.csproj
  31. 6 0
      FirmLib/Com.FirmLib.UI/Com.FirmLib.UI.csproj.user
  32. 122 0
      FirmLib/Com.FirmLib.UI/Common/CellTemplates.xaml
  33. 35 0
      FirmLib/Com.FirmLib.UI/Common/CommonStyles.cs
  34. 17 0
      FirmLib/Com.FirmLib.UI/Common/Enums.cs
  35. 25 0
      FirmLib/Com.FirmLib.UI/Common/IdNameItem.cs
  36. 94 0
      FirmLib/Com.FirmLib.UI/Common/InfoPointTemplateManager.cs
  37. 27 0
      FirmLib/Com.FirmLib.UI/Common/Model/AssetSaveContext.cs
  38. 273 0
      FirmLib/Com.FirmLib.UI/Common/Model/AssetShowItem.cs
  39. 30 0
      FirmLib/Com.FirmLib.UI/Common/Model/EditTypeSelectorContext.cs
  40. 86 0
      FirmLib/Com.FirmLib.UI/Common/Model/ProdcutTypeCondition.cs
  41. 51 0
      FirmLib/Com.FirmLib.UI/Common/Model/ProductTypeShowItem.cs
  42. 37 0
      FirmLib/Com.FirmLib.UI/Common/Model/SelectAssetContext.cs
  43. 57 0
      FirmLib/Com.FirmLib.UI/Common/Model/ShowDataItem.cs
  44. 51 0
      FirmLib/Com.FirmLib.UI/Common/Model/VenderItem.cs
  45. 42 0
      FirmLib/Com.FirmLib.UI/Common/Model/VenderProjectParameter.cs
  46. 63 0
      FirmLib/Com.FirmLib.UI/Common/SingleInstance.cs
  47. 43 0
      FirmLib/Com.FirmLib.UI/Common/TComparer.cs
  48. 49 0
      FirmLib/Com.FirmLib.UI/Common/TResult.cs
  49. 33 0
      FirmLib/Com.FirmLib.UI/Common/TryCatchWrapper.cs
  50. 70 0
      FirmLib/Com.FirmLib.UI/Common/UrlFileKeyParse.cs
  51. 171 0
      FirmLib/Com.FirmLib.UI/Common/WatchParameter.cs
  52. 41 0
      FirmLib/Com.FirmLib.UI/Extension/ConverterExtension.cs
  53. 48 0
      FirmLib/Com.FirmLib.UI/Extension/MessageTipExtension.cs
  54. 47 0
      FirmLib/Com.FirmLib.UI/Extension/TreeNavigationExtension.cs
  55. BIN
      FirmLib/Com.FirmLib.UI/Images/修改.jpg
  56. 22 0
      FirmLib/Com.FirmLib.UI/Insuer/Model/InsuerParameter.cs
  57. 59 0
      FirmLib/Com.FirmLib.UI/Insuer/Model/InsuerShowItem.cs
  58. 62 0
      FirmLib/Com.FirmLib.UI/Insuer/Model/InsuerUtils.cs
  59. 143 0
      FirmLib/Com.FirmLib.UI/Insuer/Model/InsureAssetShowItem.cs
  60. 82 0
      FirmLib/Com.FirmLib.UI/Insuer/Model/PolicyShowItem.cs
  61. 59 0
      FirmLib/Com.FirmLib.UI/Insuer/Model/PolicyUpdateContext.cs
  62. 333 0
      FirmLib/Com.FirmLib.UI/Insuer/VmInsuerAssetSelector.cs
  63. 202 0
      FirmLib/Com.FirmLib.UI/Insuer/VmInsuerBaseInfo.cs
  64. 147 0
      FirmLib/Com.FirmLib.UI/Insuer/VmInsuerEditor.cs
  65. 382 0
      FirmLib/Com.FirmLib.UI/Insuer/VmInsuerInfo.cs
  66. 731 0
      FirmLib/Com.FirmLib.UI/Insuer/VmInsuerProjectInfo.cs
  67. 784 0
      FirmLib/Com.FirmLib.UI/Insuer/VmInsurancePolicyEditor.cs
  68. 112 0
      FirmLib/Com.FirmLib.UI/Insuer/VmPolicyEnsure.cs
  69. 132 0
      FirmLib/Com.FirmLib.UI/Insuer/VmPolicySaveEnsure.cs
  70. 164 0
      FirmLib/Com.FirmLib.UI/Insuer/VmPolicySelector.cs
  71. 336 0
      FirmLib/Com.FirmLib.UI/Insuer/VmSimplePolicyEditor.cs
  72. 184 0
      FirmLib/Com.FirmLib.UI/Insuer/WinInsuerAssetSelector.xaml
  73. 75 0
      FirmLib/Com.FirmLib.UI/Insuer/WinInsuerAssetSelector.xaml.cs
  74. 81 0
      FirmLib/Com.FirmLib.UI/Insuer/WinInsuerBaseInfo.xaml
  75. 68 0
      FirmLib/Com.FirmLib.UI/Insuer/WinInsuerBaseInfo.xaml.cs
  76. 43 0
      FirmLib/Com.FirmLib.UI/Insuer/WinInsuerEditor.xaml
  77. 72 0
      FirmLib/Com.FirmLib.UI/Insuer/WinInsuerEditor.xaml.cs
  78. 110 0
      FirmLib/Com.FirmLib.UI/Insuer/WinInsuerInfo.xaml
  79. 94 0
      FirmLib/Com.FirmLib.UI/Insuer/WinInsuerInfo.xaml.cs
  80. 251 0
      FirmLib/Com.FirmLib.UI/Insuer/WinInsuerProjectInfo.xaml
  81. 154 0
      FirmLib/Com.FirmLib.UI/Insuer/WinInsuerProjectInfo.xaml.cs
  82. 170 0
      FirmLib/Com.FirmLib.UI/Insuer/WinInsurancePolicyEditor.xaml
  83. 91 0
      FirmLib/Com.FirmLib.UI/Insuer/WinInsurancePolicyEditor.xaml.cs
  84. 65 0
      FirmLib/Com.FirmLib.UI/Insuer/WinPolicyEnsure.xaml
  85. 61 0
      FirmLib/Com.FirmLib.UI/Insuer/WinPolicyEnsure.xaml.cs
  86. 92 0
      FirmLib/Com.FirmLib.UI/Insuer/WinPolicySaveEnsure.xaml
  87. 61 0
      FirmLib/Com.FirmLib.UI/Insuer/WinPolicySaveEnsure.xaml.cs
  88. 62 0
      FirmLib/Com.FirmLib.UI/Insuer/WinPolicySelector.xaml
  89. 61 0
      FirmLib/Com.FirmLib.UI/Insuer/WinPolicySelector.xaml.cs
  90. 68 0
      FirmLib/Com.FirmLib.UI/Insuer/WinSimplePolicyEditor.xaml
  91. 61 0
      FirmLib/Com.FirmLib.UI/Insuer/WinSimplePolicyEditor.xaml.cs
  92. 30 0
      FirmLib/Com.FirmLib.UI/Maintainer/Mode/EditParameter.cs
  93. 96 0
      FirmLib/Com.FirmLib.UI/Maintainer/Mode/MaintainerAssetShowItem.cs
  94. 35 0
      FirmLib/Com.FirmLib.UI/Maintainer/Mode/MaintainerDataConverter.cs
  95. 24 0
      FirmLib/Com.FirmLib.UI/Maintainer/Mode/MaintainerParameter.cs
  96. 88 0
      FirmLib/Com.FirmLib.UI/Maintainer/Mode/MaintainerShowItem.cs
  97. 94 0
      FirmLib/Com.FirmLib.UI/Maintainer/VmAddLossProductType.cs
  98. 257 0
      FirmLib/Com.FirmLib.UI/Maintainer/VmAddProductType.cs
  99. 339 0
      FirmLib/Com.FirmLib.UI/Maintainer/VmMaintainerAssetSelector.cs
  100. 0 0
      FirmLib/Com.FirmLib.UI/Maintainer/VmMaintainerBaseInfo.cs

BIN
Dlls/CEFSharpWPF.dll


BIN
Dlls/CefSharp.Core.dll


BIN
Dlls/CefSharp.dll


BIN
Dlls/DataGridExtensions.dll


BIN
Dlls/FWindSoft.Wpf.dll


BIN
Dlls/FWindSoft.dll


BIN
Dlls/INIFileParser.dll


BIN
Dlls/Newtonsoft.Json.dll


BIN
Dlls/SAGA.DotNetUtils.dll


BIN
Dlls/SAGA.RevitUtils.dll


BIN
Dlls/WPG.dll


+ 355 - 0
FirmLib/Com.FirmLib.UI/BllCommon/AssetManager.cs

@@ -0,0 +1,355 @@
+using Com.FirmLib.Bll;
+using Com.FirmLib.Entity;
+using Com.FirmLib.UI.Common.Model;
+using FWindSoft.DataFramework;
+using Newtonsoft.Json.Linq;
+using SAGA.DotNetUtils;
+using SAGA.DotNetUtils.Extend;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Com.FirmLib.UI.BllCommon
+{
+    /// <summary>
+    /// 资产管理相关
+    /// </summary>
+    public static class AssetManager
+    {
+        public static int PerPageCount { get; set; } = 100;
+        #region 提供值函数
+        public static Dictionary<string, Func< AssetShowItem, JToken>> ValuesProvider { get; private set; } = new Dictionary<string, Func<AssetShowItem, JToken>>();
+        static AssetManager()
+        {
+            InitValuesProvider();
+        }
+        private static void InitValuesProvider()
+        {
+            ValuesProvider.Add(MBIBuiltInParameter.DPInsuerID, si => si.InsuerId);
+            ValuesProvider.Add(MBIBuiltInParameter.InsuranceNum, si => si.InsurancePolicyNo);
+              ValuesProvider.Add(MBIBuiltInParameter.DPMaintainerID, si => si.MaintainerId);
+              ValuesProvider.Add(MBIBuiltInParameter.DPSellerID, si => si.SellerId);
+              ValuesProvider.Add(MBIBuiltInParameter.DPManufacturerID, si => si.ManufacturerId);
+            ValuesProvider.Add(MBIBuiltInParameter.MaintainDeadline, si => si.MaintainerEndDate);
+            ValuesProvider.Add(MBIBuiltInParameter.MaintainPeriod, si => si.MaintainPeriod);
+
+            ValuesProvider.Add(MBIBuiltInParameter.PurchasePrice, si => si.ProcurementPrice);
+            ValuesProvider.Add(MBIBuiltInParameter.Warranty, si => si.Warranty);
+       
+
+              ValuesProvider.Add(MBIBuiltInParameter.AssetID, si => si.AssetNo);
+            ValuesProvider.Add(MBIBuiltInParameter.DPSpecificationID, si => si.TypeId);
+
+            ValuesProvider.Add(MBIBuiltInParameter.EquipLocalName, si => si.LocalName);
+            ValuesProvider.Add(MBIBuiltInParameter.EquipLocalID, si => si.LocalCode);
+            ValuesProvider.Add(MBIBuiltInParameter.ProductDate, si => si.ProductionDate);
+            ValuesProvider.Add(MBIBuiltInParameter.SerialNum, si => si.ManufacturingNo);
+        
+             ValuesProvider.Add(MBIBuiltInParameter.SupplierContractID, si => si.SellerContractNo);
+        }
+        public static JToken GetValue(this AssetShowItem item, string parameterId)
+
+        {
+            if (!ValuesProvider.TryGetValue(parameterId, out Func<AssetShowItem, JToken> func))
+            {
+                return null;
+            }
+            return func(item);
+        }
+        #endregion
+        /// <summary>
+        /// 增加参数值信息
+        /// </summary>
+        /// <param name="jobject"></param>
+        /// <param name="parameter"></param>
+        /// <param name="item"></param>
+        private static void AddAssetValue(AssetShowItem item,JObject jobject, WatchParameter parameter)
+        {
+            var jtoken = item.GetValue(parameter.Id);
+            JObject value = null;
+
+            
+            if (parameter.ValidTime)
+            {
+                //增加生效时间
+                value=ParameterUtil.GetMbiInfo(jtoken, parameter.UpdateTime);
+            }
+            else
+            {
+                
+                    value=ParameterUtil.GetMbiInfo(jtoken);
+            }
+            JArray jArray = new JArray();
+            jArray.Add(value);
+            jobject[parameter.Id] = jArray;
+        }
+
+        public static JObject CalcAssetValue(AssetShowItem item)
+        {
+            JObject jobejct=new JObject();
+            var parameters = item.CacheParameters;
+            foreach (var watchParameter in parameters)
+            {
+                AddAssetValue(item,jobejct,watchParameter);
+            }
+
+            return jobejct;
+        }
+
+        public static AssetShowItem ConvertToShowItem(this TdAssetItem assetItem)
+        {
+            AssetShowItem item = new AssetShowItem();
+            item.Id = assetItem.Id;        
+            item.FamilyCode = assetItem.FamilyCode;
+            if (string.IsNullOrEmpty(item.FamilyCode))
+            {
+                 item.FamilyCode = assetItem.Category;
+            }
+
+            var jobject = assetItem.Infos;
+            item.EquipName = jobject.GetValueEx(MBIBuiltInParameter.EquipName).ToString();
+
+            item.InsuerId= jobject.GetValueEx(MBIBuiltInParameter.DPInsuerID).ToString();
+            item.MaintainerId= jobject.GetValueEx(MBIBuiltInParameter.DPMaintainerID).ToString();
+            item.SellerContractNo= jobject.GetValueEx(MBIBuiltInParameter.SupplierContractID).ToString();
+            item.TypeId= jobject.GetValueEx(MBIBuiltInParameter.DPSpecificationID).ToString();
+            item.SellerId=jobject.GetValueEx(MBIBuiltInParameter.DPSellerID).ToString();
+
+            item.AssetNo = jobject.GetValueEx(MBIBuiltInParameter.AssetID).ToString();
+            item.LocalCode = jobject.GetValueEx(MBIBuiltInParameter.EquipLocalID).ToString();
+            item.LocalName = jobject.GetValueEx(MBIBuiltInParameter.EquipLocalName).ToString();
+            item.Brand = jobject.GetValueEx(MBIBuiltInParameter.Brand).ToString();
+           // item.Product = jobject.GetValueEx(MBIBuiltInParameter.Specification).ToString();
+            item.Type = jobject.GetValueEx(MBIBuiltInParameter.Specification).ToString();
+            item.ProductionDate = jobject.GetValueEx(MBIBuiltInParameter.ProductDate).ToString();
+            item.ManufacturingNo = jobject.GetValueEx(MBIBuiltInParameter.SerialNum).ToString();
+            item.MaintainPeriod = jobject.GetValueEx(MBIBuiltInParameter.MaintainPeriod).ToString().ToDouble();
+            item.Warranty = jobject.GetValueEx(MBIBuiltInParameter.Warranty).ToDouble();
+            item.SellerName = jobject.GetValueEx(MBIBuiltInParameter.Supplier);
+            item.ProcurementPrice = jobject.GetValueEx(MBIBuiltInParameter.PurchasePrice).ToDouble();
+            return item;
+        }
+
+        public static TdAssetItem ConvertToAssetItem(this AssetShowItem showItem)
+        {
+            TdAssetItem assetItem = new TdAssetItem();
+            if (!string.IsNullOrEmpty(showItem.Id))
+            {
+                assetItem.Id = showItem.Id;
+            }
+            assetItem.FamilyCode = showItem.FamilyCode;
+            assetItem.Infos =CalcAssetValue(showItem);
+            //assetItem.Infos.Add(MBIBuiltInParameter.DPSpecificationID, showItem.TypeId);
+            //assetItem.Infos.Add(MBIBuiltInParameter.PurchasePrice, showItem.ProcurementPrice);
+            //assetItem.Infos.Add(MBIBuiltInParameter.Warranty, showItem.MaintenancePeriod);
+            //assetItem.Infos.Add(MBIBuiltInParameter.EquipLocalID, showItem.LocalCode);
+            //assetItem.Infos.Add(MBIBuiltInParameter.EquipLocalName, showItem.LocalName);
+            //assetItem.Infos.Add(MBIBuiltInParameter.AssetID, showItem.AssetNo);
+            //assetItem.Infos.Add(MBIBuiltInParameter.SerialNum, showItem.ManufacturingNo);
+            //assetItem.Infos.Add(MBIBuiltInParameter.ProductDate, showItem.ProductionDate);
+            return assetItem;
+
+        }
+        /// <summary>
+        /// 获取分页的资产数据
+        /// </summary>
+        /// <param name="projectId"></param>
+        /// <param name="localName"></param>
+        /// <param name="startIndex"></param>
+        /// <returns></returns>
+        public static SearchResultList<AssetShowItem> GetShowItems(string projectId,string localName,int startIndex)
+        {
+            SearchResultList<AssetShowItem> items = new SearchResultList<AssetShowItem>();
+            ProjectSetting ps = new ProjectSetting(projectId);
+            SearchLimit limit = new SearchLimit() { SkipCount = startIndex, GetCount = PerPageCount };
+            SearchFilter filter = new SearchFilter();
+            filter.AttachObject = new JObject();
+            if (!string.IsNullOrEmpty(localName))
+            {
+                filter.AttachObject.Add(MBIBuiltInParameter.EquipLocalName, localName);
+            }
+            SearchCriteria criteria = new SearchCriteria();
+            criteria.AttachObject = new JObject();
+            criteria.AttachObject.Add("id", projectId);
+            criteria.AttachObject.Add("family", JArray.FromObject(new List<string>()));
+            var originItems = BllFactory<PlatformBll>.Instance.GetAssetItems(ps, limit, filter,criteria);
+            items.AddRange(originItems.Select(c =>
+            {
+                var item=c.ConvertToShowItem();
+                item.ProjectId = projectId;
+                return item;
+            }));
+            items.TotalCount = originItems.TotalCount;
+            return items;
+        }
+
+
+        public static bool UpdateAssetItems(string projectId, List<AssetShowItem> items)
+        {
+            if (items == null ||! items.Any())
+            {
+                return true;
+            }
+            List<TdAssetItem> assetItems = items.Select(ConvertToAssetItem).ToList();
+            ProjectSetting ps = new ProjectSetting(projectId) ;
+           return BllFactory<PlatformBll>.Instance.UpdateAssetItems(ps, assetItems);       
+        }
+
+
+
+        #region 删除资产相关
+        public static bool  DeleteSellerAssets(string projectId, List<string> assetIds)
+        {
+            List<string> parameterIds = new List<string>();
+            parameterIds.Add(MBIBuiltInParameter.DPSellerID);
+            parameterIds.Add(MBIBuiltInParameter.SupplierContractID);
+            return DeleteAssets(projectId, assetIds, parameterIds);
+        }
+        
+        public static bool DeleteInsuerAssets(string projectId, List<string> assetIds)
+        {
+            List<string> parameterIds=new List<string>();
+            parameterIds.Add(MBIBuiltInParameter.DPInsuerID);
+            parameterIds.Add(MBIBuiltInParameter.InsuranceNum);
+            return DeleteAssets(projectId,assetIds,parameterIds);
+        }
+        public static bool DeleteAssets(string projectId, List<string> assetIds,List<string> parameterIds)
+        {
+            List<TdAssetItem> assetItems = new List<TdAssetItem>();
+            ProjectSetting ps = new ProjectSetting(projectId);
+            foreach (var assetId in assetIds)
+            {
+                TdAssetItem assetItem = new TdAssetItem();
+                assetItem.Id = assetId;
+                JObject jo = new JObject();
+                foreach (var parameterId in parameterIds)
+                {
+                    jo[parameterId] = ParameterUtil.CreateEmptyMbiInfo();
+
+                }
+                assetItem.Infos = jo;
+                assetItems.Add(assetItem);
+            }
+            return BllFactory<PlatformBll>.Instance.UpdateAssetItems(ps, assetItems);
+        }
+        #endregion
+
+        /// <summary>
+        /// 获取推荐信息
+        /// </summary>
+        /// <param name="projectId"></param>
+        /// <param name="localName"></param>
+        /// <param name="startIndex"></param>
+        /// <param name="item"></param>
+        /// <returns></returns>
+        public static SearchResultList<AssetShowItem> GetRecommendShowItems(string projectId, string localName,
+            int startIndex,VenderItem item)
+        {
+            SearchResultList<AssetShowItem> items = new SearchResultList<AssetShowItem>();
+            ProjectSetting ps = new ProjectSetting(projectId);
+            //SearchLimit limit = new SearchLimit() { SkipCount = startIndex, GetCount = PerPageCount+1 };
+            SearchLimit limit = new SearchLimit() { SkipCount = startIndex, GetCount = PerPageCount };
+            SearchFilter filter = new SearchFilter();
+            filter.AttachObject = new JObject();
+            if (!string.IsNullOrEmpty(localName))
+            {
+                filter.AttachObject.Add(MBIBuiltInParameter.EquipLocalName, localName);
+            }
+            SearchCriteria criteria = new SearchCriteria();
+            criteria.AttachObject = new JObject();
+            criteria.AttachObject.Add("venderId", item.Id);
+            criteria.AttachObject.Add("venderType", item.Type);
+            criteria.AttachObject.Add("venderName", item.Name);
+            var originItems = BllFactory<PlatformBll>.Instance.GetRecomendAssetItems(ps, limit, filter, criteria);
+            items.AddRange(originItems.Select(c =>
+            {
+                var tempItem = c.ConvertToShowItem();
+                tempItem.ProjectId = projectId;
+                return tempItem;
+            }));
+            items.TotalCount =startIndex+ items.Count;
+            if (items.Count>PerPageCount)
+            {
+                items.RemoveAt(items.Count);
+            }
+            return items;
+        }
+
+        #region 设备相关操作
+        //GetEquipmentItems
+        /// <summary>
+        /// 获取分页的设备数据数据
+        /// </summary>
+        /// <param name="projectId"></param>
+        /// <param name="localName"></param>
+        /// <param name="startIndex"></param>
+        /// <returns></returns>
+        public static SearchResultList<AssetShowItem> GetShowEqItems(string projectId, string localName, int startIndex)
+        {
+            SearchResultList<AssetShowItem> items = new SearchResultList<AssetShowItem>();
+            ProjectSetting ps = new ProjectSetting(projectId) ;
+            SearchLimit limit = new SearchLimit() { SkipCount = startIndex, GetCount = PerPageCount };
+            SearchFilter filter = new SearchFilter();
+            SearchCriteria criteria = new SearchCriteria();
+            criteria.AttachObject = new JObject();
+            //criteria.AttachObject.Add("id", projectId);
+            //criteria.AttachObject.Add("family", JArray.FromObject(new List<string>()));
+            criteria.AttachObject.Add("name", localName);
+            var originItems = BllFactory<PlatformBll>.Instance.GetEquipmentItems(ps, limit, filter, criteria);
+            items.AddRange(originItems.Select(c =>
+            {
+                var item = c.ConvertToShowItem();
+                item.ProjectId = projectId;
+                item.FamilyCode = c.Category;
+                return item;
+            }));
+            items.TotalCount = originItems.TotalCount;
+            return items;
+        }
+
+        /// <summary>
+        /// 更新设备信息
+        /// </summary>
+        /// <param name="projectId"></param>
+        /// <param name="items"></param>
+        /// <returns></returns>
+        public static bool UpdateEqItems(string projectId, List<AssetShowItem> items)
+        {
+            List<TdAssetItem> assetItems = items.Select(ConvertToAssetItem).ToList();
+            ProjectSetting ps = new ProjectSetting(projectId) ;
+            return BllFactory<PlatformBll>.Instance.UpdateEquipmentItems(ps, assetItems);
+        }
+        /// <summary>
+        /// 删除维修设备
+        /// </summary>
+        /// <param name="projectId"></param>
+        /// <param name="eqIds"></param>
+        /// <returns></returns>
+        public static bool DeleteMaintainerEquipments(string projectId, List<string> eqIds)
+        {
+            #region 参数选定
+            List<string> parameterIds = new List<string>();
+            parameterIds.Add(MBIBuiltInParameter.DPMaintainerID);
+            #endregion
+            List<TdAssetItem> assetItems = new List<TdAssetItem>();
+            ProjectSetting ps = new ProjectSetting(projectId) ;
+            foreach (var eqId in eqIds)
+            {
+                TdAssetItem assetItem = new TdAssetItem();
+                assetItem.Id = eqId;
+                JObject jo = new JObject();
+                foreach (var parameterId in parameterIds)
+                {
+                    jo[parameterId] = ParameterUtil.CreateEmptyMbiInfo();
+
+                }
+                assetItem.Infos = jo;
+                assetItems.Add(assetItem);
+            }
+            return BllFactory<PlatformBll>.Instance.UpdateEquipmentItems(ps, assetItems);
+        }
+        #endregion
+    }
+}

+ 149 - 0
FirmLib/Com.FirmLib.UI/BllCommon/AssetSelector.cs

@@ -0,0 +1,149 @@
+using FWindSoft.Handle;
+using FWindSoft.MVVM;
+using FWindSoft.Wpf;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Com.FirmLib.UI.BllCommon
+{
+    public class AssetSelector : BaseViewModel
+    {
+        public AssetSelector()
+        {
+            InitRecommendFilter();
+            CurrentPageIndex = 1;
+            PageCount = 1;
+        }
+        #region 前台交互属性
+        private string m_FilterName;
+        /// <summary>
+        /// 过滤名称
+        /// </summary>
+        public string FilterName
+        {
+            get { return this.m_FilterName; }
+            set
+            {
+                this.m_FilterName = value;
+                RaisePropertyChanged(nameof(this.FilterName));
+            }
+        }
+
+
+        private int m_CurrentPageIndex;
+        /// <summary>
+        /// 当前页面索引
+        /// </summary>
+        public int CurrentPageIndex
+        {
+            get { return this.m_CurrentPageIndex; }
+            set
+            {
+                this.m_CurrentPageIndex = value;
+                RaisePropertyChanged(nameof(this.CurrentPageIndex));
+            }
+        }
+
+
+        private int m_PageCount;
+        /// <summary>
+        /// 总页数
+        /// </summary>
+        public int PageCount
+        {
+            get { return this.m_PageCount; }
+            set
+            {
+                this.m_PageCount = value;
+                RaisePropertyChanged(nameof(this.PageCount));
+            }
+        }
+        #endregion
+        public PagerFilterControl FilterControl { get; private set; }
+        private void InitRecommendFilter()
+        {
+            FilterControl = new PagerFilterControl();
+            FilterControl.InitFilterAction = InitFilter;
+            FilterControl.InitPagerAction = InitPager;
+            FilterControl.UpdateData = UpdateData;
+            FilterControl.FilterSetting["LocalName"] = string.Empty;
+        }
+        private void InitFilter(PagerFilterControl control)
+        {
+            this.FilterName = control.FilterSetting["LocalName"].ToString();
+        }
+        private void InitPager(PagerFilterControl control)
+        {
+            try
+            {
+                BeginInEdit();
+                this.CurrentPageIndex = control.CurrentPageIndex;
+            }
+            finally
+            {
+                EndInEdit();
+            }
+        }
+        private void UpdateData(PagerFilterControl control)
+        {
+            Refresh?.Invoke(this);
+        }
+        #region 前台交互命令
+        /// <summary>
+        /// 搜索命令
+        /// </summary>
+        /// <param name="parameter"></param>
+        [Command]
+        public void SearchCommand(object parameter)
+        {
+            try
+            {
+                FilterControl.FilterSetting["LocalName"] = this.FilterName;
+                FilterControl.FilterChanged();
+            }
+            catch (Exception ex)
+            {
+
+                MessageTipEx.Show(ex);
+            }
+        }
+        public bool CanSearchCommand(object parameter)
+        {
+            return true;
+        }
+        /// <summary>
+        /// 分页切换命令
+        /// </summary>
+        /// <param name="parameter"></param>
+        [Command]
+        public void PageIndexChangedCommand(object parameter)
+        {
+            try
+            {
+                if (IsInEditing)
+                    return;
+                //设置当前的索引
+                Int32.TryParse(parameter?.ToString()??string.Empty, out int index);
+                FilterControl.CurrentPageIndex =Math.Max(index, 1);
+                FilterControl.PageInfoChanged();
+            }
+            catch (Exception ex)
+            {
+              MessageTipEx.Show(ex);
+            }
+        }
+        public bool CanPageIndexChangedCommand(object parameter)
+        {
+            return true;
+        }
+        #endregion
+
+        /// <summary>
+        /// 刷新数据委托
+        /// </summary>
+        public Action<AssetSelector> Refresh;
+    }
+}

+ 64 - 0
FirmLib/Com.FirmLib.UI/BllCommon/AssetShowItemUtils.cs

@@ -0,0 +1,64 @@
+
+using System;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using CEFSharpWpf;
+using Com.FirmLib.Bll;
+using Com.FirmLib.Entity;
+using Com.FirmLib.UI.Common;
+using Com.FirmLib.UI.Common.Model;
+using FWindSoft.DataFramework;
+
+namespace Com.FirmLib.UI.BllCommon
+{
+    public static class AssetShowItemUtils
+    {
+        /// <summary>
+        /// 获取漏掉的类型信息
+        /// </summary>
+        /// <param name="assetItems"></param>
+        /// <param name="containsTypeIds"></param>
+        /// <returns></returns>
+        public static List<ProductTypeShowItem> GetLossTypes(List<AssetShowItem> assetItems,List<string> containsTypeIds)
+        {
+            List<ProductTypeShowItem> items = new List<ProductTypeShowItem>();
+            var containItems = containsTypeIds;
+            var assets =assetItems ?? new List<AssetShowItem>();
+            foreach (var asset in assets)
+            {
+                if (string.IsNullOrEmpty(asset.TypeId))
+                {
+                    continue;
+                }
+
+                if (containItems.Any(c => c == asset.TypeId))
+                {
+                    continue;
+                }
+                if (items.Any(c => c.ProductTypeId == asset.TypeId))
+                {
+                    continue;
+                }
+                items.Add(asset.ConverterTypeShowItemByAsset());
+            }
+            return items;
+        }
+
+        /// <summary>
+        /// 显示资产详情
+        /// </summary>
+        /// <param name="item"></param>
+        public static void ShowAssetDetail(AssetShowItem item)
+        {
+            AssetItem parItem = new AssetItem();
+            parItem.Id = item.Id;
+            parItem.ProjectId = item.ProjectId;
+            parItem.FamilyCode = item.FamilyCode;
+            string url = BllFactory<AssetBll>.Instance.GetAssetUrl(parItem);
+            WinBrowser.Instance.Show(url, "资产信息");
+        }
+    }
+}

+ 151 - 0
FirmLib/Com.FirmLib.UI/BllCommon/BaseAssetItem.cs

@@ -0,0 +1,151 @@
+///////////////////////////////////////////////////////////////////////////////
+//Copyright (c) 2016, 北京探索者软件公司
+//All rights reserved.       
+//文件名称: BaseAssetItem.cs
+//文件描述: BaseAssetItem.cs
+//创 建 者: xls
+//创建日期: 2018/5/30 9:11:57
+//版 本 号:1.0.0.0
+////////////////////////////////////////////////////////////////////////////////
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Com.FirmLib.UI.Common;
+using FWindSoft.Data;
+
+namespace Com.FirmLib.UI
+{
+    /// <summary>
+    /// 资产相关信息
+    /// </summary>
+    public class BaseAssetItem:BasePropertyChanged
+    {
+        public BaseAssetItem()
+        {
+            CacheParameters = new WatchParameters();
+        }
+        /// <summary>
+        /// id值
+        /// </summary>
+        public string Id { get; set; }
+        /// <summary>
+        /// 本地名称
+        /// </summary>
+        public string EquipName { get; set; }
+
+        private string m_LocalName;
+        /// <summary>
+        ///  本地名称
+        /// </summary>
+        public string LocalName
+        {
+            //本地名称为null,则返回设备值
+            get { return string.IsNullOrEmpty(this.m_LocalName)?EquipName:this.m_LocalName; }
+            set
+            {
+                this.m_LocalName = value;
+                RaisePropertyChanged(() => this.LocalName);
+            }
+        }
+
+
+        private string m_LocalCode;
+        /// <summary>
+        /// 本地编码
+        /// </summary>
+        public string LocalCode
+        {
+            get { return this.m_LocalCode; }
+            set
+            {
+                this.m_LocalCode = value;
+                RaisePropertyChanged(() => this.LocalCode);
+            }
+        }
+
+
+        private string m_Brand;
+        /// <summary>
+        /// 品牌
+        /// </summary>
+        public string Brand
+        {
+            get { return this.m_Brand; }
+            set
+            {
+                this.m_Brand = value;
+                RaisePropertyChanged(() => this.Brand);
+            }
+        }
+
+
+        private string m_Product;
+        /// <summary>
+        /// 产品
+        /// </summary>
+        public string Product
+        {
+            get
+            {
+                if (!string.IsNullOrWhiteSpace(TypeId) && string.IsNullOrWhiteSpace(this.m_Product))
+                {
+                    m_Product = ProductTypeManager.GetProductName(TypeId);
+                }
+
+                return this.m_Product;
+            }
+            set
+            {
+                this.m_Product = value;
+                RaisePropertyChanged(() => this.Product);
+            }
+        }
+
+
+        private string m_Type;
+        /// <summary>
+        /// 型号
+        /// </summary>
+        public string Type
+        {
+            get
+            {              
+                return this.m_Type;
+            }
+            set
+            {
+                this.m_Type = value;
+                RaisePropertyChanged(() => this.Type);
+            }
+        }
+
+        /// <summary>
+        /// 关联的类型Id
+        /// </summary>
+        public string TypeId { get; set; }
+        #region 厂商id
+        /// <summary>
+        /// 生产商Id
+        /// </summary>
+        public string ManufacturerId { get; set; }
+        /// <summary>
+        /// 保险商id
+        /// </summary>
+        public string InsuerId { get; set; }
+        /// <summary>
+        /// 供应商id
+        /// </summary>
+        public string SellerId { get; set; }
+        /// <summary>
+        /// 维修商Id
+        /// </summary>
+        public string MaintainerId { get; set; }
+        #endregion
+
+        #region 缓存信息
+        public WatchParameters CacheParameters { get; private set; }
+        #endregion
+    }
+}

+ 22 - 0
FirmLib/Com.FirmLib.UI/BllCommon/Commands.cs

@@ -0,0 +1,22 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Input;
+
+namespace Com.FirmLib.UI.BllCommon
+{
+    public class  EditCommands
+    {
+        static EditCommands()
+        {
+            SingleUpdate=new RoutedCommand("单条修改", typeof(EditCommands));
+        }
+
+        /// <summary>
+        /// 单挑修改
+        /// </summary>
+        public static RoutedCommand SingleUpdate { get; private set; }
+    }
+}

+ 18 - 0
FirmLib/Com.FirmLib.UI/BllCommon/CommomUtils.cs

@@ -0,0 +1,18 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using SAGA.DotNetUtils.Extend;
+
+namespace Com.FirmLib.UI
+{
+    public static class CommomUtils
+    {
+        public static int CalcPageCount(int allCount, int perCount)
+        {
+            var pageCount =allCount / ((double)perCount);
+            return (int)Math.Ceiling(pageCount);
+        }
+    }
+}

+ 57 - 0
FirmLib/Com.FirmLib.UI/BllCommon/ContactInformationEditor.xaml

@@ -0,0 +1,57 @@
+<UserControl x:Class="Com.FirmLib.UI.ContactInformationEditor"
+             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
+             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
+             xmlns:uc="clr-namespace:Com.FirmLib.UI.Common"
+             xmlns:controls="http://schemas.FWind/xaml"
+             xmlns:bllCommon="clr-namespace:Com.FirmLib.UI.BllCommon"
+             mc:Ignorable="d" 
+             d:DesignHeight="300" d:DesignWidth="300" Name="this" Height="{Binding Height,RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=UIElement}}"
+             Width="{Binding Width,RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=UIElement}}" >
+    <Grid>
+        <StackPanel Orientation="Vertical" HorizontalAlignment="Stretch">
+            <Label  Style="{StaticResource ResourceKey={x:Static uc:CommonStyles.StarLableKey}}" Content="联系人:"></Label>
+
+            <controls:TextBoxEditor  Style="{StaticResource ResourceKey={x:Static controls:ResourceKeys.ErrorTemplateKey2}}" Command="{x:Static bllCommon:EditCommands.SingleUpdate}" 
+                                    CommandParameter="{Binding RelativeSource={RelativeSource Self}}" Tag="People" Margin="3" >
+                <controls:TextBoxEditor.Text>
+                    <Binding Path="People" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged" >
+                        <Binding.ValidationRules>
+                            <controls:RequireValidationRule ></controls:RequireValidationRule>
+
+                        </Binding.ValidationRules>
+                    </Binding>
+                </controls:TextBoxEditor.Text>
+            </controls:TextBoxEditor>
+            
+            <Label  Style="{StaticResource ResourceKey={x:Static uc:CommonStyles.StarLableKey}}" Content="联系电话:"></Label>
+            <!--Text="{Binding Telephone,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"-->
+            <controls:TextBoxEditor Style="{StaticResource ResourceKey={x:Static controls:ResourceKeys.ErrorTemplateKey2}}"
+                                    Command="{x:Static bllCommon:EditCommands.SingleUpdate}" CommandParameter="{Binding RelativeSource={RelativeSource Self}}" Tag="Telephone"  Margin="3">
+                <controls:TextBoxEditor.Text>
+                    <Binding Path="Telephone" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged" >
+                        <Binding.ValidationRules>
+                            <controls:RequireValidationRule ></controls:RequireValidationRule>
+                            <controls:PhoneValidationRule ErrorMessage="电话手机号码不正确"></controls:PhoneValidationRule>
+                        </Binding.ValidationRules>
+                    </Binding>
+                </controls:TextBoxEditor.Text>
+               
+            </controls:TextBoxEditor>
+           
+            <Label  Content="传真:"></Label>
+
+            <controls:TextBoxEditor Text="{Binding Fax,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" Margin="3" 
+                                    Command="{x:Static bllCommon:EditCommands.SingleUpdate}" 
+                                    CommandParameter="{Binding RelativeSource={RelativeSource Self}}" Tag="Fax">
+            </controls:TextBoxEditor>
+            <Label   Content="电子邮件:"></Label>
+
+            <controls:TextBoxEditor Text="{Binding Email,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"  Margin="3" 
+                                    Command="{x:Static bllCommon:EditCommands.SingleUpdate}" 
+                                    CommandParameter="{Binding RelativeSource={RelativeSource Self}}" Tag="Email">
+            </controls:TextBoxEditor>
+        </StackPanel>
+    </Grid>
+</UserControl>

+ 28 - 0
FirmLib/Com.FirmLib.UI/BllCommon/ContactInformationEditor.xaml.cs

@@ -0,0 +1,28 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Navigation;
+using System.Windows.Shapes;
+
+namespace Com.FirmLib.UI
+{
+    /// <summary>
+    /// ContacInformationInput.xaml 的交互逻辑
+    /// </summary>
+    public partial class ContactInformationEditor : UserControl
+    {
+        public ContactInformationEditor()
+        {
+            InitializeComponent();
+        }
+    }
+}

+ 43 - 0
FirmLib/Com.FirmLib.UI/BllCommon/ContactInformationInput.xaml

@@ -0,0 +1,43 @@
+<UserControl x:Class="Com.FirmLib.UI.ContactInformationInput"
+             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
+             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
+             xmlns:uc="clr-namespace:Com.FirmLib.UI.Common"
+             xmlns:fw="http://schemas.FWind/xaml"
+             mc:Ignorable="d" 
+             d:DesignHeight="300" d:DesignWidth="300" Name="this" Height="{Binding Height,RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=UIElement}}"
+             Width="{Binding Width,RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=UIElement}}" >
+    <Grid>
+        <StackPanel Orientation="Vertical" HorizontalAlignment="Stretch">
+            <Label  Style="{StaticResource ResourceKey={x:Static uc:CommonStyles.StarLableKey}}" Content="联系人:"></Label>
+            <!--Text="{Binding People,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"-->
+            <TextBox  Style="{StaticResource ResourceKey={x:Static uc:CommonStyles.TextBoxKey}}" Margin="5">
+                <Binding Path="People" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged" >
+                    <Binding.ValidationRules>
+                        <fw:RequireValidationRule ></fw:RequireValidationRule>
+                    </Binding.ValidationRules>
+                </Binding>
+            </TextBox>
+            <Label  Style="{StaticResource ResourceKey={x:Static uc:CommonStyles.StarLableKey}}" Content="联系电话:"></Label>
+            <!--Text="{Binding Telephone,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"-->
+            <TextBox Style="{StaticResource ResourceKey={x:Static uc:CommonStyles.TextBoxKey}}" Margin="5">
+                <Binding Path="Telephone" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged" >
+                    <Binding.ValidationRules>
+                        <fw:RequireValidationRule ></fw:RequireValidationRule>
+                        <fw:PhoneValidationRule ErrorMessage="电话手机号码不正确"></fw:PhoneValidationRule>
+                    </Binding.ValidationRules>
+                </Binding>
+            </TextBox>
+           
+            <Label  Content="传真:"></Label>
+
+            <TextBox Text="{Binding Fax,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"  Style="{StaticResource ResourceKey={x:Static uc:CommonStyles.TextBoxKey}}" Margin="5">
+            </TextBox>
+            <Label   Content="电子邮件:"></Label>
+
+            <TextBox Text="{Binding Email,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"  Style="{StaticResource ResourceKey={x:Static uc:CommonStyles.TextBoxKey}}" Margin="5">
+            </TextBox>
+        </StackPanel>
+    </Grid>
+</UserControl>

+ 33 - 0
FirmLib/Com.FirmLib.UI/BllCommon/ContactInformationInput.xaml.cs

@@ -0,0 +1,33 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Navigation;
+using System.Windows.Shapes;
+using FWindSoft.Data;
+
+namespace Com.FirmLib.UI
+{
+    /// <summary>
+    /// ContactInformationEditor.xaml 的交互逻辑
+    /// </summary>
+    public partial class ContactInformationInput : UserControl
+    {
+        public ContactInformationInput()
+        {
+            InitializeComponent();
+        }
+    }
+
+
+  
+
+}

+ 73 - 0
FirmLib/Com.FirmLib.UI/BllCommon/ContactInformationItem.cs

@@ -0,0 +1,73 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using FWindSoft.Data;
+
+namespace Com.FirmLib.UI.BllCommon
+{
+    /// <summary>
+    /// 联系人信息
+    /// </summary>
+    public class ContactInformationItem : BasePropertyChanged
+    {
+
+        private string m_Telephone;
+        /// <summary>
+        /// 电话
+        /// </summary>
+        public string Telephone
+        {
+            get { return this.m_Telephone; }
+            set
+            {
+                this.m_Telephone = value;
+                RaisePropertyChanged(() => this.Telephone);
+            }
+        }
+
+        private string m_People;
+        /// <summary>
+        /// 联系人
+        /// </summary>
+        public string People
+        {
+            get { return this.m_People; }
+            set
+            {
+                this.m_People = value;
+                RaisePropertyChanged(() => this.People);
+            }
+        }
+
+        private string m_Fax;
+        /// <summary>
+        /// 传真
+        /// </summary>
+        public string Fax
+        {
+            get { return this.m_Fax; }
+            set
+            {
+                this.m_Fax = value;
+                RaisePropertyChanged(() => this.Fax);
+            }
+        }
+
+
+        private string m_Email;
+        /// <summary>
+        /// 电子邮件
+        /// </summary>
+        public string Email
+        {
+            get { return this.m_Email; }
+            set
+            {
+                this.m_Email = value;
+                RaisePropertyChanged(() => this.Email);
+            }
+        }
+    }
+}

+ 47 - 0
FirmLib/Com.FirmLib.UI/BllCommon/DateTimeManager.cs

@@ -0,0 +1,47 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Com.FirmLib.UI.BllCommon
+{
+    /// <summary>
+    /// 系统使用固定的方式去转换时间S
+    /// </summary>
+   public  class DateTimeManager
+    {
+        public static DateTime ConvertDateTime(string timeStr)
+        {
+            string format = "yyyyMMdd";
+            if (timeStr.Length > 8)
+            {
+                format = "yyyyMMddHHmmss";
+            }
+            DateTime dateTime = DateTime.ParseExact(timeStr, format, System.Globalization.CultureInfo.InvariantCulture);
+            return dateTime;
+        }
+        public static DateTime ConvertDateTimeH(string timeStr)
+        {
+            string format = "yyyy-MM-dd";
+            DateTime dateTime = DateTime.Now;
+            if (string.IsNullOrEmpty(timeStr))
+            {
+                return dateTime;
+            }
+
+            try
+            {
+                 dateTime = DateTime.ParseExact(timeStr, format, System.Globalization.CultureInfo.InvariantCulture);
+            }
+            catch (Exception ex)
+            {
+            }
+            return dateTime;
+        }
+        public static string ConvertDateTime(DateTime dateTime)
+        {         
+            return dateTime.ToString("yyyyMMddHHmmss");
+        }
+    }
+}

+ 113 - 0
FirmLib/Com.FirmLib.UI/BllCommon/EquipmentFamilyManager.cs

@@ -0,0 +1,113 @@
+using Com.FirmLib.Bll;
+using Com.FirmLib.Entity;
+using Com.FirmLib.UI.Common;
+using FWindSoft.Data;
+using FWindSoft.DataFramework;
+using FWindSoft.Tools;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Com.FirmLib.UI.BllCommon
+{
+    public class EquipmentFamilyManager
+    {
+        //public static readonly EquipmentFamilyManager Instance = new EquipmentFamilyManager();
+        private EquipmentFamilyManager()
+        { }
+
+        /// <summary>
+        /// 获取当前设备信息
+        /// </summary>
+        /// <returns></returns>
+        public static List<EquipmentFamilyItem> GetFamilys()
+        {
+           return  MemoryCacheUtil.GetCacheItem<List<EquipmentFamilyItem>>("EquipmentFamily", () => BllFactory<EquipmentFamilyBll>.Instance.GetAllItems(), new TimeSpan(0,0,1800))??new List<EquipmentFamilyItem>();
+        }
+        /// <summary>
+        /// 获取设备族中叶子级节点
+        /// </summary>
+        /// <returns></returns>
+        public static List<EquipmentFamilyItem> GetFamilyLeaves()
+        {
+            var originItems = GetFamilys();
+            List<EquipmentFamilyItem> items = new List<EquipmentFamilyItem>();
+            Queue<EquipmentFamilyItem> searchItems = new Queue<EquipmentFamilyItem>(originItems);
+            while (searchItems.Any())
+            {
+                var currentItem = searchItems.Dequeue();
+                if (currentItem.ChildItems.Any())
+                {
+                    currentItem.ChildItems.ForEach(c => searchItems.Enqueue(c));
+                }
+                else
+                {
+                    items.Add(currentItem);
+                }
+                    
+            }
+            return items;
+        }
+        /// <summary>
+        /// 通过code取到名设备族名称
+        /// </summary>
+        /// <param name="code"></param>
+        /// <returns></returns>
+        public static string GetFamilyName(string code)
+        {
+            var listFamilys = GetFamilys();
+            var family = listFamilys.FirstOrDefault(f=>f.Code==code);
+            if (family != null)
+                return family.Name;
+            return string.Empty;
+
+        }
+
+        #region 相关信息点信息定义
+        private readonly static Dictionary<string, List<EquipmentInfoPointItem>> m_InfoPointsCache = new Dictionary<string, List<EquipmentInfoPointItem>>();
+        public static List<EquipmentInfoPointItem> GetInfoPointDefinitions(string code)
+        {
+            //避免破坏原始的的信息点定义集合
+            List<EquipmentInfoPointItem> items = null;
+            if (m_InfoPointsCache.TryGetValue(code, out items))
+            {
+                return new List<EquipmentInfoPointItem>(items); 
+            }
+            items = BllFactory<EquipmentInfoPointBll>.Instance.GetPointInfoDefinitions(code)??new List<EquipmentInfoPointItem>();
+            m_InfoPointsCache.Add(code, items);
+            return new List<EquipmentInfoPointItem>(items);
+        }
+        #endregion
+
+        public static EquipmentFamilyItem GetTopFamily(string code)
+        {
+            var familys = GetFamilys();
+            return GetTopFamily(familys, code);
+        }
+        public static string GetaTopCode(string code)
+        {
+            var familys = GetFamilys();
+            return GetTopFamily(familys, code)?.Code??string.Empty;
+        }
+        private static EquipmentFamilyItem GetTopFamily(List<EquipmentFamilyItem> items, string code)
+        {
+            var familys = items;          
+            foreach (var item in familys)
+            {
+                if (item.Code == code)
+                {
+                    return item;
+                }                
+                else
+                {
+                    var result = GetTopFamily(item.ChildItems ?? new List<EquipmentFamilyItem>(), code);
+                    if (result != null)
+                        return item;
+                }
+            }
+            return null;
+        }
+    }
+}

+ 62 - 0
FirmLib/Com.FirmLib.UI/BllCommon/FileItem.cs

@@ -0,0 +1,62 @@
+using FWindSoft.Data;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Com.FirmLib.UI.BllCommon
+{
+    /// <summary>
+    /// 上传交互类修改
+    /// </summary>
+    public class FileItem: BasePropertyChanged
+    {
+        public FileItem()
+        {
+            this.Name = string.Empty;
+            this.Path = string.Empty;
+            this.FileKey = string.Empty;
+        }
+        #region 属性
+        private string m_Name;
+        /// <summary>
+        /// 文件名称
+        /// </summary>
+        public string Name
+        {
+            get { return this.m_Name; }
+            set
+            {
+                this.m_Name = value;
+                RaisePropertyChanged(nameof(this.Name));
+            }
+        }
+
+        /// <summary>
+        /// 文件key值
+        /// </summary>
+        public string FileKey { get; set; }
+
+        /// <summary>
+        /// 本地文件路径
+        /// </summary>
+        public string Path { get; set; } 
+        #endregion
+
+
+        /// <summary>
+        /// 标识是否是可用的path
+        /// </summary>
+        public bool ValidatePath {
+            get { return !string.IsNullOrEmpty(Path); }
+        }
+        /// <summary>
+        /// 标识是否是有效的key值
+        /// </summary>
+        public bool ValidateKey
+        {
+            get { return !string.IsNullOrEmpty(FileKey); }
+        }
+    }
+}

+ 53 - 0
FirmLib/Com.FirmLib.UI/BllCommon/FileUtils.cs

@@ -0,0 +1,53 @@
+using Com.FirmLib.Bll;
+using FWindSoft.DataFramework;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Com.FirmLib.UI.BllCommon
+{
+    public static class FileUtils
+    {
+        /// <summary>
+        /// 解析文件系统key值
+        /// </summary>
+        /// <param name="fileKey"></param>
+        /// <returns></returns>
+        public static FileItem ParseFileKey(string fileKey)
+        {
+            FileItem item = new FileItem();
+            item.FileKey = fileKey ?? string.Empty;
+            item.Name = BllFactory<FileBll>.Instance.GetSuffix(item.FileKey.ToString());
+            return item;
+        }
+        /// <summary>
+        /// 获取可用键值信息
+        /// </summary>
+        /// <param name="fileItem"></param>
+        /// <param name="suffix"></param>
+        /// <returns></returns>
+        public static string GetUseKey(FileItem fileItem,string suffix)
+        {
+            if (fileItem == null)
+            {
+                return string.Empty;
+            }
+            if (!fileItem.ValidatePath)
+            {
+                return fileItem.FileKey;
+            }
+            string fileKey = string.Empty;
+            if (fileItem.ValidateKey)
+            {
+                fileKey = fileItem.FileKey;
+            }
+            else
+            {
+                fileKey = BllFactory<FileBll>.Instance.CreateKey(fileItem.Name, suffix);
+            }
+            return fileKey;
+        }
+    }
+}

+ 246 - 0
FirmLib/Com.FirmLib.UI/BllCommon/ProductTypeManager.cs

@@ -0,0 +1,246 @@
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using Com.FirmLib.Bll;
+using Com.FirmLib.Entity;
+using Com.FirmLib.UI.BllCommon;
+using Com.FirmLib.UI.Common;
+using Com.FirmLib.UI.Manufacturer.Model;
+using FWindSoft.DataFramework;
+using FWindSoft.Tools;
+using FWindSoft.Wpf;
+
+
+namespace Com.FirmLib.UI
+{
+    /// <summary>
+    /// 型号相关查询
+    /// </summary>
+    public class ProductTypeManager
+    {
+        #region 接口数据转换
+        public static List<ProductTypeDetailItem> ConverToList(List<BrandTreeItem> brandTreeItems)
+        {
+            List<ProductTypeDetailItem> result = new List<ProductTypeDetailItem>();
+            foreach (var brand in brandTreeItems)
+            {
+                foreach (var product in brand.Products)
+                {
+                    foreach (var productType in product.ProductTypes)
+                    {
+                        #region 数据转换
+                        ProductTypeDetailItem item = new ProductTypeDetailItem();
+                        item.BrandId = brand.Id;
+                        item.BrandName = brand.Name;
+                        item.ProductId = product.Id;
+                        item.ProductName = product.Name;
+                        item.FamilyCode = product.FamilyCode;
+                        item.ProductTypeId = productType.Id;
+                        item.ProductTypeName = productType.Name;
+                        result.Add(item); 
+                        #endregion
+                    }
+                }
+            }
+
+            return result;
+        }
+
+        #endregion
+
+        #region 查询接口
+        /// <summary>
+        /// 查询设备族信息
+        /// </summary>
+        /// <param name="condition"></param>
+        /// <returns></returns>
+        public static List<ShowDataItem> GetFamilys(ProdcutTypeCondition condition)
+        {
+            List<ShowDataItem> result = new List<ShowDataItem>();
+            var products = condition.ToList();
+            var comparer = new TComparer<ShowDataItem>((s1, s2) => s1.Id == s2.Id);
+
+            var groups = products.GroupBy(c => new ShowDataItem() { Name = EquipmentFamilyManager.GetFamilyName(c.FamilyCode), Id = c.FamilyCode, FamilyCode = c.FamilyCode }, comparer);
+            foreach (var group1 in groups)
+            {
+                result.Add(group1.Key);
+            }
+            //设备族 展现名字;
+            return result;
+        }
+        /// <summary>
+        /// 查询品牌信息
+        /// </summary>
+        /// <param name="condition"></param>
+        /// <returns></returns>
+        public static List<ShowDataItem> GetBrands(ProdcutTypeCondition condition)
+        {
+            List<ShowDataItem> result = new List<ShowDataItem>();
+            var dataSource = condition.ToList();
+            var comparer = new TComparer<ShowDataItem>((s1, s2) => s1.Id == s2.Id);
+            var groups = dataSource.GroupBy(c => new ShowDataItem() { Name = c.BrandName, Id = c.BrandId }, comparer);
+            foreach (var group1 in groups)
+            {
+                result.Add(group1.Key);
+            }
+            return result;
+        }
+        /// <summary>
+        /// 查询产品信息
+        /// </summary>
+        /// <param name="condition"></param>
+        /// <returns></returns>
+        public static List<ShowDataItem> GetProducts(ProdcutTypeCondition condition)
+        {
+            List<ShowDataItem> result = new List<ShowDataItem>();
+            var products = condition.ToList();
+            var comparer = new TComparer<ShowDataItem>((s1, s2) => s1.Id == s2.Id);
+            var groups = products.GroupBy(c => new ShowDataItem() { Name = c.ProductName, Id = c.ProductId, FamilyCode = c.FamilyCode }, comparer);
+            foreach (var group1 in groups)
+            {
+                result.Add(group1.Key);
+            }
+            return result;
+        }
+        /// <summary>
+        /// 查询类型信息
+        /// </summary>
+        /// <param name="condition"></param>
+        /// <returns></returns>
+        public static List<ShowDataItem> GetProductTypes(ProdcutTypeCondition condition)
+        {
+            List<ShowDataItem> result = new List<ShowDataItem>();
+            var products = condition.ToList();
+            var comparer = new TComparer<ShowDataItem>((s1, s2) => s1.Id == s2.Id);
+            var groups = products.GroupBy(c => new ShowDataItem() { Name = c.ProductTypeName, Id = c.ProductTypeId, FamilyCode = c.FamilyCode }, comparer);
+            foreach (var group1 in groups)
+            {
+                result.Add(group1.Key);
+            }
+            return result;
+        }
+        #endregion
+
+        #region 产品类型信息点呈现相关
+        /// <summary>
+        /// 获取指定设备族相关信息
+        /// </summary>
+        /// <param name="code"></param>
+        /// <returns></returns>
+        public static List<PropertyDefinition> GetInfoPointDefinitions(string code)
+        {
+            
+            List<PropertyDefinition> result = new List<PropertyDefinition>();
+            if (string.IsNullOrEmpty(code))
+            {
+                return result;
+            }
+            var definitions = EquipmentFamilyManager.GetInfoPointDefinitions(code);
+            List<string> sort = new List<string>() { "MaintainPeriod", "ServiceLife" };
+            foreach (EquipmentInfoPointItem definition in definitions)
+            {
+                if (definition.Category != "技术参数" && !sort.Contains(definition.CodeName))
+                    continue;
+                PropertyDefinition item = new PropertyDefinition() { IsVisible = true };
+                item.Id = definition.CodeName;
+                item.Name = definition.Name;
+                item.IsVisible = definition.IsShow;
+                item.ExtendObject = definition.Clone();
+                result.Add(item);
+            }
+
+            for (int i = 0; i < sort.Count; i++)
+            {
+                string flag = sort[i];
+                var currentItem = result.FirstOrDefault(c => c.Id == flag);
+                if (currentItem != null)
+                {
+                    result.Remove(currentItem);
+                    result.Insert(i, currentItem);
+                }
+            }
+            return result;
+        }
+        /// <summary>
+        /// 获取型号详细信息
+        /// </summary>
+        /// <param name="condition"></param>
+        /// <returns></returns>
+        public static List<TypeShowItem> GetProdcutTypeInfoItems(ProdcutTypeCondition condition)
+        {
+            string productId = condition.ProductId;
+            var familyCode = condition.FamilyCode;
+            var definitions = GetInfoPointDefinitions(familyCode);
+            return GetProdcutTypeInfoItems(productId, definitions);
+        }
+        /// <summary>
+        /// 获取型号详细信息
+        /// </summary>
+        /// <param name="productid"></param>
+        /// <param name="definitions"></param>
+        /// <returns></returns>
+        public static List<TypeShowItem> GetProdcutTypeInfoItems(string productid,List<PropertyDefinition> definitions)
+        {
+            string productId = productid;
+            var typeItems = new List<TypeShowItem>();
+            var dataItems = BllFactory<ProductTypeBll>.Instance.GetAllItems(productId);
+            var inDefinitions = definitions??new List<PropertyDefinition>();
+            foreach (var dataItem in dataItems)
+            {
+                #region 类型转换
+                var tempItem = new TypeShowItem();
+                tempItem.ProductTypeId = dataItem.Id;
+                tempItem.TypeName = dataItem.Name;
+                tempItem.Parameters = PropertyCollection.CreateCollection(inDefinitions);
+                foreach (var item in dataItem.Parameters)
+                {
+                    var definitonPara = tempItem.Parameters[item.Code];
+                    if (definitonPara != null)
+                    {
+                        definitonPara.Value = item.Value;
+                    }
+                }
+                typeItems.Add(tempItem);
+                #endregion
+            }
+            return typeItems;
+        }
+        #endregion
+
+
+        #region 缓存产品信息相关
+        /// <summary>
+        /// 获取产品信息
+        /// </summary>
+        /// <returns></returns>
+        public static  Dictionary<string, ProductTypeDetailItem> GetProductTypes()
+        {
+            return MemoryCacheUtil.GetCacheItem<Dictionary<string,ProductTypeDetailItem>>("ProdcutTypes",()=>
+            {
+                Dictionary<string, ProductTypeDetailItem> dic = new Dictionary<string, ProductTypeDetailItem>();
+                var items = ProductTypeManager.ConverToList(BllFactory<GeneralBll>.Instance
+                               .GetProductTypeItems());
+                foreach (var productTypeDetailItem in items)
+                {
+                    dic[productTypeDetailItem.ProductTypeId] = productTypeDetailItem;
+                }
+                return dic;
+            }, new TimeSpan(0,0,300)) ?? new Dictionary<string, ProductTypeDetailItem>();
+        }
+        /// <summary>
+        /// 获取类型的产品名[暂时不用字典存储]
+        /// </summary>
+        /// <param name="productTypeId"></param>
+        /// <returns></returns>
+        public static string GetProductName(string productTypeId)
+        {
+            var items = GetProductTypes();
+            items.TryGetValue(productTypeId, out ProductTypeDetailItem item);
+            if (item != null)
+                return item.ProductName;
+            return string.Empty;
+        }
+        #endregion
+    }
+}

+ 54 - 0
FirmLib/Com.FirmLib.UI/BllCommon/ProjectIdManager.cs

@@ -0,0 +1,54 @@
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Com.FirmLib.UI
+{
+    public static class ProjectIdManager
+    {
+        public static string Prefix = "Pj";
+        /// <summary>
+        /// 获取系统使用id
+        /// </summary>
+        /// <param name="projectId"></param>
+        /// <returns></returns>
+        public static string GetSystemProjectId(string projectId)
+        {
+            if (string.IsNullOrEmpty(projectId))
+                return projectId;
+            if (!HasPrefix(projectId))
+            {
+                projectId = Prefix + projectId;
+            }
+
+            return projectId;
+        }
+        /// <summary>
+        /// 获取前台展示id
+        /// </summary>
+        /// <param name="projectId"></param>
+        /// <returns></returns>
+        public static string GetForeSystemProjectId(string projectId)
+        {
+            if (string.IsNullOrEmpty(projectId))
+                return projectId;
+            if (HasPrefix(projectId))
+            {
+                projectId = projectId.Substring(2);
+            }
+            return projectId;
+        }
+        /// <summary>
+        /// 存在前缀
+        /// </summary>
+        private static bool  HasPrefix(string projectId)
+        {
+            if (string.IsNullOrEmpty(projectId))
+                return false;
+            return projectId.StartsWith(Prefix);
+        }
+    }
+}

+ 60 - 0
FirmLib/Com.FirmLib.UI/BllCommon/ProjectManager.cs

@@ -0,0 +1,60 @@
+using Com.FirmLib.Bll;
+using FWindSoft.DataFramework;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Com.FirmLib.UI.BllCommon
+{
+    /// <summary>
+    /// 项目管理
+    /// </summary>
+    public static class ProjectManager
+    {
+        /// <summary>
+        /// 同步供应商项目[自动检测是否首次]
+        /// </summary>
+        /// <param name="projectId"></param>
+        /// <param name="venderId"></param>
+        public static void SyncSellerProject(string projectId, string venderId)
+        {
+            var projects = BllFactory<SellerBll>.Instance.GetProjectItems(venderId);
+            if (projects.Any(p => p.Id == projectId))
+            {
+                return;
+            }
+            BllFactory<ProjectBll>.Instance.ProjectSync(projectId);
+        }
+        /// <summary>
+        /// 同步维修商项目
+        /// </summary>
+        /// <param name="projectId"></param>
+        /// <param name="venderId"></param>
+        public static void SyncMaintainerProject(string projectId, string venderId)
+        {
+            var projects = BllFactory<MaintainerBll>.Instance.GetProjectItems(venderId);
+            if (projects.Any(p => p.Id == projectId))
+            {
+                return;
+            }
+            BllFactory<ProjectBll>.Instance.ProjectSync(projectId);
+        }
+        /// <summary>
+        /// 同步保险商项目
+        /// </summary>
+        /// <param name="projectId"></param>
+        /// <param name="venderId"></param>
+        public static void SyncInsuerProject(string projectId, string venderId)
+        {
+            var projects = BllFactory<InsuerBll>.Instance.GetProjectItems(venderId);
+            if (projects.Any(p => p.Id == projectId))
+            {
+                return;
+            }
+            BllFactory<ProjectBll>.Instance.ProjectSync(projectId);
+
+        }
+    }
+}

+ 544 - 0
FirmLib/Com.FirmLib.UI/Com.FirmLib.UI.csproj

@@ -0,0 +1,544 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProjectGuid>{1A6202BA-6646-48D1-8F93-F55ED4CFF075}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>Com.FirmLib.UI</RootNamespace>
+    <AssemblyName>Com.FirmLib.UI</AssemblyName>
+    <TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+    <TargetFrameworkProfile />
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>..\..\OutputDll\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <PlatformTarget>x64</PlatformTarget>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>..\..\OutputDll\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>..\..\OutputDll\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
+    <OutputPath>..\..\OutputDll\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'RR17|AnyCPU'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>bin\RR17\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'RR17|x64'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>..\..\OutputDll\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="CEFSharpWPF">
+      <HintPath>..\..\Dlls\CEFSharpWPF.dll</HintPath>
+    </Reference>
+    <Reference Include="DataGridExtensions">
+      <HintPath>..\..\Dlls\DataGridExtensions.dll</HintPath>
+    </Reference>
+    <Reference Include="FWindSoft, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\Dlls\FWindSoft.dll</HintPath>
+    </Reference>
+    <Reference Include="FWindSoft.Wpf, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\Dlls\FWindSoft.Wpf.dll</HintPath>
+    </Reference>
+    <Reference Include="Newtonsoft.Json, Version=10.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed">
+      <HintPath>..\..\Dlls\Newtonsoft.Json.dll</HintPath>
+    </Reference>
+    <Reference Include="PresentationCore" />
+    <Reference Include="PresentationFramework" />
+    <Reference Include="SAGA.DotNetUtils">
+      <HintPath>..\..\Dlls\SAGA.DotNetUtils.dll</HintPath>
+    </Reference>
+    <Reference Include="SAGA.RevitUtils, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\Dlls\SAGA.RevitUtils.dll</HintPath>
+    </Reference>
+    <Reference Include="System" />
+    <Reference Include="System.Core" />
+    <Reference Include="System.Runtime.Caching" />
+    <Reference Include="System.Windows" />
+    <Reference Include="System.Windows.Interactivity, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\Dlls\FirmLibDll\System.Windows.Interactivity.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Xaml" />
+    <Reference Include="System.Xml.Linq" />
+    <Reference Include="System.Data.DataSetExtensions" />
+    <Reference Include="Microsoft.CSharp" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Net.Http" />
+    <Reference Include="System.Xml" />
+    <Reference Include="WindowsBase" />
+    <Reference Include="WPG">
+      <HintPath>..\..\Dlls\WPG.dll</HintPath>
+    </Reference>
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="BllCommon\AssetManager.cs" />
+    <Compile Include="BllCommon\AssetSelector.cs" />
+    <Compile Include="BllCommon\AssetShowItemUtils.cs" />
+    <Compile Include="BllCommon\BaseAssetItem.cs" />
+    <Compile Include="BllCommon\Commands.cs" />
+    <Compile Include="BllCommon\CommomUtils.cs" />
+    <Compile Include="BllCommon\ContactInformationEditor.xaml.cs">
+      <DependentUpon>ContactInformationEditor.xaml</DependentUpon>
+    </Compile>
+    <Compile Include="BllCommon\ContactInformationInput.xaml.cs">
+      <DependentUpon>ContactInformationInput.xaml</DependentUpon>
+    </Compile>
+    <Compile Include="BllCommon\ContactInformationItem.cs" />
+    <Compile Include="BllCommon\DateTimeManager.cs" />
+    <Compile Include="BllCommon\EquipmentFamilyManager.cs" />
+    <Compile Include="BllCommon\FileItem.cs" />
+    <Compile Include="BllCommon\FileUtils.cs" />
+    <Compile Include="BllCommon\ProductTypeManager.cs" />
+    <Compile Include="BllCommon\ProjectIdManager.cs" />
+    <Compile Include="BllCommon\ProjectManager.cs" />
+    <Compile Include="Common\CommonStyles.cs" />
+    <Compile Include="Common\Enums.cs" />
+    <Compile Include="Common\IdNameItem.cs" />
+    <Compile Include="Common\InfoPointTemplateManager.cs" />
+    <Compile Include="Common\TResult.cs" />
+    <Compile Include="Common\TryCatchWrapper.cs" />
+    <Compile Include="Common\UrlFileKeyParse.cs" />
+    <Compile Include="Extension\MessageTipExtension.cs" />
+    <Compile Include="Common\Model\AssetShowItem.cs" />
+    <Compile Include="Common\Model\VenderItem.cs" />
+    <Compile Include="Common\Model\VenderProjectParameter.cs" />
+    <Compile Include="Common\Model\EditTypeSelectorContext.cs" />
+    <Compile Include="Common\Model\ProdcutTypeCondition.cs" />
+    <Compile Include="Common\Model\SelectAssetContext.cs" />
+    <Compile Include="Common\Model\ShowDataItem.cs" />
+    <Compile Include="Common\Model\ProductTypeShowItem.cs" />
+    <Compile Include="Common\TComparer.cs" />
+    <Compile Include="Common\WatchParameter.cs" />
+    <Compile Include="Extension\ConverterExtension.cs" />
+    <Compile Include="Extension\TreeNavigationExtension.cs" />
+    <Compile Include="Insuer\Model\InsuerShowItem.cs" />
+    <Compile Include="Insuer\Model\InsuerParameter.cs" />
+    <Compile Include="Common\Model\AssetSaveContext.cs" />
+    <Compile Include="Insuer\Model\InsuerUtils.cs" />
+    <Compile Include="Insuer\Model\PolicyShowItem.cs" />
+    <Compile Include="Insuer\Model\PolicyUpdateContext.cs" />
+    <Compile Include="Insuer\VmInsuerAssetSelector.cs" />
+    <Compile Include="Insuer\VmInsuerBaseInfo.cs" />
+    <Compile Include="Insuer\VmInsuerEditor.cs" />
+    <Compile Include="Insuer\VmInsuerInfo.cs" />
+    <Compile Include="Insuer\VmInsuerProjectInfo.cs" />
+    <Compile Include="Insuer\VmInsurancePolicyEditor.cs" />
+    <Compile Include="Insuer\VmPolicyEnsure.cs" />
+    <Compile Include="Insuer\VmPolicySaveEnsure.cs" />
+    <Compile Include="Insuer\VmPolicySelector.cs" />
+    <Compile Include="Insuer\VmSimplePolicyEditor.cs" />
+    <Compile Include="Insuer\WinInsuerAssetSelector.xaml.cs">
+      <DependentUpon>WinInsuerAssetSelector.xaml</DependentUpon>
+    </Compile>
+    <Compile Include="Insuer\WinInsuerBaseInfo.xaml.cs">
+      <DependentUpon>WinInsuerBaseInfo.xaml</DependentUpon>
+    </Compile>
+    <Compile Include="Insuer\WinInsuerEditor.xaml.cs">
+      <DependentUpon>WinInsuerEditor.xaml</DependentUpon>
+    </Compile>
+    <Compile Include="Insuer\WinInsuerInfo.xaml.cs">
+      <DependentUpon>WinInsuerInfo.xaml</DependentUpon>
+    </Compile>
+    <Compile Include="Insuer\WinInsuerProjectInfo.xaml.cs">
+      <DependentUpon>WinInsuerProjectInfo.xaml</DependentUpon>
+    </Compile>
+    <Compile Include="Insuer\WinInsurancePolicyEditor.xaml.cs">
+      <DependentUpon>WinInsurancePolicyEditor.xaml</DependentUpon>
+    </Compile>
+    <Compile Include="Insuer\WinPolicyEnsure.xaml.cs">
+      <DependentUpon>WinPolicyEnsure.xaml</DependentUpon>
+    </Compile>
+    <Compile Include="Insuer\WinPolicySaveEnsure.xaml.cs">
+      <DependentUpon>WinPolicySaveEnsure.xaml</DependentUpon>
+    </Compile>
+    <Compile Include="Insuer\WinPolicySelector.xaml.cs">
+      <DependentUpon>WinPolicySelector.xaml</DependentUpon>
+    </Compile>
+    <Compile Include="Insuer\WinSimplePolicyEditor.xaml.cs">
+      <DependentUpon>WinSimplePolicyEditor.xaml</DependentUpon>
+    </Compile>
+    <Compile Include="Maintainer\Mode\EditParameter.cs" />
+    <Compile Include="Maintainer\Mode\MaintainerDataConverter.cs" />
+    <Compile Include="Maintainer\Mode\MaintainerParameter.cs" />
+    <Compile Include="Maintainer\Mode\MaintainerShowItem.cs" />
+    <Compile Include="Maintainer\VmAddLossProductType.cs" />
+    <Compile Include="Maintainer\VmAddProductType.cs" />
+    <Compile Include="Maintainer\VmMaintainerAssetSelector.cs" />
+    <Compile Include="Maintainer\VmMaintainerEditor.cs" />
+    <Compile Include="Maintainer\VmMaintainerInfo.cs" />
+    <Compile Include="Maintainer\VmMaintainerBaseInfo.cs" />
+    <Compile Include="Maintainer\VmMaintainerProjectAsset.cs" />
+    <Compile Include="Maintainer\VmMaintainerSaveEnsure.cs" />
+    <Compile Include="Maintainer\VmManitainerProjectInfo.cs" />
+    <Compile Include="Manufacturer\VmProductList.cs" />
+    <Compile Include="Maintainer\VmUpdateProductType.cs" />
+    <Compile Include="Maintainer\WinAddLossProductType.xaml.cs">
+      <DependentUpon>WinAddLossProductType.xaml</DependentUpon>
+    </Compile>
+    <Compile Include="Maintainer\WinAddProductType.xaml.cs">
+      <DependentUpon>WinAddProductType.xaml</DependentUpon>
+    </Compile>
+    <Compile Include="Maintainer\WinMaintainerAssetSelector.xaml.cs">
+      <DependentUpon>WinMaintainerAssetSelector.xaml</DependentUpon>
+    </Compile>
+    <Compile Include="Maintainer\WinMaintainerEditor.xaml.cs">
+      <DependentUpon>WinMaintainerEditor.xaml</DependentUpon>
+    </Compile>
+    <Compile Include="Maintainer\WinMaintainerInfo.xaml.cs">
+      <DependentUpon>WinMaintainerInfo.xaml</DependentUpon>
+    </Compile>
+    <Compile Include="Maintainer\WinMaintainerBaseInfo.xaml.cs">
+      <DependentUpon>WinMaintainerBaseInfo.xaml</DependentUpon>
+    </Compile>
+    <Compile Include="Maintainer\WinMaintainerProjectAsset.xaml.cs">
+      <DependentUpon>WinMaintainerProjectAsset.xaml</DependentUpon>
+    </Compile>
+    <Compile Include="Maintainer\WinMaintainerSaveEnsure.xaml.cs">
+      <DependentUpon>WinMaintainerSaveEnsure.xaml</DependentUpon>
+    </Compile>
+    <Compile Include="Maintainer\WinManitainerProjectInfo.xaml.cs">
+      <DependentUpon>WinManitainerProjectInfo.xaml</DependentUpon>
+    </Compile>
+    <Compile Include="Maintainer\WinUpdateProductType.xaml.cs">
+      <DependentUpon>WinUpdateProductType.xaml</DependentUpon>
+    </Compile>
+    <Compile Include="Manufacturer\Model\AssetShowItem.cs" />
+    <Compile Include="Manufacturer\Model\BrandShowItem.cs" />
+    <Compile Include="Manufacturer\Model\ManufactureParameter.cs" />
+    <Compile Include="Manufacturer\Model\ManufacturerShowItem.cs" />
+    <Compile Include="Manufacturer\Model\ProductShowItem.cs" />
+    <Compile Include="Manufacturer\Model\RefVenderShowItem.cs" />
+    <Compile Include="Manufacturer\Model\TypeShowItem.cs" />
+    <Compile Include="Manufacturer\WinProductList.xaml.cs">
+      <DependentUpon>WinProductList.xaml</DependentUpon>
+    </Compile>
+    <Compile Include="Manufacturer\VmBrandEditor.cs" />
+    <Compile Include="Manufacturer\VmManufactureBaseInfo.cs" />
+    <Compile Include="Manufacturer\VmManufactureInfo.cs" />
+    <Compile Include="Manufacturer\VmManufacturerEditor.cs" />
+    <Compile Include="Manufacturer\VmProductEditor.cs" />
+    <Compile Include="Manufacturer\VmProductType.cs" />
+    <Compile Include="Manufacturer\VmProjectAssetList.cs" />
+    <Compile Include="Manufacturer\WinBrandEditor.xaml.cs">
+      <DependentUpon>WinBrandEditor.xaml</DependentUpon>
+    </Compile>
+    <Compile Include="Manufacturer\WinManufactureBaseInfo.xaml.cs">
+      <DependentUpon>WinManufactureBaseInfo.xaml</DependentUpon>
+    </Compile>
+    <Compile Include="Manufacturer\WinManufactureInfo.xaml.cs">
+      <DependentUpon>WinManufactureInfo.xaml</DependentUpon>
+    </Compile>
+    <Compile Include="Manufacturer\WinManufacturerEditor.xaml.cs">
+      <DependentUpon>WinManufacturerEditor.xaml</DependentUpon>
+    </Compile>
+    <Compile Include="Manufacturer\WinProductEditor.xaml.cs">
+      <DependentUpon>WinProductEditor.xaml</DependentUpon>
+    </Compile>
+    <Compile Include="Manufacturer\WinProductType.xaml.cs">
+      <DependentUpon>WinProductType.xaml</DependentUpon>
+    </Compile>
+    <Compile Include="Manufacturer\WinProjectAssetList.xaml.cs">
+      <DependentUpon>WinProjectAssetList.xaml</DependentUpon>
+    </Compile>
+    <Compile Include="NavigationManager\FirmLibPost.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="Seller\Model\ContractSelectorParameter.cs" />
+    <Compile Include="Seller\Model\SellerDataConverter.cs" />
+    <Compile Include="Seller\Model\SellerParameter.cs" />
+    <Compile Include="Seller\Model\SellerShowItem.cs" />
+    <Compile Include="Seller\VmAddLossProductType.cs" />
+    <Compile Include="Seller\VmMultiProductTypeSelector.cs" />
+    <Compile Include="Seller\VmSellerInfo.cs" />
+    <Compile Include="Seller\VmSellerBaseInfo.cs" />
+    <Compile Include="Seller\VmSellerEditor.cs" />
+    <Compile Include="Seller\VmSellerProjectContract.cs" />
+    <Compile Include="Seller\VmSellerProjectInfo.cs" />
+    <Compile Include="Seller\VmSingleProductTypeSelector.cs" />
+    <Compile Include="Seller\VmSupplyAssetCreater.cs" />
+    <Compile Include="Seller\VmSupplyAssetSelector.cs" />
+    <Compile Include="Seller\VmSupplyContractNoSelector.cs" />
+    <Compile Include="Seller\WinAddLossProductType.xaml.cs">
+      <DependentUpon>WinAddLossProductType.xaml</DependentUpon>
+    </Compile>
+    <Compile Include="Seller\WinMultiProductTypeSelector.xaml.cs">
+      <DependentUpon>WinMultiProductTypeSelector.xaml</DependentUpon>
+    </Compile>
+    <Compile Include="Seller\WinSellerInfo.xaml.cs">
+      <DependentUpon>WinSellerInfo.xaml</DependentUpon>
+    </Compile>
+    <Compile Include="Seller\WinSellerBaseInfo.xaml.cs">
+      <DependentUpon>WinSellerBaseInfo.xaml</DependentUpon>
+    </Compile>
+    <Compile Include="Seller\WinSellerEditor.xaml.cs">
+      <DependentUpon>WinSellerEditor.xaml</DependentUpon>
+    </Compile>
+    <Compile Include="Seller\WinSellerProjectContract.xaml.cs">
+      <DependentUpon>WinSellerProjectContract.xaml</DependentUpon>
+    </Compile>
+    <Compile Include="Seller\WinSellerProjectInfo.xaml.cs">
+      <DependentUpon>WinSellerProjectInfo.xaml</DependentUpon>
+    </Compile>
+    <Compile Include="Seller\WinSingleProductTypeSelector.xaml.cs">
+      <DependentUpon>WinSingleProductTypeSelector.xaml</DependentUpon>
+    </Compile>
+    <Compile Include="Seller\WinSupplyAssetCreater.xaml.cs">
+      <DependentUpon>WinSupplyAssetCreater.xaml</DependentUpon>
+    </Compile>
+    <Compile Include="Seller\WinSupplyAssetSelector.xaml.cs">
+      <DependentUpon>WinSupplyAssetSelector.xaml</DependentUpon>
+    </Compile>
+    <Compile Include="Seller\WinSupplyContractNoSelector.xaml.cs">
+      <DependentUpon>WinSupplyContractNoSelector.xaml</DependentUpon>
+    </Compile>
+    <Compile Include="Common\SingleInstance.cs" />
+    <Compile Include="WinFirmMain.xaml.cs">
+      <DependentUpon>WinFirmMain.xaml</DependentUpon>
+    </Compile>
+  </ItemGroup>
+  <ItemGroup>
+    <Resource Include="Images\修改.jpg" />
+  </ItemGroup>
+  <ItemGroup>
+    <Page Include="BllCommon\ContactInformationEditor.xaml">
+      <SubType>Designer</SubType>
+      <Generator>MSBuild:Compile</Generator>
+    </Page>
+    <Page Include="BllCommon\ContactInformationInput.xaml">
+      <SubType>Designer</SubType>
+      <Generator>MSBuild:Compile</Generator>
+    </Page>
+    <Page Include="Common\CellTemplates.xaml">
+      <Generator>MSBuild:Compile</Generator>
+      <SubType>Designer</SubType>
+    </Page>
+    <Page Include="Insuer\WinInsuerAssetSelector.xaml">
+      <SubType>Designer</SubType>
+      <Generator>MSBuild:Compile</Generator>
+    </Page>
+    <Page Include="Insuer\WinInsuerBaseInfo.xaml">
+      <SubType>Designer</SubType>
+      <Generator>MSBuild:Compile</Generator>
+    </Page>
+    <Page Include="Insuer\WinInsuerEditor.xaml">
+      <SubType>Designer</SubType>
+      <Generator>MSBuild:Compile</Generator>
+    </Page>
+    <Page Include="Insuer\WinInsuerInfo.xaml">
+      <SubType>Designer</SubType>
+      <Generator>MSBuild:Compile</Generator>
+    </Page>
+    <Page Include="Insuer\WinInsuerProjectInfo.xaml">
+      <SubType>Designer</SubType>
+      <Generator>MSBuild:Compile</Generator>
+    </Page>
+    <Page Include="Insuer\WinInsurancePolicyEditor.xaml">
+      <SubType>Designer</SubType>
+      <Generator>MSBuild:Compile</Generator>
+    </Page>
+    <Page Include="Insuer\WinPolicyEnsure.xaml">
+      <Generator>MSBuild:Compile</Generator>
+      <SubType>Designer</SubType>
+    </Page>
+    <Page Include="Insuer\WinPolicySaveEnsure.xaml">
+      <SubType>Designer</SubType>
+      <Generator>MSBuild:Compile</Generator>
+    </Page>
+    <Page Include="Insuer\WinPolicySelector.xaml">
+      <Generator>MSBuild:Compile</Generator>
+      <SubType>Designer</SubType>
+    </Page>
+    <Page Include="Insuer\WinSimplePolicyEditor.xaml">
+      <Generator>MSBuild:Compile</Generator>
+      <SubType>Designer</SubType>
+    </Page>
+    <Page Include="Maintainer\WinAddLossProductType.xaml">
+      <SubType>Designer</SubType>
+      <Generator>MSBuild:Compile</Generator>
+    </Page>
+    <Page Include="Maintainer\WinAddProductType.xaml">
+      <SubType>Designer</SubType>
+      <Generator>MSBuild:Compile</Generator>
+    </Page>
+    <Page Include="Maintainer\WinMaintainerAssetSelector.xaml">
+      <SubType>Designer</SubType>
+      <Generator>MSBuild:Compile</Generator>
+    </Page>
+    <Page Include="Maintainer\WinMaintainerEditor.xaml">
+      <SubType>Designer</SubType>
+      <Generator>MSBuild:Compile</Generator>
+    </Page>
+    <Page Include="Maintainer\WinMaintainerInfo.xaml">
+      <SubType>Designer</SubType>
+      <Generator>MSBuild:Compile</Generator>
+    </Page>
+    <Page Include="Maintainer\WinMaintainerBaseInfo.xaml">
+      <SubType>Designer</SubType>
+      <Generator>MSBuild:Compile</Generator>
+    </Page>
+    <Page Include="Maintainer\WinMaintainerProjectAsset.xaml">
+      <SubType>Designer</SubType>
+      <Generator>MSBuild:Compile</Generator>
+    </Page>
+    <Page Include="Maintainer\WinMaintainerSaveEnsure.xaml">
+      <SubType>Designer</SubType>
+      <Generator>MSBuild:Compile</Generator>
+    </Page>
+    <Page Include="Maintainer\WinManitainerProjectInfo.xaml">
+      <SubType>Designer</SubType>
+      <Generator>MSBuild:Compile</Generator>
+    </Page>
+    <Page Include="Maintainer\WinUpdateProductType.xaml">
+      <SubType>Designer</SubType>
+      <Generator>MSBuild:Compile</Generator>
+    </Page>
+    <Page Include="Manufacturer\WinProductList.xaml">
+      <SubType>Designer</SubType>
+      <Generator>MSBuild:Compile</Generator>
+    </Page>
+    <Page Include="Manufacturer\WinBrandEditor.xaml">
+      <SubType>Designer</SubType>
+      <Generator>MSBuild:Compile</Generator>
+    </Page>
+    <Page Include="Manufacturer\WinManufactureBaseInfo.xaml">
+      <SubType>Designer</SubType>
+      <Generator>MSBuild:Compile</Generator>
+    </Page>
+    <Page Include="Manufacturer\WinManufactureInfo.xaml">
+      <SubType>Designer</SubType>
+      <Generator>MSBuild:Compile</Generator>
+    </Page>
+    <Page Include="Manufacturer\WinManufacturerEditor.xaml">
+      <SubType>Designer</SubType>
+      <Generator>MSBuild:Compile</Generator>
+    </Page>
+    <Page Include="Manufacturer\WinProductEditor.xaml">
+      <SubType>Designer</SubType>
+      <Generator>MSBuild:Compile</Generator>
+    </Page>
+    <Page Include="Manufacturer\WinProductType.xaml">
+      <SubType>Designer</SubType>
+      <Generator>MSBuild:Compile</Generator>
+    </Page>
+    <Page Include="Manufacturer\WinProjectAssetList.xaml">
+      <SubType>Designer</SubType>
+      <Generator>MSBuild:Compile</Generator>
+    </Page>
+    <Page Include="Seller\WinAddLossProductType.xaml">
+      <Generator>MSBuild:Compile</Generator>
+      <SubType>Designer</SubType>
+    </Page>
+    <Page Include="Seller\WinMultiProductTypeSelector.xaml">
+      <Generator>MSBuild:Compile</Generator>
+      <SubType>Designer</SubType>
+    </Page>
+    <Page Include="Seller\WinSellerInfo.xaml">
+      <SubType>Designer</SubType>
+      <Generator>MSBuild:Compile</Generator>
+    </Page>
+    <Page Include="Seller\WinSellerBaseInfo.xaml">
+      <SubType>Designer</SubType>
+      <Generator>MSBuild:Compile</Generator>
+    </Page>
+    <Page Include="Seller\WinSellerEditor.xaml">
+      <SubType>Designer</SubType>
+      <Generator>MSBuild:Compile</Generator>
+    </Page>
+    <Page Include="Seller\WinSellerProjectContract.xaml">
+      <SubType>Designer</SubType>
+      <Generator>MSBuild:Compile</Generator>
+    </Page>
+    <Page Include="Seller\WinSellerProjectInfo.xaml">
+      <SubType>Designer</SubType>
+      <Generator>MSBuild:Compile</Generator>
+    </Page>
+    <Page Include="Seller\WinSingleProductTypeSelector.xaml">
+      <Generator>MSBuild:Compile</Generator>
+      <SubType>Designer</SubType>
+    </Page>
+    <Page Include="Seller\WinSupplyAssetCreater.xaml">
+      <Generator>MSBuild:Compile</Generator>
+      <SubType>Designer</SubType>
+    </Page>
+    <Page Include="Seller\WinSupplyAssetSelector.xaml">
+      <Generator>MSBuild:Compile</Generator>
+      <SubType>Designer</SubType>
+    </Page>
+    <Page Include="Seller\WinSupplyContractNoSelector.xaml">
+      <Generator>MSBuild:Compile</Generator>
+      <SubType>Designer</SubType>
+    </Page>
+    <Page Include="Themes\Generic.xaml">
+      <Generator>MSBuild:Compile</Generator>
+      <SubType>Designer</SubType>
+    </Page>
+    <Page Include="Themes\CommonStyle.xaml">
+      <Generator>MSBuild:Compile</Generator>
+      <SubType>Designer</SubType>
+    </Page>
+    <Page Include="WinFirmMain.xaml">
+      <Generator>MSBuild:Compile</Generator>
+      <SubType>Designer</SubType>
+    </Page>
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\Com.FirmLib\Com.FirmLib.csproj">
+      <Project>{8e39978d-e06f-44cd-bbc9-b6f10fac29de}</Project>
+      <Name>Com.FirmLib</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="app.config" />
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>

+ 6 - 0
FirmLib/Com.FirmLib.UI/Com.FirmLib.UI.csproj.user

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <ProjectView>ProjectFiles</ProjectView>
+  </PropertyGroup>
+</Project>

+ 122 - 0
FirmLib/Com.FirmLib.UI/Common/CellTemplates.xaml

@@ -0,0 +1,122 @@
+<ResourceDictionary
+          xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
+                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
+                    xmlns:clr="clr-namespace:System;assembly=mscorlib" 
+                    xmlns:clr2="clr-namespace:System.Collections;assembly=mscorlib" 
+                    xmlns:wpg="clr-namespace:WPG;assembly=WPG"
+                   xmlns:converters="clr-namespace:WPG.Converters;assembly=WPG" 
+                    xmlns:typeeditors="clr-namespace:WPG.TypeEditors;assembly=WPG" 
+                    xmlns:usercontrols="clr-namespace:WPG.UserControls;assembly=WPG" 
+                   xmlns:TypeEditors="clr-namespace:WPG.Themes.TypeEditors;assembly=WPG"
+                   xmlns:fw="http://schemas.FWind/xaml"
+                  xmlns:wpf="clr-namespace:FWindSoft.Wpf;assembly=FWindSoft.Wpf"
+    >
+
+    <DataTemplate x:Key="default">
+        <TextBox fw:ElementCopyOptions.UseCopy="True" fw:ElementCopyOptions.CopyValue="{Binding Path=Value,UpdateSourceTrigger=PropertyChanged,Mode=TwoWay}" IsReadOnly="{Binding Path=IsReadOnly}" Style="{DynamicResource {ComponentResourceKey TypeInTargetAssembly={x:Type wpg:PropertyGrid}, ResourceId=TextBoxStyle}}">
+            <TextBox.Text>
+                <Binding Mode="TwoWay" Path="Value" UpdateSourceTrigger="LostFocus">
+                    <Binding.ValidationRules>
+                        <ExceptionValidationRule />
+                    </Binding.ValidationRules>
+                </Binding>
+            </TextBox.Text>
+        </TextBox>
+    </DataTemplate>
+    <DataTemplate x:Key="TextBox_Double_A1">
+        <usercontrols:TextBox_Double_A1 fw:ElementCopyOptions.UseCopy="True" fw:ElementCopyOptions.CopyValue="{Binding Path=Value,UpdateSourceTrigger=PropertyChanged,Mode=TwoWay}"  IsReadOnly="{Binding Path=IsReadOnly}" Style="{DynamicResource {ComponentResourceKey TypeInTargetAssembly={x:Type wpg:PropertyGrid}, ResourceId=TextBoxStyle}}">
+            <TextBox.Text>
+                <Binding Mode="TwoWay" Path="Value" UpdateSourceTrigger="LostFocus">
+                    <Binding.ValidationRules>
+                        <ExceptionValidationRule />
+                    </Binding.ValidationRules>
+                </Binding>
+            </TextBox.Text>
+        </usercontrols:TextBox_Double_A1>
+    </DataTemplate>
+    <DataTemplate x:Key="Textbox_DoubleUnit_A2">
+        <usercontrols:Textbox_DoubleUnit_A2 fw:ElementCopyOptions.UseCopy="True" fw:ElementCopyOptions.CopyValue="{Binding Path=Value, UpdateSourceTrigger=PropertyChanged,Mode=TwoWay}"
+            Text="{Binding Path=Value, Mode=TwoWay}"
+            TextUnit="{Binding Path=Property.ExtendObject.Unit, Mode=TwoWay}">
+        </usercontrols:Textbox_DoubleUnit_A2>
+    </DataTemplate>
+    <DataTemplate x:Key="TextBox_String_B1">
+        <usercontrols:TextBox_String_B1 fw:ElementCopyOptions.UseCopy="True" fw:ElementCopyOptions.CopyValue="{Binding Path=Value,UpdateSourceTrigger=PropertyChanged,Mode=TwoWay}"  IsReadOnly="{Binding Path=IsReadOnly}" Style="{DynamicResource {ComponentResourceKey TypeInTargetAssembly={x:Type wpg:PropertyGrid}, ResourceId=TextBoxStyle}}">
+            <TextBox.Text>
+                <Binding Mode="TwoWay" Path="Value" UpdateSourceTrigger="LostFocus">
+                    <Binding.ValidationRules>
+                        <ExceptionValidationRule />
+                    </Binding.ValidationRules>
+                </Binding>
+            </TextBox.Text>
+        </usercontrols:TextBox_String_B1>
+    </DataTemplate>
+
+    <DataTemplate x:Key="DataTime_Date_C5">
+        <DatePicker  fw:ElementCopyOptions.UseCopy="True" fw:ElementCopyOptions.CopyValue="{Binding Path=Value,UpdateSourceTrigger=PropertyChanged,Mode=TwoWay}">
+            <DatePicker.SelectedDate>
+                <Binding Path="Value" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged" Converter="{x:Static wpf:DateTimeConverter.Date}">
+                </Binding>
+            </DatePicker.SelectedDate>
+        </DatePicker>
+    </DataTemplate>
+
+    <DataTemplate x:Key="Enum_D1">
+        <ComboBox fw:ElementCopyOptions.UseCopy="True" fw:ElementCopyOptions.CopyValue="{Binding Path=Value,UpdateSourceTrigger=PropertyChanged,Mode=TwoWay}"  IsReadOnly="{Binding Path=IsReadOnly}" Style="{DynamicResource {ComponentResourceKey TypeInTargetAssembly={x:Type wpg:PropertyGrid}, ResourceId=ComboBoxStyle}}" 
+                  ItemsSource="{Binding Property.ExtendObject.EnumItems}" DisplayMemberPath="Name" SelectedValuePath="Value"  SelectedValue="{Binding Path=Value,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}">
+        </ComboBox>
+    </DataTemplate>
+    <DataTemplate x:Key="{ComponentResourceKey TypeInTargetAssembly={x:Type wpg:PropertyGrid}, ResourceId={x:Type Brush}}">
+        <TypeEditors:BrushEditorControl Brush="{Binding Path=Value}" VerticalAlignment="Stretch" HorizontalAlignment="Stretch"></TypeEditors:BrushEditorControl>
+    </DataTemplate>
+
+    <DataTemplate x:Key="{ComponentResourceKey TypeInTargetAssembly={x:Type wpg:PropertyGrid}, ResourceId={x:Type clr:Int32}}">
+        <typeeditors:IntegerTypeEditor Text="{Binding Path=Value,UpdateSourceTrigger=PropertyChanged}" IsReadOnly="{Binding Path=IsReadOnly}" Foreground="Black"></typeeditors:IntegerTypeEditor>
+    </DataTemplate>
+
+    <DataTemplate x:Key="{ComponentResourceKey TypeInTargetAssembly={x:Type wpg:PropertyGrid}, ResourceId={x:Type clr:Boolean}}">
+        <CheckBox Margin="2 0 0 0" Style="{DynamicResource {ComponentResourceKey TypeInTargetAssembly={x:Type wpg:PropertyGrid}, ResourceId=CheckBoxStyle}}" IsEnabled="{Binding Path=IsWriteable}" IsChecked="{Binding Path=Value}" />
+    </DataTemplate>
+
+    <DataTemplate x:Key="{ComponentResourceKey TypeInTargetAssembly={x:Type wpg:PropertyGrid}, ResourceId={x:Type clr2:IList}}">
+        <ListBox ItemsSource="{Binding Path=Value}" />
+    </DataTemplate>
+
+    <DataTemplate x:Key="{ComponentResourceKey TypeInTargetAssembly={x:Type wpg:PropertyGrid}, ResourceId={x:Type clr:Enum}}">
+        <ComboBox Style="{DynamicResource {ComponentResourceKey TypeInTargetAssembly={x:Type wpg:PropertyGrid}, ResourceId=ComboBoxStyle}}" 
+                  SelectedItem="{Binding Path=Value,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}">
+            <ComboBox.ItemsSource>
+                <Binding Path="Value">
+                    <Binding.Converter>
+                        <converters:EnumTypeConverter />
+                    </Binding.Converter>
+                </Binding>
+            </ComboBox.ItemsSource>
+        </ComboBox>
+    </DataTemplate>
+
+    <DataTemplate x:Key="{ComponentResourceKey TypeInTargetAssembly={x:Type wpg:PropertyGrid}, ResourceId={x:Type clr:Double}}">
+        <TextBox IsReadOnly="{Binding Path=IsReadOnly}" Style="{DynamicResource {ComponentResourceKey TypeInTargetAssembly={x:Type wpg:PropertyGrid}, ResourceId=TextBoxStyle}}">
+            <TextBox.Text>
+                <Binding Mode="TwoWay" Path="Value">
+                    <Binding.Converter>
+                        <converters:DoubleTypeConverter />
+                    </Binding.Converter>
+                </Binding>
+            </TextBox.Text>
+        </TextBox>
+    </DataTemplate>
+
+    <!--对应资产-->
+    <DataTemplate x:Key="{ComponentResourceKey TypeInTargetAssembly={x:Type wpg:PropertyGrid}, ResourceId={x:Type usercontrols:UcReferenceFM}}">
+        <usercontrols:UcReferenceFM></usercontrols:UcReferenceFM>
+    </DataTemplate>
+    <!--生产厂家-->
+    <DataTemplate x:Key="{ComponentResourceKey TypeInTargetAssembly={x:Type wpg:PropertyGrid}, ResourceId={x:Type usercontrols:UcPopups}}">
+        <usercontrols:UcPopups></usercontrols:UcPopups>
+    </DataTemplate>
+    <!--铭牌照片-->
+    <DataTemplate x:Key="{ComponentResourceKey TypeInTargetAssembly={x:Type wpg:PropertyGrid}, ResourceId={x:Type usercontrols:UcPopups_Nameplate}}">
+        <usercontrols:UcPopups_Nameplate></usercontrols:UcPopups_Nameplate>
+    </DataTemplate>
+</ResourceDictionary>

+ 35 - 0
FirmLib/Com.FirmLib.UI/Common/CommonStyles.cs

@@ -0,0 +1,35 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+
+namespace Com.FirmLib.UI.Common
+{
+    public class CommonStyles
+    {
+        static CommonStyles()
+        {
+            StarLableKey = new ComponentResourceKey(typeof(CommonStyles), "StarLable");
+            TextBoxKey = new ComponentResourceKey(typeof(CommonStyles), "TextBox");
+            ButtonKey = new ComponentResourceKey(typeof(CommonStyles), "Button");
+            GroupBoxKey = new ComponentResourceKey(typeof(CommonStyles), "GroupBox");
+            LinkButtonKey = new ComponentResourceKey(typeof(CommonStyles), "LinkButton");
+            ComboBoxKey = new ComponentResourceKey(typeof(CommonStyles), "ComboBox");
+            DataGridCellKey = new ComponentResourceKey(typeof(CommonStyles), "DataGridCell");
+            ControlKey = new ComponentResourceKey(typeof(CommonStyles), nameof(ControlKey));
+        }
+        public static ResourceKey StarLableKey { get; private set; }
+        public static ResourceKey TextBoxKey { get; private set; }
+        public static ResourceKey ButtonKey { get; private set; }
+        public static ResourceKey GroupBoxKey { get; private set; }
+        public static ResourceKey LinkButtonKey { get; private set; }
+
+        public static ResourceKey ComboBoxKey { get; private set; }
+
+        public static ResourceKey DataGridCellKey { get; private set; }
+
+        public static ResourceKey ControlKey { get; private set; }
+    }
+}

+ 17 - 0
FirmLib/Com.FirmLib.UI/Common/Enums.cs

@@ -0,0 +1,17 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Com.FirmLib.UI
+{
+    public enum EditType
+    {
+        [Description("修改")]
+        Update,
+        [Description("更正")]
+        Correct,
+    }
+}

+ 25 - 0
FirmLib/Com.FirmLib.UI/Common/IdNameItem.cs

@@ -0,0 +1,25 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Com.FirmLib.UI.Common
+{
+    public class IdNameItem
+    {
+        /// <summary>
+        /// Id值
+        /// </summary>
+        public string Id { get; set; }
+        /// <summary>
+        /// name值
+        /// </summary>
+        public string Name { get; set; }
+
+        /// <summary>
+        /// 关联信息
+        /// </summary>
+        public object Tag { get; set; }
+    }
+}

+ 94 - 0
FirmLib/Com.FirmLib.UI/Common/InfoPointTemplateManager.cs

@@ -0,0 +1,94 @@
+using Com.FirmLib.Entity;
+using FWindSoft.Wpf.Controls;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Markup;
+using System.Windows.Media;
+using WPG;
+
+namespace Com.FirmLib.UI.Common
+{
+    /// <summary>
+    /// 信息点模板管理
+    /// </summary>
+    public class InfoPointTemplateParse : ITemplateParse
+    {
+        private static Dictionary<string, DataTemplate> m_RefDataTemplates = new Dictionary<string, DataTemplate>();
+        static InfoPointTemplateParse()
+        {
+            ResourceDictionary dic = new ResourceDictionary();
+            PropertyGrid gr = new PropertyGrid();
+            dic.Source = new Uri("/Com.FirmLib.UI;component/Common/CellTemplates.xaml", UriKind.Relative);
+            //dic.Source = new Uri("/TemplateLib;component/DataGrid/CellTemplates.xaml", UriKind.Relative);
+            //dic.MergedDictionaries.Add(ResourceManager.DataGridCellTemplate);
+            foreach (var key in dic.Keys)
+            {
+                DataTemplate tempTemplate = dic[key] as DataTemplate;
+                if (tempTemplate != null)
+                {
+                    m_RefDataTemplates.Add(key.ToString(), tempTemplate);
+                }
+            }
+        }
+        /// <summary>
+        /// 根据信息点的信息去创建某值
+        /// </summary>
+        /// <returns></returns>
+        public DataTemplate SelectTemplate(object ob)
+        {
+            var geDefinition = ob as EquipmentInfoPointItem;
+            if (geDefinition == null)
+                return CreateDefaultTemplate();
+            //var id = geDefinition.CollectionCmptCode;
+            //if(string.IsNullOrEmpty(id))
+            //    return CreateDefaultTemplate();
+            string controlId = geDefinition.CollectionCmptCode;
+            if (string.IsNullOrEmpty(geDefinition.CollectionCmptCode))
+            {
+                controlId = geDefinition.InputType;
+            }
+            if (controlId == "E1")
+            {
+                controlId = "Enum_D1";
+            }
+            DataTemplate template;
+            if (!m_RefDataTemplates.TryGetValue(controlId, out template))
+            {
+                template = CreateDefaultTemplate();
+            }
+            return template;
+
+        }
+        private DataTemplate CreateDefaultTemplate()
+        {
+            DataTemplate temp = new DataTemplate();
+            FrameworkElementFactory root = new FrameworkElementFactory(typeof(TextBlock));
+            Binding binding = new Binding("Value");
+            root.SetBinding(TextBlock.TextProperty, binding);
+            temp.VisualTree = root;
+            temp.Seal();
+            return temp;
+        }
+        #region 构造解析器
+        /// <summary>
+        /// 创建模板解析器
+        /// </summary>
+        /// <returns></returns>
+        public static CommonTemplateProvider CreateTemplateManager()
+        {
+            CommonTemplateProvider commonTemplate = new CommonTemplateProvider();
+            InfoPointTemplateParse pasrse = new InfoPointTemplateParse();
+            commonTemplate.Add(typeof(EquipmentInfoPointItem), pasrse);
+            return commonTemplate;
+        }
+        #endregion
+    }
+
+  
+}

+ 27 - 0
FirmLib/Com.FirmLib.UI/Common/Model/AssetSaveContext.cs

@@ -0,0 +1,27 @@
+using Com.FirmLib.UI.Common;
+using Com.FirmLib.UI.Common.Model;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Com.FirmLib.UI
+{
+    public class AssetSaveContext
+    {
+        /// <summary>
+        /// 编辑方式
+        /// </summary>
+        public EditType EditType { get; set; }
+        /// <summary>
+        /// 生效时间
+        /// </summary>
+        public string EffectiveTime { get; set; }
+
+        /// <summary>
+        /// 改变的项目信息
+        /// </summary>
+        public List<AssetShowItem> ChangedItems { get; set; }
+    }
+}

+ 273 - 0
FirmLib/Com.FirmLib.UI/Common/Model/AssetShowItem.cs

@@ -0,0 +1,273 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Com.FirmLib.UI.Common.Model
+{
+    public class AssetShowItem:BaseAssetItem
+    {
+        public AssetShowItem()
+        {
+            this.IsEnabled = true;
+        }
+        #region 带勾选标志
+
+        private bool m_IsChecked;
+        /// <summary>
+        /// 是否选中
+        /// </summary>
+        public bool IsChecked
+        {
+            get { return this.m_IsChecked; }
+            set
+            {
+                this.m_IsChecked = value;
+                RaisePropertyChanged(nameof(this.IsChecked));
+            }
+        }
+
+
+        private bool m_IsEnabled;
+        /// <summary>
+        /// 标志数据是否可以修改
+        /// </summary>
+        public bool IsEnabled
+        {
+            get { return this.m_IsEnabled; }
+            set
+            {
+                this.m_IsEnabled = value;
+                RaisePropertyChanged(nameof(this.IsEnabled));
+            }
+        }
+        #endregion
+
+        /// <summary>
+        /// 项目Id
+        /// </summary>
+        public string ProjectId { get; set; }
+        /// <summary>
+        /// 设备编码
+        /// </summary>
+        public string FamilyCode { get; set; }
+
+        private string m_AssetNo;
+        /// <summary>
+        /// 资产编号
+        /// </summary>
+        public string AssetNo
+        {
+            get { return this.m_AssetNo; }
+            set
+            {
+                this.m_AssetNo = value;
+                RaisePropertyChanged(() => this.AssetNo);
+            }
+        }
+
+
+        #region 保险商
+        private string m_InsurancePolicyNo;
+        /// <summary>
+        /// 保单编号
+        /// </summary>
+        public string InsurancePolicyNo
+        {
+            get { return this.m_InsurancePolicyNo; }
+            set
+            {
+                this.m_InsurancePolicyNo = value;
+                RaisePropertyChanged(() => this.InsurancePolicyNo);
+            }
+        }
+
+
+        private string m_EndDate;
+        /// <summary>
+        /// 保单截止日期
+        /// </summary>
+        public string EndDate
+        {
+            get { return this.m_EndDate; }
+            set
+            {
+                this.m_EndDate = value;
+                RaisePropertyChanged(() => this.EndDate);
+            }
+        }
+
+        private string m_PolicyFile;
+        /// <summary>
+        /// 保单文件
+        /// </summary>
+        public string PolicyFile
+        {
+            get { return this.m_PolicyFile; }
+            set
+            {
+                this.m_PolicyFile = value;
+                RaisePropertyChanged(() => this.PolicyFile);
+            }
+        }
+
+
+        private string m_InsuerName;
+        /// <summary>
+        /// 保险商名称
+        /// </summary>
+        public string InsuerName
+        {
+            get { return this.m_InsuerName; }
+            set
+            {
+                this.m_InsuerName = value;
+                RaisePropertyChanged(nameof(this.InsuerName));
+            }
+        }
+        #endregion
+
+        #region 生产商
+
+        private double m_ProcurementPrice;
+        /// <summary>
+        /// 采购价格
+        /// </summary>
+        public double ProcurementPrice
+        {
+            get { return this.m_ProcurementPrice; }
+            set
+            {
+                this.m_ProcurementPrice = value;
+                RaisePropertyChanged(nameof(this.ProcurementPrice));
+            }
+        }
+
+
+        private double m_MaintainPeriod;
+        /// <summary>
+        /// 保养周期
+        /// </summary>
+        public double MaintainPeriod
+        {
+            get { return this.m_MaintainPeriod; }
+            set
+            {
+                this.m_MaintainPeriod = value;
+                RaisePropertyChanged(nameof(this.MaintainPeriod));
+            }
+        }
+
+
+        private double m_Warranty;
+        /// <summary>
+        /// 保修期
+        /// </summary>
+        public double Warranty
+        {
+            get { return this.m_Warranty; }
+            set
+            {
+                this.m_Warranty = value;
+                RaisePropertyChanged(nameof(this.Warranty));
+            }
+        }
+
+        private string m_ProductionDate;
+        /// <summary>
+        /// 生产日期
+        /// </summary>
+        public string ProductionDate
+        {
+            get { return this.m_ProductionDate; }
+            set
+            {
+                this.m_ProductionDate = value;
+                RaisePropertyChanged(nameof(this.ProductionDate));
+            }
+        }
+
+        private string m_ManufacturingNo;
+        /// <summary>
+        /// 出厂编号
+        /// </summary>
+        public string ManufacturingNo
+        {
+            get { return this.m_ManufacturingNo; }
+            set
+            {
+                this.m_ManufacturingNo = value;
+                RaisePropertyChanged(nameof(this.ManufacturingNo));
+            }
+        }
+        #endregion
+
+        #region 供应商
+
+        private string m_SellerName;
+        /// <summary>
+        /// 供应商名称
+        /// </summary>
+        public string SellerName
+        {
+            get { return this.m_SellerName; }
+            set
+            {
+                this.m_SellerName = value;
+                RaisePropertyChanged(nameof(this.SellerName));
+            }
+        }
+
+
+        private string m_SellerContractNo;
+        /// <summary>
+        /// 供应合同编号
+        /// </summary>
+        public string SellerContractNo
+        {
+            get { return this.m_SellerContractNo; }
+            set
+            {
+                this.m_SellerContractNo = value;
+                RaisePropertyChanged(nameof(this.SellerContractNo));
+            }
+        }
+        #endregion
+
+
+        #region 维修商
+
+        private string m_MaintainerEndDate;
+        /// <summary>
+        /// 维修合同截止日期
+        /// </summary>
+        public string MaintainerEndDate
+        {
+            get { return this.m_MaintainerEndDate; }
+            set
+            {
+                this.m_MaintainerEndDate = value;
+                RaisePropertyChanged(nameof(this.MaintainerEndDate));
+            }
+        }
+        #endregion
+
+        #region 控制信息
+
+        private bool m_ChangeMaintainer;
+        /// <summary>
+        /// 维修商发生变化
+        /// </summary>
+        public bool ChangeMaintainer
+        {
+            get { return this.m_ChangeMaintainer; }
+            set
+            {
+                this.m_ChangeMaintainer = value;
+                RaisePropertyChanged(nameof(this.ChangeMaintainer));
+            }
+        }
+        #endregion
+    }
+}

+ 30 - 0
FirmLib/Com.FirmLib.UI/Common/Model/EditTypeSelectorContext.cs

@@ -0,0 +1,30 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Com.FirmLib.UI.Common.Model
+{
+    /// <summary>
+    /// 编辑方式维护
+    /// </summary>
+    public class EditTypeSelectorContext
+    {
+        public EditTypeSelectorContext()
+        {
+            ChangedItems = new List<AssetShowItem>();
+        }
+       
+       public List<AssetShowItem> ChangedItems { get; set; }
+        /// <summary>
+        /// 编辑类型\修改还是更正
+        /// </summary>
+        public EditType EditType { get; set; }
+
+        /// <summary>
+        /// 改正日期
+        /// </summary>
+        public string CorrectEndDate { get; set; }
+    }
+}

+ 86 - 0
FirmLib/Com.FirmLib.UI/Common/Model/ProdcutTypeCondition.cs

@@ -0,0 +1,86 @@
+using Com.FirmLib.Entity;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Com.FirmLib.UI
+{
+    /// <summary>
+    /// 产品过滤条件
+    /// </summary>
+    public class ProdcutTypeCondition
+    {
+        public ProdcutTypeCondition()
+        {
+            
+        }
+        public ProdcutTypeCondition(string venderId)
+        {
+            this.VenderId = venderId;
+        }
+        public ProdcutTypeCondition(List<ProductTypeDetailItem> data)
+        {
+            this.CatchData = data;
+        }
+        /// <summary>
+        /// 设备族
+        /// </summary>
+        public string FamilyCode { get; set; }
+        /// <summary>
+        ///生产厂商Id
+        /// </summary>
+        public string VenderId { get; set; }
+        /// <summary>
+        /// 品牌Id
+        /// </summary>
+        public string BrandId { get; set; }
+        /// <summary>
+        /// 产品Id
+        /// </summary>
+        public string  ProductId { get; set; }
+
+        /// <summary>
+        /// 缓存数据
+        /// </summary>
+        public List<ProductTypeDetailItem> CatchData { get; set; }
+
+        /// <summary>
+        /// 创建过滤条件
+        /// </summary>
+        /// <returns></returns>
+        public Func<ProductTypeDetailItem,bool> CreateFilter()
+        {
+            List<Predicate<ProductTypeDetailItem>> predicates = new List<Predicate<ProductTypeDetailItem>>();
+            if (!string.IsNullOrEmpty(VenderId))
+            {
+                predicates.Add(p => p.VenderId == VenderId);
+            }
+            if (!string.IsNullOrEmpty(FamilyCode))
+            {
+                predicates.Add(p => p.FamilyCode == FamilyCode);
+            }
+            if (!string.IsNullOrEmpty(BrandId))
+            {
+                predicates.Add(p => p.BrandId == BrandId);
+            }
+            if (!string.IsNullOrEmpty(ProductId))
+            {
+                predicates.Add(p => p.ProductId == ProductId);
+            }
+            return new Func<ProductTypeDetailItem, bool>(p => predicates.All(filter => filter(p)));
+        }
+
+        /// <summary>
+        /// 根据过滤条件过滤
+        /// </summary>
+        /// <returns></returns>
+        public List<ProductTypeDetailItem> ToList()
+        {
+            var dataSource = CatchData??new List<ProductTypeDetailItem>() ;
+            var products = dataSource.Where(CreateFilter()).ToList();
+            return products;
+        }
+    }
+}

+ 51 - 0
FirmLib/Com.FirmLib.UI/Common/Model/ProductTypeShowItem.cs

@@ -0,0 +1,51 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using FWindSoft.Data;
+
+namespace Com.FirmLib.UI.Common
+{
+    public class ProductTypeShowItem: BasePropertyChanged
+    {
+        /// <summary>
+        /// 品牌Id
+        /// </summary>
+        public string BrandId { get; set; } = string.Empty;
+        /// <summary>
+        /// 品牌名称
+        /// </summary>
+        public string BrandName { get; set; } = string.Empty;
+        /// <summary>
+        /// 产品Id
+        /// </summary>
+        public string ProductId { get; set; } = string.Empty;
+        /// <summary>
+        /// 产品名称
+        /// </summary>
+        public string ProductName { get; set; } = string.Empty;
+        /// <summary>
+        /// 产品类型Id
+        /// </summary>
+        public string ProductTypeId { get; set; } = string.Empty;
+        /// <summary>
+        /// 产品类型名称
+        /// </summary>
+        public string ProductTypeName { get; set; } = string.Empty;
+        /// <summary>
+        /// 种族编码
+        /// </summary>
+        public string FamilyCode { get; set; } = string.Empty;
+
+        public ProductTypeShowItem Clone()
+        {
+            return (ProductTypeShowItem)this.MemberwiseClone();
+        }
+
+        public override string ToString()
+        {
+            return $"{BrandName}-{ProductName}-{ProductTypeName}";
+        }
+    }
+}

+ 37 - 0
FirmLib/Com.FirmLib.UI/Common/Model/SelectAssetContext.cs

@@ -0,0 +1,37 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Com.FirmLib.UI.Common.Model
+{
+    public class SelectAssetContext
+    {
+        public SelectAssetContext()
+        {
+            ContainIds = new List<string>();
+            AddedItems = new List<AssetShowItem>();
+            ProjectId = string.Empty;
+            VenderId = string.Empty;
+        }
+        /// <summary>
+        /// 包含的Ids
+        /// </summary>
+        public List<string> ContainIds { get; set; }
+
+        /// <summary>
+        /// 增加的条目信息
+        /// </summary>
+        public List<AssetShowItem> AddedItems { get; set; }
+
+        /// <summary>
+        /// 项目Id
+        /// </summary>
+        public string ProjectId { get; set; }
+        /// <summary>
+        /// 厂商id
+        /// </summary>
+        public string VenderId { get; set; }
+    }
+}

+ 57 - 0
FirmLib/Com.FirmLib.UI/Common/Model/ShowDataItem.cs

@@ -0,0 +1,57 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using FWindSoft.Data;
+
+namespace Com.FirmLib.UI.Common
+{
+    /// <summary>
+    /// 产品线对象;品牌,产品,类型的基类
+    /// </summary>
+    public class ShowDataItem : BasePropertyChanged
+    {
+
+        private string m_Name;
+        /// <summary>
+        /// 名称
+        /// </summary>
+        public string Name
+        {
+            get { return this.m_Name; }
+            set
+            {
+                this.m_Name = value;
+                RaisePropertyChanged(nameof(this.Name));
+            }
+        }
+
+
+        private string m_Id;
+        /// <summary>
+        /// 存储Id
+        /// </summary>
+        public string Id
+        {
+            get { return this.m_Id; }
+            set
+            {
+                this.m_Id = value;
+                RaisePropertyChanged(nameof(this.Id));
+            }
+        }
+
+        /// <summary>
+        /// 种族编码
+        /// </summary>
+        public string FamilyCode { get; set; }
+
+        #region 重写方法
+        public override string ToString()
+        {
+            return Name ?? string.Empty;
+        }
+        #endregion
+    }
+}

+ 51 - 0
FirmLib/Com.FirmLib.UI/Common/Model/VenderItem.cs

@@ -0,0 +1,51 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Com.FirmLib.UI
+{
+    public class VenderItem
+    {
+        private VenderItem()
+        {
+        }
+
+        public static VenderItem CreateSupplierItem(string name)
+        {
+            return CreateItem("supplier", name);
+        }
+        public static VenderItem CreateInsuerItem(string name)
+        {
+            return CreateItem("insurer", name);
+        }
+        public static VenderItem CreateMaintainerItem(string name)
+        {
+            return CreateItem("maintainer", name);
+        }
+        /// <summary>
+        /// 根据id获取厂商信息【内部未实现,接口不友好,暂时不适用】
+        /// </summary>
+        /// <param name="venderId"></param>
+        /// <returns></returns>
+        public static VenderItem CreateItem(string venderId)
+        {
+            var item = new VenderItem();
+            item.Id = venderId;
+            return item;
+        }
+
+        private static VenderItem CreateItem(string type,string name)
+        {
+            return new VenderItem(){Type=type,Name=name};
+        }
+
+        /// <summary>
+        ///厂商类型
+        /// </summary>
+        public string Type { get; private set; }
+        public string Id { get; set; }
+        public string Name { get; set; }
+    }
+}

+ 42 - 0
FirmLib/Com.FirmLib.UI/Common/Model/VenderProjectParameter.cs

@@ -0,0 +1,42 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Com.FirmLib.UI.Common
+{
+    /// <summary>
+    /// 合同创建参数
+    /// </summary>
+    public class VenderProjectParameter
+    {
+        public VenderProjectParameter()
+        {
+        }
+        public VenderProjectParameter(string venderId)
+        {
+            VenderId = venderId;
+        }
+        public VenderProjectParameter(string venderId,string projectId)
+        {
+            VenderId = venderId;
+            ProjectId = projectId;
+        }
+        /// <summary>
+        /// 项目Id
+        /// </summary>
+        public string ProjectId { get; set; }
+        /// <summary>
+        /// 厂商Id
+        /// </summary>
+        public string VenderId { get; set; }
+        /// <summary>
+        /// 项目是否可用
+        /// </summary>
+        public bool ProjectValid
+        {
+            get { return !string.IsNullOrEmpty(ProjectId); }
+        }
+    }
+}

+ 63 - 0
FirmLib/Com.FirmLib.UI/Common/SingleInstance.cs

@@ -0,0 +1,63 @@
+/*-------------------------------------------------------------------------
+ * 功能描述:SingleInstance
+ * 作者:xulisong
+ * 创建时间: 2018/12/21 9:01:34
+ * 版本号:v1.0
+ *  -------------------------------------------------------------------------*/
+
+using FWindSoft.Wpf;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Reflection;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+
+namespace Com.FirmLib.UI
+{
+    public class WindowSingleInstance<T> where T:Window
+    {
+        private readonly Func<T> m_CreateInstance;
+        public WindowSingleInstance()
+        {
+            m_CreateInstance = CreateInstance;
+        }
+        public WindowSingleInstance(Func<T> createInstance)
+        {
+            m_CreateInstance = createInstance;
+        }
+
+        protected T CreateInstance()
+        {
+            Type type = typeof(T);
+            ConstructorInfo  construct = type.GetConstructor(Type.EmptyTypes);
+            if (construct == null)
+                return default(T);
+            return (T)construct.Invoke(null);
+        }
+        protected T m_Target;
+        /// <summary>
+        /// 目标信息
+        /// </summary>
+        public virtual T Target
+        {
+            get
+            {
+                if (m_Target == null||m_Target.IsDisposed())
+                {
+                    if (m_CreateInstance!=null)
+                    {
+                        m_Target = m_CreateInstance();
+                    }                  
+                }
+                else
+                {
+                    m_Target.Visibility = Visibility.Visible;
+                    m_Target.Activate();
+                }
+                return m_Target;
+            }
+        }      
+    }  
+}

+ 43 - 0
FirmLib/Com.FirmLib.UI/Common/TComparer.cs

@@ -0,0 +1,43 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Com.FirmLib.UI.Common
+{
+    /// <summary>
+    /// 比较元素是否相等
+    /// </summary>
+    /// <typeparam name="E"></typeparam>
+    public class TComparer<E> : IEqualityComparer<E>
+    {
+        private Func<E, E, bool> m_func;
+        public TComparer()
+        {
+        }
+        public TComparer(Func<E, E, bool> func)
+        {
+            m_func = func;
+        }
+        public bool Equals(E x, E y)
+        {
+            var tempFunc = m_func;
+            if (m_func != null)
+            {
+                return m_func(x, y);
+            }
+            if (x == null && y == null)
+                return true;
+            if (x == null || y == null)
+                return false;
+            return x.Equals(y);
+        }
+
+        public int GetHashCode(E obj)
+        {
+            return 0;
+        }
+    }
+}

+ 49 - 0
FirmLib/Com.FirmLib.UI/Common/TResult.cs

@@ -0,0 +1,49 @@
+/*-------------------------------------------------------------------------
+ * 功能描述:TResult
+ * 作者:xulisong
+ * 创建时间: 2019/6/27 10:50:29
+ * 版本号:v1.0
+ *  -------------------------------------------------------------------------*/
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Com.FirmLib.UI.Common
+{
+    public class TResult
+    {
+        public TResult(bool isSuccessed)
+        {
+            IsSuccessed = isSuccessed;
+        }
+        public TResult(bool isSuccessed,string message):this(isSuccessed)
+        {
+            Message = message;
+        }
+        public bool IsSuccessed { get;private set; }
+        public string Id { get; set; }
+        public string Message { get; set; }
+
+        /// <summary>
+        /// tag
+        /// </summary>
+        public object Tag { get; set; }
+
+        public static implicit operator bool(TResult result)
+        {
+            return result.IsSuccessed;
+        }
+        public static implicit operator TResult(bool d)
+        {
+            return new TResult(d);
+        }
+
+        public override string ToString()
+        {
+            return Message??string.Empty;
+        }
+    }
+}

+ 33 - 0
FirmLib/Com.FirmLib.UI/Common/TryCatchWrapper.cs

@@ -0,0 +1,33 @@
+/*-------------------------------------------------------------------------
+ * 功能描述:TryCatchWrapper
+ * 作者:xulisong
+ * 创建时间: 2018/12/20 11:35:30
+ * 版本号:v1.0
+ *  -------------------------------------------------------------------------*/
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Com.FirmLib.UI
+{
+    /// <summary>
+    /// 异常处理包装器
+    /// </summary>
+    public class TryCatchWrapper
+    {
+        public static void Handled(Action action)
+        {
+            try
+            {
+                action?.Invoke();
+            }
+            catch (Exception e)
+            {
+                MessageTipEx.Show(e);
+            }
+        }
+    }
+}

+ 70 - 0
FirmLib/Com.FirmLib.UI/Common/UrlFileKeyParse.cs

@@ -0,0 +1,70 @@
+/*-------------------------------------------------------------------------
+ * 功能描述:UrlFileKeyParse
+ * 作者:xulisong
+ * 创建时间: 2019/4/28 10:26:25
+ * 版本号:v1.0
+ *  -------------------------------------------------------------------------*/
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using FirmHttpDao;
+using Newtonsoft.Json;
+using SAGA.DotNetUtils.Data;
+
+namespace Com.FirmLib.UI
+{
+    public class UrlFileKeyParse
+    {
+        /// <summary>
+        /// 创建文件key
+        /// </summary>
+        /// <param name="urlFile"></param>
+        /// <returns></returns>
+        public static string CreatKey(UrlFile urlFile)
+        {
+            if (urlFile == null)
+                return string.Empty;
+            return JsonConvert.SerializeObject(urlFile);
+        }
+        /// <summary>
+        /// 解析文件key
+        /// </summary>
+        /// <param name="urlKey"></param>
+        /// <returns></returns>
+        public static UrlFile ParseKey(string urlKey)
+        {
+            UrlFile urlFile = null;
+            try
+            {
+                urlFile = JsonConvert.DeserializeObject<UrlFile>(urlKey);
+            }
+            catch (Exception)
+            {
+            }
+            if (urlFile == null)
+            {
+                urlFile = new UrlFile();
+                urlFile.FileType = "image";
+                urlFile.Key = urlKey;
+                urlFile.SystemId = BllHttpSetting.Instance.Default.SystemId;
+            }
+            return urlFile;
+        }
+        /// <summary>
+        /// 创建UrlFile文件
+        /// </summary>
+        /// <param name="fileKey"></param>
+        /// <returns></returns>
+        public static UrlFile CreateImageUrlFile(string fileKey)
+        {
+            UrlFile urlFile = new UrlFile();
+            urlFile.FileType = "image";
+            urlFile.Key = fileKey;
+            urlFile.SystemId = BllHttpSetting.Instance.Default.SystemId;
+            return urlFile;
+        }
+    }
+}

+ 171 - 0
FirmLib/Com.FirmLib.UI/Common/WatchParameter.cs

@@ -0,0 +1,171 @@
+using System;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Com.FirmLib.UI
+{
+    /// <summary>
+    /// 监视参数
+    /// </summary>
+    public class WatchParameter
+    {
+        public WatchParameter()
+        { }
+        public WatchParameter(string parameterId)
+        {
+            this.Id = parameterId;
+        }
+        /// <summary>
+        /// 关联父类
+        /// </summary>
+        public WatchParameters Parent { get; internal set; }
+        /// 参数Id
+        /// </summary>
+        public string Id { get; set; }
+        /// <summary>
+        /// 更新时间
+        /// </summary>
+        public string UpdateTime { get; set; }
+
+        /// <summary>
+        /// 时间是否有效【如果时间有效则使用相关参数】
+        /// </summary>
+        public bool ValidTime { get { return !string.IsNullOrEmpty(this.UpdateTime); } }
+    }
+    /// <summary>
+    /// 监视参数集合
+    /// </summary>
+    public class WatchParameters  : KeyedCollection<string, WatchParameter>
+    {
+       
+        
+        #region 重写方法
+        protected override string GetKeyForItem(WatchParameter item)
+        {
+            return item.Id;
+        }
+        protected override void ClearItems()
+        {
+            foreach (var item in this)
+            {
+                if (item != null)
+                {
+                    item.Parent = null;
+                }
+
+            }
+            base.ClearItems();
+        }
+        protected override void InsertItem(int index, WatchParameter item)
+        {
+            base.InsertItem(index, item);
+            item.Parent = this;
+        }
+        protected override void RemoveItem(int index)
+        {
+            if (this[index] != null)
+            {
+                this[index].Parent = null;
+            }
+            base.RemoveItem(index);
+        }
+        protected override void SetItem(int index, WatchParameter item)
+        {
+
+            base.SetItem(index, item);
+            item.Parent = this;
+        }
+
+        public void AddRange(IEnumerable<WatchParameter> items)
+        {
+            foreach (var item in items)
+            {
+                this.CheckAdd(item);
+            }
+        }
+        #endregion
+        /// <summary>
+        /// 是否是没有变化
+        /// </summary>
+        public bool IsEmpty { get { return this.Count == 0; } }
+        /// <summary>
+        /// 根据参数id获取修改时间字符串
+        /// </summary>
+        /// <param name="parameterId"></param>
+        /// <param name="time"></param>
+        /// <returns></returns>
+        public bool SetParameterTime(string parameterId,string time)
+        {
+            var paramter = this.FirstOrDefault(p => p.Id == parameterId);
+            if (paramter == null)
+                return false;
+            paramter.UpdateTime = time;
+            return true;
+        }
+        public void SetAllParameterTime(string time)
+        {
+            foreach (var item in this)
+            {
+                item.UpdateTime = time;
+            }
+        }
+        /// <summary>
+        /// 合并参数
+        /// </summary>
+        /// <param name="parameters"></param>
+        public void Merge(WatchParameters parameters)
+        {
+            foreach (var item in parameters)
+            {
+                this.CheckAdd(item);
+            }
+        }
+        /// <summary>
+        /// 获取相关参数
+        /// </summary>
+        /// <param name="parameterId"></param>
+        /// <returns></returns>
+        public WatchParameter GetParameter(string parameterId)
+        {
+            if (this.Contains(parameterId))
+            {
+                return this[parameterId];
+            }
+            return null;
+        }
+
+        public void AddAndUpdate(WatchParameter parameter)
+        {
+             if (this.Contains(GetKeyForItem(parameter)))
+            {
+                var existItem = this.Items.FirstOrDefault(w => GetKeyForItem(w) == GetKeyForItem(parameter));
+                var index = this.IndexOf(existItem);
+                this[index] = parameter;
+            }
+            else
+            {
+                this.Add(parameter);
+            }
+        }
+        /// <summary>
+        /// 检测并添加【如果没有则加入,并返回true,如果存在则返回false】
+        /// </summary>
+        /// <param name="parameter"></param>
+        /// <returns></returns>
+        public bool CheckAdd(WatchParameter parameter)
+        {
+            if (this.Contains(GetKeyForItem(parameter)))
+            {
+                return false;
+            }
+            else
+            {
+                this.Add(parameter);
+                return true;
+            }
+        }
+    }
+}

+ 41 - 0
FirmLib/Com.FirmLib.UI/Extension/ConverterExtension.cs

@@ -0,0 +1,41 @@
+using Com.FirmLib.Entity;
+using Com.FirmLib.UI.Common;
+using Com.FirmLib.UI.Common.Model;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Com.FirmLib.UI
+{
+    public  static class ConverterExtension
+    {
+        public static ProductTypeShowItem ConverterTypeShowItem(this ProductTypeDetailItem detailItem)
+        {
+            var productTypeShowItem = new ProductTypeShowItem();
+
+            productTypeShowItem.BrandId = detailItem.BrandId;
+            productTypeShowItem.BrandName = detailItem.BrandName;
+            productTypeShowItem.ProductId = detailItem.ProductId;
+            productTypeShowItem.ProductName = detailItem.ProductName;
+            productTypeShowItem.ProductTypeId = detailItem.ProductTypeId;
+            productTypeShowItem.ProductTypeName = detailItem.ProductTypeName;
+
+            return productTypeShowItem;
+        }
+        public static ProductTypeShowItem ConverterTypeShowItemByAsset(this AssetShowItem assetItem)
+        {
+            var productTypeShowItem = new ProductTypeShowItem();
+
+            productTypeShowItem.BrandId = assetItem.Brand;
+            productTypeShowItem.BrandName = assetItem.Brand;
+            productTypeShowItem.ProductId = assetItem.Product;
+            productTypeShowItem.ProductName = assetItem.Product;
+            productTypeShowItem.ProductTypeId = assetItem.TypeId;
+            productTypeShowItem.ProductTypeName = assetItem.Type;
+
+            return productTypeShowItem;
+        }
+    }
+}

+ 48 - 0
FirmLib/Com.FirmLib.UI/Extension/MessageTipExtension.cs

@@ -0,0 +1,48 @@
+/*-------------------------------------------------------------------------
+ * 功能描述:MessageTipExtension
+ * 作者:xulisong
+ * 创建时间: 2018/12/19 14:01:42
+ * 版本号:v1.0
+ *  -------------------------------------------------------------------------*/
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using FWindSoft;
+using FWindSoft.Wpf;
+
+namespace Com.FirmLib.UI
+{
+    public class MessageTipEx
+    {
+        public static void Show(Window owner, Exception ex)
+        {
+            string result = ex.Message;
+
+            #region 异常详细信息
+            #if DEBUG
+            StringBuilder builder = new StringBuilder();
+            builder.Append(ex.Message);
+            builder.Append(Environment.NewLine);
+            builder.Append(ex.StackTrace.ToString());
+            result = builder.ToString(); 
+            #endif
+            #endregion
+
+            if (ex is HttpApiException httpEx)
+            {
+                result = httpEx.ToString();
+            }
+
+            MessageTip.Show(owner,result,"错误提示");
+        }
+
+        public static void Show(Exception ex)
+        {
+            Show(null, ex);
+        }
+    }
+}

+ 47 - 0
FirmLib/Com.FirmLib.UI/Extension/TreeNavigationExtension.cs

@@ -0,0 +1,47 @@
+using FWindSoft.Data;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Com.FirmLib.UI
+{
+    /// <summary>
+    /// 树形导航类扩展
+    /// </summary>
+    public static class TreeNavigationExtension
+    {
+        /// <summary>
+        /// 获取指定级别的子数据
+        /// </summary>
+        /// <typeparam name="T"></typeparam>
+        /// <param name="root"></param>
+        /// <param name="level"></param>
+        /// <returns></returns>
+        public static List<TreeNavigationItem<T>> GetSpecifyLevelData<T>(this TreeNavigation<T> root,int level)
+        {
+            var useLevel = level;
+            List<TreeNavigationItem<T>> items = root.Items.ToList();
+            while (useLevel > 1)
+            {
+                items = items.SelectMany(i => i.Nodes).ToList();
+
+                useLevel--;
+            }
+            return items;
+        }
+        /// <summary>
+        /// 获取最底级数据
+        /// </summary>
+        /// <typeparam name="T"></typeparam>
+        /// <param name="root"></param>
+        /// <returns></returns>
+        public static List<TreeNavigationItem<T>> GetLastLevelData<T>(this TreeNavigation<T> root)
+        {
+            List<TreeNavigationItem<T>> items = new List<TreeNavigationItem<T>>();
+            items = root.Items.SelectMany(c => c.GetLeaves()).ToList();
+            return items;
+        }
+    }
+}

BIN
FirmLib/Com.FirmLib.UI/Images/修改.jpg


+ 22 - 0
FirmLib/Com.FirmLib.UI/Insuer/Model/InsuerParameter.cs

@@ -0,0 +1,22 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Com.FirmLib.UI.Common;
+
+namespace Com.FirmLib.UI.Insuer.Model
+{
+    public class InsuerParameter
+    {
+        public InsuerParameter()
+        {
+            Insuer = new IdNameItem();
+            Project = new IdNameItem();
+            Policy = new IdNameItem();
+        }
+        public IdNameItem Insuer { get; private set; }
+        public IdNameItem Project { get;private set; }
+        public IdNameItem Policy { get; private set; }
+    }
+}

+ 59 - 0
FirmLib/Com.FirmLib.UI/Insuer/Model/InsuerShowItem.cs

@@ -0,0 +1,59 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using FWindSoft.Data;
+
+namespace Com.FirmLib.UI.Insuer.Model
+{
+    public class InsuerShowItem:BasePropertyChanged
+    {
+        /// <summary>
+        /// 保险商Id
+        /// </summary>
+        public string Id { get; set; }
+
+        private string m_Name;
+        /// <summary>
+        /// 保险商名称
+        /// </summary>
+        public string Name
+        {
+            get { return this.m_Name; }
+            set
+            {
+                this.m_Name = value;
+                RaisePropertyChanged(() => this.Name);
+            }
+        }
+
+        private string m_Url;
+        /// <summary>
+        /// 保险商网址
+        /// </summary>
+        public string Url
+        {
+            get { return this.m_Url; }
+            set
+            {
+                this.m_Url = value;
+                RaisePropertyChanged(() => this.Url);
+            }
+        }
+
+        private int m_RefProjectCount;
+        /// <summary>
+        /// 关联项目数量
+        /// </summary>
+        public int RefProjectCount
+        {
+            get { return this.m_RefProjectCount; }
+            set
+            {
+                this.m_RefProjectCount = value;
+                RaisePropertyChanged(() => this.RefProjectCount);
+            }
+        }
+    }
+}

+ 62 - 0
FirmLib/Com.FirmLib.UI/Insuer/Model/InsuerUtils.cs

@@ -0,0 +1,62 @@
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Com.FirmLib.Bll;
+using FirmHttpDao;
+using FWindSoft.DataFramework;
+using FWindSoft.Wpf;
+using Microsoft.Win32;
+
+namespace Com.FirmLib.UI.Insuer.Model
+{
+    /// <summary>
+    /// 保险上方法
+    /// </summary>
+    public class InsuerUtils
+    {
+        public static void LoadPolicyFile(string fileKey)
+        {
+            try
+            {
+                if (string.IsNullOrEmpty(fileKey))
+                {
+                    MessageTip.Show("没有关联保单文件");
+                    return;
+                }
+                SaveFileDialog sflg = new SaveFileDialog();
+                sflg.Title = "下载保单";
+                //解析名字
+                  string name = BllFactory<FileBll>.Instance.GetSuffix(fileKey);
+                if (string.IsNullOrEmpty(name))
+                {
+                    name = fileKey;
+                }
+                sflg.FileName = name;
+                if (sflg.ShowDialog() != true) return;
+                string url =
+                    BllFactory<FileBll>.Instance.CreateFileUrl(BllHttpSetting.Instance.Default, fileKey);
+                var flag = BllFactory<FileBll>.Instance.DownLoadFile(url, sflg.FileName);
+
+                if (flag)
+                {
+                    MessageTip.Show("下载保单成功");
+                }
+                else
+                {
+                    MessageTip.Show("下载保单失败");
+                }
+
+            }
+            catch (Exception ex)
+            {
+
+                MessageTipEx.Show(ex);
+            }
+
+        }
+    }
+
+}

+ 143 - 0
FirmLib/Com.FirmLib.UI/Insuer/Model/InsureAssetShowItem.cs

@@ -0,0 +1,143 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using FWindSoft.Data;
+
+namespace Com.FirmLib.UI.Insuer.Model
+{
+    public class InsureAssetShowItem:BasePropertyChanged
+    {
+        public InsureAssetShowItem()
+        {
+            this.IsEnabled = true;
+        }
+        #region 带勾选标志
+
+        private bool m_IsChecked;
+        /// <summary>
+        /// 是否选中
+        /// </summary>
+        public bool IsChecked
+        {
+            get { return this.m_IsChecked; }
+            set
+            {
+                this.m_IsChecked = value;
+                RaisePropertyChanged(nameof(this.IsChecked));
+            }
+        }
+
+
+        private bool m_IsEnabled;
+        /// <summary>
+        /// 标志数据是否可以修改
+        /// </summary>
+        public bool IsEnabled
+        {
+            get { return this.m_IsEnabled; }
+            set
+            {
+                this.m_IsEnabled = value;
+                RaisePropertyChanged(nameof(this.IsEnabled));
+            }
+        }
+        #endregion
+
+        /// <summary>
+        /// 项目Id
+        /// </summary>
+        public string ProjectId { get; set; }
+        /// <summary>
+        /// 设备编码
+        /// </summary>
+        public string FamilyCode { get; set; }
+
+        private string m_AssetNo;
+        /// <summary>
+        /// 资产编号
+        /// </summary>
+        public string AssetNo
+        {
+            get { return this.m_AssetNo; }
+            set
+            {
+                this.m_AssetNo = value;
+                RaisePropertyChanged(() => this.AssetNo);
+            }
+        }
+
+        private BaseAssetItem m_AssetItem;
+        /// <summary>
+        /// 资产基础信息
+        /// </summary>
+        public BaseAssetItem AssetItem
+        {
+            get { return this.m_AssetItem; }
+            set
+            {
+                this.m_AssetItem = value;
+                RaisePropertyChanged(() => this.AssetItem);
+            }
+        }
+
+        private string m_InsurancePolicyNo;
+        /// <summary>
+        /// 保单编号
+        /// </summary>
+        public string InsurancePolicyNo
+        {
+            get { return this.m_InsurancePolicyNo; }
+            set
+            {
+                this.m_InsurancePolicyNo = value;
+                RaisePropertyChanged(() => this.InsurancePolicyNo);
+            }
+        }
+
+
+        private string m_EndDate;
+        /// <summary>
+        /// 保单截止日期
+        /// </summary>
+        public string EndDate
+        {
+            get { return this.m_EndDate; }
+            set
+            {
+                this.m_EndDate = value;
+                RaisePropertyChanged(() => this.EndDate);
+            }
+        }
+
+        private string m_PolicyFile;
+        /// <summary>
+        /// 保单文件
+        /// </summary>
+        public string PolicyFile
+        {
+            get { return this.m_PolicyFile; }
+            set
+            {
+                this.m_PolicyFile = value;
+                RaisePropertyChanged(() => this.PolicyFile);
+            }
+        }
+
+
+        private string m_InsuerName;
+        /// <summary>
+        /// 保险商名称
+        /// </summary>
+        public string InsuerName
+        {
+            get { return this.m_InsuerName; }
+            set
+            {
+                this.m_InsuerName = value;
+                RaisePropertyChanged(nameof(this.InsuerName));
+            }
+        }
+    }
+}

+ 82 - 0
FirmLib/Com.FirmLib.UI/Insuer/Model/PolicyShowItem.cs

@@ -0,0 +1,82 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using FWindSoft.Data;
+
+namespace Com.FirmLib.UI.Insuer.Model
+{
+    /// <summary>
+    /// 保单信息
+    /// </summary>
+    public class PolicyShowItem:BasePropertyChanged
+    {
+        /// <summary>
+        /// 项目保单信息
+        /// </summary>
+        public string ProjectId { get; set; }
+        /// <summary>
+        /// 保险ID
+        /// </summary>
+        public string InsuerId { get; set; }
+
+        private string m_PolicyNo;
+        /// <summary>
+        /// 保单编号
+        /// </summary>
+        public string PolicyNo
+        {
+            get { return this.m_PolicyNo; }
+            set
+            {
+                this.m_PolicyNo = value;
+                RaisePropertyChanged(() => this.PolicyNo);
+            }
+        }
+
+        private string m_EndDate;
+        /// <summary>
+        /// 保单截止日期
+        /// </summary>
+        public string EndDate
+        {
+            get { return this.m_EndDate; }
+            set
+            {
+                this.m_EndDate = value;
+                RaisePropertyChanged(() => this.EndDate);
+            }
+        }
+
+
+        private int m_RefAssetCount;
+        /// <summary>
+        /// 关联资产数量
+        /// </summary>
+        public int RefAssetCount
+        {
+            get { return this.m_RefAssetCount; }
+            set
+            {
+                this.m_RefAssetCount = value;
+                RaisePropertyChanged(() => this.RefAssetCount);
+            }
+        }
+
+
+        private string m_PolicyFile;
+        /// <summary>
+        /// 保单文件
+        /// </summary>
+        public string PolicyFile
+        {
+            get { return this.m_PolicyFile; }
+            set
+            {
+                this.m_PolicyFile = value;
+                RaisePropertyChanged(nameof(this.PolicyFile));
+            }
+        }
+    }
+}

+ 59 - 0
FirmLib/Com.FirmLib.UI/Insuer/Model/PolicyUpdateContext.cs

@@ -0,0 +1,59 @@
+using Com.FirmLib.UI.Common;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Com.FirmLib.UI.Insuer.Model
+{
+    public class PolicyUpdateContext
+    {
+        /*
+         * 初始化的时候使用列表中的数据;
+         * 对比的时候,使用物理世界中存储的保单信息进行对比
+         * 要不要保单保存到,厂商数据库。保险商文件,截止日期相关信息,添加到厂商数据库
+         * 和资产关联的只有保险单号的id
+         */
+        public PolicyUpdateContext()
+        {
+            InsuerParameter = new InsuerParameter();
+        }
+         /// <summary>
+         /// 关联的保险商项目信息
+         /// </summary>
+         public InsuerParameter InsuerParameter { get; private set; }
+        /// <summary>
+        /// 是否可执行
+        /// </summary>
+        public bool CanExecute { get; set; }
+        /// <summary>
+        /// 资产Id
+        /// </summary>
+        public string AssetId { get; set; }
+        /// <summary>
+        /// 保险单号
+        /// </summary>
+        public string PolicyNo { get; set; }
+        /// <summary>
+        /// 失效日期【yyyyMMddhhmmss】
+        /// </summary>
+        public string ExpiryDate { get; set; }
+        /// <summary>
+        /// 保险文件
+        /// </summary>
+        public string PolicyFile { get; set; }
+        /// <summary>
+        /// 使用编辑类型
+        /// </summary>
+        public bool UseEditType { get; set; }
+        /// <summary>
+        /// 编辑方式
+        /// </summary>
+        public EditType EditType { get; set; }
+        /// <summary>
+        /// 生效时间
+        /// </summary>
+        public string EffectiveTime { get; set; }
+    }
+}

+ 333 - 0
FirmLib/Com.FirmLib.UI/Insuer/VmInsuerAssetSelector.cs

@@ -0,0 +1,333 @@
+
+///////////////////////////////////////////////////////////////////////////////
+//文件名称: VmInsuerAssetSelecter.cs
+//文件描述: VmInsuerAssetSelecter.cs
+//创 建 者: xls
+//创建日期: 2018/9/18 9:11:18
+//版 本 号:1.0.0.0
+////////////////////////////////////////////////////////////////////////////////
+
+using System;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using Com.FirmLib.Bll;
+using Com.FirmLib.UI.BllCommon;
+using Com.FirmLib.UI.Common.Model;
+using FWindSoft.DataFramework;
+using FWindSoft.MVVM;
+using FWindSoft.Wpf;
+
+namespace Com.FirmLib.UI.Insuer
+{
+    public class VmInsuerAssetSelector : BaseViewModel
+    {
+        public VmInsuerAssetSelector()
+        {
+            Init();
+            
+        }
+
+        private void Init()
+        {
+            SelectedAssetItems = new List<AssetShowItem>();
+            ExistAssets = new List<string>();
+            //InitSelector();
+        }
+        public void Init(LoadParameter parameter)
+        {
+            SelectAssetContext context = parameter.Parameter as SelectAssetContext;
+            if (context == null)
+                return;
+            Context = context;
+            ProjectId = context.ProjectId;
+            VenderId = context.VenderId;
+            VenderName =BllFactory<InsuerBll>.Instance.GetItem(context.VenderId)?.Name??string.Empty;
+            ExistAssets = new List<string>(context.ContainIds);
+            InitSelector();
+            CalcCheckedCount();
+        }
+        #region 属性相关  
+        /// <summary>
+        /// 厂商名称
+        /// </summary>
+        private string VenderName { get; set; }
+        /// <summary>
+        /// 厂商id
+        /// </summary>
+        public string VenderId { get; set; }
+        /// <summary>
+        /// 关联项目信息
+        /// </summary>
+        private string ProjectId { get; set; }
+        /// <summary>
+        /// 存在资产信息
+        /// </summary>
+        private List<string> ExistAssets { get; set; }
+        private SelectAssetContext Context { get; set; }
+        /// <summary>
+        /// 当前保单中选中资产
+        /// </summary>
+        public List<AssetShowItem> SelectedAssetItems { get; set; }
+
+        private ObservableCollection<AssetShowItem> m_RecommendAssetItems;
+        /// <summary>
+        /// 推荐资产
+        /// </summary>
+        public ObservableCollection<AssetShowItem> RecommendAssetItems
+        {
+            get { return this.m_RecommendAssetItems; }
+            set
+            {
+                this.m_RecommendAssetItems = value;
+                RaisePropertyChanged(nameof(this.RecommendAssetItems));
+            }
+        }
+
+
+        private ObservableCollection<AssetShowItem> m_AllAssetItems;
+        /// <summary>
+        /// 全部资产
+        /// </summary>
+        public ObservableCollection<AssetShowItem> AllAssetItems
+        {
+            get { return this.m_AllAssetItems; }
+            set
+            {
+                this.m_AllAssetItems = value;
+                RaisePropertyChanged(nameof(this.AllAssetItems));
+            }
+        }
+
+
+        private string m_SelectedAssetCount;
+        /// <summary>
+        /// 选中资产数量
+        /// </summary>
+        public string SelectedAssetCount
+        {
+            get { return this.m_SelectedAssetCount; }
+            set
+            {
+                this.m_SelectedAssetCount = value;
+                RaisePropertyChanged(nameof(this.SelectedAssetCount));
+            }
+        }
+
+        #endregion
+
+        #region 命令相关
+
+        /// <summary>
+        /// 确定按钮
+        /// </summary>
+        /// <param name="parameter"></param>
+        [Command]
+        public void EnsureCommand(object parameter)
+        {
+            try
+            {
+                if (Context != null)
+                {
+                    Context.AddedItems.AddRange(SelectedAssetItems);
+                }
+                Window win = parameter as Window;
+                if (win != null)
+                {
+                    win.DialogResult = true;
+                }
+
+            }
+            catch (Exception ex)
+            {
+
+                MessageTipEx.Show(ex);
+            }
+        }
+        public bool CanEnsureCommand(object parameter)
+        {
+            return true;
+        }
+        /// <summary>
+        /// 选择资产变化
+        /// </summary>
+        /// <param name="parameter"></param>
+        [Command]
+        public void SelectedAssetChanged(object parameter)
+        {
+            try
+            {
+                AssetShowItem item = parameter as AssetShowItem;
+                if (item == null)
+                    return;
+                var currentItem = this.SelectedAssetItems.FirstOrDefault(c => c.Id == item.Id);
+                bool isChecked = item.IsChecked;
+                if (isChecked && currentItem == null)
+                {
+                    this.SelectedAssetItems.Add(item);
+                }
+                else if (!isChecked && currentItem != null)
+                {
+                    this.SelectedAssetItems.Remove(currentItem);
+                }
+                CalcCheckedCount();
+            }
+            catch (Exception ex)
+            {
+
+               MessageTipEx.Show(ex);
+            }
+
+        }
+        public bool CanSelectedAssetChanged(object parameter)
+        {
+            AssetShowItem item = parameter as AssetShowItem;
+            if (item == null)
+                return false;
+            return item.IsEnabled;
+        }
+
+
+        /// <summary>
+        /// tab切换按钮【联动两边选中项】
+        /// </summary>
+        /// <param name="parameter"></param>
+        [Command]
+        public void TabChangedCommand(object parameter)
+        {
+            try
+            {
+                //子控件,包含相同的事件也会触发
+                int index = Convert.ToInt32(parameter);
+                var useCollection = index == 0 ? RecommendAssetItems : AllAssetItems;
+                if (useCollection == null)
+                    return;
+                foreach (var item in useCollection)
+                {                  
+                     item.IsChecked = ExistAssetId(item.Id);
+                }
+            }
+            catch (Exception ex)
+            {
+
+                MessageTipEx.Show(ex);
+            }
+        }
+        public bool CanTabChangedCommand(object parameter)
+        {
+            return true;
+        }
+
+        #endregion
+
+        #region 私有方法
+        private void CalcCheckedCount()
+        {
+            this.SelectedAssetCount = (ExistAssets.Count + this.SelectedAssetItems.Count).ToString();
+        }
+        private bool ExistAssetId(string no)
+        {
+           return  this.SelectedAssetItems.Any(asset => asset.Id == no);
+        }
+        private bool ExistInOrigin(string no)
+        {
+            return this.ExistAssets.Any(id => id == no);
+        }
+        private void InitSelector()
+        {
+            RecommendAssetSelecter = new AssetSelector();
+            AllAssetSelecter = new AssetSelector();
+            RecommendAssetSelecter.Refresh = (selector) =>
+            {
+                LoadRecommendAssets(selector, ProjectId, VenderId);
+            };
+            AllAssetSelecter.Refresh = (selector) =>
+            {
+                LoadAllAssets(selector, ProjectId, string.Empty);
+            };
+            RecommendAssetSelecter.FilterControl.Refresh();
+            AllAssetSelecter.FilterControl.Refresh();
+        }
+        private void LoadRecommendAssets(AssetSelector selector,string projectId,string venderId)
+        {
+            string prefix = selector.FilterControl.FilterSetting["LocalName"].ToString();
+            int startIndex = Math.Max((selector.CurrentPageIndex - 1), 0) * AssetManager.PerPageCount;
+            var venderItem = VenderItem.CreateInsuerItem(VenderName);
+            venderItem.Id = venderId;
+            SearchResultList<AssetShowItem> items = AssetManager.GetRecommendShowItems(projectId, prefix, startIndex, venderItem); ;
+            foreach (var item in items)
+            {
+                item.IsChecked = ExistInOrigin(item.Id);
+                if (item.IsChecked)
+                {
+                    item.IsEnabled = false;
+                }
+                else
+                {
+                    item.IsChecked = ExistAssetId(item.Id);
+                }
+            }
+ 
+            selector.PageCount =CommomUtils.CalcPageCount(items.TotalCount,AssetManager.PerPageCount) ;
+            RecommendAssetItems = new ObservableCollection<AssetShowItem>(items);     
+        }
+        private void LoadAllAssets(AssetSelector selector, string projectId, string venderId)
+        {
+            string prefix = selector.FilterControl.FilterSetting["LocalName"].ToString();
+
+            int startIndex = Math.Max((selector.CurrentPageIndex - 1), 0) * AssetManager.PerPageCount;
+            SearchResultList<AssetShowItem> items = AssetManager.GetShowItems(projectId, prefix, startIndex); ;
+            foreach (var item in items)
+            {
+                item.IsChecked = ExistInOrigin(item.Id);
+                if (item.IsChecked)
+                {
+                    item.IsEnabled = false;
+                }
+                else
+                {
+                    item.IsChecked = ExistAssetId(item.Id);
+                }
+            }
+            selector.PageCount =CommomUtils.CalcPageCount(items.TotalCount,AssetManager.PerPageCount) ;
+            AllAssetItems = new ObservableCollection<AssetShowItem>(items);
+        }
+        #endregion
+
+        #region 推荐资产 列表相关
+        private AssetSelector m_RecommendAssetSelecter;
+        /// <summary>
+        /// 推荐资产
+        /// </summary>
+        public AssetSelector RecommendAssetSelecter
+        {
+            get { return this.m_RecommendAssetSelecter; }
+            private set
+            {
+                this.m_RecommendAssetSelecter = value;
+                RaisePropertyChanged(nameof(this.RecommendAssetSelecter));
+            }
+        }
+        #endregion
+
+        #region 全部资产列表相关
+        private AssetSelector m_AllAssetSelecterr;
+        /// <summary>
+        /// 全部资产选择器
+        /// </summary>
+        public AssetSelector AllAssetSelecter
+        {
+            get { return this.m_AllAssetSelecterr; }
+            private set
+            {
+                this.m_AllAssetSelecterr = value;
+                RaisePropertyChanged(nameof(this.AllAssetSelecter));
+            }
+        }
+        #endregion
+    }
+}

+ 202 - 0
FirmLib/Com.FirmLib.UI/Insuer/VmInsuerBaseInfo.cs

@@ -0,0 +1,202 @@
+
+///////////////////////////////////////////////////////////////////////////////
+//文件名称: VmInsuerBaseInfo.cs
+//文件描述: 保险商基本信息
+//创 建 者: xls
+//创建日期: 2018/5/24 21:41:29
+//版 本 号:1.0.0.0
+////////////////////////////////////////////////////////////////////////////////
+
+using System;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using Com.FirmLib.Bll;
+using Com.FirmLib.UI.Insuer.Model;
+using FWindSoft.DataFramework;
+using FWindSoft.MVVM;
+using FWindSoft.Wpf;
+
+namespace Com.FirmLib.UI.Insuer
+{
+    public class VmInsuerBaseInfo : BaseViewModel
+    {
+        public VmInsuerBaseInfo()
+        {
+            Init();
+        }
+
+        private void Init()
+        {
+            #region 测试数据
+            //Insuers = new ObservableCollection<InsuerShowItem>();
+            //for (int i = 0; i < 10; i++)
+            //{
+            //    var tempItem = new InsuerShowItem() { Name = "保险商" + (i + 1) };
+            //    tempItem.Id = (i + 1).ToString();
+            //    tempItem.Url = "baidu.com";
+            //    tempItem.RefProjectCount = 1;
+            //    Insuers.Add(tempItem);
+            //} 
+            #endregion
+            //LoadItems();
+        }
+        public void Init(LoadParameter parameter)
+        {
+            LoadItems();
+
+        }
+        #region 属性相关
+
+
+
+        private ObservableCollection<InsuerShowItem> m_Insuers;
+        /// <summary>
+        /// 保险商信息
+        /// </summary>
+        public ObservableCollection<InsuerShowItem> Insuers
+        {
+            get { return this.m_Insuers; }
+            set
+            {
+                this.m_Insuers = value;
+                RaisePropertyChanged(() => this.Insuers);
+            }
+        }
+        #endregion
+
+        #region 命令相关
+        /// <summary>
+        /// 添加保险商
+        /// </summary>
+        /// <param name="parameter"></param>
+        [Command]
+        public void AddCommand(object parameter)
+        {
+            try
+            {
+                WinInsuerEditor win = new WinInsuerEditor();
+                win.Owner = this.GetWindow();
+                if (win.ShowDialog() == true)
+                {
+                    if (win.IsManage)
+                    {
+                        WinInsuerInfo winInsuerInfo = new WinInsuerInfo();
+                        LoadParameter.StartParameter(winInsuerInfo, new LoadParameter(win.NewId));
+                        winInsuerInfo.Show(this.GetNavigationBar());
+                    }
+                    else
+                    {
+                        //todo 刷新界面
+                        LoadItems();
+                    }
+                }
+            }
+            catch (Exception ex)
+            {
+
+                MessageTipEx.Show(ex);
+            }
+        }
+        public bool CanAddCommand(object parameter)
+        {
+            return true;
+        }
+
+        /// <summary>
+        /// 删除生产厂家
+        /// </summary>
+        /// <param name="parameter"></param>
+        [Command]
+        public void DeleteCommand(object parameter)
+        {
+            try
+            {
+                var item = parameter as InsuerShowItem;
+                if (item == null)
+                    return;
+                var result = MessageTip.Show(this.GetWindow(), "是否要删除", "提示", MessageBoxButton.YesNo);
+                if (result == MessageBoxResult.Yes)
+                {
+                    //todo 网络api处理
+                    DeleteItem(item.Id);
+                    //todo 刷新窗体
+                    LoadItems();
+                    //todo 删除操作
+                    //Sellers.Remove(item);
+                }
+            }
+            catch (Exception ex)
+            {
+                MessageTipEx.Show(ex);
+            }
+        }
+        public bool CanDeleteCommand(object parameter)
+        {
+            return true;
+        }
+
+        /// <summary>
+        /// 管理命令
+        /// </summary>
+        /// <param name="parameter"></param>
+        [Command]
+        public void ManageCommand(object parameter)
+        {
+            try
+            {
+                var item = parameter as InsuerShowItem;
+                WinInsuerInfo win = new WinInsuerInfo();
+                LoadParameter.StartParameter(win, new LoadParameter(item.Id));
+                win.Show(this.GetNavigationBar());
+            }
+            catch (Exception ex)
+            {
+                MessageTipEx.Show(ex);
+            }
+        }
+        public bool CanManageCommand(object parameter)
+        {
+            return true;
+        }
+        #endregion
+
+        /// <summary>
+        /// 加载数据
+        /// </summary>
+        private void LoadItems()
+        {
+            Insuers = new ObservableCollection<InsuerShowItem>();
+            var items = BllFactory<InsuerBll>.Instance.GetAllItems();
+            foreach (var sellerItem in items)
+            {
+                var tempItem = new InsuerShowItem();
+                tempItem.Id = sellerItem.Id;
+                tempItem.Name = sellerItem.Name;
+                tempItem.Url = sellerItem.Website;
+                //tempItem.BrandNames = maintainerItem..Select(b => b.Name).ToList();
+                //tempItem.FamilyNames = maintainerItem.Familys.Select(f => f.Name).ToList();
+                tempItem.RefProjectCount = sellerItem.ProjectCount;
+                Insuers.Add(tempItem);
+            }
+        }
+
+        /// <summary>
+        /// 返回删除厂商信信息函数
+        /// </summary>
+        /// <param name="id"></param>
+        /// <returns></returns>
+        private bool DeleteItem(string id)
+        {
+            var result = BllFactory<InsuerBll>.Instance.Delete(id);
+            if (!result)
+            {
+                MessageTip.Show(this.GetWindow(), BllFactory<InsuerBll>.Instance.ErrorMessage ?? string.Empty);
+            }
+            return result;
+        }
+    }
+}

+ 147 - 0
FirmLib/Com.FirmLib.UI/Insuer/VmInsuerEditor.cs

@@ -0,0 +1,147 @@
+
+///////////////////////////////////////////////////////////////////////////////
+//文件名称: VmInsuerEditor.cs
+//文件描述: 保险商添加修改
+//创 建 者: xls
+//创建日期: 2018/5/24 21:35:53
+//版 本 号:1.0.0.0
+////////////////////////////////////////////////////////////////////////////////
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using Com.FirmLib.Bll;
+using Com.FirmLib.Entity;
+using FWindSoft.DataFramework;
+using FWindSoft.MVVM;
+using FWindSoft.Wpf;
+
+namespace Com.FirmLib.UI.Insuer
+{
+    public class VmInsuerEditor : BaseViewModel
+    {
+        public VmInsuerEditor()
+        {
+            Init();
+        }
+
+        private void Init()
+        {
+
+        }
+        #region 属性相关
+
+        /// <summary>
+        /// 是否管理
+        /// </summary>
+        public bool IsManage { get; set; }
+        /// <summary>
+        /// 新保险商Id
+        /// </summary>
+        public string Id { get; set; }
+        private string m_Name;
+        /// <summary>
+        /// 保险商名称
+        /// </summary>
+        public string Name
+        {
+            get { return this.m_Name; }
+            set
+            {
+                this.m_Name = value;
+                RaisePropertyChanged(() => this.Name);
+            }
+        }
+
+        private string m_Url;
+        /// <summary>
+        /// 保险商url
+        /// </summary>
+        public string Url
+        {
+            get { return this.m_Url; }
+            set
+            {
+                this.m_Url = value;
+                RaisePropertyChanged(() => this.Url);
+            }
+        }
+        #endregion
+
+        #region 命令相关
+        /// <summary>
+        /// 添加工厂完场
+        /// </summary>
+        /// <param name="parameter"></param>
+        [Command]
+        public void AddCommand(object parameter)
+        {
+            try
+            {
+                if (!CreateInsuer())
+                    return;
+                Window window = parameter as Window;
+                if (window != null)
+                    window.DialogResult = true;
+            }
+            catch (Exception e)
+            {
+               MessageTipEx.Show(this.GetWindow(), e);
+            }
+        }
+        public bool CanAddCommand(object parameter)
+        {
+            return IsValidated;
+        }
+        /// <summary>
+        /// 添加并管理供应商
+        /// </summary>
+        /// <param name="parameter"></param>
+        [Command]
+        public void AddAndManageCommand(object parameter)
+        {
+            try
+            {
+                if (!CreateInsuer())
+                    return;
+                IsManage = true;
+                Window window = parameter as Window;
+                if (window != null)
+                    window.DialogResult = true;
+            }
+            catch (Exception e)
+            {
+               MessageTipEx.Show(this.GetWindow(), e);
+            }
+        }
+        public bool CanAddAndManageCommand(object parameter)
+        {
+            return IsValidated;
+        }
+
+        #endregion
+        /// <summary>
+        /// 创建保险商
+        /// </summary>
+        /// <returns></returns>
+        private bool CreateInsuer()
+        {
+            InsuerItem item = new InsuerItem();
+            item.Name = this.Name ?? string.Empty;
+            item.Website = Url ?? string.Empty;
+            var result = BllFactory<InsuerBll>.Instance.Add(item);
+            if (result)
+            {
+                Id = item.Id;
+            }
+            else
+            {
+                MessageTip.Show(this.GetWindow(),BllFactory<InsuerBll>.Instance.ErrorMessage ?? string.Empty);
+            }
+            return result;     
+        }
+    }
+}

+ 382 - 0
FirmLib/Com.FirmLib.UI/Insuer/VmInsuerInfo.cs

@@ -0,0 +1,382 @@
+
+///////////////////////////////////////////////////////////////////////////////
+//文件名称: VmInsuerInfo.cs
+//文件描述: 保险商项目信息维护
+//创 建 者: xls
+//创建日期: 2018/5/24 21:55:24
+//版 本 号:1.0.0.0
+////////////////////////////////////////////////////////////////////////////////
+
+using System;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+using System.Linq;
+using System.Text;
+using System.Threading;
+using System.Threading.Tasks;
+using System.Windows;
+using Com.FirmLib.Bll;
+using Com.FirmLib.Entity;
+using Com.FirmLib.UI.Common;
+using Com.FirmLib.UI.Insuer.Model;
+using FWindSoft.Data;
+using FWindSoft.DataFramework;
+using FWindSoft.MVVM;
+using FWindSoft.Wpf;
+using FWindSoft.SystemExtensions;
+using FWindSoft.Tools;
+
+namespace Com.FirmLib.UI.Insuer
+{
+    public class VmInsuerInfo : BaseViewModel
+    {
+        public VmInsuerInfo()
+        {
+            Init();
+        }
+
+        private void Init()
+        {
+           
+        }
+
+        public  void Init(LoadParameter parameter)
+        {
+            var id = parameter.Parameter as string;
+            Id = id;
+            //加载数据
+            LoadVenderItem(Id);
+            LoadProjectRelationItems(Id);
+        }
+        /// <summary>
+        /// 保险商id
+        /// </summary>
+        public string Id { get; set; }
+        #region 属性相关
+
+
+        private string m_Name;
+        /// <summary>
+        /// 保险商名称
+        /// </summary>
+        public string Name
+        {
+            get { return this.m_Name; }
+            set
+            {
+                this.m_Name = value;
+                RaisePropertyChanged(() => this.Name);
+            }
+        }
+        private string m_Url;
+        /// <summary>
+        /// 保险商网址
+        /// </summary>
+        public string Url
+        {
+            get { return this.m_Url; }
+            set
+            {
+                this.m_Url = value;
+                RaisePropertyChanged(() => this.Url);
+            }
+        }
+
+
+        private ObservableCollection<ProjectRelationShowItem> m_ProjectItems;
+        /// <summary>
+        /// 关联项目信息
+        /// </summary>
+        public ObservableCollection<ProjectRelationShowItem> ProjectItems
+        {
+            get { return this.m_ProjectItems; }
+            set
+            {
+                this.m_ProjectItems = value;
+                RaisePropertyChanged(() => this.ProjectItems);
+            }
+        }
+        #endregion
+
+        #region 命令相关
+
+        /// <summary>
+        /// 增加保单
+        /// </summary>
+        /// <param name="parameter"></param>
+        [Command]
+        public void AddInsuracncePolicy(object parameter)
+        {
+            try
+            {
+                WinInsurancePolicyEditor win = new WinInsurancePolicyEditor();
+                var f = new InsuerParameter();
+                f.Insuer.Id = Id;
+                LoadParameter.StartParameter(win, new LoadParameter(f));
+                win.Show(this.GetNavigationBar());
+            }
+            catch (Exception ex)
+            {
+
+                MessageTipEx.Show(ex);
+            }
+        }
+        public bool CanAddInsuracncePolicy(object parameter)
+        {
+            return true;
+        }
+
+        /// <summary>
+        /// 进入项目信息
+        /// </summary>
+        /// <param name="parameter"></param>
+        [Command]
+        public void GoToProject(object parameter)
+        {
+            try
+            {
+                ProjectRelationShowItem showItem = parameter as ProjectRelationShowItem;
+                var pa = new InsuerParameter();
+                pa.Insuer.Id = Id;
+                pa.Project.Id = showItem.ProjectId;
+                pa.Project.Name = showItem.ProjectLocalName;
+                LoadParameter loadParameter = new LoadParameter(pa);
+                WinInsuerProjectInfo win = new WinInsuerProjectInfo();
+                LoadParameter.StartParameter(win, loadParameter);
+                win.Show(this.GetNavigationBar());
+            }
+            catch (Exception ex)
+            {
+                MessageTipEx.Show(ex);
+            }
+        }
+        public bool CanGoToProject(object parameter)
+        {
+            return true;
+        }
+
+
+        /// <summary>
+        /// 保存功能
+        /// </summary>
+        /// <param name="parameter"></param>
+        [Command]
+        public void SaveCommand(object parameter)
+        {
+            //MessageTip.Show(this.GetWindow(), "保存");
+        }
+        public bool CanSaveCommand(object parameter)
+        {
+            return true;
+        }
+        /// <summary>
+        /// 刷新动画
+        /// </summary>
+        /// <param name="parameter"></param>
+        [Command]
+        public void RefreshCommand(object parameter)
+        {
+            try
+            {
+                var item = parameter as ProjectRelationShowItem;
+                if (item != null)
+                {
+                    item.IsLoading = true;
+                    TaskUtil.StartSTATask((obj) =>
+                  {
+                      var useItem = obj as ProjectRelationShowItem;
+                      if (useItem == null)
+                          return;
+                      try
+                      {
+                          BllFactory<ProjectBll>.Instance.ProjectSync(useItem.ProjectId);
+                          Thread.Sleep(3000);//立即执行偶尔导致连接取消
+                         var projects = BllFactory<InsuerBll>.Instance.GetProjectItems(Id);
+                          foreach (var project in projects)
+                          {
+                              if (project.Id == useItem.ProjectId)
+                              {
+                                  useItem.AssetCount = (int)project.TotalCount.ToDouble();
+                                  useItem.InsurancePolicyCount = (int)project.ContractCount.ToDouble();
+                              }
+
+                          }
+                      }
+                      catch (Exception ex)
+                      {
+                          MessageTipEx.Show(ex);
+                      }
+
+                      finally
+                      {
+
+                          useItem.IsLoading = false;
+                      }
+                  }, item);
+
+                }
+
+            }
+            catch (Exception ex)
+            {
+                MessageTipEx.Show(ex);
+            }
+
+        }
+        public bool CanRefreshCommand(object parameter)
+        {
+            return true;
+        }
+        #endregion
+
+        #region 公开方法
+        /// <summary>
+        /// 更新指定字段信息
+        /// </summary>
+        /// <param name="field"></param>
+        /// <returns></returns>
+        public bool SingleUpdateVenderItem(string field)
+        {
+
+            InsuerItem item = new InsuerItem();
+            item.Id = this.Id;
+            SetFieldValue(item, field);
+            var result = BllFactory<InsuerBll>.Instance.Update(item);
+            if (!result)
+            {
+                MessageTip.Show(this.GetWindow(), BllFactory<InsuerBll>.Instance.ErrorMessage ?? string.Empty);
+            }
+            return result;
+        }
+
+        private void SetFieldValue(InsuerItem item, string field)
+        {
+            if (field == "Name")
+            {
+                item.Name = this.Name;
+                return;
+            }
+            if (field == "Url")
+            {
+                item.Website = this.Url;
+                return;
+            }
+          
+        }
+        #endregion
+
+        #region 私有方法
+        /// <summary>
+        /// 加载厂商信息
+        /// </summary>
+        /// <param name="venderId">厂商Id</param>
+        private void LoadVenderItem(string venderId)
+        {
+            #region 加载厂商信息
+            var venderItem = BllFactory<InsuerBll>.Instance.GetAllItems().FirstOrDefault(c => c.Id == venderId);
+            Name = venderItem.Name;
+            Url = venderItem.Website;
+            #endregion
+        }
+        /// <summary>
+        /// 加载
+        /// </summary>
+        /// <param name="venderId"></param>
+        private void LoadProjectRelationItems(string venderId)
+        {
+            ProjectItems = new ObservableCollection<ProjectRelationShowItem>();
+            var projects = BllFactory<InsuerBll>.Instance.GetProjectItems(venderId);
+            foreach (var project in projects)
+            {
+                var showItem = new ProjectRelationShowItem();
+                showItem.ProjectId = project.Id;
+                showItem.ProjectLocalName = project.Name;
+                showItem.AssetCount = (int)project.TotalCount.ToDouble();
+                showItem.InsurancePolicyCount = (int)project.ContractCount.ToDouble();
+                ProjectItems.Add(showItem);
+            }
+        }
+
+        #endregion
+    }
+
+    /// <summary>
+    /// 项目关联信息
+    /// </summary>
+    public class ProjectRelationShowItem : BasePropertyChanged
+    {
+
+        private string m_ProjectId;
+        /// <summary>
+        /// 项目ID
+        /// </summary>
+        public string ProjectId
+        {
+            get { return this.m_ProjectId; }
+            set
+            {
+                this.m_ProjectId = value;
+                RaisePropertyChanged(() => this.ProjectId);
+            }
+        }
+
+        private string m_ProjectLocalName;
+        /// <summary>
+        /// 项目本地名称
+        /// </summary>
+        public string ProjectLocalName
+        {
+            get { return this.m_ProjectLocalName; }
+            set
+            {
+                this.m_ProjectLocalName = value;
+                RaisePropertyChanged(() => this.ProjectLocalName);
+            }
+        }
+
+
+
+        private int m_InsurancePolicyCount;
+        /// <summary>
+        /// 涉及保单数量
+        /// </summary>
+        public int InsurancePolicyCount
+        {
+            get { return this.m_InsurancePolicyCount; }
+            set
+            {
+                this.m_InsurancePolicyCount = value;
+                RaisePropertyChanged(() => this.InsurancePolicyCount);
+            }
+        }
+
+        private int m_AssetCount;
+        /// <summary>
+        /// 资产数量
+        /// </summary>
+        public int AssetCount
+        {
+            get { return this.m_AssetCount; }
+            set
+            {
+                this.m_AssetCount = value;
+                RaisePropertyChanged(() => this.AssetCount);
+            }
+        }
+
+
+        private bool m_IsLoading;
+        /// <summary>
+        /// 加载数据
+        /// </summary>
+        public bool IsLoading
+        {
+            get { return this.m_IsLoading; }
+            set
+            {
+                this.m_IsLoading = value;
+                RaisePropertyChanged(nameof(this.IsLoading));
+            }
+        }
+    }
+}

+ 731 - 0
FirmLib/Com.FirmLib.UI/Insuer/VmInsuerProjectInfo.cs

@@ -0,0 +1,731 @@
+
+///////////////////////////////////////////////////////////////////////////////
+//文件名称: VmInsuerProjectInfo.cs
+//文件描述: 保险项目信息
+//创 建 者: xls
+//创建日期: 2018/5/24 21:58:36
+//版 本 号:1.0.0.0
+////////////////////////////////////////////////////////////////////////////////
+
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+using System.Diagnostics;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Data;
+using CEFSharpWpf;
+using Com.FirmLib.Bll;
+using Com.FirmLib.Entity;
+using Com.FirmLib.UI.BllCommon;
+using Com.FirmLib.UI.Common.Model;
+using Com.FirmLib.UI.Insuer.Model;
+using FWindSoft.DataFramework;
+using FWindSoft.Handle;
+using FWindSoft.MVVM;
+using FWindSoft.SystemExtensions;
+using FWindSoft.Wpf;
+using FWindSoft.Wpf.Common;
+
+namespace Com.FirmLib.UI.Insuer
+{
+    public class VmInsuerProjectInfo : BaseViewModel
+    {
+        public VmInsuerProjectInfo()
+        {
+            Init();
+        }
+
+        private void Init()
+        {
+            ContactItem = new ContactInformationItem();
+        }
+        public void Init(LoadParameter parameter)
+        {
+            var para = parameter.Parameter as InsuerParameter;
+            InsuerId = para.Insuer.Id;
+            ProjectId = para.Project.Id;
+
+            LoadInsuerItem(InsuerId);
+            LoadProjectItem(ProjectId);
+            LoadLinkerItem(InsuerId, ProjectId);
+            LoadAssetItems(InsuerId, ProjectId);
+        }
+        #region 属性相关
+        /// <summary>
+        /// 供应商Id
+        /// </summary>
+        private string InsuerId { get; set; }
+        /// <summary>
+        /// 项目Id
+        /// </summary>
+        public string ProjectId { get; private set; }
+        /// <summary>
+        /// 项目名称
+        /// </summary>
+        public string ProjectName { get; private set; }
+        private string m_InsuerName;
+        /// <summary>
+        /// 保险商名称
+        /// </summary>
+        public string InsuerName
+        {
+            get { return this.m_InsuerName; }
+            set
+            {
+                this.m_InsuerName = value;
+                RaisePropertyChanged(() => this.InsuerName);
+            }
+        }
+
+
+        private string m_InsuerUrl;
+        /// <summary>
+        /// 保险商地址
+        /// </summary>
+        public string InsuerUrl
+        {
+            get { return this.m_InsuerUrl; }
+            set
+            {
+                this.m_InsuerUrl = value;
+                RaisePropertyChanged(() => this.InsuerUrl);
+            }
+        }
+
+
+
+        private ContactInformationItem m_ContactItem;
+        /// <summary>
+        /// 联系人信息
+        /// </summary>
+        public ContactInformationItem ContactItem
+        {
+            get { return this.m_ContactItem; }
+            set
+            {
+                this.m_ContactItem = value;
+                RaisePropertyChanged(() => this.ContactItem);
+            }
+        }
+
+
+
+        private ObservableCollection<AssetShowItem> m_AssetItems;
+        /// <summary>
+        /// 保单资产信息
+        /// </summary>
+        public ObservableCollection<AssetShowItem> AssetItems
+        {
+            get { return this.m_AssetItems; }
+            set
+            {
+                this.m_AssetItems = value;
+                RaisePropertyChanged(() => this.AssetItems);
+            }
+        }
+
+
+        private ObservableCollection<PolicyShowItem> m_PolicyItems;
+        /// <summary>
+        /// 项目保单信息
+        /// </summary>
+        public ObservableCollection<PolicyShowItem>  PolicyItems
+        {
+            get { return this.m_PolicyItems; }
+            set
+            {
+                this.m_PolicyItems = value;
+                RaisePropertyChanged(() => this.PolicyItems);
+            }
+        }
+        #endregion
+
+        #region 命令相关
+
+
+        /// <summary>
+        /// 查看资产详情
+        /// </summary>
+        /// <param name="parameter"></param>
+        [Command]
+        public void ScanAsset(object parameter)
+        {
+
+            try
+            {
+                AssetShowItem item = parameter as AssetShowItem;
+                if (item == null)
+                    return;
+                AssetItem parItem = new AssetItem();
+                parItem.Id = item.AssetNo;
+                parItem.ProjectId = item.ProjectId;
+                parItem.FamilyCode = item.FamilyCode;
+                string url = BllFactory<AssetBll>.Instance.GetAssetUrl(parItem);
+                WinBrowser.Instance.Show(url, "资产信息");
+            }
+            catch (Exception ex)
+            {
+                MessageTipEx.Show(ex);
+            }
+        }
+        public bool CanScanAsset(object parameter)
+        {
+            return true;
+        }
+        /// <summary>
+        /// 编辑保单
+        /// </summary>
+        /// <param name="parameter"></param>
+        [Command]
+        public void EditPolicy(object parameter)
+        {
+
+            try
+            {
+                PolicyShowItem item = parameter as PolicyShowItem;
+                WinInsurancePolicyEditor win = new WinInsurancePolicyEditor();
+                var f = new InsuerParameter();
+                f.Insuer.Id = item.InsuerId;
+                f.Project.Id = item.ProjectId;
+                f.Policy.Id = item.PolicyNo;//传递表单编号
+                LoadParameter.StartParameter(win, new LoadParameter(f));
+                win.Show(this.GetNavigationBar());
+            }
+            catch (Exception ex)
+            {
+                MessageTipEx.Show(ex);
+            }
+        }
+        public bool CanEditPolicy(object parameter)
+        {
+            return true;
+        }
+        /// <summary>
+        /// 增加保单
+        /// </summary>
+        /// <param name="parameter"></param>
+        [Command]
+        public void AddInsuracncePolicy(object parameter)
+        {
+
+            try
+            {
+                WinInsurancePolicyEditor win = new WinInsurancePolicyEditor();
+                var f = new InsuerParameter();
+                f.Project.Id = ProjectId;
+                f.Insuer.Id = InsuerId;
+                LoadParameter.StartParameter(win, new LoadParameter(f));
+                win.Show(this.GetNavigationBar());
+            }
+            catch (Exception ex)
+            {
+                MessageTipEx.Show(ex);
+            }
+        }
+        public bool CanAddInsuracncePolicy(object parameter)
+        {
+            return true;
+        }
+        /// <summary>
+        /// 保存功能
+        /// </summary>
+        /// <param name="parameter"></param>
+        [Command]
+        public void SaveCommand(object parameter)
+        {
+
+            try
+            {
+                if (CreatePolicyAsset())
+                {
+                    AfterSuccessSave();
+                    MessageTip.Show(this.GetWindow(), "保存成功");
+                }
+                else
+                {
+                    MessageTip.Show(this.GetWindow(), "保存失败");
+                }
+            }
+            catch (Exception ex)
+            {
+                MessageTipEx.Show(ex);
+            }
+           
+        }
+        public bool CanSaveCommand(object parameter)
+        {
+            return true;
+        }
+
+        /// <summary>
+        /// 更新指定字段信息
+        /// </summary>
+        /// <param name="field"></param>
+        /// <returns></returns>
+        public bool SingleUpdateLinkerItem(string field)
+        {
+
+            LinkerItem item = new LinkerItem();
+            item.VenderId = this.InsuerId;
+            item.ProjectId = this.ProjectId;
+            SetFieldValue(item, field);
+            var result = BllFactory<InsuerBll>.Instance.UpdateLinker(item);
+            if (!result)
+            {
+                MessageTip.Show(this.GetWindow(), BllFactory<InsuerBll>.Instance.ErrorMessage ?? string.Empty);
+            }
+            return result;
+        }
+        private void SetFieldValue(LinkerItem item, string field)
+        {
+            item.Name = ContactItem.People;
+            item.Phone = this.ContactItem.Telephone;
+            item.Email = this.ContactItem.Email;
+            item.Fax = this.ContactItem.Fax;
+            #region 修改相关
+            //if (field == "People")
+            //{
+            //    item.Name = ContactItem.People;
+            //    return;
+            //}
+            //if (field == "Telephone")
+            //{
+            //    item.Phone = this.ContactItem.Telephone;
+            //    return;
+            //}
+            //if (field == "Email")
+            //{
+            //    item.Email = this.ContactItem.Email;
+            //    return;
+            //}
+            //if (field == "Fax")
+            //{
+            //    item.Fax = this.ContactItem.Fax;
+            //    return;
+            //} 
+            #endregion
+        }
+
+
+
+        /// <summary>
+        /// 编辑保单号信息
+        /// </summary>
+        /// <param name="parameter"></param>
+        [Command]
+        public void EditPolicyNoCommand(object parameter)
+        {
+
+            try
+            {
+                AssetShowItem item = parameter as AssetShowItem;
+                if (item == null)
+                    return;
+                item.CacheParameters.Clear();
+                string originPolicyNo = item.InsurancePolicyNo;
+                #region 初始化传入参数
+                PolicyUpdateContext context = new PolicyUpdateContext();
+                context.InsuerParameter.Policy.Id = item.InsurancePolicyNo;
+                context.InsuerParameter.Project.Id = item.ProjectId;
+                context.InsuerParameter.Insuer.Id = InsuerId;
+                context.PolicyNo = item.InsurancePolicyNo;
+                #endregion
+                #region 保单编辑节点
+                WizardState wizardState = new WizardState("Root");
+                wizardState.SetHandle((obj) =>
+                {
+                    WinSimplePolicyEditor win = new WinSimplePolicyEditor();
+                    win.Owner = this.GetWindow();
+                    LoadParameter.StartParameter(win, new LoadParameter(obj));
+                    if (win.ShowDialog() == true)
+                    {
+                        var tempContext = win.GetRealResult<PolicyUpdateContext>();
+                        if (string.IsNullOrEmpty(originPolicyNo) || tempContext.PolicyNo == originPolicyNo)
+                        {
+                        //如果原始单号为null,获取与新单号相同,则直接完成修改
+                        tempContext.CanExecute = false;
+                            return WizardState.CompletedState;
+                        }
+                        else
+                        {
+                            return WizardState.NextState;
+                        }
+                    }
+                    else
+                    {
+                        (obj as PolicyUpdateContext).CanExecute = false;
+                        return WizardState.CancelState;
+                    }
+                });
+                #endregion
+
+                #region 确认修改时间节点
+                WizardState ensureState = new WizardState("Ensure");
+                ensureState.SetHandle((obj) =>
+                {
+                    WinPolicyEnsure win = new WinPolicyEnsure();
+                    win.Owner = this.GetWindow();
+                    LoadParameter.StartParameter(win, new LoadParameter(obj));
+                    if (win.ShowDialog() == true)
+                    {
+                        var tempContext = win.GetRealResult<PolicyUpdateContext>();
+                        tempContext.CanExecute = true;
+                        return WizardState.CompletedState;
+                    }
+                    else
+                    {
+                        (obj as PolicyUpdateContext).CanExecute = false;
+                        return WizardState.CancelState;
+                    }
+                });
+                #endregion
+                wizardState.AddState(WizardState.NextState, ensureState);
+                wizardState.Execute(context);
+                //不增加完成节点,直接通过context的CanExecute判断是否执行修改
+                if (UpdateAssetPolicyNo(item, context))
+                {
+                    item.InsurancePolicyNo = context.PolicyNo;
+                    item.EndDate = DateTimeManager.ConvertDateTime(context.ExpiryDate).ToString("yyyy-MM-dd");
+                    item.PolicyFile = context.PolicyFile;
+                    var items = CollectionViewSource.GetDefaultView(this.AssetItems);
+                    items.Refresh();
+                }
+            }
+            catch (Exception ex)
+            {
+                MessageTipEx.Show(ex);
+            }
+        }
+        public bool CanEditPolicyNoCommand(object parameter)
+        {
+            return true;
+        }
+
+
+        /// <summary>
+        /// 删除保单关联资产
+        /// </summary>
+        /// <param name="parameter"></param>
+        [Command]
+        public void DeleteAssetPolicy(object parameter)
+        {
+
+            try
+            {
+                AssetShowItem showItem = parameter as AssetShowItem;
+                if (showItem == null)
+                    return;
+                //todo 删除资产关联关系,是直接删除,不需要保存确定
+                var result = MessageTip.Show(this.GetWindow(), "是否要删除", "提示", MessageBoxButton.YesNo);
+                if (result == MessageBoxResult.Yes)
+                {
+                    bool flag = false;
+                    if (showItem.InsuerId == InsuerId)
+                    {
+                        flag = AssetManager.DeleteInsuerAssets(ProjectId, new List<string>() { showItem.Id });
+                    }
+                    else
+                    {
+                        flag = true;
+                    }
+                    if (flag)
+                    {
+                        this.AssetItems.Remove(showItem);
+                    }
+                    else
+                    {
+                        MessageTip.Show(this.GetWindow(), "删除失败");
+                    }
+
+                }
+            }
+            catch (Exception ex)
+            {
+                MessageTipEx.Show(ex);
+            }
+        }
+        public bool CanDeleteAssetPolicy(object parameter)
+        {
+            return true;
+        }
+
+
+
+        /// <summary>
+        /// 下载保单
+        /// </summary>
+        /// <param name="parameter"></param>
+        [Command]
+        public void FileDownLoadCommand(object parameter)
+        {
+            try
+            {
+                string fileKey = string.Empty;
+                do
+                {
+                    if (parameter is AssetShowItem showItem)
+                    {
+                        fileKey = showItem.PolicyFile;
+                        break;
+                    }
+
+                    if (parameter is PolicyShowItem policyItem)
+                    {
+                        fileKey = policyItem.PolicyFile;
+                         break;
+                    }
+                } while (false);
+             
+                InsuerUtils.LoadPolicyFile(fileKey);
+            }
+            catch ( Exception ex)
+            {
+
+                MessageTip.Show(this.GetWindow(), "下载失败");
+            }
+        }
+        public bool CanFileDownLoadCommand(object parameter)
+        {
+            return true;
+        }
+
+
+        #endregion
+        #region 私有方法
+        /// <summary>
+        /// 加载供应商信息
+        /// </summary>
+        /// <param name="venderId">厂商id</param>
+        private void LoadInsuerItem(string venderId)
+        {
+            var seller = BllFactory<InsuerBll>.Instance.GetAllItems().FirstOrDefault(c => c.Id == venderId);
+            if (seller != null)
+            {
+                this.InsuerName = seller.Name;
+                this.InsuerUrl = seller.Website;
+            }
+
+        }
+        /// <summary>
+        /// 加载联系人信息
+        /// </summary>
+        /// <param name="venderId">厂商库id</param>
+        /// <param name="projectId">项目Id</param>
+        private void LoadLinkerItem(string venderId, string projectId)
+        {
+            var linkerItem = BllFactory<InsuerBll>.Instance.GetLinker(venderId, projectId);
+            if (linkerItem != null)
+            {
+                this.ContactItem.Telephone = linkerItem.Phone;
+                this.ContactItem.People = linkerItem.Name;
+                this.ContactItem.Fax = linkerItem.Fax;
+                this.ContactItem.Email = linkerItem.Email;
+            }
+        }
+        /// <summary>
+        /// 获取相关资产信息
+        /// </summary>
+        /// <param name="venderId"></param>
+        /// <param name="projectId"></param>
+        private void LoadAssetItems(string venderId, string projectId)
+        {
+            AssetItems = new ObservableCollection<AssetShowItem>();
+            PolicyItems = new ObservableCollection<PolicyShowItem>();
+       
+            var policyItems = BllFactory<InsuerBll>.Instance.GetAllPolicyItems(venderId, projectId);
+            foreach (var dataItem in policyItems)
+            {
+                var item = ConvertPolicyShowItem(dataItem);
+                item.InsuerId = venderId;
+                item.ProjectId = projectId;
+                PolicyItems.Add(item);
+            }
+
+            var dataItems = BllFactory<InsuerBll>.Instance.GetAllAssetItems(venderId, projectId);
+            string venderName = BllFactory<InsuerBll>.Instance.GetItem(InsuerId)?.Name;
+            foreach (var dataItem in dataItems)
+            {
+                var tempItem = ConvertAssetShowItem(dataItem);
+              
+                tempItem.InsuerName=venderName;
+                //给日期赋值 
+                if (!string.IsNullOrEmpty(tempItem.InsurancePolicyNo))
+                {
+                    var contractItem = policyItems.FirstOrDefault(c => c.InsuranceNo == tempItem.InsurancePolicyNo);
+                    if (contractItem != null)
+                    {
+                        tempItem.EndDate =contractItem.ExpireDate;
+                        tempItem.PolicyFile = contractItem.InsuranceFile;
+                    }
+
+                    
+                }              
+                 tempItem.InsuerId = venderId;
+                tempItem.ProjectId = projectId;
+                AssetItems.Add(tempItem);
+            }
+        }
+
+        #region 信息转换
+        private AssetShowItem ConvertAssetShowItem(InsuerAssetItem dataItem)
+        {
+            var showItem = new AssetShowItem();
+            showItem.FamilyCode = dataItem.Family;
+            showItem.Id = dataItem.Id;
+
+            showItem.AssetNo = dataItem.Id;
+            showItem.LocalName = dataItem.Asset.EquipLocalName;
+            showItem.LocalCode = dataItem.Asset.EquipLocalId;
+            showItem.Brand = dataItem.Asset.Brand;
+            showItem.Product = dataItem.Asset.Product;
+            showItem.Type = dataItem.Asset.Specification;
+
+            showItem.EndDate = dataItem.Asset.ExpireDate;
+            showItem.InsurancePolicyNo = dataItem.Asset.InsuranceNo;
+            showItem.PolicyFile = dataItem.Asset.InsuranceFile;
+            return showItem;
+        }
+        private PolicyShowItem ConvertPolicyShowItem(InsuerContractStatisticsItem dataItem)
+        {
+            var showItem = new PolicyShowItem();
+            showItem.PolicyNo = dataItem.InsuranceNo;
+            showItem.RefAssetCount = (int)dataItem.PropertyCount.ToDouble();
+            showItem.EndDate = dataItem.ExpireDate;
+            showItem.PolicyFile = dataItem.InsuranceFile;
+            return showItem;
+        }
+        #endregion
+        private void LoadProjectItem(string projectId)
+        {
+            var projectItem = BllFactory<ProjectBll>.Instance.GetProjectItem(projectId);
+            if (projectItem != null)
+            {
+                this.ProjectName = projectItem.Name;
+            }
+
+        }
+
+
+
+        private bool UpdateAssetPolicyNo(AssetShowItem item,PolicyUpdateContext context)
+        {
+            if (!context.CanExecute)
+            {
+                //没对资产信息进行修改
+                return false;
+            }
+            var useItem = ConvertUpdateItem(item);
+            useItem.InsurancePolicyNo = context.PolicyNo;
+            if (context.EditType == EditType.Correct)
+            {
+                useItem.CacheParameters.SetAllParameterTime(context.EffectiveTime);
+            }
+            bool flag = AssetManager.UpdateAssetItems(ProjectId, new List<AssetShowItem>() {useItem });
+            if (flag)
+            {
+                MessageTip.Show(this.GetWindow(), "修改保单号成功");
+            }
+            else
+            {
+                MessageTip.Show(this.GetWindow(), "修改保单号失败");
+            }
+            return flag;
+        }
+
+        private AssetShowItem ConvertUpdateItem(AssetShowItem item)
+        {
+            var newItem = new AssetShowItem();
+            newItem.Id = item.Id;
+            newItem.InsurancePolicyNo = item.InsurancePolicyNo;
+            newItem.CacheParameters.Merge(item.CacheParameters);
+            newItem.CacheParameters.Add((new WatchParameter(MBIBuiltInParameter.InsuranceNum)));
+            return newItem;
+        }
+        #endregion
+        #region 保存资产相关
+        private bool CreatePolicyAsset()
+        {
+            if (this.AssetItems == null || !this.AssetItems.Any())
+                return true;
+            //保单或保险商任意发生变化,都修改
+            //判断当前保险单号,和item中的保险单号
+            List<AssetShowItem> changedItems = new List<AssetShowItem>();
+            foreach (var item in this.AssetItems)
+            {
+                item.CacheParameters.Clear();
+                var parameters = GetChangeParameters(item);
+                if (!parameters.IsEmpty)
+                {
+                    item.CacheParameters.Merge(parameters);
+                    changedItems.Add(item);
+                }
+            }
+            //关掉也不影响保存流程
+            if (changedItems.Any())
+            {
+                AssetSaveContext context = new AssetSaveContext();
+                context.ChangedItems = changedItems;
+                WinPolicySaveEnsure win = new WinPolicySaveEnsure();
+                win.Owner = this.GetWindow();
+                LoadParameter.StartParameter(win, new LoadParameter(context));
+                if (win.ShowDialog() == true)
+                {
+                    context = win.GetRealResult<AssetSaveContext>();
+                    if (context != null)
+                    {
+                        var items = context.ChangedItems ?? new List<AssetShowItem>();
+                        foreach (var item in items)
+                        {
+                            if (context.EditType == EditType.Correct)
+                            {
+                                item.CacheParameters.SetAllParameterTime(context.EffectiveTime);
+                            }
+                        }
+                    }
+                }
+            }
+
+            #region 修改厂商,保单号发生变化的资产
+            List<AssetShowItem> updateItems = new List<AssetShowItem>();
+            AssetItems.ToList().ForEach(assetItem =>
+            {
+                ///todo 历史值存储
+                if (!assetItem.CacheParameters.IsEmpty)
+                {
+                    assetItem.CacheParameters.CheckAdd((new WatchParameter(MBIBuiltInParameter.InsuranceNum)));
+                }
+               
+            });
+            bool flag = AssetManager.UpdateAssetItems(ProjectId, updateItems.ToList());
+            #endregion
+            return flag;
+
+        }
+        /// <summary>
+        /// 初始化变化参数
+        /// </summary>
+        /// <param name="item"></param>
+        private WatchParameters GetChangeParameters(AssetShowItem item)
+        {
+            WatchParameters parameters = new WatchParameters();
+            //获取变化的资产:缺原始数据
+            //if (!string.IsNullOrEmpty(item.InsurancePolicyNo)&&item.InsurancePolicyNo != "")
+            //{
+            //    parameters.Add(new WatchParameter(MBIBuiltInParameter.InsuranceNum));
+            //}
+            return parameters;
+        }
+        #endregion
+        /// <summary>
+        /// 成功保存后处理
+        /// </summary>
+        private void AfterSuccessSave()
+        {
+               LoadAssetItems(InsuerId, ProjectId);
+        }
+    }
+}

+ 784 - 0
FirmLib/Com.FirmLib.UI/Insuer/VmInsurancePolicyEditor.cs

@@ -0,0 +1,784 @@
+
+///////////////////////////////////////////////////////////////////////////////
+//文件名称: VmInsurancePolicyEditor.cs
+//文件描述: 保险单编辑
+//创 建 者: xls
+//创建日期: 2018/5/24 22:01:48
+//版 本 号:1.0.0.0
+////////////////////////////////////////////////////////////////////////////////
+
+using System;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+using System.IO;
+using System.Linq;
+using System.Windows;
+using CEFSharpWpf;
+using Com.FirmLib.Bll;
+using Com.FirmLib.Entity;
+using Com.FirmLib.UI.BllCommon;
+using Com.FirmLib.UI.Common.Model;
+using Com.FirmLib.UI.Insuer.Model;
+using FirmHttpDao;
+using FWindSoft.Data;
+using FWindSoft.DataFramework;
+using FWindSoft.MVVM;
+using FWindSoft.Wpf;
+using FWindSoft.Wpf.Common;
+using FWindSoft.Wpf.Controls;
+using Microsoft.Win32;
+
+namespace Com.FirmLib.UI.Insuer
+{
+    /*
+     * 两种入口
+     * 1、没有项目信息的,直接创建
+     * 2、带有项目信息的,项目信息不能改变
+     */
+    public class VmInsurancePolicyEditor : BaseViewModel
+    {
+        #region 初始化
+        public VmInsurancePolicyEditor()
+        {
+            Init();
+        }
+        private void Init()
+        {
+            AssetItems = new ObservableCollection<AssetShowItem>();
+            PolicyFile = new FileItem();
+            ContactItem = new ContactInformationItem();
+            PolicyEndDate = DateTimeManager.ConvertDateTime(DateTime.Now);
+        }
+        public void Init(LoadParameter parameter)
+        {
+            var param = parameter.Parameter as InsuerParameter;
+            if (param == null)
+                return;
+            InsuerId = param.Insuer.Id;
+            #region 控制条件初始化
+            ProjectFixed = !string.IsNullOrEmpty(param.Project.Id);
+            if (ProjectFixed)
+            {
+                ProjectNo =ProjectIdManager.GetForeSystemProjectId(param.Project.Id); ;
+            }
+            PolicyFixed = !string.IsNullOrEmpty(param.Policy.Id);
+            if (PolicyFixed)
+            {
+                PolicyNo = param.Policy.Id;
+                if (!string.IsNullOrEmpty(PolicyEndDate))
+                {
+                    var now=DateTimeManager.ConvertDateTime(DateTime.Now);
+                    if (now.CompareTo(PolicyEndDate)>0)
+                    {
+                        IsEpire = true;
+                    }
+                }
+            }
+            #endregion   
+            //如果上面的值有自然会加载资产信息
+            //LoadAssetItems();
+        } 
+        #endregion
+        #region 属性相关     
+        /// <summary>
+        /// 保险商Id
+        /// </summary>
+        public string InsuerId { get; private set; }
+
+        #region 入口控制信息
+        private bool m_ProjectFixed;
+        /// <summary>
+        /// 项目是否固定【编辑进入入口】
+        /// </summary>
+        public bool ProjectFixed
+        {
+            get { return this.m_ProjectFixed; }
+            set
+            {
+                this.m_ProjectFixed = value;
+
+                RaisePropertyChanged(nameof(this.ProjectFixed));
+            }
+        }
+
+
+        private bool m_PolicyFixed;
+        /// <summary>
+        /// 保单是否固定
+        /// </summary>
+        public bool PolicyFixed
+        {
+            get { return this.m_PolicyFixed; }
+            set
+            {
+                this.m_PolicyFixed = value;
+                RaisePropertyChanged(nameof(this.PolicyFixed));
+            }
+        }
+
+        private bool m_IsEpire;
+        /// <summary>
+        /// 保单是否过期
+        /// </summary>
+        public bool IsEpire
+        {
+            get { return this.m_IsEpire; }
+            set
+            {
+                this.m_IsEpire = value;
+                RaisePropertyChanged(() => this.IsEpire);
+            }
+        }
+        #endregion
+
+        #region 保单信息
+        /// <summary>
+        /// 是否是可用的ValidatePolicy
+        /// </summary>
+        public bool ValidatePolicy { get; set; }
+        private string m_PolicyNo;
+        /// <summary>
+        /// 保单编号
+        /// </summary>
+        public string PolicyNo
+        {
+            get { return this.m_PolicyNo; }
+            set
+            {
+                this.m_PolicyNo = value;
+                if (!IsInEditing)
+                {
+                    LoadPolicyByNo(SystemProjectId, value);
+                    LoadAssetItems();
+                }
+             
+                RaisePropertyChanged(() => this.PolicyNo);
+            }
+        }
+        private string m_PolicyEndDate;
+        /// <summary>
+        /// 保单截止日期
+        /// </summary>
+        public string PolicyEndDate
+        {
+            get { return this.m_PolicyEndDate; }
+            set
+            {
+                this.m_PolicyEndDate = value;
+                RaisePropertyChanged(() => this.PolicyEndDate);
+            }
+        }
+        private FileItem m_PolicyFile;
+        /// <summary>
+        /// 保险文件
+        /// </summary>
+        public FileItem PolicyFile
+        {
+            get { return this.m_PolicyFile; }
+            set
+            {
+                this.m_PolicyFile = value;
+                RaisePropertyChanged(() => this.PolicyFile);
+            }
+        }
+        /// <summary>
+        /// 有效的项目编号
+        /// </summary>
+        public bool ValidateProject { get; set; }
+        #endregion
+
+        #region 项目相关信息
+        private string m_ProjectNo;
+        /// <summary>
+        /// 项目编号
+        /// </summary>
+        public string ProjectNo
+        {
+            get { return this.m_ProjectNo; }
+            set
+            {
+                this.m_ProjectNo = value;
+                if (!IsInEditing)
+                {
+                    LoadProjectById(SystemProjectId);
+                    LoadPolicyByNo(SystemProjectId, PolicyNo);
+                    LoadAssetItems();
+                }
+             
+                RaisePropertyChanged(() => this.ProjectNo);
+            }
+        }
+        /// <summary>
+        /// 系统项目Id
+        /// </summary>
+        public string SystemProjectId
+        {
+            get { return ProjectIdManager.GetSystemProjectId(ProjectNo); }
+        }
+        private string m_LocalProjectName;
+        /// <summary>
+        /// 本地项目名称
+        /// </summary>
+        public string LocalProjectName
+        {
+            get { return this.m_LocalProjectName; }
+            set
+            {
+                this.m_LocalProjectName = value;
+                RaisePropertyChanged(() => this.LocalProjectName);
+            }
+        }
+        #endregion
+
+        #region 联系人信息
+        private ContactInformationItem m_ContactItem;
+        /// <summary>
+        /// 联系人信息
+        /// </summary>
+        public ContactInformationItem ContactItem
+        {
+            get { return this.m_ContactItem; }
+            set
+            {
+                this.m_ContactItem = value;
+                RaisePropertyChanged(() => this.m_ContactItem);
+            }
+        }
+        #endregion
+
+        #region 资产信息
+        private ObservableCollection<AssetShowItem> m_AssetItems;
+        /// <summary>
+        /// 保单资产信息
+        /// </summary>
+        public ObservableCollection<AssetShowItem> AssetItems
+        {
+            get { return this.m_AssetItems; }
+            set
+            {
+                this.m_AssetItems = value;
+                RaisePropertyChanged(() => this.AssetItems);
+            }
+        } 
+        #endregion
+
+        #endregion
+
+        #region 命令相关
+        /// <summary>
+        /// 上传文件
+        /// </summary>
+        /// <param name="parameter"></param>
+        [Command]
+        public void UploadCommand(object parameter)
+        {
+            try
+            {
+                OpenFileDialog ofd = new OpenFileDialog();
+                ofd.Filter = "pdf文件|*.pdf";
+                if (ofd.ShowDialog() == true)
+                {
+                    string fileName = ofd.FileName;
+                    PolicyFile.Name = Path.GetFileName(fileName);
+                    PolicyFile.Path = fileName;
+                }
+            }
+            catch (Exception e)
+            {
+               MessageTipEx.Show(this.GetWindow(), e);
+            }
+        }
+        public bool CanUploadCommand(object parameter)
+        {
+            return true;
+        }
+
+        /// <summary>
+        /// 查看资产详情
+        /// </summary>
+        /// <param name="parameter"></param>
+        [Command]
+        public void ScanAsset(object parameter)
+        {
+
+            try
+            {
+                AssetShowItem item = parameter as AssetShowItem;
+                if (item == null)
+                    return;
+                AssetItem parItem = new AssetItem();
+                parItem.Id = item.Id;
+                parItem.ProjectId = item.ProjectId;
+                parItem.FamilyCode = item.FamilyCode;
+                string url = BllFactory<AssetBll>.Instance.GetAssetUrl(parItem);
+                WinBrowser.Instance.Show(url, "资产信息");
+            }
+            catch (Exception ex)
+            {
+                MessageTipEx.Show(ex);
+            }
+        }
+        public bool CanScanAsset(object parameter)
+        {
+            return true;
+        }
+
+        /// <summary>
+        /// 保存按钮
+        /// </summary>
+        /// <param name="parameter"></param>
+        [Command]
+        public void SaveCommand(object parameter)
+        {
+            //CreatePolicyAsset();
+            //return;
+            try
+            {
+                if (CreatePolicyInfo() && CreateLinkInfo()&&CreatePolicyAsset())
+                {
+                    AfterSuccessSave();
+                    MessageTip.Show(this.GetWindow(), "保存成功");
+                }
+                else
+                {
+                    MessageTip.Show(this.GetWindow(), "保存失败");
+                }
+            }
+            catch (Exception e)
+            {
+
+                MessageTipEx.Show(this.GetWindow(), e);
+            }
+        }
+        public bool CanSaveCommand(object parameter)
+        {
+            return IsValidated&&ValidateProject;
+        }
+        /// <summary>
+        /// 选择保单号
+        /// </summary>
+        /// <param name="parameter"></param>
+        [Command]
+        public void SelectPolicyCommand(object parameter)
+        {
+            //传入当前输入的保单号,为显示默认值
+            //如果项目为空,可以不弹窗
+
+            try
+            {
+                WinPolicySelector win = new WinPolicySelector();
+                InsuerParameter insuerParameter = new InsuerParameter();
+                insuerParameter.Insuer.Id = InsuerId;
+                insuerParameter.Project.Id = SystemProjectId;
+                insuerParameter.Policy.Id = PolicyNo;
+                LoadParameter.StartParameter(win, new LoadParameter(insuerParameter));
+                win.Owner = this.GetWindow();
+                if (win.ShowDialog() == true)
+                {
+                    var tempPolicyNo = win.GetRealResult<string>();
+                    if (!string.IsNullOrEmpty(tempPolicyNo))
+                    {
+                        this.PolicyNo = tempPolicyNo;
+                    }
+                }
+            }
+            catch (Exception ex)
+            {
+                MessageTipEx.Show(ex);
+            }
+        }
+        public bool CanSelectPolicyCommand(object parameter)
+        {
+            return ValidateProject;
+        }
+        /// <summary>
+        /// 选择资产信息
+        /// </summary>
+        /// <param name="parameter"></param>
+        [Command]
+        public void SelectAssetCommand(object parameter)
+        {
+
+            try
+            {
+                WinInsuerAssetSelector win = new WinInsuerAssetSelector();
+                win.Owner = this.GetWindow();
+                SelectAssetContext context = new SelectAssetContext();
+                context.ProjectId = SystemProjectId;
+                context.VenderId = InsuerId;
+
+                context.ContainIds = new List<string>(AssetItems.Select(p => p.Id));
+                LoadParameter.StartParameter(win, new LoadParameter(context));
+                if (win.ShowDialog() == true)
+                {
+                    if (AssetItems == null)
+                    {
+                        AssetItems = new ObservableCollection<AssetShowItem>();
+                    }
+                    var addRelations = context.AddedItems;
+                    foreach (var item in addRelations)
+                    {
+                        if (AssetItems.Any(c => c.Id == item.Id))
+                            return;
+                        AssetItems.Add(item);
+                    }
+                }
+            }
+            catch (Exception ex)
+            {
+                MessageTipEx.Show(ex);
+            }
+        }
+        public bool CanSelectAssetCommand(object parameter)
+        {
+            return ValidateProject;
+        }
+        /// <summary>
+        /// 删除在保资产
+        /// </summary>
+        /// <param name="parameter"></param>
+        [Command]
+        public void DeleteCommand(object parameter)
+        {
+
+            try
+            {
+                AssetShowItem showItem = parameter as AssetShowItem;
+                if (showItem == null)
+                    return;
+                //todo 删除资产关联关系,是直接删除,不需要保存确定
+                var result = MessageTip.Show(this.GetWindow(), "是否要删除", "提示", MessageBoxButton.YesNo);
+                if (result == MessageBoxResult.Yes)
+                {
+                    bool flag = false;
+                    if (showItem.InsuerId == InsuerId && showItem.InsurancePolicyNo == PolicyNo)
+                    {
+                        flag = AssetManager.DeleteInsuerAssets(SystemProjectId, new List<string>() { showItem.Id });
+                    }
+                    else
+                    {
+                        flag = true;
+                    }
+                    if (flag)
+                    {
+                        this.AssetItems.Remove(showItem);
+                    }
+                    else
+                    {
+                        MessageTip.Show(this.GetWindow(), "删除失败");
+                    }
+
+                }
+            }
+            catch (Exception ex)
+            {
+                MessageTipEx.Show(ex);
+            }
+        }
+        public bool CanDeleteCommand(object parameter)
+        {
+            return true;
+        }
+        #endregion
+
+        #region 私有方法
+        /// <summary>
+        /// 加载资产信息
+        /// </summary>
+        private void LoadAssetItems()
+        {
+            AssetItems = new ObservableCollection<AssetShowItem>();
+            if (!ValidateProject ||!ValidatePolicy)
+                return;
+            LoadAssetItems(InsuerId, SystemProjectId, PolicyNo);         
+        }
+        /// <summary>
+        /// 加载资产信息
+        /// </summary>
+        /// <param name="venderId"></param>
+        /// <param name="projectId"></param>
+        /// <param name="policyId"></param>
+        private void LoadAssetItems(string venderId,string projectId,string policyId)
+        {
+            var dataItems = BllFactory<InsuerBll>.Instance.GetPolicyAssetItems(venderId, projectId, policyId);
+            List<AssetShowItem> showItems = new List<AssetShowItem>();
+            foreach (var dataItem in dataItems)
+            {
+                var showItem = new AssetShowItem();
+                showItem.Id = dataItem.Id;
+                showItem.ProjectId = SystemProjectId;
+                showItem.FamilyCode = dataItem.Family;
+                showItem.LocalName = dataItem.Asset.EquipLocalName;
+                showItem.LocalCode = dataItem.Asset.EquipLocalId;
+                showItem.Brand = dataItem.Asset.Brand;
+                showItem.Product = dataItem.Asset.Product;
+                showItem.Type = dataItem.Asset.Specification;
+                showItems.Add(showItem);
+            }
+
+            AssetItems = new ObservableCollection<AssetShowItem>(showItems);
+        }
+
+        /// <summary>
+        /// 创建联系人信息
+        /// </summary>
+        /// <returns></returns>
+        private bool CreateLinkInfo()
+        {
+            LinkerItem item = new LinkerItem();
+            item.VenderId = InsuerId;
+            item.ProjectId = SystemProjectId;
+            item.Name = ContactItem.People;
+            item.Phone = ContactItem.Telephone;
+            item.Fax = ContactItem.Fax;
+            item.Email = ContactItem.Email;
+            var result = BllFactory<InsuerBll>.Instance.UpdateLinker(item);
+            if (!result)
+            {
+                MessageTip.Show(this.GetWindow(), BllFactory<InsuerBll>.Instance.ErrorMessage ?? string.Empty);
+            }
+            return result;
+        }
+
+        /// <summary>
+        /// 创建保单信息
+        /// </summary>
+        /// <returns></returns>
+        private bool CreatePolicyInfo()
+        {
+            InsuerContractItem item = new InsuerContractItem();
+            item.ProjectId = SystemProjectId;
+            item.VenderId = InsuerId;
+
+            item.ExpireDate =DateTimeManager.ConvertDateTime(PolicyEndDate).ToString("yyyy-MM-dd");
+            item.InsuranceNo = PolicyNo;
+            item.InsuranceFile = GetFileKey();//获取相关编码
+            bool result = false;
+            var refVenderId = BllFactory<InsuerBll>.Instance.CheckInsuranceNo(PolicyNo);
+            bool isExist = !string.IsNullOrEmpty(refVenderId);
+            if (!isExist)
+            {
+                result = BllFactory<InsuerBll>.Instance.AddPolicy(item);
+            }
+            else
+            {
+                if (refVenderId != InsuerId)
+                {
+                    MessageTip.Show(this.GetWindow(), $"该保单已被其他项目关联");
+                    return result;
+                }
+                result = BllFactory<InsuerBll>.Instance.UpdatePolicy(item);
+            }
+            if (!result)
+            {
+                MessageTip.Show(this.GetWindow(), BllFactory<InsuerBll>.Instance.ErrorMessage ?? string.Empty);
+            }
+            return result;
+        }
+        #region 相关信息加载
+        /// <summary>
+        /// 获取项目,通过项目编号
+        /// </summary>
+        /// <param name="projectId"></param>
+        private void LoadProjectById(string projectId)
+        {
+            ProjectItem item = null;
+            try
+            {
+                ValidateProject = false;
+                if (string.IsNullOrEmpty(projectId))
+                    return;
+                item = BllFactory<ProjectBll>.Instance.GetProjectItem(projectId);               
+                ValidateProject = item != null;
+            }
+            finally
+            {
+                #region 修改
+                if (ValidateProject)
+                {
+                    LocalProjectName = item.Name;
+                    LoadLinkerItem(projectId, InsuerId);
+                }
+                else
+                {
+                    LocalProjectName = string.Empty;
+                } 
+                #endregion
+            }
+        }
+
+        /// <summary>
+        /// 通过保单编号加载保单信息
+        /// </summary>
+        /// <param name="projectId"></param>
+        /// <param name="policyNo"></param>
+        private void LoadPolicyByNo(string projectId,string policyNo)
+        {
+            InsuerContractItem item = null;
+            string fileKey = string.Empty;
+            try
+            {
+                ValidatePolicy = false;
+                if (!ValidateProject|| string.IsNullOrEmpty(policyNo))
+                    return;
+                item = BllFactory<InsuerBll>.Instance.GetPolicyItem(InsuerId, projectId, policyNo);
+                ValidatePolicy = item != null;
+            }
+            finally
+            {
+                if (ValidatePolicy)
+                {
+                    string timeStr=item.ExpireDate ?? string.Empty;
+
+                    this.PolicyEndDate = DateTimeManager.ConvertDateTimeH(timeStr).ToString("yyyyMMdd");
+                    fileKey = item.InsuranceFile;
+                    PolicyFile = FileUtils.ParseFileKey(fileKey);
+                }
+                else
+                {
+                    PolicyFile = new FileItem();
+                }
+            }          
+        }
+        #endregion
+
+        #region 文件操作  
+        /// <summary>
+        /// 获取文件键值
+        /// </summary>
+        /// <returns></returns>
+        public string GetFileKey()
+        {
+            #region 上传文件
+            string fileKey =FileUtils.GetUseKey(PolicyFile, InsuerId);
+            if (string.IsNullOrEmpty(fileKey))
+            {
+                return fileKey;
+            }
+            if (!File.Exists(PolicyFile.Path))
+            {
+                return fileKey;
+            }
+            var bytes = File.ReadAllBytes(PolicyFile.Path);
+            var flag = BllFactory<FileBll>.Instance.UploadFile(BllHttpSetting.Instance.Default, fileKey, bytes);
+            if (!flag)
+            {
+                MessageTip.Show(this.GetWindow(), BllFactory<FileBll>.Instance.ErrorMessage ?? string.Empty);
+            } 
+            #endregion
+            return fileKey;
+        }
+        #endregion
+        #endregion
+        #region 联系人相关
+        /// <summary>
+        /// 查询联系人信息
+        /// </summary>
+        /// <param name="projectId"></param>
+        /// <param name="venderId"></param>
+        private void LoadLinkerItem(string projectId, string venderId)
+        {
+            if (string.IsNullOrEmpty(projectId) || string.IsNullOrEmpty(venderId))
+                return;
+            var linkerItem = BllFactory<InsuerBll>.Instance.GetLinker(venderId, projectId);
+            if (linkerItem != null)
+            {
+                this.ContactItem.Telephone = linkerItem.Phone;
+                this.ContactItem.People = linkerItem.Name;
+                this.ContactItem.Fax = linkerItem.Fax;
+                this.ContactItem.Email = linkerItem.Email;
+            }
+
+        }
+        #endregion
+
+        #region 保存资产相关
+        private bool CreatePolicyAsset()
+        {
+            if (this.AssetItems == null || !this.AssetItems.Any())
+                return true;
+            //保单或保险商任意发生变化,都修改
+            //判断当前保险单号,和item中的保险单号
+            List<AssetShowItem> changedItems = new List<AssetShowItem>();
+            foreach (var item in this.AssetItems)
+            {
+                item.CacheParameters.Clear();
+               var parameters= GetChangeParameters(item);
+                if (!parameters.IsEmpty)
+                {
+                    item.CacheParameters.Merge(parameters);
+                    changedItems.Add(item);
+                }
+            }
+            //关掉也不影响保存流程
+            if (changedItems.Any())
+            {
+                AssetSaveContext context = new AssetSaveContext();
+                context.ChangedItems = changedItems;
+                WinPolicySaveEnsure win = new WinPolicySaveEnsure();
+                win.Owner = this.GetWindow();
+                LoadParameter.StartParameter(win, new LoadParameter(context));
+                if (win.ShowDialog() == true)
+                {
+                    context = win.GetRealResult<AssetSaveContext>();
+                    if (context != null)
+                    {
+                        var items = context.ChangedItems ?? new List<AssetShowItem>();
+                        foreach (var item in items)
+                        {
+                            if (context.EditType == EditType.Correct)
+                            {
+                                item.CacheParameters.SetAllParameterTime(context.EffectiveTime);
+                            }
+                        }
+                    }
+                }
+            }
+
+            #region 修改厂商,保单号发生变化的资产
+            
+            AssetItems.ToList().ForEach(assetItem =>
+            {
+                assetItem.InsuerId = InsuerId;
+                assetItem.InsurancePolicyNo = PolicyNo;
+                assetItem.CacheParameters.CheckAdd((new WatchParameter(MBIBuiltInParameter.DPInsuerID)));
+                 assetItem.CacheParameters.CheckAdd((new WatchParameter(MBIBuiltInParameter.InsuranceNum)));
+            });
+            bool flag = AssetManager.UpdateAssetItems(SystemProjectId, AssetItems.ToList());
+            #endregion
+            return flag;
+            
+        }
+        /// <summary>
+        /// 初始化变化参数
+        /// </summary>
+        /// <param name="item"></param>
+        private WatchParameters GetChangeParameters(AssetShowItem item)
+        {
+            WatchParameters parameters = new WatchParameters();
+            if (!string.IsNullOrEmpty(item.InsuerId)&&item.InsuerId!=InsuerId)
+            {
+                parameters.Add(new WatchParameter(MBIBuiltInParameter.DPInsuerID));
+            }
+            if (!string.IsNullOrEmpty(item.InsurancePolicyNo)&&item.InsurancePolicyNo!=PolicyNo)
+            {
+                parameters.Add(new WatchParameter(MBIBuiltInParameter.InsuranceNum));
+            }
+            return parameters;
+        }
+        #endregion
+
+        /// <summary>
+        /// 成功保存后处理
+        /// </summary>
+        private void AfterSuccessSave()
+        {
+            ProjectManager.SyncInsuerProject(SystemProjectId, InsuerId);
+            LoadAssetItems(InsuerId, SystemProjectId, PolicyNo);
+            if (this.GetNavigationBar() is NavigationBar bar)
+            {
+                bar.RefreshPreWinddow();
+            }
+        }
+    }
+}

+ 112 - 0
FirmLib/Com.FirmLib.UI/Insuer/VmPolicyEnsure.cs

@@ -0,0 +1,112 @@
+
+///////////////////////////////////////////////////////////////////////////////
+//文件名称: VmPolicyEnsure.cs
+//文件描述: VmPolicyEnsure.cs
+//创 建 者: xls
+//创建日期: 2018/9/17 23:40:48
+//版 本 号:1.0.0.0
+////////////////////////////////////////////////////////////////////////////////
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using Com.FirmLib.UI.BllCommon;
+using Com.FirmLib.UI.Common;
+using Com.FirmLib.UI.Insuer.Model;
+using FWindSoft.MVVM;
+using FWindSoft.Wpf;
+using FWindSoft.Wpf.Common;
+
+namespace Com.FirmLib.UI.Insuer
+{
+    public class VmPolicyEnsure : BaseViewModel
+    {
+        public VmPolicyEnsure()
+        {
+            Init();
+        }
+
+        private void Init()
+        {
+            this.EditType = EditType.Update;
+            CorrectEndDate = DateTimeManager.ConvertDateTime(DateTime.Now);
+        }       
+        public void Init(LoadParameter parameter)
+        {
+            PolicyUpdateContext context = parameter.Parameter as PolicyUpdateContext;
+            if (context == null)
+                return;
+            Context = context;
+        }
+        #region 属性相关
+        private PolicyUpdateContext Context { get; set; }
+        private EditType m_EditType;
+        /// <summary>
+        /// 编辑类型\修改还是更正
+        /// </summary>
+        public EditType EditType
+        {
+            get { return this.m_EditType; }
+            set
+            {
+                this.m_EditType = value;
+                RaisePropertyChanged(nameof(this.EditType));
+            }
+        }
+
+        private string m_CorrectDate;
+        /// <summary>
+        /// 改正日期
+        /// </summary>
+        public string CorrectEndDate
+        {
+            get { return this.m_CorrectDate; }
+            set
+            {
+                this.m_CorrectDate = value;
+                RaisePropertyChanged(() => this.CorrectEndDate);
+            }
+        }
+        #endregion
+
+        #region 命令相关
+
+        /// <summary>
+        /// 确定按钮
+        /// </summary>
+        /// <param name="parameter"></param>
+        [Command]
+        public void EnsureCommand(object parameter)
+        {
+            try
+            {
+                Window window = parameter as Window;
+                if (window == null)
+                {
+                    return;
+                }
+                PolicyUpdateContext context = Context;
+                context.CanExecute = true;
+                context.EditType = this.EditType;
+                context.EffectiveTime = this.CorrectEndDate;
+                window.SetRealResult(context);
+                window.DialogResult = true;
+            }
+            catch (Exception ex)
+            {
+
+                MessageTipEx.Show(ex);
+            }
+        }
+        public bool CanEnsureCommand(object parameter)
+        {
+            return true;
+        }
+
+        #endregion
+    }
+
+}

+ 132 - 0
FirmLib/Com.FirmLib.UI/Insuer/VmPolicySaveEnsure.cs

@@ -0,0 +1,132 @@
+
+///////////////////////////////////////////////////////////////////////////////
+//文件名称: VmPolicySaveEnsure.cs
+//文件描述: VmPolicySaveEnsure.cs
+//创 建 者: xls
+//创建日期: 2018/9/18 9:10:29
+//版 本 号:1.0.0.0
+////////////////////////////////////////////////////////////////////////////////
+
+using System;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using Com.FirmLib.UI.BllCommon;
+using Com.FirmLib.UI.Common;
+using Com.FirmLib.UI.Common.Model;
+using Com.FirmLib.UI.Insuer.Model;
+using FWindSoft.MVVM;
+using FWindSoft.Wpf;
+using FWindSoft.Wpf.Common;
+
+namespace Com.FirmLib.UI.Insuer
+{
+    public class VmPolicySaveEnsure : BaseViewModel
+    {
+        public VmPolicySaveEnsure()
+        {
+            Init();
+        }
+
+        private void Init()
+        {
+            this.EditType = EditType.Update;
+            CorrectEndDate = DateTimeManager.ConvertDateTime(DateTime.Now);
+        }
+        public void Init(LoadParameter parameter)
+        {
+            AssetSaveContext context = parameter.Parameter as AssetSaveContext;
+            if (context == null)
+                return;
+            this.ChangedAssetItems = new ObservableCollection<AssetShowItem>(context.ChangedItems ?? new List<AssetShowItem>());
+        }
+        #region 属性相关
+        /// <summary>
+        /// 数据相关信息
+        /// </summary>
+        private AssetSaveContext Context { get; set; }
+
+        private EditType m_EditType;
+        /// <summary>
+        /// 编辑类型\修改还是更正
+        /// </summary>
+        public EditType EditType
+        {
+            get { return this.m_EditType; }
+            set
+            {
+                this.m_EditType = value;
+                RaisePropertyChanged(nameof(this.EditType));
+            }
+        }
+        private string m_CorrectDate;
+        /// <summary>
+        /// 改正日期
+        /// </summary>
+        public string CorrectEndDate
+        {
+            get { return this.m_CorrectDate; }
+            set
+            {
+                this.m_CorrectDate = value;
+                RaisePropertyChanged(() => this.CorrectEndDate);
+            }
+        }
+
+
+
+        private ObservableCollection<AssetShowItem> m_ChangedAssetItems;
+        /// <summary>
+        /// 信息点发生变化的资产
+        /// </summary>
+        public ObservableCollection<AssetShowItem> ChangedAssetItems
+        {
+            get { return this.m_ChangedAssetItems; }
+            set
+            {
+                this.m_ChangedAssetItems = value;
+                RaisePropertyChanged(nameof(this.ChangedAssetItems));
+            }
+        }
+        #endregion
+
+        #region 命令相关
+
+        /// <summary>
+        /// 确定完成
+        /// </summary>
+        /// <param name="parameter"></param>
+        [Command]
+        public void EnsureCommand(object parameter)
+        {
+            try
+            {
+                Window window = parameter as Window;
+                if (window == null)
+                {
+                    return;
+                }
+                AssetSaveContext context = Context ?? new AssetSaveContext();        
+                context.EditType = this.EditType;
+                context.EffectiveTime = this.CorrectEndDate;
+                context.ChangedItems=this.ChangedAssetItems?.ToList()??new List<AssetShowItem>();
+                window.SetRealResult(context);
+                window.DialogResult = true;
+            }
+            catch (Exception ex)
+            {
+
+                MessageTipEx.Show(ex);
+            }
+        }
+        public bool CanEnsureCommand(object parameter)
+        {
+            return true;
+        }
+
+        #endregion
+    }
+}

+ 164 - 0
FirmLib/Com.FirmLib.UI/Insuer/VmPolicySelector.cs

@@ -0,0 +1,164 @@
+
+///////////////////////////////////////////////////////////////////////////////
+//文件名称: VmPolicySelector.cs
+//文件描述: VmPolicySelector.cs
+//创 建 者: xls
+//创建日期: 2018/9/18 0:07:27
+//版 本 号:1.0.0.0
+////////////////////////////////////////////////////////////////////////////////
+
+using System;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+using System.IO;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using Com.FirmLib.Bll;
+using Com.FirmLib.Entity;
+using Com.FirmLib.UI.Insuer.Model;
+using FWindSoft.DataFramework;
+using FWindSoft.MVVM;
+using FWindSoft.Wpf;
+using FWindSoft.Wpf.Common;
+
+namespace Com.FirmLib.UI.Insuer
+{
+    public class VmPolicySelector : BaseViewModel
+    {
+        public VmPolicySelector()
+        {
+            Init();
+        }
+
+        private void Init()
+        {
+
+        }
+        public void Init(LoadParameter parameter)
+        {
+            InsuerParameter insuerParameter = parameter.Parameter as InsuerParameter;
+            if (insuerParameter == null)
+                return;
+            //需要厂商id,和项目Id
+            LoadPolicyItems(insuerParameter.Project.Id, insuerParameter.Insuer.Id);
+            if (insuerParameter != null)
+            {
+                this.CurrentPolicyItem = this.PolicyItems.FirstOrDefault(c => c.PolicyNo == insuerParameter.Policy.Id);
+            }
+        }
+        #region 属性相关
+
+
+
+        private ObservableCollection<PolicyShowItem> m_PolicyItems;
+        /// <summary>
+        /// 保单信息
+        /// </summary>
+        public ObservableCollection<PolicyShowItem> PolicyItems
+        {
+            get { return this.m_PolicyItems; }
+            set
+            {
+                this.m_PolicyItems = value;
+                RaisePropertyChanged(nameof(this.PolicyItems));
+            }
+        }
+
+
+        private PolicyShowItem m_CurrentPolicyItem;
+        /// <summary>
+        /// 当前选中保单
+        /// </summary>
+        public PolicyShowItem CurrentPolicyItem
+        {
+            get { return this.m_CurrentPolicyItem; }
+            set
+            {
+                this.m_CurrentPolicyItem = value;
+                RaisePropertyChanged(nameof(this.CurrentPolicyItem));
+            }
+        }
+        #endregion
+
+        #region 命令相关
+
+        /// <summary>
+        /// 确定按钮
+        /// </summary>
+        /// <param name="parameter"></param>
+        [Command]
+        public void EnsureCommand(object parameter)
+        {
+
+            try
+            {
+                Window window = parameter as Window;
+                if (window != null)
+                {
+                    window.SetRealResult(m_CurrentPolicyItem.PolicyNo);
+                    window.DialogResult = true;
+
+                }
+            }
+            catch (Exception ex)
+            {
+                MessageTipEx.Show(ex);
+            }
+        }
+        public bool CanEnsureCommand(object parameter)
+        {
+            return m_CurrentPolicyItem!=null;
+        }
+        /// <summary>
+        /// 单击列表框按钮
+        /// </summary>
+        /// <param name="parameter"></param>
+        [Command]
+        public void SelectCommand(object parameter)
+        {
+
+            try
+            {
+                PolicyShowItem item = parameter as PolicyShowItem;
+                if (item != null)
+                {
+                    this.CurrentPolicyItem = item;
+                }
+            }
+            catch (Exception ex)
+            {
+                MessageTipEx.Show(ex);
+            }
+        }
+        public bool CanSelectCommand(object parameter)
+        {
+            return true;
+        }
+        #endregion
+
+        #region 私有方法
+        private void LoadPolicyItems(string projectId,string insuerId)
+        {
+            PolicyItems = new ObservableCollection<PolicyShowItem>();
+            var policyItems = BllFactory<InsuerBll>.Instance.GetAllPolicyItems(insuerId, projectId);
+            foreach (var dataItem in policyItems)
+            {
+                var item = ConvertPolicyShowItem(dataItem);
+                item.InsuerId = insuerId;
+                item.ProjectId = projectId;
+                PolicyItems.Add(item);
+            }
+        }
+        private PolicyShowItem ConvertPolicyShowItem(InsuerContractStatisticsItem dataItem)
+        {
+            var showItem = new PolicyShowItem();
+            showItem.PolicyNo = dataItem.InsuranceNo;
+            //showItem.RefAssetCount = (int)dataItem.PropertyCount.ToDouble();
+            showItem.EndDate = dataItem.ExpireDate;
+            return showItem;
+        }
+        #endregion
+    }
+}

+ 336 - 0
FirmLib/Com.FirmLib.UI/Insuer/VmSimplePolicyEditor.cs

@@ -0,0 +1,336 @@
+
+///////////////////////////////////////////////////////////////////////////////
+//文件名称: VmSimplePolicyEditor.cs
+//文件描述: VmSimplePolicyEditor.cs
+//创 建 者: xls
+//创建日期: 2018/9/17 23:19:01
+//版 本 号:1.0.0.0
+////////////////////////////////////////////////////////////////////////////////
+
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using Com.FirmLib.Bll;
+using Com.FirmLib.Entity;
+using Com.FirmLib.UI.BllCommon;
+using Com.FirmLib.UI.Insuer.Model;
+using FirmHttpDao;
+using FWindSoft.Data;
+using FWindSoft.DataFramework;
+using FWindSoft.MVVM;
+using FWindSoft.Wpf;
+using FWindSoft.Wpf.Common;
+using Microsoft.Win32;
+
+namespace Com.FirmLib.UI.Insuer
+{
+    public class VmSimplePolicyEditor : BaseViewModel
+    {
+       
+        public VmSimplePolicyEditor()
+        {
+            Init();
+        }
+
+        private void Init()
+        {
+
+        }
+        public void Init(LoadParameter parameter)
+        {
+            PolicyUpdateContext context = parameter.Parameter as PolicyUpdateContext;
+            if (context == null)
+                return;
+            Context = context;
+            ProjectId = context.InsuerParameter.Project.Id;
+            VenderId = context.InsuerParameter.Insuer.Id;
+            this.OriginPolicyNo = context.PolicyNo;
+            this.PolicyNo = context.PolicyNo ;
+        }
+        #region 相关历史记录
+        private PolicyUpdateContext Context { get; set; }
+        /// <summary>
+        /// 项目Id
+        /// </summary>
+        public string ProjectId { get; set; }
+        /// <summary>
+        /// 厂商id
+        /// </summary>
+         public string VenderId { get; set; }
+        /// <summary>
+        /// 原始保险单号
+        /// </summary>
+        private string OriginPolicyNo { get; set; }
+        #endregion
+
+        #region 属性相关
+
+        private string m_PolicyNo;
+        /// <summary>
+        /// 保单编号
+        /// </summary>
+        public string PolicyNo
+        {
+            get { return this.m_PolicyNo; }
+            set
+            {
+                this.m_PolicyNo = value;
+                if (!IsInEditing)
+                {
+                    LoadPolicyByNo(value);
+                }               
+                RaisePropertyChanged(() => this.PolicyNo);
+            }
+        }
+        private string m_PolicyEndDate;
+        /// <summary>
+        /// 保单截止日期
+        /// </summary>
+        public string PolicyEndDate
+        {
+            get { return this.m_PolicyEndDate; }
+            set
+            {
+                this.m_PolicyEndDate = value;
+                RaisePropertyChanged(() => this.PolicyEndDate);
+            }
+        }
+        private FileItem m_PolicyFile;
+        /// <summary>
+        /// 保险文件
+        /// </summary>
+        public FileItem PolicyFile
+        {
+            get { return this.m_PolicyFile; }
+            set
+            {
+                this.m_PolicyFile = value;
+                RaisePropertyChanged(() => this.PolicyFile);
+            }
+        }
+        /// <summary>
+        /// 是否可用的存在保险单号
+        /// </summary>
+        public bool ValidatePolicy { get; private set; }
+        #endregion
+
+        #region 命令相关
+        /// <summary>
+        /// 上传文件
+        /// </summary>
+        /// <param name="parameter"></param>
+        [Command]
+        public void UploadCommand(object parameter)
+        {
+            try
+            {
+                OpenFileDialog ofd = new OpenFileDialog();
+                ofd.Filter = "pdf文件|*.pdf";
+                if (ofd.ShowDialog() == true)
+                {
+                    string fileName = ofd.FileName;
+                    this.PolicyFile.Name = Path.GetFileName(fileName);
+                    this.PolicyFile.Path = fileName;
+
+                }
+            }
+            catch (Exception e)
+            {
+               MessageTipEx.Show(this.GetWindow(), e);
+            }
+        }
+        public bool CanUploadCommand(object parameter)
+        {
+            return true;
+        }
+        /// <summary>
+        /// 选择保单号
+        /// </summary>
+        /// <param name="parameter"></param>
+        [Command]
+        public void SelectPolicyCommand(object parameter)
+        {
+
+            try
+            {
+                //传入当前输入的保单号,为显示默认值
+                WinPolicySelector win = new WinPolicySelector();
+                LoadParameter.StartParameter(win, new LoadParameter(Context.InsuerParameter));
+                win.Owner = this.GetWindow();
+                if (win.ShowDialog() == true)
+                {
+                    var tempPolicyNo = win.GetRealResult<string>();
+                    if (!string.IsNullOrEmpty(tempPolicyNo))
+                    {
+                        this.PolicyNo = tempPolicyNo;
+                    }
+                }
+            }
+            catch (Exception ex)
+            {
+                MessageTipEx.Show(ex);
+            }
+        }
+        public bool CanSelectPolicyCommand(object parameter)
+        {
+            return true;
+        }
+
+
+        /// <summary>
+        /// 确定按钮
+        /// </summary>
+        /// <param name="parameter"></param>
+        [Command]
+        public void EnsureCommand(object parameter)
+        {
+            try
+            {
+                Window window = parameter as Window;
+                if (window == null)
+                    return;
+                var flag = CreatePolicyInfo();
+                if (!flag)
+                {
+                    return;
+                }
+                UpdateContetxt();
+                window.SetRealResult<PolicyUpdateContext>(Context);
+                window.DialogResult = true;
+            }
+            catch (Exception ex)
+            {
+               MessageTipEx.Show(ex);
+            }
+        }
+        public bool CanEnsureCommand(object parameter)
+        {
+            return true;
+        }
+
+        #endregion
+        #region 私有方法
+        /// <summary>
+        /// 加载保单信息
+        /// </summary>
+        /// <param name="policyNo"></param>
+        private void LoadPolicyByNo(string policyNo)
+        {
+            InsuerContractItem item = null;
+            string fileKey = string.Empty;
+            try
+            {
+                ValidatePolicy = false;
+                if (string.IsNullOrEmpty(policyNo))
+                    return;
+                item = BllFactory<InsuerBll>.Instance.GetPolicyItem(VenderId, ProjectId, policyNo);
+                ValidatePolicy = item != null;
+            }
+            finally
+            {
+                if (ValidatePolicy)
+                {
+                    string timeStr = item.ExpireDate ?? string.Empty;
+
+                    this.PolicyEndDate = DateTimeManager.ConvertDateTimeH(timeStr).ToString("yyyyMMdd");
+                    fileKey = item.InsuranceFile;
+                    PolicyFile = FileUtils.ParseFileKey(fileKey);
+                }
+                else
+                {
+                    PolicyFile = new FileItem();
+                }
+            }
+        }
+
+        /// <summary>
+        /// 判断是否使用编辑方式控制
+        /// </summary>
+        /// <returns></returns>
+        private bool UseEditTypeControl()
+        {
+            if(string.IsNullOrEmpty(this.OriginPolicyNo))
+               return false;
+            if (this.OriginPolicyNo == this.PolicyNo)
+                return false;
+            return true;
+        }
+        /// <summary>
+        /// 更新信息
+        /// </summary>
+        private void UpdateContetxt()
+        {
+            if (Context == null)
+                return;
+            Context.PolicyNo = this.PolicyNo;
+            Context.ExpiryDate = this.PolicyEndDate;
+            Context.PolicyFile = this.PolicyFile?.FileKey;
+            Context.UseEditType = UseEditTypeControl();
+        }
+        /// <summary>
+        /// 创建保单信息
+        /// </summary>
+        /// <returns></returns>
+        private bool CreatePolicyInfo()
+        {
+            InsuerContractItem item = new InsuerContractItem();
+            item.ProjectId = ProjectId;
+            item.VenderId = VenderId;
+
+            item.ExpireDate = DateTimeManager.ConvertDateTime(PolicyEndDate).ToString("yyyy-MM-dd");
+            item.InsuranceNo = PolicyNo;
+            item.InsuranceFile = GetFileKey();//获取相关编码
+            bool result = false;
+            var refVenderId= BllFactory<InsuerBll>.Instance.CheckInsuranceNo(PolicyNo);
+            bool isExist = !string.IsNullOrEmpty(refVenderId);         
+            if (!isExist)
+            {
+                result = BllFactory<InsuerBll>.Instance.AddPolicy(item);
+            }
+            else
+            {
+                if (refVenderId != VenderId)
+                {
+                    MessageTip.Show(this.GetWindow(), $"该保单已被其他项目关联");
+                    return result;
+                }
+                result = BllFactory<InsuerBll>.Instance.UpdatePolicy(item);
+            }
+            if (!result)
+            {
+                MessageTip.Show(this.GetWindow(), BllFactory<InsuerBll>.Instance.ErrorMessage ?? string.Empty);
+            }
+            return result;
+        }
+        /// <summary>
+        /// 获取文件键值
+        /// </summary>
+        /// <returns></returns>
+        public string GetFileKey()
+        {
+            #region 上传文件
+            string fileKey = FileUtils.GetUseKey(PolicyFile, VenderId);
+            if (string.IsNullOrEmpty(fileKey))
+            {
+                return fileKey;
+            }
+            if (!File.Exists(PolicyFile.Path))
+            {
+                return fileKey;
+            }
+            var bytes = File.ReadAllBytes(PolicyFile.Path);
+            var flag = BllFactory<FileBll>.Instance.UploadFile(BllHttpSetting.Instance.Default, fileKey, bytes);
+            if (!flag)
+            {
+                MessageTip.Show(this.GetWindow(), BllFactory<FileBll>.Instance.ErrorMessage ?? string.Empty);
+            }
+            #endregion
+            return fileKey;
+        }
+        #endregion
+    }
+}

+ 184 - 0
FirmLib/Com.FirmLib.UI/Insuer/WinInsuerAssetSelector.xaml

@@ -0,0 +1,184 @@
+<fw:BaseWindow x:Class="Com.FirmLib.UI.Insuer.WinInsuerAssetSelector"
+             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+             xmlns:fw="http://schemas.FWind/xaml"
+             xmlns:wpf="clr-namespace:SAGA.DotNetUtils.WPF;assembly=SAGA.DotNetUtils"
+             xmlns:uc="clr-namespace:Com.FirmLib.UI.Common"
+               xmlns:dgx="urn:tom-englert.de/DataGridExtensions"
+             xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
+             Name="this" Title="选择已有资产"
+            Height="550" Width="600" WindowStartupLocation="CenterOwner">
+    <fw:BaseWindow.Resources>
+        <fw:BindingProxy x:Key="DATA" Data="{Binding}"></fw:BindingProxy>
+    </fw:BaseWindow.Resources>
+    <Grid Margin="5">
+        <Grid.RowDefinitions>
+            <RowDefinition></RowDefinition>
+            <RowDefinition Height="Auto"></RowDefinition>
+            <RowDefinition Height="30"></RowDefinition>
+        </Grid.RowDefinitions>
+        <TabControl x:Name="TabControl" SelectionChanged="TabControl_SelectionChanged">
+            <TabItem Header="系统推荐" DataContext="{Binding RecommendAssetSelecter,Mode=OneWay}">
+                <Grid>
+                    <Grid.RowDefinitions>
+                        <RowDefinition Height="Auto"></RowDefinition>
+                        <RowDefinition></RowDefinition>
+                        <RowDefinition  Height="Auto"></RowDefinition>
+                    </Grid.RowDefinitions>
+                    <!--搜索框-->
+                    <wpf:SearchInputEditor  Grid.Row="0" Text="{Binding FilterName,Mode=TwoWay}"  WaterText="输入资产本地名称进行搜索" Command="{Binding Commands.SearchCommand}" Margin="0,5,0,5" VerticalAlignment="Center" HorizontalAlignment="Stretch" >
+                    </wpf:SearchInputEditor>
+
+                    <DataGrid  Grid.Row="1" dgx:DataGridFilter.IsAutoFilterEnabled="True" AutoGenerateColumns="False" SelectionMode="Single"  FrozenColumnCount="1" ItemsSource="{Binding Data.RecommendAssetItems,Source={StaticResource ResourceKey=DATA}}"
+                CanUserAddRows="False"
+                CanUserDeleteRows="False"
+                VerticalScrollBarVisibility="Auto"
+                HorizontalScrollBarVisibility="Auto"
+                SelectionUnit="FullRow"
+                HeadersVisibility="Column" 
+                CanUserSortColumns="True"   
+                CellStyle="{StaticResource ResourceKey={x:Static uc:CommonStyles.DataGridCellKey}}"
+                  AlternationCount="2"
+                >
+                        <DataGrid.RowStyle>
+                            <Style TargetType="DataGridRow" BasedOn="{StaticResource ResourceKey={x:Type DataGridRow}}">
+                                <Setter Property="Height" Value="30"></Setter>
+                                <Style.Triggers>
+                                   
+                                    <Trigger Property="ItemsControl.AlternationIndex"
+                                 Value="0">
+                                        <Setter Property="Background" Value="White" />
+                                    </Trigger>
+                                    <Trigger Property="ItemsControl.AlternationIndex"
+                                 Value="1">
+                                        <Setter Property="Background" Value="#FFE6E3DD" />
+                                    </Trigger>
+                                    <DataTrigger Binding="{Binding RelativeSource={RelativeSource Self},Path=Item.IsEnabled }" Value="False">
+                                        <Setter Property="Background" Value="GreenYellow" />
+                                    </DataTrigger>
+                                </Style.Triggers>
+                            </Style>
+                        </DataGrid.RowStyle>
+                        <DataGrid.Columns>
+                            <DataGridTemplateColumn Width="30" dgx:DataGridFilterColumn.IsFilterVisible="False">
+                                <DataGridTemplateColumn.CellTemplate>
+                                    <DataTemplate>
+                                        <CheckBox IsChecked="{Binding IsChecked,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"  Command="{Binding Data.Commands.SelectedAssetChanged,Source={StaticResource ResourceKey=DATA}}" CommandParameter="{Binding }" IsEnabled="{Binding IsEnabled}" HorizontalAlignment="Center" VerticalAlignment="Center">
+                                            
+                                        </CheckBox>
+                                    </DataTemplate>
+                                </DataGridTemplateColumn.CellTemplate>
+                            </DataGridTemplateColumn>
+                            <fw:TDataGridTextColumn Header="资产本地名称" Width="120" IsReadOnly="True"  Binding="{Binding Path=LocalName}"></fw:TDataGridTextColumn>
+                            <fw:TDataGridTextColumn Header="资产本地编码"  Width="120" IsReadOnly="True"  Binding="{Binding Path=LocalCode}"></fw:TDataGridTextColumn>
+                            <fw:TDataGridTextColumn Header="资产编码"  Width="100" IsReadOnly="True"  Binding="{Binding Path=AssetNo}"></fw:TDataGridTextColumn>
+                            <fw:TDataGridTextColumn Header="品牌"  Width="100" IsReadOnly="True"  Binding="{Binding Path=Brand}"></fw:TDataGridTextColumn>
+
+                            <fw:TDataGridTextColumn Header="产品名"  Width="100" IsReadOnly="True"  Binding="{Binding Path=Product}"></fw:TDataGridTextColumn>
+
+                            <fw:TDataGridTextColumn Header="型号"  Width="100" IsReadOnly="True"  Binding="{Binding Path=Type}"></fw:TDataGridTextColumn>
+                            <fw:TDataGridTextColumn Header="供应商名称"  Width="100" IsReadOnly="True"  Binding="{Binding Path=SellerName}"></fw:TDataGridTextColumn>
+                            <fw:TDataGridTextColumn Header="所属合同编码"  Width="120" IsReadOnly="True"  Binding="{Binding Path=SellerContractNo}"></fw:TDataGridTextColumn>
+
+
+                        </DataGrid.Columns>
+                       
+                    </DataGrid>
+
+                    <fw:NavigationPager Margin="5"  CurrentPageIndex="{Binding CurrentPageIndex,Mode=TwoWay}" TotalPageCount="{Binding PageCount,Mode=OneWay}" Grid.Row="2" PageIndexChanged="NavigationPager_OnPageIndexChanged" HorizontalAlignment="Right">
+                        <i:Interaction.Triggers>
+                            <i:EventTrigger EventName="PageIndexChanged">
+                                <i:InvokeCommandAction Command="{Binding Commands.PageIndexChangedCommand}" CommandParameter="{Binding Path=CurrentPageIndex}"/>
+                            </i:EventTrigger>
+                        </i:Interaction.Triggers>
+                    </fw:NavigationPager>
+                </Grid>
+
+            </TabItem>
+
+            <TabItem Header="全部资产" DataContext="{Binding AllAssetSelecter,Mode=OneWay}">
+                <Grid>
+                    <Grid.RowDefinitions>
+                        <RowDefinition Height="Auto"></RowDefinition>
+                        <RowDefinition></RowDefinition>
+                        <RowDefinition  Height="Auto"></RowDefinition>
+                    </Grid.RowDefinitions>
+                    <!--搜索框-->
+                    <wpf:SearchInputEditor  Grid.Row="0" Text="{Binding FilterName,Mode=TwoWay}"  WaterText="输入资产本地名称进行搜索" Command="{Binding Commands.SearchCommand}" Margin="0,5,0,5" VerticalAlignment="Center" HorizontalAlignment="Stretch" >
+                    </wpf:SearchInputEditor>
+
+                    <DataGrid  Grid.Row="1" dgx:DataGridFilter.IsAutoFilterEnabled="True"  AutoGenerateColumns="False" SelectionMode="Single"  FrozenColumnCount="1" ItemsSource="{Binding Data.AllAssetItems,Source={StaticResource ResourceKey=DATA}}"
+                CanUserAddRows="False"
+                CanUserDeleteRows="False"
+                VerticalScrollBarVisibility="Auto"
+                HorizontalScrollBarVisibility="Auto"
+                SelectionUnit="FullRow"
+                HeadersVisibility="Column" 
+                CanUserSortColumns="True"   
+                CellStyle="{StaticResource ResourceKey={x:Static uc:CommonStyles.DataGridCellKey}}"
+                  AlternationCount="2"
+                >
+                        <DataGrid.RowStyle>
+                            <Style TargetType="DataGridRow" BasedOn="{StaticResource ResourceKey={x:Type DataGridRow}}">
+                                <Setter Property="Height" Value="30"></Setter>
+                                <Style.Triggers>
+
+                                    <Trigger Property="ItemsControl.AlternationIndex"
+                                 Value="0">
+                                        <Setter Property="Background" Value="White" />
+                                    </Trigger>
+                                    <Trigger Property="ItemsControl.AlternationIndex"
+                                 Value="1">
+                                        <Setter Property="Background" Value="#FFE6E3DD" />
+                                    </Trigger>
+                                    <DataTrigger Binding="{Binding RelativeSource={RelativeSource Self},Path=Item.IsEnabled }" Value="False">
+                                        <Setter Property="Background" Value="GreenYellow" />
+                                    </DataTrigger>
+                                </Style.Triggers>
+                            </Style>
+                        </DataGrid.RowStyle>
+                        <DataGrid.Columns>
+                            <DataGridTemplateColumn Width="30" dgx:DataGridFilterColumn.IsFilterVisible="False">
+                                <DataGridTemplateColumn.CellTemplate>
+                                    <DataTemplate>
+                                        <CheckBox IsChecked="{Binding IsChecked,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"  Command="{Binding Data.Commands.SelectedAssetChanged,Source={StaticResource ResourceKey=DATA}}" CommandParameter="{Binding }" IsEnabled="{Binding IsEnabled}" HorizontalAlignment="Center" VerticalAlignment="Center">
+
+                                        </CheckBox>
+                                    </DataTemplate>
+                                </DataGridTemplateColumn.CellTemplate>
+                            </DataGridTemplateColumn>
+                            <fw:TDataGridTextColumn Header="资产本地名称" Width="120" IsReadOnly="True"  Binding="{Binding Path=LocalName}"></fw:TDataGridTextColumn>
+                            <fw:TDataGridTextColumn Header="资产本地编码"  Width="120" IsReadOnly="True"  Binding="{Binding Path=LocalCode}"></fw:TDataGridTextColumn>
+                            <fw:TDataGridTextColumn Header="资产编码"  Width="100" IsReadOnly="True"  Binding="{Binding Path=AssetNo}"></fw:TDataGridTextColumn>
+                            <fw:TDataGridTextColumn Header="品牌"  Width="100" IsReadOnly="True"  Binding="{Binding Path=Brand}"></fw:TDataGridTextColumn>
+
+                            <fw:TDataGridTextColumn Header="产品名"  Width="100" IsReadOnly="True"  Binding="{Binding Path=Product}"></fw:TDataGridTextColumn>
+
+                            <fw:TDataGridTextColumn Header="型号"  Width="100" IsReadOnly="True"  Binding="{Binding Path=Type}"></fw:TDataGridTextColumn>
+                            <fw:TDataGridTextColumn Header="供应商名称"  Width="100" IsReadOnly="True"  Binding="{Binding Path=SellerName}"></fw:TDataGridTextColumn>
+                            <fw:TDataGridTextColumn Header="所属合同编码"  Width="120" IsReadOnly="True"  Binding="{Binding Path=SellerContractNo}"></fw:TDataGridTextColumn>
+
+
+                        </DataGrid.Columns>
+
+                    </DataGrid>
+
+                    <fw:NavigationPager Margin="5"  CurrentPageIndex="{Binding CurrentPageIndex,Mode=TwoWay}" TotalPageCount="{Binding PageCount,Mode=OneWay}" Grid.Row="2" PageIndexChanged="NavigationPager_OnPageIndexChanged" HorizontalAlignment="Right">
+                        <i:Interaction.Triggers>
+                            <i:EventTrigger EventName="PageIndexChanged">
+                                <i:InvokeCommandAction Command="{Binding Commands.PageIndexChangedCommand}" CommandParameter="{Binding Path=CurrentPageIndex}"/>
+                            </i:EventTrigger>
+                        </i:Interaction.Triggers>
+                    </fw:NavigationPager>
+                </Grid>
+            </TabItem>
+         
+        </TabControl>
+
+        <TextBlock Grid.Row="1" Margin="0,5" Text="{Binding SelectedAssetCount,StringFormat=选中{0}}" HorizontalAlignment="Center" VerticalAlignment="Center"></TextBlock>
+        <StackPanel Grid.Row="2" Orientation="Horizontal" VerticalAlignment="Center" HorizontalAlignment="Center">
+            <Button Command="{Binding Commands.EnsureCommand}" CommandParameter="{Binding ElementName=this}"  Style="{StaticResource ResourceKey={x:Static uc:CommonStyles.ButtonKey}}"  Height="23" Width="60"   Content="确定" Click="btnOK_Click"/>
+
+        </StackPanel>
+    </Grid>
+</fw:BaseWindow>

+ 75 - 0
FirmLib/Com.FirmLib.UI/Insuer/WinInsuerAssetSelector.xaml.cs

@@ -0,0 +1,75 @@
+
+///////////////////////////////////////////////////////////////////////////////  
+//文件名称: WinInsuerAssetSelecter.xaml
+//文件描述: WinInsuerAssetSelecter.xaml
+//创 建 者: xls
+//创建日期: 2018/9/18 9:11:18
+//版 本 号:1.0.0.0
+////////////////////////////////////////////////////////////////////////////////
+
+using System;
+using System.Windows;
+using System.Windows.Controls;
+using FWindSoft.Wpf;
+
+namespace Com.FirmLib.UI.Insuer
+{
+    /// <summary>
+    /// WinInsuerAssetSelecter.xaml 的交互逻辑
+    /// </summary>
+    public partial class WinInsuerAssetSelector : BaseWindow
+    {
+        private VmInsuerAssetSelector m_Vm;
+        public WinInsuerAssetSelector() : this(new VmInsuerAssetSelector())
+        {
+           
+        }
+        public WinInsuerAssetSelector(VmInsuerAssetSelector vm)
+        {
+            InitializeComponent();
+            this.m_Vm = vm;
+            this.m_Vm.SetRefView(this);
+            this.DataContext = this.m_Vm;
+        }
+        protected override void LoadData(LoadParameter parameter)
+        {
+            //初始化数据
+             TryCatchWrapper.Handled(() => this.m_Vm.Init(parameter));
+        }
+        #region 界面关联事件
+        private void btnOK_Click(object sender, RoutedEventArgs e)
+        {
+            try
+            {
+                if (this.HasError())
+                {
+                    //MessageShow.Infomation("请修改错误输入项");
+                    return;
+                }
+            }
+            catch (Exception ex)
+            {
+                //MessageShow.Show(ex);
+            }
+        }
+
+        private void btnCancel_Click(object sender, RoutedEventArgs e)
+        {
+            Close();
+        }
+        #endregion
+
+        private void NavigationPager_OnPageIndexChanged(object sender, FWindSoft.Wpf.Controls.PageChangedEventArgs e)
+        {
+
+        }
+
+        private void TabControl_SelectionChanged(object sender, SelectionChangedEventArgs e)
+        {
+            System.Windows.Controls.TabControl control = e.OriginalSource as TabControl;
+            if (control == null)
+                return;
+            this.m_Vm.TabChangedCommand(control.SelectedIndex);
+        }
+    }
+}

+ 81 - 0
FirmLib/Com.FirmLib.UI/Insuer/WinInsuerBaseInfo.xaml

@@ -0,0 +1,81 @@
+<fw:NChildWindow x:Class="Com.FirmLib.UI.Insuer.WinInsuerBaseInfo"
+             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
+             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
+             xmlns:fw="http://schemas.FWind/xaml"
+             xmlns:wpf="clr-namespace:FWindSoft.Wpf;assembly=FWindSoft.Wpf"
+             xmlns:uc="clr-namespace:Com.FirmLib.UI.Common"
+                 xmlns:dgx="urn:tom-englert.de/DataGridExtensions"
+             xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
+             xmlns:behaviors="clr-namespace:FWindSoft.Wpf.Behaviors;assembly=FWindSoft.Wpf"
+                 mc:Ignorable="d" d:DesignHeight="300" d:DesignWidth="500" Title="保险商名称" Name="this" Height="{Binding Height,RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=UIElement}}"
+                 Width="{Binding ActualWidth,RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=ScrollContentPresenter}}" >
+    <fw:NChildWindow.Resources>
+        <wpf:BindingProxy x:Key="DATA" Data="{Binding}"></wpf:BindingProxy>
+    </fw:NChildWindow.Resources>
+    <Grid Margin="5">
+        <Grid.RowDefinitions>
+            <RowDefinition Height="Auto"></RowDefinition>
+            <RowDefinition></RowDefinition>
+        </Grid.RowDefinitions>
+        <StackPanel Grid.Row="0" Orientation="Horizontal" VerticalAlignment="Center" HorizontalAlignment="Right">
+            <Button Style="{StaticResource ResourceKey={x:Static uc:CommonStyles.ButtonKey}}" Command="{Binding Commands.AddCommand}"  Height="23"  Margin="10" Content="添加保险商"/>
+            <Button Style="{StaticResource ResourceKey={x:Static uc:CommonStyles.ButtonKey}}"  Height="23" Margin="10" Content="查看备选名片" />
+        </StackPanel>
+
+        <DataGrid Grid.Row="1" Grid.Column="0"   AutoGenerateColumns="False" SelectionMode="Single"  FrozenColumnCount="1" ItemsSource="{Binding Insuers}"
+                CanUserAddRows="False"
+                CanUserDeleteRows="False"
+                VerticalScrollBarVisibility="Auto"
+                HorizontalScrollBarVisibility="Auto"
+                SelectionUnit="FullRow"
+                HeadersVisibility="Column" 
+                CanUserSortColumns="True"   
+                  dgx:DataGridFilter.IsAutoFilterEnabled="True"
+                CellStyle="{StaticResource ResourceKey={x:Static uc:CommonStyles.DataGridCellKey}}"
+                  AlternationCount="2"
+                >
+            <DataGrid.RowStyle>
+                <Style TargetType="DataGridRow">
+                    <Setter Property="ContextMenu">
+                        <Setter.Value>
+                            <ContextMenu>
+                                <MenuItem Header="删除" Command="{Binding Data.Commands.DeleteCommand,Source={StaticResource ResourceKey=DATA}}" CommandParameter="{Binding }"></MenuItem>
+                            </ContextMenu>
+                        </Setter.Value>
+                    </Setter>
+                    <Setter Property="Height" Value="30"></Setter>
+                    <Style.Triggers>
+                        <Trigger Property="ItemsControl.AlternationIndex"
+                                 Value="0">
+                            <Setter Property="Background" Value="White" />
+                        </Trigger>
+                        <Trigger Property="ItemsControl.AlternationIndex"
+                                 Value="1">
+                            <Setter Property="Background" Value="#FFE6E3DD" />
+                        </Trigger>
+                    </Style.Triggers>
+                </Style>
+            </DataGrid.RowStyle>
+            <DataGrid.Columns>
+                <DataGridTemplateColumn Header="操作"  Width="60" IsReadOnly="True" >
+                    <DataGridTemplateColumn.CellTemplate>
+                        <DataTemplate>
+                            <Button Command="{Binding DataContext.Commands.ManageCommand,ElementName=this}" Style="{StaticResource ResourceKey={x:Static uc:CommonStyles.LinkButtonKey}}"  CommandParameter="{Binding }" VerticalAlignment="Center"   Content="管理" HorizontalAlignment="Left" Padding="5,0,5,0"/>
+                        </DataTemplate>
+                    </DataGridTemplateColumn.CellTemplate>
+
+                </DataGridTemplateColumn>
+                <fw:TDataGridTextColumn Header="保险商名称" Width="100" IsReadOnly="True"  Binding="{Binding Path=Name}"></fw:TDataGridTextColumn>
+                <fw:TDataGridTextColumn Header="保险商网址"  Width="*" IsReadOnly="True"  Binding="{Binding Path=Url}"></fw:TDataGridTextColumn>
+
+                <fw:TDataGridTextColumn Header="提供保险服务的项目"  Width="*" IsReadOnly="True"  Binding="{Binding Path=RefProjectCount}"></fw:TDataGridTextColumn>
+            </DataGrid.Columns>
+            <i:Interaction.Behaviors>
+                <behaviors:GridCellSingleClickEditBehavior></behaviors:GridCellSingleClickEditBehavior>
+            </i:Interaction.Behaviors>
+
+        </DataGrid>
+    </Grid>
+</fw:NChildWindow>

+ 68 - 0
FirmLib/Com.FirmLib.UI/Insuer/WinInsuerBaseInfo.xaml.cs

@@ -0,0 +1,68 @@
+
+///////////////////////////////////////////////////////////////////////////////  
+//文件名称: WinInsuerBaseInfo.xaml
+//文件描述: 保险商基本信息
+//创 建 者: xls
+//创建日期: 2018/5/24 21:41:29
+//版 本 号:1.0.0.0
+////////////////////////////////////////////////////////////////////////////////
+
+using System;
+using System.Windows;
+using FWindSoft.Wpf;
+using FWindSoft.Wpf.Controls;
+
+namespace Com.FirmLib.UI.Insuer
+{
+    /// <summary>
+    /// WinInsuerBaseInfo.xaml 的交互逻辑
+    /// </summary>
+    public partial class WinInsuerBaseInfo : NChildWindow
+    {
+        private VmInsuerBaseInfo m_Vm;
+        public WinInsuerBaseInfo():this(new VmInsuerBaseInfo())
+        {
+           
+        }
+        public WinInsuerBaseInfo(VmInsuerBaseInfo vm)
+        {
+            InitializeComponent();
+            this.m_Vm = vm;
+            this.m_Vm.SetRefView(this);
+            this.DataContext = this.m_Vm;
+            this.EveryTimeLoad = true;
+        }
+        protected override void LoadData(LoadParameter parameter)
+        {
+            //初始化列表数据
+            TryCatchWrapper.Handled(() => this.m_Vm.Init(parameter));
+        }
+        #region 界面关联事件
+        private void btnOK_Click(object sender, RoutedEventArgs e)
+        {
+            try
+            {
+                if (this.HasError())
+                {
+                    //MessageShow.Infomation("请修改错误输入项");
+                    return;
+                }
+                //if (Execute())
+                //{
+                //    MessageShow.Infomation("");
+                //    DialogResult = true;
+                //}
+            }
+            catch (Exception ex)
+            {
+                //MessageShow.Show(ex);
+            }
+        }
+
+        private void btnCancel_Click(object sender, RoutedEventArgs e)
+        {
+            Close();
+        }
+        #endregion
+    }
+}

+ 43 - 0
FirmLib/Com.FirmLib.UI/Insuer/WinInsuerEditor.xaml

@@ -0,0 +1,43 @@
+<fw:BaseWindow x:Class="Com.FirmLib.UI.Insuer.WinInsuerEditor"
+             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
+             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
+             xmlns:fw="http://schemas.FWind/xaml"
+             xmlns:uc="clr-namespace:Com.FirmLib.UI.Common"
+             mc:Ignorable="d"  Title="添加保险商" Name="this"
+        d:DesignHeight="300" d:DesignWidth="300" Width="270" SizeToContent="Height" WindowStartupLocation="CenterOwner">
+    <Grid Margin="5"  Validation.ErrorTemplate="{StaticResource ResourceKey={x:Static fw:ResourceKeys.EmptyErrorTemplateKey}}">
+        <Grid.RowDefinitions>
+            <RowDefinition></RowDefinition>
+            <RowDefinition Height="Auto"></RowDefinition>
+            <RowDefinition Height="Auto"></RowDefinition>
+        </Grid.RowDefinitions>
+
+        <Grid.BindingGroup  >
+            <BindingGroup x:Name="bg"  NotifyOnValidationError="False"/>
+        </Grid.BindingGroup>
+        <StackPanel Orientation="Vertical" HorizontalAlignment="Stretch">
+            <Label  Style="{StaticResource ResourceKey={x:Static uc:CommonStyles.StarLableKey}}" Content="保险商名称:"></Label>
+
+            <TextBox Style="{StaticResource ResourceKey={x:Static uc:CommonStyles.TextBoxKey}}" Margin="5">
+                <Binding Path="Name" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged" >
+                    <Binding.ValidationRules>
+                        <fw:RequireValidationRule ></fw:RequireValidationRule>
+                    </Binding.ValidationRules>
+                </Binding>
+            </TextBox>
+            <Label  Content="网址:"></Label>
+
+            <TextBox Text="{Binding Url,UpdateSourceTrigger=PropertyChanged}" Style="{StaticResource ResourceKey={x:Static uc:CommonStyles.TextBoxKey}}" Margin="5">
+            </TextBox>
+        </StackPanel>
+
+        <fw:LineSpliter Grid.Column="0" Margin="5,0,5,0" Grid.Row="1" VerticalAlignment="Center" ></fw:LineSpliter>
+
+        <StackPanel Grid.Row="2" Orientation="Horizontal" VerticalAlignment="Center" HorizontalAlignment="Center">
+            <Button Command="{Binding Commands.AddCommand}" CommandParameter="{Binding ElementName=this}"  Style="{StaticResource ResourceKey={x:Static uc:CommonStyles.ButtonKey}}"  Height="23" Width="60"  Margin="10" Content="完成" Click="btnOK_Click"/>
+            <Button Command="{Binding Commands.AddAndManageCommand}" CommandParameter="{Binding ElementName=this}"  Style="{StaticResource ResourceKey={x:Static uc:CommonStyles.ButtonKey}}"  Height="23" Margin="10" Content="继续管理厂家其他信息" Click="btnOK_Click"/>
+        </StackPanel>
+    </Grid>
+   </fw:BaseWindow>

+ 72 - 0
FirmLib/Com.FirmLib.UI/Insuer/WinInsuerEditor.xaml.cs

@@ -0,0 +1,72 @@
+
+///////////////////////////////////////////////////////////////////////////////  
+//文件名称: WinInsuerEditor.xaml
+//文件描述: 保险商添加修改
+//创 建 者: xls
+//创建日期: 2018/5/24 21:35:53
+//版 本 号:1.0.0.0
+////////////////////////////////////////////////////////////////////////////////
+
+using System;
+using System.Windows;
+using Com.FirmLib.UI.Common;
+using FWindSoft.Wpf;
+using FWindSoft.Wpf.SystemTypeExtensions;
+
+namespace Com.FirmLib.UI.Insuer
+{
+    /// <summary>
+    /// WinInsuerEditor.xaml 的交互逻辑
+    /// </summary>
+    public partial class WinInsuerEditor : BaseWindow
+    {
+        private VmInsuerEditor m_Vm;
+        public WinInsuerEditor():this(new VmInsuerEditor())
+        {
+            InitializeComponent();
+        }
+        public WinInsuerEditor(VmInsuerEditor vm)
+        {
+            InitializeComponent();
+            this.m_Vm = vm;
+            this.m_Vm.SetRefView(this);
+            this.m_Vm.WatchValidateResult(() => !this.HasError());
+            this.DataContext = this.m_Vm;
+        }
+        #region 界面关联事件
+        private void btnOK_Click(object sender, RoutedEventArgs e)
+        {
+            try
+            {
+                bg.UpdateSourceForEach();
+                if (this.HasError())
+                {
+                    //MessageShow.Infomation("请修改错误输入项");
+                    return;
+                }
+
+            }
+            catch (Exception ex)
+            {
+                //MessageShow.Show(ex);
+            }
+        }
+
+        private void btnCancel_Click(object sender, RoutedEventArgs e)
+        {
+            Close();
+        }
+        #endregion
+
+        /// <summary>
+        /// 是否管理
+        /// </summary>
+
+        public bool IsManage { get { return this.m_Vm.IsManage; } }
+        /// <summary>
+        /// 保险商Id
+        /// </summary>
+
+        public string NewId { get { return this.m_Vm.Id; } }
+    }
+}

+ 110 - 0
FirmLib/Com.FirmLib.UI/Insuer/WinInsuerInfo.xaml

@@ -0,0 +1,110 @@
+<fw:NChildWindow x:Class="Com.FirmLib.UI.Insuer.WinInsuerInfo"
+             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
+             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
+             xmlns:fw="http://schemas.FWind/xaml"
+             xmlns:wpf="clr-namespace:FWindSoft.Wpf;assembly=FWindSoft.Wpf"
+             xmlns:uc="clr-namespace:Com.FirmLib.UI.Common"
+             xmlns:bllCommon="clr-namespace:Com.FirmLib.UI.BllCommon"
+             mc:Ignorable="d" Title="保险商信息"
+             d:DesignHeight="300" d:DesignWidth="500" Name="this" Height="{Binding Height,RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=UIElement}}"
+                 Width="{Binding ActualWidth,RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=ScrollContentPresenter}}" >
+    <fw:NChildWindow.Resources>
+        <wpf:BindingProxy x:Key="DATA" Data="{Binding}"></wpf:BindingProxy>
+    </fw:NChildWindow.Resources>
+    <fw:NChildWindow.AttachElement>
+        <StackPanel HorizontalAlignment="Stretch" Orientation="Horizontal" VerticalAlignment="Center">
+            <Button Command="{Binding Data.Commands.SaveCommand,Source={StaticResource ResourceKey=DATA}}" Style="{StaticResource ResourceKey={x:Static uc:CommonStyles.ButtonKey}}"  BorderThickness="0"  FontFamily="{DynamicResource ResourceKey={x:Static wpf:FontsUtil.AwesomeKey}}">
+                <Button.Content>
+                    <StackPanel Orientation="Horizontal">
+                        <TextBlock Text="{wpf:FontIcon Icon=Save}"  Width="30" FontSize="20"></TextBlock>
+                        <TextBlock Text="保存" VerticalAlignment="Center" Margin="-5,0,0,0"></TextBlock>
+                    </StackPanel>
+                </Button.Content>
+            </Button>
+        </StackPanel>
+      
+    </fw:NChildWindow.AttachElement>
+    <Grid Margin="5">
+        <Grid.RowDefinitions>
+            <RowDefinition Height="Auto"></RowDefinition>
+            <RowDefinition></RowDefinition>
+        </Grid.RowDefinitions>
+        <StackPanel Grid.Row="0" Grid.Column="0" Orientation="Vertical" 
+                    VerticalAlignment="Center" HorizontalAlignment="Left" Width="200">
+            <fw:TextBoxEditor  Text="{Binding Name,UpdateSourceTrigger=PropertyChanged,Mode=TwoWay}"  VerticalAlignment="Center" HorizontalAlignment="Stretch" Margin="5"
+                               Command="{x:Static bllCommon:EditCommands.SingleUpdate}" CommandParameter="{Binding RelativeSource={RelativeSource Self}}" Tag="Name"></fw:TextBoxEditor>
+
+            <fw:TextBoxEditor  Text="{Binding Url,UpdateSourceTrigger=PropertyChanged,Mode=TwoWay}"  VerticalAlignment="Center" HorizontalAlignment="Stretch" Margin="5"
+                               Command="{x:Static bllCommon:EditCommands.SingleUpdate}" CommandParameter="{Binding RelativeSource={RelativeSource Self}}" Tag="Url" ></fw:TextBoxEditor>
+           
+        </StackPanel>
+
+        <GroupBox Grid.Row="1" Grid.Column="0"  Margin="0,10,0,10" Header="厂家提供保险服务的所有项目"  Style="{StaticResource ResourceKey={x:Static uc:CommonStyles.GroupBoxKey}}"  >
+
+            <Grid>
+                <Grid.RowDefinitions>
+                    <RowDefinition Height="Auto"></RowDefinition>
+                    <RowDefinition ></RowDefinition>
+                </Grid.RowDefinitions>
+                <StackPanel HorizontalAlignment="Right">
+                    <Button Command="{Binding Commands.AddInsuracncePolicy}" Style="{StaticResource ResourceKey={x:Static uc:CommonStyles.ButtonKey}}"  Height="23" Margin="5" Content="新项目添加保单" />
+                </StackPanel>
+                <ListBox Grid.Row="1" ItemsSource="{Binding ProjectItems}" BorderThickness="0" Padding="-5,0,-5,0">
+                    <ListBox.ItemsPanel >
+                        <ItemsPanelTemplate>
+                            <WrapPanel Orientation="Horizontal" Width="{Binding Path=Width,RelativeSource={RelativeSource AncestorType=ListBox}}"/>
+                        </ItemsPanelTemplate>
+                    </ListBox.ItemsPanel>
+                    <ListBox.ItemContainerStyle>
+                        <Style TargetType="{x:Type ListBoxItem}">
+                            <Setter Property="Template">
+                                <Setter.Value>
+                                    <ControlTemplate TargetType="{x:Type ListBoxItem}">
+                                        <Border BorderThickness="1"  BorderBrush="Black" Margin="5" Padding="5" fw:MaskOptions.IsManualHide="true" fw:MaskOptions.IsShow="{Binding IsLoading}">
+                                               <fw:MaskOptions.MaskTemplate>
+                                            <ControlTemplate>
+                                                <Border Background="Gray" Opacity="0.5">
+                                                    <ProgressBar  VerticalAlignment="Center" Margin="5" IsIndeterminate="True"></ProgressBar>
+                                                </Border>
+                                            </ControlTemplate>
+                                        </fw:MaskOptions.MaskTemplate>
+                                            <Grid Width="150" Height="80" >
+                                                <Grid.RowDefinitions>
+                                                    <RowDefinition></RowDefinition>
+                                                    <RowDefinition Height="Auto"></RowDefinition>
+                                                </Grid.RowDefinitions>
+                                                <StackPanel Orientation="Vertical" Grid.Row="0">
+                                                    <Grid>
+                                                         <TextBlock Margin="5,0,5,0" Name="TxtName" FontSize="20" Text="{Binding ProjectLocalName}"></TextBlock>
+                                                         <Button  HorizontalAlignment="Right" VerticalAlignment="Center" Content="刷新" Style="{StaticResource ResourceKey={x:Static uc:CommonStyles.LinkButtonKey}}" Command="{Binding Data.Commands.RefreshCommand,Source={StaticResource ResourceKey=DATA}}" CommandParameter="{Binding}" ></Button>
+                                                    </Grid>
+                                                  
+                                                    <StackPanel Orientation="Horizontal">
+                                                        <TextBlock Margin="5,0,5,0"  Text="涉及的保单:"  />
+                                                        <TextBlock Margin="5,0,5,0" x:Name="TXTN" Text="{Binding InsurancePolicyCount}" TextDecorations="Underline"/>
+                                                        <TextBlock Margin="5,0,5,0"  Text="个" />
+                                                    </StackPanel>
+                                                    <StackPanel Orientation="Horizontal">
+                                                        <TextBlock Margin="5,0,5,0"  Text="在保资产:"  />
+                                                        <TextBlock Margin="5,0,5,0"  Text="{Binding AssetCount}" TextDecorations="Underline"/>
+                                                        <TextBlock Margin="5,0,5,0"  Text="个" />
+                                                    </StackPanel>
+                                                </StackPanel>
+                                                <Button Grid.Row="1" Grid.Column="0" x:Name="BTNU" HorizontalAlignment="Right" Content="进入项目" Style="{StaticResource ResourceKey={x:Static uc:CommonStyles.LinkButtonKey}}" Command="{Binding Data.Commands.GoToProject,Source={StaticResource ResourceKey=DATA}}" CommandParameter="{Binding}" ></Button>
+                                            </Grid>
+                                        </Border>
+
+                                    </ControlTemplate>
+                                </Setter.Value>
+                            </Setter>
+                        </Style>
+                    </ListBox.ItemContainerStyle>
+                </ListBox>
+            </Grid>
+
+        </GroupBox>
+    </Grid>
+</fw:NChildWindow>
+

+ 94 - 0
FirmLib/Com.FirmLib.UI/Insuer/WinInsuerInfo.xaml.cs

@@ -0,0 +1,94 @@
+
+///////////////////////////////////////////////////////////////////////////////  
+//文件名称: WinInsuerInfo.xaml
+//文件描述: 保险商相关管理信息
+//创 建 者: xls
+//创建日期: 2018/5/24 21:55:24
+//版 本 号:1.0.0.0
+////////////////////////////////////////////////////////////////////////////////
+
+using System;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Input;
+using Com.FirmLib.UI.BllCommon;
+using FWindSoft.Wpf;
+using FWindSoft.Wpf.Controls;
+
+namespace Com.FirmLib.UI.Insuer
+{
+    /// <summary>
+    /// WinInsuerInfo.xaml 的交互逻辑
+    /// </summary>
+    public partial class WinInsuerInfo : NChildWindow
+    {
+        private VmInsuerInfo m_Vm;
+        public WinInsuerInfo():this(new VmInsuerInfo())
+        {
+          
+        }
+        public WinInsuerInfo(VmInsuerInfo vm)
+        {
+            InitializeComponent();
+            EveryTimeLoad = true;
+            this.m_Vm = vm;
+            this.m_Vm.SetRefView(this);
+            this.DataContext = this.m_Vm;
+            this.CommandBindings.Add(new CommandBinding(EditCommands.SingleUpdate, SingleUpdate));
+        }
+        protected override void LoadData(LoadParameter parameter)
+        {
+            //初始化列表数据
+            TryCatchWrapper.Handled(() => this.m_Vm.Init(parameter));
+            //加载醒目信息
+            this.Title = this.m_Vm.Name;
+        }
+        #region 界面关联事件
+        private void btnOK_Click(object sender, RoutedEventArgs e)
+        {
+            try
+            {
+                if (this.HasError())
+                {
+                    //MessageShow.Infomation("请修改错误输入项");
+                    return;
+                }
+                //if (Execute())
+                //{
+                //    MessageShow.Infomation("");
+                //    DialogResult = true;
+                //}
+            }
+            catch (Exception ex)
+            {
+                //MessageShow.Show(ex);
+            }
+        }
+
+        private void btnCancel_Click(object sender, RoutedEventArgs e)
+        {
+            Close();
+        }
+        #endregion
+
+        #region 命令绑定相关
+        void SingleUpdate(object sender, ExecutedRoutedEventArgs e)
+        {
+            TextBoxEditor editor = e.Parameter as TextBoxEditor;
+            if (editor == null)
+                return;
+            string field = string.Empty;
+            if (editor.Tag != null)
+            {
+                field = editor.Tag.ToString();
+            }
+            bool result = this.m_Vm.SingleUpdateVenderItem(field);
+            if (!result)
+            {
+                //editor.Focus();
+                editor.IsEditing = true;
+            }
+        }
+        #endregion
+    }
+}

+ 251 - 0
FirmLib/Com.FirmLib.UI/Insuer/WinInsuerProjectInfo.xaml

@@ -0,0 +1,251 @@
+<fw:NChildWindow x:Class="Com.FirmLib.UI.Insuer.WinInsuerProjectInfo"
+             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
+             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
+             xmlns:fw="http://schemas.FWind/xaml"
+             xmlns:uc="clr-namespace:Com.FirmLib.UI.Common"
+             xmlns:wpf="clr-namespace:FWindSoft.Wpf;assembly=FWindSoft.Wpf"
+             xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
+             xmlns:behaviors="clr-namespace:FWindSoft.Wpf.Behaviors;assembly=FWindSoft.Wpf"
+             xmlns:ui="clr-namespace:Com.FirmLib.UI"
+             xmlns:insuer="clr-namespace:Com.FirmLib.UI.Insuer"
+             mc:Ignorable="d" 
+             d:DesignHeight="300" d:DesignWidth="500"  Name="this" Height="{Binding Height,RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=UIElement}}"
+                 Width="{Binding ActualWidth,RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=ScrollContentPresenter}}">
+    <fw:NChildWindow.Resources>
+        <wpf:BindingProxy x:Key="DATA" Data="{Binding}"></wpf:BindingProxy>
+        <insuer:CopyHandle x:Key="CopyHandle" ></insuer:CopyHandle>
+        <fw:EmptyDataTemplateSelector  x:Key="Selector">
+            <fw:EmptyDataTemplateSelector.Checker>
+                <insuer:DownLoadTemplateChecker></insuer:DownLoadTemplateChecker>
+            </fw:EmptyDataTemplateSelector.Checker>
+            <fw:EmptyDataTemplateSelector.Empty>
+                  <DataTemplate>
+                    <TextBlock Text="未上传" VerticalAlignment="Center" HorizontalAlignment="Center"></TextBlock>
+                </DataTemplate>
+            </fw:EmptyDataTemplateSelector.Empty>
+            <fw:EmptyDataTemplateSelector.Use>
+             
+                 <DataTemplate>
+                      <Button Command="{Binding Data.Commands.FileDownLoadCommand,Source={StaticResource ResourceKey=DATA} }" CommandParameter="{Binding}" Style="{StaticResource ResourceKey={x:Static uc:CommonStyles.LinkButtonKey}}"   Content="下载" Padding="5"/>
+                </DataTemplate>
+            </fw:EmptyDataTemplateSelector.Use>
+          </fw:EmptyDataTemplateSelector>
+    </fw:NChildWindow.Resources>
+    <fw:NChildWindow.AttachElement>
+        <StackPanel HorizontalAlignment="Stretch" Orientation="Horizontal" VerticalAlignment="Center">
+            <Button Command="{Binding Data.Commands.SaveCommand,Source={StaticResource ResourceKey=DATA}}" Style="{StaticResource ResourceKey={x:Static uc:CommonStyles.ButtonKey}}"  BorderThickness="0"  FontFamily="{DynamicResource ResourceKey={x:Static wpf:FontsUtil.AwesomeKey}}">
+                <Button.Content>
+                    <StackPanel Orientation="Horizontal">
+                        <TextBlock Text="{wpf:FontIcon Icon=Save}"  Width="30" FontSize="20"></TextBlock>
+                        <TextBlock Text="保存" VerticalAlignment="Center" Margin="-5,0,0,0"></TextBlock>
+                    </StackPanel>
+                </Button.Content>
+            </Button>
+        </StackPanel>
+
+    </fw:NChildWindow.AttachElement>
+    <Grid>
+        <Grid.ColumnDefinitions>
+            <ColumnDefinition Width="150"></ColumnDefinition>
+            <ColumnDefinition Width="Auto"></ColumnDefinition>
+            <ColumnDefinition></ColumnDefinition>
+        </Grid.ColumnDefinitions>
+        <StackPanel Orientation="Vertical" HorizontalAlignment="Stretch">
+
+            <Label   Content="{Binding InsuerName}" Margin="5,0,0,0"></Label>
+            <Label  Content="{Binding InsuerUrl}" Margin="5,0,0,0"></Label>
+            <fw:LineSpliter Margin="5,0,5,0" VerticalAlignment="Center" ></fw:LineSpliter>
+            <ui:ContactInformationEditor DataContext="{Binding ContactItem}"></ui:ContactInformationEditor>
+        </StackPanel>
+
+        <GridSplitter Grid.Row="0" Grid.Column="1" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" BorderThickness="1" BorderBrush="White"></GridSplitter>
+
+        <GroupBox Grid.Row="0" Grid.Column="2"  Margin="0,10,0,10" Header="投保的项目资产清单"  Style="{StaticResource ResourceKey={x:Static uc:CommonStyles.GroupBoxKey}}"  >
+            <TabControl>
+                <TabItem Header="在保资产清单">
+                    <Grid>
+                        <Grid.RowDefinitions>
+                            <RowDefinition Height=" Auto"></RowDefinition>
+                            <RowDefinition></RowDefinition>
+                        </Grid.RowDefinitions>
+                    
+                     <StackPanel  HorizontalAlignment="Right">
+                    <Button Command="{Binding Commands.AddInsuracncePolicy}" Style="{StaticResource ResourceKey={x:Static uc:CommonStyles.ButtonKey}}"  Height="23" Margin="5" Content="添加保单" />
+                </StackPanel>
+                    <DataGrid Grid.Row="1" fw:DataGridDragCopyOptions.CanDragCopy="True"   AutoGenerateColumns="False"   FrozenColumnCount="1" ItemsSource="{Binding AssetItems,UpdateSourceTrigger=PropertyChanged}"
+                CanUserAddRows="False"
+                CanUserDeleteRows="False"
+                VerticalScrollBarVisibility="Auto"
+                HorizontalScrollBarVisibility="Auto"
+                SelectionUnit="Cell"
+                HeadersVisibility="Column" 
+                CanUserSortColumns="True"   
+
+                CellStyle="{StaticResource ResourceKey={x:Static uc:CommonStyles.DataGridCellKey}}"
+                  AlternationCount="2"
+                >
+                        <DataGrid.RowStyle>
+                            <Style TargetType="DataGridRow" BasedOn="{StaticResource ResourceKey={x:Type DataGridRow}}">
+                                <Setter Property="ContextMenu">
+                                    <Setter.Value>
+                                        <ContextMenu>
+                                            <MenuItem Header="在保清单中删除资产" Command="{Binding Data.Commands.DeleteAssetPolicy,Source={StaticResource ResourceKey=DATA}}" CommandParameter="{Binding }"></MenuItem>
+                                        </ContextMenu>
+                                    </Setter.Value>
+
+                                </Setter>
+                                <Setter Property="Height" Value="30"></Setter>
+                                <Style.Triggers>
+                                    <Trigger Property="ItemsControl.AlternationIndex"
+                                 Value="0">
+                                        <Setter Property="Background" Value="White" />
+                                    </Trigger>
+                                    <Trigger Property="ItemsControl.AlternationIndex"
+                                 Value="1">
+                                        <Setter Property="Background" Value="#FFE6E3DD" />
+                                    </Trigger>
+                                </Style.Triggers>
+                            </Style>
+                        </DataGrid.RowStyle>
+                            <DataGrid.Columns>
+                                <DataGridTemplateColumn Header="操作"  Width="100" IsReadOnly="True" >
+                                    <DataGridTemplateColumn.CellTemplate>
+                                        <DataTemplate>
+                                            <Button Command="{Binding Data.Commands.ScanAsset,Source={StaticResource ResourceKey=DATA} }" CommandParameter="{Binding}" Style="{StaticResource ResourceKey={x:Static uc:CommonStyles.LinkButtonKey}}"   Content="查看资产详情" HorizontalAlignment="Left" Padding="5,0,5,0"/>
+                                        </DataTemplate>
+                                    </DataGridTemplateColumn.CellTemplate>
+
+                                </DataGridTemplateColumn>
+                                <fw:TDataGridTextColumn Header="本地名称" Width="100" IsReadOnly="True"  Binding="{Binding Path=LocalName}"></fw:TDataGridTextColumn>
+                                <fw:TDataGridTextColumn Header="本地编码"  Width="80" IsReadOnly="True"  Binding="{Binding Path=LocalCode}"></fw:TDataGridTextColumn>
+
+                                <fw:TDataGridTextColumn Header="品牌"  Width="80" IsReadOnly="True"  Binding="{Binding Path=Brand}"></fw:TDataGridTextColumn>
+
+                                <fw:TDataGridTextColumn Header="产品名"  Width="80" IsReadOnly="True"  Binding="{Binding Path=Product}"></fw:TDataGridTextColumn>
+
+                                <fw:TDataGridTextColumn Header="型号"  Width="80" IsReadOnly="True"  Binding="{Binding Path=Type}"></fw:TDataGridTextColumn>
+                                <DataGridTemplateColumn Header="保险单号" SortMemberPath="InsurancePolicyNo" fw:DataGridDragCopyOptions.CanColumnDragCopy="True">
+                                    <DataGridTemplateColumn.CellTemplate>
+                                        <DataTemplate>
+                                            <Border fw:ElementCopyOptions.UseCopy="True" fw:ElementCopyOptions.CopyValue="{Binding Path=InsurancePolicyNo,UpdateSourceTrigger=PropertyChanged,Mode=TwoWay}" fw:ElementCopyOptions.CopyHandle="{StaticResource ResourceKey=CopyHandle}">
+                                                <TextBlock Text="{Binding Path=InsurancePolicyNo,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" VerticalAlignment="Center"></TextBlock>
+                                            </Border>
+
+                                        </DataTemplate>
+                                    </DataGridTemplateColumn.CellTemplate>
+                                    <DataGridTemplateColumn.CellEditingTemplate>
+                                        <DataTemplate>
+                                            <Border fw:ElementCopyOptions.UseCopy="True" fw:ElementCopyOptions.CopyValue="{Binding Path=InsurancePolicyNo,UpdateSourceTrigger=PropertyChanged,Mode=TwoWay}">
+                                                <Grid>
+                                                    <Grid.ColumnDefinitions>
+                                                        <ColumnDefinition></ColumnDefinition>
+                                                        <ColumnDefinition Width="30"></ColumnDefinition>
+                                                    </Grid.ColumnDefinitions>
+                                                    <TextBox IsReadOnly="True" Text="{Binding Path=InsurancePolicyNo,UpdateSourceTrigger=PropertyChanged,Mode=TwoWay}" VerticalContentAlignment="Center"></TextBox>
+                                                    <Button Grid.Column="1" Command="{Binding Data.Commands.EditPolicyNoCommand,Source={StaticResource ResourceKey=DATA} }" CommandParameter="{Binding}" Style="{StaticResource ResourceKey={x:Static uc:CommonStyles.ButtonKey}}"   Content="…" Padding="5"/>
+                                                </Grid>
+                                            </Border>
+
+                                        </DataTemplate>
+                                    </DataGridTemplateColumn.CellEditingTemplate>
+                                </DataGridTemplateColumn>
+
+                                <fw:TDataGridTextColumn Header="保险截止日期"  Width="80" IsReadOnly="True"  Binding="{Binding Path=EndDate}"></fw:TDataGridTextColumn>
+
+                                <DataGridTemplateColumn Header="保险文件" Width="60" IsReadOnly="True" >
+                                    <DataGridTemplateColumn.CellTemplate>
+                                        <DataTemplate>
+                                            <ContentControl Content="{Binding}">
+                                                <ContentControl.ContentTemplate>
+                                                    <DataTemplate>
+                                                        <Grid>
+                                                            <TextBlock  x:Name="Text" Visibility="Collapsed" Text="未上传" VerticalAlignment="Center" HorizontalAlignment="Center"></TextBlock>
+                                                            <Button x:Name="Button" Command="{Binding Data.Commands.FileDownLoadCommand,Source={StaticResource ResourceKey=DATA} }" CommandParameter="{Binding}" Style="{StaticResource ResourceKey={x:Static uc:CommonStyles.LinkButtonKey}}"   Content="下载" Padding="5"/>
+                                                        </Grid>
+                                                        <DataTemplate.Triggers>
+                                                            <DataTrigger Binding="{Binding PolicyFile,Mode=OneWay}" Value="">
+                                                                <Setter Property="Visibility" TargetName="Text" Value="Visible"></Setter>
+                                                                <Setter Property="Visibility" TargetName="Button" Value="Collapsed"></Setter>
+                                                            </DataTrigger>
+                                                            <DataTrigger Binding="{Binding PolicyFile,Mode=OneWay}" Value="{x:Null}">
+                                                                <Setter Property="Visibility" TargetName="Text" Value="Visible"></Setter>
+                                                                <Setter Property="Visibility" TargetName="Button" Value="Collapsed"></Setter>
+                                                            </DataTrigger>
+                                                        </DataTemplate.Triggers>
+                                                    </DataTemplate>
+                                                </ContentControl.ContentTemplate>
+                                            </ContentControl>
+                                        </DataTemplate>
+                                    </DataGridTemplateColumn.CellTemplate>
+                                </DataGridTemplateColumn>
+                            </DataGrid.Columns>
+                        </DataGrid>
+                        </Grid>
+                </TabItem>
+                
+                <TabItem Header="所有保单">
+                    <DataGrid    AutoGenerateColumns="False" SelectionMode="Single"  FrozenColumnCount="1" ItemsSource="{Binding PolicyItems,UpdateSourceTrigger=PropertyChanged}"
+                CanUserAddRows="False"
+                CanUserDeleteRows="False"
+                VerticalScrollBarVisibility="Auto"
+                HorizontalScrollBarVisibility="Auto"
+                SelectionUnit="FullRow"
+                HeadersVisibility="Column" 
+                CanUserSortColumns="True"   
+                CellStyle="{StaticResource ResourceKey={x:Static uc:CommonStyles.DataGridCellKey}}"
+                  AlternationCount="2"
+                >
+                        <DataGrid.RowStyle>
+                            <Style TargetType="DataGridRow" BasedOn="{StaticResource ResourceKey={x:Type DataGridRow}}">
+                                <Setter Property="ContextMenu">
+                                    <Setter.Value>
+                                        <ContextMenu>
+                                            <MenuItem Header="删除" Command="{Binding Data.Commands.DeleteCommand,Source={StaticResource ResourceKey=DATA}}" CommandParameter="{Binding }"></MenuItem>
+                                        </ContextMenu>
+                                    </Setter.Value>
+
+                                </Setter>
+                                <Setter Property="Height" Value="30"></Setter>
+                                <Style.Triggers>
+                                    <Trigger Property="ItemsControl.AlternationIndex"
+                                 Value="0">
+                                        <Setter Property="Background" Value="White" />
+                                    </Trigger>
+                                    <Trigger Property="ItemsControl.AlternationIndex"
+                                 Value="1">
+                                        <Setter Property="Background" Value="#FFE6E3DD" />
+                                    </Trigger>
+                                </Style.Triggers>
+                            </Style>
+                        </DataGrid.RowStyle>
+                        <DataGrid.Columns>
+
+                            <fw:TDataGridTextColumn Header="保险单号" Width="100" IsReadOnly="True"  Binding="{Binding Path=PolicyNo}"></fw:TDataGridTextColumn>
+                            <fw:TDataGridTextColumn Header="保单截止日期"  Width="120" IsReadOnly="True"  Binding="{Binding Path=EndDate}"></fw:TDataGridTextColumn>
+
+                            <fw:TDataGridTextColumn Header="相关资产"  Width="120" IsReadOnly="True"  Binding="{Binding Path=RefAssetCount}"></fw:TDataGridTextColumn>
+                               <DataGridTemplateColumn Header="保险文件"  Width="60" IsReadOnly="True"  CellTemplateSelector="{StaticResource ResourceKey=Selector}">
+                                </DataGridTemplateColumn>
+                            <DataGridTemplateColumn Header="操作"  Width="60" IsReadOnly="True" >
+                                <DataGridTemplateColumn.CellTemplate>
+                                    <DataTemplate>
+                                        <Button Command="{Binding Data.Commands.EditPolicy,Source={StaticResource ResourceKey=DATA} }" CommandParameter="{Binding}" Style="{StaticResource ResourceKey={x:Static uc:CommonStyles.LinkButtonKey}}"   Content="编辑" HorizontalAlignment="Left" Padding="5,0,5,0"/>
+                                    </DataTemplate>
+                                </DataGridTemplateColumn.CellTemplate>
+
+                            </DataGridTemplateColumn>
+                        </DataGrid.Columns>
+                        <i:Interaction.Behaviors>
+                            <behaviors:GridCellSingleClickEditBehavior></behaviors:GridCellSingleClickEditBehavior>
+                        </i:Interaction.Behaviors>
+
+                    </DataGrid>
+                </TabItem>
+            </TabControl>
+
+        </GroupBox>
+    </Grid>
+</fw:NChildWindow>
+

+ 154 - 0
FirmLib/Com.FirmLib.UI/Insuer/WinInsuerProjectInfo.xaml.cs

@@ -0,0 +1,154 @@
+
+///////////////////////////////////////////////////////////////////////////////  
+//文件名称: WinInsuerProjectInfo.xaml
+//文件描述: 保险项目信息
+//创 建 者: xls
+//创建日期: 2018/5/24 21:58:36
+//版 本 号:1.0.0.0
+////////////////////////////////////////////////////////////////////////////////
+
+using System;
+using System.Windows;
+using System.Windows.Input;
+using Com.FirmLib.UI.BllCommon;
+using Com.FirmLib.UI.Common;
+using Com.FirmLib.UI.Common.Model;
+using Com.FirmLib.UI.Insuer.Model;
+using FWindSoft.Wpf;
+using FWindSoft.Wpf.Controls;
+using FWindSoft.Wpf.Selector;
+
+namespace Com.FirmLib.UI.Insuer
+{
+    /// <summary>
+    /// WinInsuerProjectInfo.xaml 的交互逻辑
+    /// </summary>
+    public partial class WinInsuerProjectInfo : NChildWindow
+    {
+        private VmInsuerProjectInfo m_Vm;
+        public WinInsuerProjectInfo():this(new VmInsuerProjectInfo())
+        {
+        }
+        public WinInsuerProjectInfo(VmInsuerProjectInfo vm)
+        {
+            InitializeComponent();
+            //EveryTimeLoad = true;
+            this.m_Vm = vm;
+            this.m_Vm.SetRefView(this);
+            this.DataContext = this.m_Vm;
+            this.CommandBindings.Add(new CommandBinding(EditCommands.SingleUpdate, SingleUpdate));
+        }
+        protected override void LoadData(LoadParameter parameter)
+        {
+            if (parameter == null)
+            {
+                this.Title = "项目名称";
+            }
+            else
+            {
+                InsuerParameter currentParameter = parameter.Parameter as InsuerParameter;
+                if (parameter != null)
+                {
+                    this.Title = string.Format("{0}", currentParameter.Project.Name);
+                }
+            }
+             TryCatchWrapper.Handled(() => this.m_Vm.Init(parameter));
+        }
+
+       
+
+        #region 界面关联事件
+        private void btnOK_Click(object sender, RoutedEventArgs e)
+        {
+            try
+            {
+                if (this.HasError())
+                {
+                    //MessageShow.Infomation("请修改错误输入项");
+                    return;
+                }          
+            }
+            catch (Exception ex)
+            {
+                //MessageShow.Show(ex);
+            }
+        }
+
+        private void btnCancel_Click(object sender, RoutedEventArgs e)
+        {
+            Close();
+        }
+        #endregion
+
+        void SingleUpdate(object sender, ExecutedRoutedEventArgs e)
+        {
+            TextBoxEditor editor = e.Parameter as TextBoxEditor;
+            if (editor == null)
+                return;
+            #region 验证信息
+            var binding = editor.GetBindingExpression(TextBoxEditor.TextProperty);
+            if (binding != null)
+            {
+                binding.UpdateSource();
+            }
+            if (editor.HasError())
+            {
+                editor.IsEditing = true;
+                return;
+            } 
+            #endregion
+            string field = string.Empty;
+            if (editor.Tag != null)
+            {
+                field = editor.Tag.ToString();
+            }
+            bool result = this.m_Vm.SingleUpdateLinkerItem(field);
+            if (!result)
+            {
+                //editor.Focus();
+                editor.IsEditing = true;
+            }
+        }
+    }
+
+
+
+    #region 界面操作相关
+    public class DownLoadTemplateChecker : IEmptyTemplateChecker
+    {
+        public bool IsEmpty(object item)
+        {
+            if (item == null)
+            {
+                return true;
+            }
+
+            if (item is AssetShowItem showItem)
+            {
+                return string.IsNullOrEmpty(showItem.PolicyFile);
+            }
+
+            if (item is PolicyShowItem policyItem)
+            {
+                  return string.IsNullOrEmpty(policyItem.PolicyFile);
+            }
+
+            return true;
+        }
+    }
+
+    public class CopyHandle : ICopy
+    {
+        public void CopyValue(object baseItem, object targetItem)
+        {
+            var useBase = baseItem as AssetShowItem;
+            var targetBase = targetItem as AssetShowItem;
+            if (useBase == null || targetBase == null)
+                return;
+            targetBase.InsurancePolicyNo=useBase.InsurancePolicyNo;
+            targetBase.PolicyFile=useBase.PolicyFile;
+            targetBase.EndDate=useBase.EndDate;
+        }
+    }
+    #endregion
+}

+ 170 - 0
FirmLib/Com.FirmLib.UI/Insuer/WinInsurancePolicyEditor.xaml

@@ -0,0 +1,170 @@
+<fw:NChildWindow x:Class="Com.FirmLib.UI.Insuer.WinInsurancePolicyEditor"
+             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
+             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
+             xmlns:fw="http://schemas.FWind/xaml"
+             xmlns:wpf="clr-namespace:FWindSoft.Wpf;assembly=FWindSoft.Wpf"
+             xmlns:uc="clr-namespace:Com.FirmLib.UI.Common"
+             xmlns:ui="clr-namespace:Com.FirmLib.UI"
+             mc:Ignorable="d" Title="添加保险"
+             d:DesignHeight="300" d:DesignWidth="500" Name="this" Height="{Binding Height,RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=UIElement}}"
+                 Width="{Binding ActualWidth,RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=ScrollContentPresenter}}"  >
+    <fw:NChildWindow.Resources>
+        <wpf:BindingProxy x:Key="DATA" Data="{Binding}"></wpf:BindingProxy>
+    </fw:NChildWindow.Resources>
+    <fw:NChildWindow.AttachElement>
+        <StackPanel HorizontalAlignment="Stretch" Orientation="Horizontal" VerticalAlignment="Center">
+            <Button Command="{Binding Data.Commands.SaveCommand,Source={StaticResource ResourceKey=DATA}}" Style="{StaticResource ResourceKey={x:Static uc:CommonStyles.ButtonKey}}"  BorderThickness="0"  FontFamily="{DynamicResource ResourceKey={x:Static wpf:FontsUtil.AwesomeKey}}" Click="btnOK_Click">
+                <Button.Content>
+                    <StackPanel Orientation="Horizontal">
+                        <TextBlock Text="{wpf:FontIcon Icon=Save}"  Width="30" FontSize="20"></TextBlock>
+                        <TextBlock Text="保存" VerticalAlignment="Center" Margin="-5,0,0,0"></TextBlock>
+                    </StackPanel>
+                </Button.Content>
+            </Button>
+        </StackPanel>
+
+    </fw:NChildWindow.AttachElement>
+    <Grid Margin="5" >
+        <Grid.RowDefinitions>
+            <RowDefinition Height="Auto"></RowDefinition>
+            <RowDefinition Height="Auto"></RowDefinition>
+            <RowDefinition MinHeight="100" ></RowDefinition>
+        </Grid.RowDefinitions>
+        <Grid>
+            <Grid.ColumnDefinitions>
+                <ColumnDefinition Width="Auto"></ColumnDefinition>
+                <ColumnDefinition></ColumnDefinition>
+            </Grid.ColumnDefinitions>
+            <StackPanel Orientation="Vertical" HorizontalAlignment="Left" Width="200">
+                <Label  Style="{StaticResource ResourceKey={x:Static uc:CommonStyles.StarLableKey}}" Content="保单编号:"></Label>
+
+                <TextBox IsEnabled="{Binding PolicyFixed,Converter={x:Static fw:ConverterFactory.BoolOpposition}}"  Style="{StaticResource ResourceKey={x:Static uc:CommonStyles.TextBoxKey}}" Margin="5">
+                    <Binding Path="PolicyNo" Mode="TwoWay" UpdateSourceTrigger="LostFocus" >
+                        <Binding.ValidationRules>
+                            <fw:RequireValidationRule ></fw:RequireValidationRule>
+                             <fw:LengthValidationRule MaxLength="50" ></fw:LengthValidationRule>
+                        </Binding.ValidationRules>
+                    </Binding>
+                </TextBox>
+                <Label  Style="{StaticResource ResourceKey={x:Static uc:CommonStyles.StarLableKey}}" Content="保单截止日期:"></Label>
+                <DatePicker    Margin="5">
+                    <DatePicker.SelectedDate>
+                        <Binding Path="PolicyEndDate" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged" Converter="{x:Static wpf:DateTimeConverter.Date}">
+                            <Binding.ValidationRules>
+                                <fw:RequireValidationRule ValidationStep="ConvertedProposedValue"></fw:RequireValidationRule>
+                            </Binding.ValidationRules>
+                        </Binding>
+                    </DatePicker.SelectedDate>
+                </DatePicker>
+
+                <Label  Content="保险文件:"></Label>
+
+                <Grid  HorizontalAlignment="Stretch"  IsEnabled="{Binding IsEpire,Converter={x:Static fw:ConverterFactory.BoolOpposition}}">
+                    <Grid.ColumnDefinitions>
+                        <ColumnDefinition></ColumnDefinition>
+                        <ColumnDefinition Width="Auto"></ColumnDefinition>
+                    </Grid.ColumnDefinitions>
+                    <TextBox Text="{Binding PolicyFile.Name}" Style="{StaticResource ResourceKey={x:Static uc:CommonStyles.TextBoxKey}}" IsReadOnly="True" Margin="5">
+                    </TextBox>
+                    <Button Command="{Binding Commands.UploadCommand}" Grid.Column="1" Content="上传" Width="40" Height="23"></Button>
+                </Grid>
+
+
+                <Label  Style="{StaticResource ResourceKey={x:Static uc:CommonStyles.StarLableKey}}" Content="所属项目:"></Label>
+
+                <TextBox IsEnabled="{Binding ProjectFixed,Converter={x:Static fw:ConverterFactory.BoolOpposition}}"  Style="{StaticResource ResourceKey={x:Static uc:CommonStyles.TextBoxKey}}" Margin="5">
+                    <Binding Path="ProjectNo" Mode="TwoWay" UpdateSourceTrigger="LostFocus" >
+                        <Binding.ValidationRules>
+                            <fw:RequireValidationRule ></fw:RequireValidationRule>
+                        </Binding.ValidationRules>
+                    </Binding>
+                </TextBox>
+
+                <Label   Content="项目本地名称:"></Label>
+
+                <TextBlock  Margin="5" Text="{Binding LocalProjectName}">
+                </TextBlock>
+            </StackPanel>
+
+            <StackPanel Grid.Column="1">
+                <Label   Content="" Margin="1"></Label>
+                <Button Margin="5" Command="{Binding Commands.SelectPolicyCommand}" IsEnabled="{Binding PolicyFixed,Converter={x:Static fw:ConverterFactory.BoolOpposition}}"  Style="{StaticResource ResourceKey={x:Static uc:CommonStyles.LinkButtonKey}}"  VerticalAlignment="Center"   Content="从项目已有保单中选择" HorizontalAlignment="Left" Padding="5,0,5,0"/>
+            </StackPanel>
+        </Grid>
+
+
+        <GroupBox IsEnabled="{Binding ProjectFixed,Converter={x:Static fw:ConverterFactory.BoolOpposition}}" Grid.Row="1" Grid.Column="0"  Margin="0,10,0,10" Header="保险商联系信息"  Style="{StaticResource ResourceKey={x:Static uc:CommonStyles.GroupBoxKey}}"  >
+
+            <ui:ContactInformationInput DataContext="{Binding ContactItem}" Width="200" HorizontalAlignment="Left"></ui:ContactInformationInput>
+
+        </GroupBox>
+        <GroupBox IsEnabled="{Binding IsEpire,Converter={x:Static fw:ConverterFactory.BoolOpposition}}" Grid.Row="2" Grid.Column="0"  Margin="0,10,0,10" Header="保单中包含的资产"  Style="{StaticResource ResourceKey={x:Static uc:CommonStyles.GroupBoxKey}}"  >
+            <Grid>
+                <Grid.RowDefinitions>
+                    <RowDefinition Height="Auto"></RowDefinition>
+                    <RowDefinition ></RowDefinition>
+                </Grid.RowDefinitions>
+                <StackPanel HorizontalAlignment="Right" Orientation="Horizontal">
+                    <Button IsEnabled="True" Command="{Binding Commands.SelectAssetCommand}" Style="{StaticResource ResourceKey={x:Static uc:CommonStyles.ButtonKey}}"  Height="23" Margin="5" Content="选择项目内已存在的资产" />
+                </StackPanel>
+                <DataGrid Grid.Row="1"  AutoGenerateColumns="False" SelectionMode="Single"  FrozenColumnCount="1" ItemsSource="{Binding AssetItems,UpdateSourceTrigger=PropertyChanged}"
+                CanUserAddRows="False"
+                CanUserDeleteRows="False"
+                VerticalScrollBarVisibility="Auto"
+                HorizontalScrollBarVisibility="Auto"
+                SelectionUnit="FullRow"
+                HeadersVisibility="Column" 
+                CanUserSortColumns="True"   
+                CellStyle="{StaticResource ResourceKey={x:Static uc:CommonStyles.DataGridCellKey}}"
+                  AlternationCount="2"
+                >
+                <DataGrid.RowStyle>
+                    <Style TargetType="DataGridRow" BasedOn="{StaticResource ResourceKey={x:Type DataGridRow}}">
+                        <Setter Property="ContextMenu">
+                            <Setter.Value>
+                                <ContextMenu>
+                                    <MenuItem Header="在保清单中删除资产" Command="{Binding Data.Commands.DeleteCommand,Source={StaticResource ResourceKey=DATA}}" CommandParameter="{Binding }"></MenuItem>
+                                </ContextMenu>
+                            </Setter.Value>
+
+                        </Setter>
+                        <Setter Property="Height" Value="30"></Setter>
+                        <Style.Triggers>
+                            <Trigger Property="ItemsControl.AlternationIndex"
+                                 Value="0">
+                                <Setter Property="Background" Value="White" />
+                            </Trigger>
+                            <Trigger Property="ItemsControl.AlternationIndex"
+                                 Value="1">
+                                <Setter Property="Background" Value="#FFE6E3DD" />
+                            </Trigger>
+                        </Style.Triggers>
+                    </Style>
+                </DataGrid.RowStyle>
+                    <DataGrid.Columns>
+                        <DataGridTemplateColumn Header="操作"  Width="100" IsReadOnly="True" >
+                            <DataGridTemplateColumn.CellTemplate>
+                                <DataTemplate>
+                                    <Button Command="{Binding Data.Commands.ScanAsset,Source={StaticResource ResourceKey=DATA} }" CommandParameter="{Binding}" Style="{StaticResource ResourceKey={x:Static uc:CommonStyles.LinkButtonKey}}"   Content="查看资产详情" Padding="5,0,5,0"/>
+                                </DataTemplate>
+                            </DataGridTemplateColumn.CellTemplate>
+
+                        </DataGridTemplateColumn>
+                        <fw:TDataGridTextColumn Header="本地名称" Width="100" IsReadOnly="True"  Binding="{Binding Path=LocalName}"></fw:TDataGridTextColumn>
+                        <fw:TDataGridTextColumn Header="本地编码"  Width="100" IsReadOnly="True"  Binding="{Binding Path=LocalCode}"></fw:TDataGridTextColumn>
+
+                        <fw:TDataGridTextColumn Header="品牌"  Width="100" IsReadOnly="True"  Binding="{Binding Path=Brand}"></fw:TDataGridTextColumn>
+
+                        <fw:TDataGridTextColumn Header="产品名"  Width="100" IsReadOnly="True"  Binding="{Binding Path=Product}"></fw:TDataGridTextColumn>
+
+                        <fw:TDataGridTextColumn Header="型号"  Width="100" IsReadOnly="True"  Binding="{Binding Path=Type}"></fw:TDataGridTextColumn>
+
+                    </DataGrid.Columns>
+                </DataGrid>
+                </Grid>
+        </GroupBox>
+    </Grid>
+</fw:NChildWindow>
+

+ 91 - 0
FirmLib/Com.FirmLib.UI/Insuer/WinInsurancePolicyEditor.xaml.cs

@@ -0,0 +1,91 @@
+
+///////////////////////////////////////////////////////////////////////////////  
+//文件名称: WinInsurancePolicyEditor.xaml
+//文件描述: 保险单编辑
+//创 建 者: xls
+//创建日期: 2018/5/24 22:01:48
+//版 本 号:1.0.0.0
+////////////////////////////////////////////////////////////////////////////////
+
+using System;
+using System.Windows;
+using System.Windows.Controls;
+using Com.FirmLib.UI.Insuer.Model;
+using FWindSoft.Wpf;
+using FWindSoft.Wpf.Controls;
+
+namespace Com.FirmLib.UI.Insuer
+{
+    /// <summary>
+    /// WinInsurancePolicyEditor.xaml 的交互逻辑
+    /// </summary>
+    public partial class WinInsurancePolicyEditor : NChildWindow
+    {
+        private VmInsurancePolicyEditor m_Vm;
+        public WinInsurancePolicyEditor():this(new VmInsurancePolicyEditor())
+        {
+          
+        }
+        public WinInsurancePolicyEditor(VmInsurancePolicyEditor vm)
+        {
+            InitializeComponent();
+            this.m_Vm = vm;
+            this.m_Vm.SetRefView(this);
+            this.DataContext = this.m_Vm;
+            this.m_Vm.WatchValidateResult(() => !this.HasError());
+        }
+        protected override void LoadData(LoadParameter parameter)
+        {
+            InsuerParameter currentParameter = parameter.Parameter as InsuerParameter;
+            if (string.IsNullOrWhiteSpace(currentParameter.Project.Id))
+            {
+                this.Title = "增加保单";
+            }
+            else
+            {
+                this.Title = "修改保单";            
+            }
+            TryCatchWrapper.Handled(() => this.m_Vm.Init(parameter));
+        }
+        #region 界面关联事件
+        private void btnOK_Click(object sender, RoutedEventArgs e)
+        {
+            try
+            {
+                try
+                {
+                    this.m_Vm.BeginInEdit();
+                    var textBoxes = this.GetSpecifyTypeChildren<TextBox>();
+                    foreach (var textBox in textBoxes)
+                    {
+                        var binding = textBox.GetBindingExpression(TextBox.TextProperty);
+                        if (binding != null)
+                        {
+                            binding.UpdateSource();
+                        }
+                    }
+                }
+               finally
+                {
+
+                    this.m_Vm.EndInEdit();
+                }
+                if (this.HasError())
+                {
+                    //MessageShow.Infomation("请修改错误输入项");
+                    return;
+                }
+            }
+            catch (Exception ex)
+            {
+                //MessageShow.Show(ex);
+            }
+        }
+
+        private void btnCancel_Click(object sender, RoutedEventArgs e)
+        {
+            Close();
+        }
+        #endregion
+    }
+}

+ 65 - 0
FirmLib/Com.FirmLib.UI/Insuer/WinPolicyEnsure.xaml

@@ -0,0 +1,65 @@
+<fw:BaseWindow x:Class="Com.FirmLib.UI.Insuer.WinPolicyEnsure"
+             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
+             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
+             xmlns:fw="http://schemas.FWind/xaml"
+             xmlns:uc="clr-namespace:Com.FirmLib.UI.Common"
+             Name="this" Title="确认提示"
+            Width="450" SizeToContent="Height" ResizeMode="NoResize" WindowStartupLocation="CenterOwner">
+    <Grid Margin="5">
+        <Grid.RowDefinitions>
+            <RowDefinition Height="40"></RowDefinition>
+            <RowDefinition Height="Auto"></RowDefinition>
+            <RowDefinition Height="100"></RowDefinition>
+            <RowDefinition Height="30"></RowDefinition>
+        </Grid.RowDefinitions>
+        <Grid>
+            <Grid.ColumnDefinitions>
+                <ColumnDefinition></ColumnDefinition>
+                <ColumnDefinition></ColumnDefinition>
+            </Grid.ColumnDefinitions>
+            <RadioButton x:Name="RdoDefault" GroupName="EditorType" VerticalAlignment="Center" Content="信息点修正值(默认)" Margin="15,5,5,5" IsChecked="{Binding Path=EditType,Converter={x:Static fw:EnumBoolConverter.Instance},ConverterParameter=Update, Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}">
+              
+            </RadioButton>
+            <RadioButton VerticalAlignment="Center" GroupName="EditorType" Grid.Column="1" Content="因业务或工程更新信息点值" Margin="5" IsChecked="{Binding Path=EditType,Converter={x:Static fw:EnumBoolConverter.Instance},ConverterParameter=Correct, Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"></RadioButton>
+        </Grid>
+       
+        <Border Grid.Row="1" BorderBrush="Black" BorderThickness="1" Margin="3"></Border>
+
+        <StackPanel Margin="10,0" Grid.Row="2" Visibility="{Binding IsChecked,ElementName=RdoDefault,Converter={x:Static fw:ConverterFactory.BooleanToVisibility}}">
+            <TextBlock Text="值填写错误,修改当前值" TextWrapping="Wrap"></TextBlock>
+        </StackPanel>
+        <StackPanel Margin="10,0" Grid.Row="2" Visibility="{Binding IsChecked,ElementName=RdoDefault,Converter={x:Static fw:ConverterFactory.BoolOppositionVisibility}}">
+            <TextBlock  Text="因业务变更,需更新信息点值并保存原有值,请设置新数值的生效时间" TextWrapping="Wrap"></TextBlock>
+
+            <fw:LabelEditor Header="信息点生效时间:" Orientation="Horizontal">
+                <DatePicker    Margin="5">
+                    <DatePicker.SelectedDate>
+                        <Binding Path="CorrectEndDate" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged" Converter="{x:Static fw:DateTimeConverter.Date}">
+                            <Binding.ValidationRules>
+                                <fw:RequireValidationRule ValidationStep="ConvertedProposedValue"></fw:RequireValidationRule>
+                            </Binding.ValidationRules>
+                        </Binding>
+                    </DatePicker.SelectedDate>
+                </DatePicker>
+            </fw:LabelEditor>
+          
+        </StackPanel>
+        <StackPanel Grid.Row="3" Orientation="Horizontal" HorizontalAlignment="Center" >
+            <Button x:Name="BtnEnsure" Command="{Binding Commands.EnsureCommand}" CommandParameter="{Binding ElementName=this}"   Height="23" Padding="5,0,5,0" MinWidth="60"   Content="确定" Click="btnOK_Click">
+                <Button.Style >
+                    <Style TargetType="Button" BasedOn="{StaticResource ResourceKey={x:Static uc:CommonStyles.ButtonKey}}">
+                        <Style.Triggers>
+                            <DataTrigger Binding="{Binding ElementName=RdoDefault,Path=IsChecked}" Value="False">
+
+                                <Setter Property="Content"  Value="新数值即将生效,确认更新"></Setter>
+                            </DataTrigger>
+                        </Style.Triggers>
+                    </Style>
+                </Button.Style>
+            </Button>
+
+        </StackPanel>
+    </Grid>
+</fw:BaseWindow>

+ 61 - 0
FirmLib/Com.FirmLib.UI/Insuer/WinPolicyEnsure.xaml.cs

@@ -0,0 +1,61 @@
+
+///////////////////////////////////////////////////////////////////////////////  
+//文件名称: WinPolicyEnsure.xaml
+//文件描述: WinPolicyEnsure.xaml
+//创 建 者: xls
+//创建日期: 2018/9/17 23:40:48
+//版 本 号:1.0.0.0
+////////////////////////////////////////////////////////////////////////////////
+
+using System;
+using System.Windows;
+using FWindSoft.Wpf;
+
+namespace Com.FirmLib.UI.Insuer
+{
+    /// <summary>
+    /// WinPolicyEnsure.xaml 的交互逻辑
+    /// </summary>
+    public partial class WinPolicyEnsure : BaseWindow
+    {
+        private VmPolicyEnsure m_Vm;
+        public WinPolicyEnsure() : this(new VmPolicyEnsure())
+        {
+
+        }
+        public WinPolicyEnsure(VmPolicyEnsure vm)
+        {
+            InitializeComponent();
+            this.m_Vm = vm;
+            this.m_Vm.SetRefView(this);
+            this.DataContext = this.m_Vm;
+        }
+        protected override void LoadData(LoadParameter parameter)
+        {
+            //初始化数据
+            TryCatchWrapper.Handled(() => this.m_Vm.Init(parameter));
+        }
+        #region 界面关联事件
+        private void btnOK_Click(object sender, RoutedEventArgs e)
+        {
+            try
+            {
+                if (this.HasError())
+                {
+                    //MessageShow.Infomation("请修改错误输入项");
+                    return;
+                }
+            }
+            catch (Exception ex)
+            {
+                //MessageShow.Show(ex);
+            }
+        }
+
+        private void btnCancel_Click(object sender, RoutedEventArgs e)
+        {
+            Close();
+        }
+        #endregion
+    }
+}

+ 92 - 0
FirmLib/Com.FirmLib.UI/Insuer/WinPolicySaveEnsure.xaml

@@ -0,0 +1,92 @@
+<fw:BaseWindow x:Class="Com.FirmLib.UI.Insuer.WinPolicySaveEnsure"
+             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
+             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
+             xmlns:fw="http://schemas.FWind/xaml"
+             xmlns:uc="clr-namespace:Com.FirmLib.UI.Common"
+             Name="this" Title="确认提示"
+            Height="350" Width="500" ResizeMode="NoResize" WindowStartupLocation="CenterOwner">
+    <Grid Margin="5">
+       <Grid.RowDefinitions>
+           <RowDefinition Height="Auto"></RowDefinition>
+           <RowDefinition></RowDefinition>
+           <RowDefinition Height="30"></RowDefinition>
+       </Grid.RowDefinitions>
+       <Grid Grid.Row="0">
+           <Grid.RowDefinitions>
+               <RowDefinition></RowDefinition>
+               <RowDefinition></RowDefinition>
+           </Grid.RowDefinitions>
+           <Grid.ColumnDefinitions>
+               <ColumnDefinition></ColumnDefinition>
+               <ColumnDefinition></ColumnDefinition>
+           </Grid.ColumnDefinitions>
+            <RadioButton x:Name="RdoDefault" GroupName="EditorType" VerticalAlignment="Center" Content="原保险商/保单填写错误,直接修改" Margin="15,5,5,5" IsChecked="{Binding Path=EditType,Converter={x:Static fw:EnumBoolConverter.Instance},ConverterParameter=Update, Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"></RadioButton>
+            <RadioButton x:Name="RdoCorrect" Grid.Row="0" Grid.Column="1"  VerticalAlignment="Center" GroupName="EditorType" Content="因业务变更更新保险商保单信息" Margin="5" IsChecked="{Binding Path=EditType,Converter={x:Static fw:EnumBoolConverter.Instance},ConverterParameter=Correct, Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"></RadioButton>
+
+            <fw:LabelEditor Grid.Row="1" Grid.Column="1" Header="业务变更生效时间:" Orientation="Horizontal" IsEnabled="{Binding IsChecked,ElementName=RdoCorrect}">
+                <DatePicker    Margin="5">
+                    <DatePicker.SelectedDate>
+                        <Binding Path="CorrectEndDate" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged" Converter="{x:Static fw:DateTimeConverter.Date}">
+                            <Binding.ValidationRules>
+                                <fw:RequireValidationRule ValidationStep="ConvertedProposedValue"></fw:RequireValidationRule>
+                            </Binding.ValidationRules>
+                        </Binding>
+                    </DatePicker.SelectedDate>
+                </DatePicker>
+            </fw:LabelEditor>
+        </Grid>
+
+        <GroupBox Grid.Row="1">
+            <GroupBox.Header>
+                <TextBlock Text="保险商/保单发生变化的资产"></TextBlock>
+            </GroupBox.Header>
+            <DataGrid Grid.Row="0" Grid.Column="0"  Margin="0,5,0,5" AutoGenerateColumns="False" SelectionMode="Single"  FrozenColumnCount="1" ItemsSource="{Binding ChangedAssetItems}"
+                  CanUserAddRows="False"
+                  CanUserDeleteRows="False"
+                  VerticalScrollBarVisibility="Auto"
+                  HorizontalScrollBarVisibility="Auto"
+                  SelectionUnit="FullRow"
+                  HeadersVisibility="Column" 
+                  CanUserSortColumns="True"   
+                  CellStyle="{StaticResource ResourceKey={x:Static uc:CommonStyles.DataGridCellKey}}"
+                  AlternationCount="2"
+        >
+                <DataGrid.RowStyle>
+                    <Style TargetType="DataGridRow">
+                        <Setter Property="Height" Value="30"></Setter>
+                        <Style.Triggers>
+                            <Trigger Property="ItemsControl.AlternationIndex"
+                                 Value="0">
+                                <Setter Property="Background" Value="White" />
+                            </Trigger>
+                            <Trigger Property="ItemsControl.AlternationIndex"
+                                 Value="1">
+                                <Setter Property="Background" Value="#FFE6E3DD" />
+                            </Trigger>
+                        </Style.Triggers>
+                    </Style>
+                </DataGrid.RowStyle>
+                <DataGrid.Columns>
+                    <fw:TDataGridTextColumn Header="资产本地编码" Width="100" IsReadOnly="True"  Binding="{Binding Path=LocalCode}"></fw:TDataGridTextColumn>
+                    <fw:TDataGridTextColumn Header="资产本地名称" Width="100" IsReadOnly="True"  Binding="{Binding Path=LocalName}"></fw:TDataGridTextColumn>
+                    <fw:TDataGridTextColumn Header="品牌" Width="100" IsReadOnly="True"  Binding="{Binding Path=Brand}"></fw:TDataGridTextColumn>
+                    <fw:TDataGridTextColumn Header="产品名" Width="100" IsReadOnly="True"  Binding="{Binding Path=Product}"></fw:TDataGridTextColumn>
+                    <fw:TDataGridTextColumn Header="型号" Width="100" IsReadOnly="True"  Binding="{Binding Path=Type}"></fw:TDataGridTextColumn>
+                    <fw:TDataGridTextColumn Header="原保险商名称" Width="100" IsReadOnly="True"  Binding="{Binding Path=InsuerName}"></fw:TDataGridTextColumn>
+                    <fw:TDataGridTextColumn Header="原保险单号" Width="100" IsReadOnly="True"  Binding="{Binding Path=InsurancePolicyNo}"></fw:TDataGridTextColumn>
+                    <fw:TDataGridTextColumn Header="原保单截止日期" Width="100" IsReadOnly="True"  Binding="{Binding Path=EndDate}"></fw:TDataGridTextColumn>
+                </DataGrid.Columns>
+             
+            </DataGrid>
+        </GroupBox>
+
+        <StackPanel Grid.Row="2" Orientation="Horizontal" HorizontalAlignment="Center" >
+            <Button Command="{Binding Commands.EnsureCommand}" CommandParameter="{Binding ElementName=this}"  Style="{StaticResource ResourceKey={x:Static uc:CommonStyles.ButtonKey}}"  Height="23" Width="60"   Content="确定" Click="btnOK_Click">
+
+            </Button>
+
+        </StackPanel>
+    </Grid>
+</fw:BaseWindow>

+ 61 - 0
FirmLib/Com.FirmLib.UI/Insuer/WinPolicySaveEnsure.xaml.cs

@@ -0,0 +1,61 @@
+
+///////////////////////////////////////////////////////////////////////////////  
+//文件名称: WinPolicySaveEnsure.xaml
+//文件描述: WinPolicySaveEnsure.xaml
+//创 建 者: xls
+//创建日期: 2018/9/18 9:10:29
+//版 本 号:1.0.0.0
+////////////////////////////////////////////////////////////////////////////////
+
+using System;
+using System.Windows;
+using FWindSoft.Wpf;
+
+namespace Com.FirmLib.UI.Insuer
+{
+    /// <summary>
+    /// WinPolicySaveEnsure.xaml 的交互逻辑
+    /// </summary>
+    public partial class WinPolicySaveEnsure : BaseWindow
+    {
+        private VmPolicySaveEnsure m_Vm;
+        public WinPolicySaveEnsure() : this(new VmPolicySaveEnsure())
+        {
+
+        }
+        public WinPolicySaveEnsure(VmPolicySaveEnsure vm)
+        {
+            InitializeComponent();
+            this.m_Vm = vm;
+            this.m_Vm.SetRefView(this);
+            this.DataContext = this.m_Vm;
+        }
+        protected override void LoadData(LoadParameter parameter)
+        {
+            //初始化数据
+           TryCatchWrapper.Handled(() => this.m_Vm.Init(parameter));
+        }
+        #region 界面关联事件
+        private void btnOK_Click(object sender, RoutedEventArgs e)
+        {
+            try
+            {
+                if (this.HasError())
+                {
+                    //MessageShow.Infomation("请修改错误输入项");
+                    return;
+                }
+            }
+            catch (Exception ex)
+            {
+                //MessageShow.Show(ex);
+            }
+        }
+
+        private void btnCancel_Click(object sender, RoutedEventArgs e)
+        {
+            Close();
+        }
+        #endregion
+    }
+}

+ 62 - 0
FirmLib/Com.FirmLib.UI/Insuer/WinPolicySelector.xaml

@@ -0,0 +1,62 @@
+<fw:BaseWindow x:Class="Com.FirmLib.UI.Insuer.WinPolicySelector"
+             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
+             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
+             xmlns:fw="http://schemas.FWind/xaml"
+             xmlns:uc="clr-namespace:Com.FirmLib.UI.Common"
+             xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
+             Name="this" Title="从已有的保单号中选择"
+            Height="400" Width="350" ResizeMode="NoResize" WindowStartupLocation="CenterOwner">
+    <fw:BaseWindow.Resources>
+        <fw:BindingProxy x:Key="DATA" Data="{Binding}"></fw:BindingProxy>
+    </fw:BaseWindow.Resources>
+    <Grid Margin="5">
+        <Grid.RowDefinitions>
+            <RowDefinition></RowDefinition>
+            <RowDefinition Height="30"></RowDefinition>
+        </Grid.RowDefinitions>
+        <DataGrid Name="DataGrid" Grid.Row="0" Grid.Column="0"   AutoGenerateColumns="False" SelectionMode="Single"  FrozenColumnCount="1" ItemsSource="{Binding PolicyItems}" SelectedItem="{Binding CurrentPolicyItem,Mode=TwoWay}"
+                  CanUserAddRows="False"
+                  CanUserDeleteRows="False"
+                  VerticalScrollBarVisibility="Auto"
+                  HorizontalScrollBarVisibility="Auto"
+                  SelectionUnit="FullRow"
+                  HeadersVisibility="Column" 
+                  CanUserSortColumns="True"   
+                  CellStyle="{StaticResource ResourceKey={x:Static uc:CommonStyles.DataGridCellKey}}"
+                  AlternationCount="2"
+        >
+            <DataGrid.RowStyle>
+                <Style TargetType="DataGridRow">
+                    <Setter Property="Height" Value="30"></Setter>
+                    <Style.Triggers>
+                        <Trigger Property="ItemsControl.AlternationIndex"
+                                 Value="0">
+                            <Setter Property="Background" Value="White" />
+                        </Trigger>
+                        <Trigger Property="ItemsControl.AlternationIndex"
+                                 Value="1">
+                            <Setter Property="Background" Value="#FFE6E3DD" />
+                        </Trigger>
+                     
+                    </Style.Triggers>
+                      
+                </Style>
+            </DataGrid.RowStyle>
+            <DataGrid.Columns>
+                <fw:TDataGridTextColumn Header="保单号" Width="*" IsReadOnly="True"  Binding="{Binding Path=PolicyNo}"></fw:TDataGridTextColumn>
+                <fw:TDataGridTextColumn Header="保单截止日期" Width="*" IsReadOnly="True"  Binding="{Binding Path=EndDate}"></fw:TDataGridTextColumn>
+            </DataGrid.Columns>
+             <i:Interaction.Triggers>
+                <i:EventTrigger EventName="MouseLeftButtonUp">
+                    <i:InvokeCommandAction Command="{Binding Data.Commands.SelectCommand,Source={StaticResource ResourceKey=DATA}}" CommandParameter="{Binding SelectedItem,ElementName=DataGrid}" />
+                </i:EventTrigger>
+            </i:Interaction.Triggers>
+        </DataGrid>
+        <StackPanel Grid.Row="1" Orientation="Horizontal" VerticalAlignment="Center" HorizontalAlignment="Center">
+            <Button Command="{Binding Commands.EnsureCommand}" CommandParameter="{Binding ElementName=this}"  Style="{StaticResource ResourceKey={x:Static uc:CommonStyles.ButtonKey}}"  Height="23" Width="60"   Content="确定" Click="btnOK_Click"/>
+
+        </StackPanel>
+    </Grid>
+</fw:BaseWindow>

+ 61 - 0
FirmLib/Com.FirmLib.UI/Insuer/WinPolicySelector.xaml.cs

@@ -0,0 +1,61 @@
+
+///////////////////////////////////////////////////////////////////////////////  
+//文件名称: WinPolicySelector.xaml
+//文件描述: WinPolicySelector.xaml
+//创 建 者: xls
+//创建日期: 2018/9/18 0:07:27
+//版 本 号:1.0.0.0
+////////////////////////////////////////////////////////////////////////////////
+
+using System;
+using System.Windows;
+using FWindSoft.Wpf;
+
+namespace Com.FirmLib.UI.Insuer
+{
+    /// <summary>
+    /// WinPolicySelector.xaml 的交互逻辑
+    /// </summary>
+    public partial class WinPolicySelector : BaseWindow
+    {
+        private VmPolicySelector m_Vm;
+        public WinPolicySelector() : this(new VmPolicySelector())
+        {
+
+        }
+        public WinPolicySelector(VmPolicySelector vm)
+        {
+            InitializeComponent();
+            this.m_Vm = vm;
+            this.m_Vm.SetRefView(this);
+            this.DataContext = this.m_Vm;
+        }
+        protected override void LoadData(LoadParameter parameter)
+        {
+            //初始化数据
+           TryCatchWrapper.Handled(() => this.m_Vm.Init(parameter));
+        }
+        #region 界面关联事件
+        private void btnOK_Click(object sender, RoutedEventArgs e)
+        {
+            try
+            {
+                if (this.HasError())
+                {
+                    //MessageShow.Infomation("请修改错误输入项");
+                    return;
+                }
+            }
+            catch (Exception ex)
+            {
+                //MessageShow.Show(ex);
+            }
+        }
+
+        private void btnCancel_Click(object sender, RoutedEventArgs e)
+        {
+            Close();
+        }
+        #endregion
+    }
+}

+ 68 - 0
FirmLib/Com.FirmLib.UI/Insuer/WinSimplePolicyEditor.xaml

@@ -0,0 +1,68 @@
+<fw:BaseWindow x:Class="Com.FirmLib.UI.Insuer.WinSimplePolicyEditor"
+             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
+             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
+             xmlns:fw="http://schemas.FWind/xaml"
+             xmlns:uc="clr-namespace:Com.FirmLib.UI.Common"
+             Name="this" Title="保险单号"
+            Height="300" Width="350" ResizeMode="NoResize" WindowStartupLocation="CenterOwner">
+    <Grid Margin="5">
+        <Grid.RowDefinitions>
+            <RowDefinition></RowDefinition>
+            <RowDefinition Height="30"></RowDefinition>
+        </Grid.RowDefinitions>
+        <Grid>
+            <Grid.ColumnDefinitions>
+                <ColumnDefinition Width="Auto"></ColumnDefinition>
+                <ColumnDefinition></ColumnDefinition>
+            </Grid.ColumnDefinitions>
+
+            <StackPanel Orientation="Vertical" HorizontalAlignment="Left" Width="180">
+                <Label  Style="{StaticResource ResourceKey={x:Static uc:CommonStyles.StarLableKey}}" Content="保单编号:"></Label>
+
+                <TextBox IsEnabled="{Binding IsAdd}"  Style="{StaticResource ResourceKey={x:Static uc:CommonStyles.TextBoxKey}}" Margin="5">
+                    <Binding Path="PolicyNo" Mode="TwoWay" UpdateSourceTrigger="LostFocus" >
+                        <Binding.ValidationRules>
+                            <fw:RequireValidationRule ></fw:RequireValidationRule>
+                              <fw:LengthValidationRule MaxLength="50" ></fw:LengthValidationRule>
+                        </Binding.ValidationRules>
+                    </Binding>
+                </TextBox>
+                <Label   Content="保单截止日期:"></Label>
+                <DatePicker    Margin="5">
+                    <DatePicker.SelectedDate>
+                        <Binding Path="PolicyEndDate" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged" Converter="{x:Static fw:DateTimeConverter.Date}">
+                            <Binding.ValidationRules>
+                                <fw:RequireValidationRule ValidationStep="ConvertedProposedValue"></fw:RequireValidationRule>
+                            </Binding.ValidationRules>
+                        </Binding>
+                    </DatePicker.SelectedDate>
+                </DatePicker>
+
+                <Label  Content="保险文件:"></Label>
+
+                <Grid  HorizontalAlignment="Stretch">
+                    <Grid.ColumnDefinitions>
+                        <ColumnDefinition></ColumnDefinition>
+                        <ColumnDefinition Width="Auto"></ColumnDefinition>
+                    </Grid.ColumnDefinitions>
+                    <TextBox Text="{Binding PolicyFile.Name}" Style="{StaticResource ResourceKey={x:Static uc:CommonStyles.TextBoxKey}}" IsReadOnly="True" Margin="5">
+                    </TextBox>
+                    <Button Command="{Binding Commands.UploadCommand}" Grid.Column="1" Content="上传" Width="40" Height="23"></Button>
+                </Grid>
+            </StackPanel>
+
+            <StackPanel Grid.Column="1" Orientation="Vertical" HorizontalAlignment="Stretch" >
+                <Label   Content=""></Label>
+                <Button Margin="5" Command="{Binding Commands.SelectPolicyCommand}"  Style="{StaticResource ResourceKey={x:Static uc:CommonStyles.LinkButtonKey}}" Content="从已有保险单号中选择"></Button>
+              
+            </StackPanel>
+        </Grid>
+     
+
+        <StackPanel Grid.Row="1" Orientation="Horizontal" VerticalAlignment="Center" HorizontalAlignment="Left">
+            <Button Command="{Binding Commands.EnsureCommand}" CommandParameter="{Binding ElementName=this}"  Style="{StaticResource ResourceKey={x:Static uc:CommonStyles.ButtonKey}}"  Height="23" Width="60"  Margin="80,0,0,0" Content="确定" Click="btnOK_Click"/>
+        </StackPanel>
+    </Grid>
+</fw:BaseWindow>

+ 61 - 0
FirmLib/Com.FirmLib.UI/Insuer/WinSimplePolicyEditor.xaml.cs

@@ -0,0 +1,61 @@
+
+///////////////////////////////////////////////////////////////////////////////  
+//文件名称: WinSimplePolicyEditor.xaml
+//文件描述: WinSimplePolicyEditor.xaml
+//创 建 者: xls
+//创建日期: 2018/9/17 23:19:01
+//版 本 号:1.0.0.0
+////////////////////////////////////////////////////////////////////////////////
+
+using System;
+using System.Windows;
+using FWindSoft.Wpf;
+
+namespace Com.FirmLib.UI.Insuer
+{
+    /// <summary>
+    /// WinSimplePolicyEditor.xaml 的交互逻辑
+    /// </summary>
+    public partial class WinSimplePolicyEditor : BaseWindow
+    {
+        private VmSimplePolicyEditor m_Vm;
+        public WinSimplePolicyEditor() : this(new VmSimplePolicyEditor())
+        {
+
+        }
+        public WinSimplePolicyEditor(VmSimplePolicyEditor vm)
+        {
+            InitializeComponent();
+            this.m_Vm = vm;
+            this.m_Vm.SetRefView(this);
+            this.DataContext = this.m_Vm;
+        }
+        protected override void LoadData(LoadParameter parameter)
+        {
+            //初始化数据
+            TryCatchWrapper.Handled(() => this.m_Vm.Init(parameter));
+        }
+        #region 界面关联事件
+        private void btnOK_Click(object sender, RoutedEventArgs e)
+        {
+            try
+            {
+                if (this.HasError())
+                {
+                    //MessageShow.Infomation("请修改错误输入项");
+                    return;
+                }
+            }
+            catch (Exception ex)
+            {
+                //MessageShow.Show(ex);
+            }
+        }
+
+        private void btnCancel_Click(object sender, RoutedEventArgs e)
+        {
+            Close();
+        }
+        #endregion
+    }
+}

+ 30 - 0
FirmLib/Com.FirmLib.UI/Maintainer/Mode/EditParameter.cs

@@ -0,0 +1,30 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Com.FirmLib.UI.Maintainer.Mode
+{
+    public class EditParameter
+    {
+        public EditParameter()
+        {
+            VenderId = string.Empty;
+            BrandId = string.Empty;
+            IsEdit = false;
+        }
+        public EditParameter(string venderId,string brandId):this()
+        {
+            VenderId = venderId;
+            BrandId = brandId;
+        }
+        
+        public string VenderId { get; set; }
+        public bool IsEdit { get; set; }
+        /// <summary>
+        /// 匹配Id
+        /// </summary>
+        public string BrandId { get; set; }
+    }
+}

+ 96 - 0
FirmLib/Com.FirmLib.UI/Maintainer/Mode/MaintainerAssetShowItem.cs

@@ -0,0 +1,96 @@
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using FWindSoft.Data;
+
+namespace Com.FirmLib.UI.Maintainer.Mode
+{
+    /// <summary>
+    /// 维修商资产信息维护
+    /// </summary>
+    public class MaintainerAssetShowItem:BasePropertyChanged
+    {
+        /// <summary>
+        /// 项目id
+        /// </summary>
+        public string ProjectId { get; set; }
+        /// <summary>
+        /// 类别信息
+        /// </summary>
+        public string Category { get; set; }
+
+        private string m_AssetNo;
+        /// <summary>
+        /// 资产Id
+        /// </summary>
+        public string AssetNo
+        {
+            get { return this.m_AssetNo; }
+            set
+            {
+                this.m_AssetNo = value;
+                RaisePropertyChanged(() => this.AssetNo);
+            }
+        }
+        private BaseAssetItem m_AssetItem;
+        /// <summary>
+        /// 资产信息
+        /// </summary>
+        public BaseAssetItem AssetItem
+        {
+            get { return this.m_AssetItem; }
+            set
+            {
+                this.m_AssetItem = value;
+                RaisePropertyChanged(() => this.AssetItem);
+            }
+        }
+
+
+        private string m_EndDate;
+        /// <summary>
+        /// 截止日期
+        /// </summary>
+        public string EndDate
+        {
+            get { return this.m_EndDate; }
+            set
+            {
+                this.m_EndDate = value;
+                RaisePropertyChanged(() => this.EndDate);
+            }
+        }
+
+        private int m_MaintenancePeriod;
+        /// <summary>
+        /// 保养周期
+        /// </summary>
+        public int MaintenancePeriod
+        {
+            get { return this.m_MaintenancePeriod; }
+            set
+            {
+                this.m_MaintenancePeriod = value;
+                RaisePropertyChanged(() => this.MaintenancePeriod);
+            }
+        }
+
+
+        private bool m_HasOtherMaintainer;
+        /// <summary>
+        /// 是否有其他维修商
+        /// </summary>
+        public bool HasOtherMaintainer
+        {
+            get { return this.m_HasOtherMaintainer; }
+            set
+            {
+                this.m_HasOtherMaintainer = value;
+                RaisePropertyChanged(() => this.HasOtherMaintainer);
+            }
+        }
+    }
+}

+ 35 - 0
FirmLib/Com.FirmLib.UI/Maintainer/Mode/MaintainerDataConverter.cs

@@ -0,0 +1,35 @@
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Com.FirmLib.Entity;
+using Com.FirmLib.UI.Common.Model;
+using FWindSoft.SystemExtensions;
+
+namespace Com.FirmLib.UI.Maintainer
+{
+    public static class MaintainerDataConverter
+    {
+        public static AssetShowItem ConvertShowItem(MaintainerAssetItem dataItem)
+        {
+            var showItem = new AssetShowItem();
+            showItem.FamilyCode = dataItem.Category;
+            showItem.EquipName = dataItem.Asset.EquipName;
+            showItem.Id = dataItem.Id;
+            showItem.LocalName = dataItem.Asset.EquipLocalName;
+            showItem.LocalCode = dataItem.Asset.EquipLocalId;
+            showItem.Brand = dataItem.Asset.Brand;
+            showItem.Product = dataItem.Asset.Product;
+            showItem.Type = dataItem.Asset.Specification;
+
+            showItem.ChangeMaintainer = dataItem.ChnageMaintainer;
+            showItem.MaintainerEndDate = dataItem.Asset.MaintainDeadline;
+            showItem.MaintainPeriod = (int)dataItem.Asset.MaintainPeriod.ToDouble();
+
+            showItem.MaintainerId = dataItem.Asset.DpMaintainerId;
+            return showItem;
+        }
+    }
+}

+ 24 - 0
FirmLib/Com.FirmLib.UI/Maintainer/Mode/MaintainerParameter.cs

@@ -0,0 +1,24 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Com.FirmLib.UI.Common;
+
+namespace Com.FirmLib.UI.Maintainer.Mode
+{
+    /// <summary>
+    /// 维修商维护参数
+    /// </summary>
+    public class MaintainerParameter
+    {
+        public MaintainerParameter()
+        {
+            Maintainer = new IdNameItem();
+            Project = new IdNameItem();
+        }
+        public IdNameItem Maintainer { get; private set; }
+        public IdNameItem Project { get; private set; }
+    }
+
+}

+ 88 - 0
FirmLib/Com.FirmLib.UI/Maintainer/Mode/MaintainerShowItem.cs

@@ -0,0 +1,88 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using FWindSoft.Data;
+
+namespace Com.FirmLib.UI.Maintainer
+{
+
+    public class MaintainerShowItem : BasePropertyChanged
+    {
+        public string Id { get; set; }
+
+        private string m_Name;
+        /// <summary>
+        /// 供应商名字
+        /// </summary>
+        public string Name
+        {
+            get { return this.m_Name; }
+            set
+            {
+                this.m_Name = value;
+                RaisePropertyChanged(() => this.Name);
+            }
+        }
+
+
+        private string m_Url;
+        /// <summary>
+        /// 供应商网址
+        /// </summary>
+        public string Url
+        {
+            get { return this.m_Url; }
+            set
+            {
+                this.m_Url = value;
+                RaisePropertyChanged(() => this.Url);
+            }
+        }
+
+        private List<string> m_BrandNames;
+        /// <summary>
+        /// 包含品牌名称
+        /// </summary>
+        public List<string> BrandNames
+        {
+            get { return this.m_BrandNames; }
+            set
+            {
+                this.m_BrandNames = value;
+                RaisePropertyChanged(() => this.BrandNames);
+            }
+        }
+
+
+        private List<string> m_FamilyNames;
+        /// <summary>
+        /// 包含类型族名称
+        /// </summary>
+        public List<string> FamilyNames
+        {
+            get { return this.m_FamilyNames; }
+            set
+            {
+                this.m_FamilyNames = value;
+                RaisePropertyChanged(() => this.FamilyNames);
+            }
+        }
+
+
+        private int m_RefProjectCount;
+        /// <summary>
+        /// 关联项目个数
+        /// </summary>
+        public int RefProjectCount
+        {
+            get { return this.m_RefProjectCount; }
+            set
+            {
+                this.m_RefProjectCount = value;
+                RaisePropertyChanged(() => this.RefProjectCount);
+            }
+        }
+    }
+}

+ 94 - 0
FirmLib/Com.FirmLib.UI/Maintainer/VmAddLossProductType.cs

@@ -0,0 +1,94 @@
+
+///////////////////////////////////////////////////////////////////////////////
+//文件名称: VmAddLossProductType.cs
+//文件描述: VmAddLossProductType.cs
+//创 建 者: xls
+//创建日期: 2018/9/18 17:08:28
+//版 本 号:1.0.0.0
+////////////////////////////////////////////////////////////////////////////////
+
+using System;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using Com.FirmLib.UI.Common;
+using FWindSoft;
+using FWindSoft.MVVM;
+using FWindSoft.Wpf;
+using FWindSoft.Wpf.Common;
+
+namespace Com.FirmLib.UI.Maintainer
+{
+    public class VmAddLossProductType : BaseViewModel
+    {
+        public VmAddLossProductType()
+        {
+            Init();
+        }
+
+        private void Init()
+        {
+
+        }
+        public void Init(LoadParameter parameter)
+        {
+            List<ProductTypeShowItem> items = parameter.Parameter as List<ProductTypeShowItem>;
+            if (items == null)
+                return;
+            var showItems = items.Select(c => new TCheckBoxItem<ProductTypeShowItem>() { Display = c.ToString(), RefObject = c });
+            ProductTypes = new ObservableCollection<TCheckBoxItem<ProductTypeShowItem>>(showItems);
+        }
+        #region 属性相关
+        private ObservableCollection<TCheckBoxItem<ProductTypeShowItem>> m_ProductTypes;
+        /// <summary>
+        /// 待选类型集合
+        /// </summary>
+        public ObservableCollection<TCheckBoxItem<ProductTypeShowItem>> ProductTypes
+        {
+            get { return this.m_ProductTypes; }
+            set
+            {
+                this.m_ProductTypes = value;
+                RaisePropertyChanged(() => this.ProductTypes);
+            }
+        }
+
+        #endregion
+
+        #region 命令相关
+
+        /// <summary>
+        /// 确定按钮
+        /// </summary>
+        /// <param name="parameter"></param>
+        [Command]
+        public void OkCommand(object parameter)
+        {
+
+            try
+            {
+                Window window = parameter as Window;
+                if (window != null)
+                {
+                    var checkedItems = ProductTypes.Where(c => c.IsChecked).Select(c => c.RefObject).ToList();
+                    //设置需要处理的值
+                    window.SetRealResult<List<ProductTypeShowItem>>(checkedItems);
+                    window.DialogResult = true;
+                }
+            }
+            catch (Exception ex)
+            {
+                MessageTipEx.Show(ex);
+            }
+        }
+        public bool CanOkCommand(object parameter)
+        {
+            return true;
+        }
+
+        #endregion
+    }
+}

+ 257 - 0
FirmLib/Com.FirmLib.UI/Maintainer/VmAddProductType.cs

@@ -0,0 +1,257 @@
+
+///////////////////////////////////////////////////////////////////////////////
+//文件名称: VmAddProductType.cs
+//文件描述: VmAddProductType.cs
+//创 建 者: xls
+//创建日期: 2018/9/18 16:59:10
+//版 本 号:1.0.0.0
+////////////////////////////////////////////////////////////////////////////////
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using Com.FirmLib.Bll;
+using Com.FirmLib.Entity;
+using Com.FirmLib.UI.Common;
+using FWindSoft.Data;
+using FWindSoft.DataFramework;
+using FWindSoft.MVVM;
+using FWindSoft.Wpf;
+
+namespace Com.FirmLib.UI.Maintainer
+{
+    public class VmAddProductType : BaseViewModel
+    {
+        public VmAddProductType()
+        {
+            Init();
+        }
+
+        private void Init()
+        {
+            ExistProductTypeIds = new List<string>();
+        }
+        public void Init(LoadParameter parameter)
+        {
+            Id = parameter.Parameter as string;
+            LoadExistTypes(Id);
+            LoadProductTypeItems();
+        }
+        /// <summary>
+        /// 关联厂商Id[可能添加功能需要]
+        /// </summary>
+        public string Id { get; set; }
+        #region 属性相关
+        /// <summary>
+        /// 存在的产品型号Id集合
+        /// </summary>
+        public List<string> ExistProductTypeIds { get; set; }
+
+        private TreeNavigation<ShowDataItem> m_Root;
+        /// <summary>
+        /// 根元素
+        /// </summary>
+        public TreeNavigation<ShowDataItem> Root
+        {
+            get { return this.m_Root; }
+            set
+            {
+                this.m_Root = value;
+                RaisePropertyChanged(nameof(this.Root));
+            }
+        }
+        /// <summary>
+        /// 当前选中设备族
+        /// </summary>
+        public string CurrentFamily
+        {
+            get
+            {
+                if (Root.CurrentItem == null)
+                    return string.Empty;
+                ShowDataItem item = Root.CurrentItem.RefItem as ShowDataItem;
+                if (item != null)
+                    return item.Id;
+                return string.Empty;
+            }
+        }
+        #endregion
+
+        #region 命令相关
+
+        /// <summary>
+        /// 增加维护类型
+        /// </summary>
+        /// <param name="parameter"></param>
+        [Command]
+        public void AddProductTypeCommand(object parameter)
+        {
+            AddTypeList(parameter as Window);
+        }
+        public bool CanAddProductTypeCommand(object parameter)
+        {
+            return true;
+        }
+        #endregion
+        #region 私有方法
+        /// <summary>
+        /// 增加类型信息
+        /// </summary>
+        /// <param name="window"></param>
+        private void AddTypeList(Window window)
+        {
+            try
+            {
+                if (Root == null)
+                    return;
+                #region 获取需要增加类型id
+                List<string> productTypeIds = new List<string>();
+                var showItems = Root?.GetLastLevelData();
+                productTypeIds.AddRange(showItems.Where(s => s.IsChecked == true && !ExistProductTypeIds.Contains(s.RefItem.Id)).Select(s => s.RefItem.Id));
+                #endregion
+
+                #region 增加维护类型信息
+                if (productTypeIds.Count == 0)
+                {
+                    MessageTip.Show(this.GetWindow(), "没有需要增加的产品类型");
+                    return;
+                }
+                var flag = BllFactory<ProductDirectoryBll>.Instance.Add(Id, new List<string>(productTypeIds));
+                if (flag)
+                {
+                    ExistProductTypeIds.AddRange(productTypeIds);
+                    MessageTip.Show(this.GetWindow(), "添加成功");
+                    if (window != null)
+                    {
+                        window.DialogResult = true;
+                    }
+
+                }
+                else
+                {
+                    MessageTip.Show(this.GetWindow(), BllFactory<ProductDirectoryBll>.Instance.ErrorMessage, "失败");
+                }
+                #endregion
+            }
+            catch (Exception ex)
+            {
+
+              MessageTipEx.Show(this.GetWindow(), ex);
+            }
+        }
+        #endregion
+        #region 加载数据    
+        private void LoadProductTypeItems()
+        {
+            Root = new TreeNavigation<ShowDataItem>();
+            Root.CurrentItemChanged = ChangeSelectedItem;
+            Root.Items.AddRange(LoadFamilys(null));
+            Root.CurrentItem = Root.Items.FirstOrDefault();
+        }
+        private void LoadExistTypes(string venderId)
+        {
+            ExistProductTypeIds = new List<string>();
+            var types = BllFactory<ProductDirectoryBll>.Instance.GetAllItems(venderId);
+            var ids = types.Select(t => t.ProductTypeId).ToList();
+            ExistProductTypeIds.AddRange(ids);
+        }
+        #endregion
+       
+       
+        #region 加载类型相关
+        private string GetCurrentFamily()
+        {
+            string result =  Root.CurrentItem?.RefItem?.Id;
+          
+            return result??string.Empty;
+        }
+        private void ChangeSelectedItem(TreeNavigationItem<ShowDataItem> item)
+        {
+            if (item == null)
+                return;
+            if (item.Level > 3)
+                return;
+            item.Nodes.Clear();
+            string familyCode = GetCurrentFamily();
+            if (item.Level == 1)
+            {
+                item.Nodes.AddRange(GetBrands(new ProdcutTypeCondition() { FamilyCode = item.RefItem.Id }));
+            }
+            else if (item.Level == 2)
+            {
+                item.Nodes.AddRange(GetProducts(new ProdcutTypeCondition() { BrandId = item.RefItem.Id,FamilyCode= familyCode }));
+            }
+            else if (item.Level == 3)
+            {
+                item.Nodes.AddRange(GetProductTypes(new ProdcutTypeCondition() { ProductId = item.RefItem.Id, FamilyCode = familyCode }));
+                item.UpdateCheckedState();
+            }
+            item.CurrentItem = item.Nodes.FirstOrDefault();
+        }
+        /// <summary>
+        /// 当前型号数据
+        /// </summary>
+        private List<ProductTypeDetailItem> DataSource { get; set; }
+        private List<TreeNavigationItem<ShowDataItem>> LoadFamilys(ProdcutTypeCondition conditon)
+        {
+            List<TreeNavigationItem<ShowDataItem>> results = new List<TreeNavigationItem<ShowDataItem>>();
+            #region 数据查询
+            if (DataSource == null)
+            {
+                DataSource = ProductTypeManager.ConverToList(BllFactory<GeneralBll>.Instance.GetProductTypeItems());
+            }
+            #endregion
+            var familys = ProductTypeManager.GetFamilys(new ProdcutTypeCondition(DataSource));
+            familys.ForEach(b => results.Add(new TreeNavigationItem<ShowDataItem>() { RefItem = b }));
+            return results;
+        }
+        private List<TreeNavigationItem<ShowDataItem>> GetBrands(ProdcutTypeCondition conditon)
+        {
+            List<TreeNavigationItem<ShowDataItem>> results = new List<TreeNavigationItem<ShowDataItem>>();
+            #region 数据查询
+            if (DataSource == null)
+            {
+                return results;
+            }
+            #endregion
+            var dataSource = DataSource.Where(p => p.FamilyCode == conditon.FamilyCode).ToList();
+            var brands = ProductTypeManager.GetBrands(new ProdcutTypeCondition(dataSource));
+            brands.ForEach(b => results.Add(new TreeNavigationItem<ShowDataItem>() { RefItem = b }));
+            return results;
+        }
+        private List<TreeNavigationItem<ShowDataItem>> GetProducts(ProdcutTypeCondition conditon)
+        {
+            List<TreeNavigationItem<ShowDataItem>> results = new List<TreeNavigationItem<ShowDataItem>>();
+            var products = ProductTypeManager.GetProducts(new ProdcutTypeCondition(DataSource) { BrandId =conditon.BrandId,FamilyCode=conditon.FamilyCode });
+            products.ForEach(b => results.Add(new TreeNavigationItem<ShowDataItem>() { RefItem = b }));
+
+            return results;
+        }
+        private List<TreeNavigationItem<ShowDataItem>> GetProductTypes(ProdcutTypeCondition conditon)
+        {
+            List<TreeNavigationItem<ShowDataItem>> results = new List<TreeNavigationItem<ShowDataItem>>();
+            var productTypes = ProductTypeManager.GetProductTypes(new ProdcutTypeCondition(DataSource) { ProductId = conditon.ProductId, FamilyCode = conditon.FamilyCode });
+
+            #region 转换数据
+            List<string> useList = ExistProductTypeIds ?? new List<string>();
+            foreach (var productType in productTypes)
+            {
+                var useData = new TreeNavigationItem<ShowDataItem>()
+                {
+                    RefItem = productType
+                };
+
+                useData.IsChecked = useList.Any(id => id == useData.RefItem?.Id);
+                useData.IsEnabled = !(useData.IsChecked == true);
+                results.Add(useData);
+            }
+            #endregion
+
+            return results;
+        } 
+        #endregion
+    }
+}

+ 339 - 0
FirmLib/Com.FirmLib.UI/Maintainer/VmMaintainerAssetSelector.cs

@@ -0,0 +1,339 @@
+
+///////////////////////////////////////////////////////////////////////////////
+//文件名称: VmMaintainerAssetSelector.cs
+//文件描述: VmMaintainerAssetSelector.cs
+//创 建 者: xls
+//创建日期: 2018/9/18 17:02:38
+//版 本 号:1.0.0.0
+////////////////////////////////////////////////////////////////////////////////
+
+using System;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using Com.FirmLib.Bll;
+using Com.FirmLib.UI.BllCommon;
+using Com.FirmLib.UI.Common.Model;
+using Com.FirmLib.UI.Insuer.Model;
+using FWindSoft.DataFramework;
+using FWindSoft.MVVM;
+using FWindSoft.Wpf;
+
+namespace Com.FirmLib.UI.Maintainer
+{
+    public class VmMaintainerAssetSelector : BaseViewModel
+    {
+        public VmMaintainerAssetSelector()
+        {
+            Init();
+        }
+
+        private void Init()
+        {
+            SelectedAssetItems = new List<AssetShowItem>();
+            ExistAssets = new List<string>();
+            //InitSelector();
+        }
+        public void Init(LoadParameter parameter)
+        {
+            SelectAssetContext context = parameter.Parameter as SelectAssetContext;
+            if (context == null)
+                return;
+            Context = context;
+            ProjectId = context.ProjectId;
+            VenderId = context.VenderId;
+            VenderName = BllFactory<MaintainerBll>.Instance.GetItem(context.VenderId)?.Name ?? string.Empty;
+            ExistAssets = new List<string>(context.ContainIds);
+             InitSelector();
+            CalcCheckedCount();
+        }
+        #region 属性相关  
+        /// <summary>
+        /// 厂商名字
+        /// </summary>
+        private string VenderName { get; set; }
+        /// <summary>
+        /// 厂商id
+        /// </summary>
+        public string VenderId { get; set; }
+        /// <summary>
+        /// 项目id
+        /// </summary>
+        private string ProjectId { get; set; }
+        /// <summary>
+        /// 存在资产信息
+        /// </summary>
+        private List<string> ExistAssets { get; set; }
+        private SelectAssetContext Context { get; set; }
+        /// <summary>
+        /// 当前保单中选中资产
+        /// </summary>
+        public List<AssetShowItem> SelectedAssetItems { get; set; }
+
+        private ObservableCollection<AssetShowItem> m_RecommendAssetItems;
+        /// <summary>
+        /// 推荐资产
+        /// </summary>
+        public ObservableCollection<AssetShowItem> RecommendAssetItems
+        {
+            get { return this.m_RecommendAssetItems; }
+            set
+            {
+                this.m_RecommendAssetItems = value;
+                RaisePropertyChanged(nameof(this.RecommendAssetItems));
+            }
+        }
+
+
+        private ObservableCollection<AssetShowItem> m_AllAssetItems;
+        /// <summary>
+        /// 全部资产
+        /// </summary>
+        public ObservableCollection<AssetShowItem> AllAssetItems
+        {
+            get { return this.m_AllAssetItems; }
+            set
+            {
+                this.m_AllAssetItems = value;
+                RaisePropertyChanged(nameof(this.AllAssetItems));
+            }
+        }
+
+
+        private string m_SelectedAssetCount;
+        /// <summary>
+        /// 选中资产数量
+        /// </summary>
+        public string SelectedAssetCount
+        {
+            get { return this.m_SelectedAssetCount; }
+            set
+            {
+                this.m_SelectedAssetCount = value;
+                RaisePropertyChanged(nameof(this.SelectedAssetCount));
+            }
+        }
+
+        #endregion
+
+        #region 命令相关
+
+        /// <summary>
+        /// 确定按钮
+        /// </summary>
+        /// <param name="parameter"></param>
+        [Command]
+        public void EnsureCommand(object parameter)
+        {
+
+            try
+            {
+                try
+                {
+                    if (Context != null)
+                    {
+                        Context.AddedItems.AddRange(SelectedAssetItems);
+                    }
+                    Window win = parameter as Window;
+                    if (win != null)
+                    {
+                        win.DialogResult = true;
+                    }
+
+                }
+                catch (Exception ex)
+                {
+
+                    MessageTipEx.Show(ex);
+                }
+            }
+            catch (Exception ex)
+            {
+                MessageTipEx.Show(ex);
+            }
+        }
+        public bool CanEnsureCommand(object parameter)
+        {
+            return true;
+        }
+        /// <summary>
+        /// 选择资产变化
+        /// </summary>
+        /// <param name="parameter"></param>
+        [Command]
+        public void SelectedAssetChanged(object parameter)
+        {
+            try
+            {
+                AssetShowItem item = parameter as AssetShowItem;
+                if (item == null)
+                    return;
+                var currentItem = this.SelectedAssetItems.FirstOrDefault(c => c.Id == item.Id);
+                bool isChecked = item.IsChecked;
+                if (isChecked && currentItem == null)
+                {
+                    this.SelectedAssetItems.Add(item);
+                }
+                else if (!isChecked && currentItem != null)
+                {
+                    this.SelectedAssetItems.Remove(currentItem);
+                }
+                CalcCheckedCount();
+            }
+            catch (Exception ex)
+            {
+
+               MessageTipEx.Show(ex);
+            }
+
+        }
+        public bool CanSelectedAssetChanged(object parameter)
+        {
+            AssetShowItem item = parameter as AssetShowItem;
+            if (item == null)
+                return false;
+            return item.IsEnabled;
+        }
+
+
+        /// <summary>
+        /// tab切换按钮【联动两边选中项】
+        /// </summary>
+        /// <param name="parameter"></param>
+        [Command]
+        public void TabChangedCommand(object parameter)
+        {
+            try
+            {
+                //子控件,包含相同的事件也会触发
+                int index = Convert.ToInt32(parameter);
+                var useCollection = index == 0 ? RecommendAssetItems : AllAssetItems;
+                if (useCollection == null)
+                    return;
+                foreach (var item in useCollection)
+                {
+                    item.IsChecked = ExistAssetId(item.Id);
+                }
+            }
+            catch (Exception ex)
+            {
+
+               MessageTipEx.Show(ex);
+            }
+        }
+        public bool CanTabChangedCommand(object parameter)
+        {
+            return true;
+        }
+
+        #endregion
+
+        #region 私有方法
+        private void CalcCheckedCount()
+        {
+            this.SelectedAssetCount = (ExistAssets.Count + this.SelectedAssetItems.Count).ToString();
+        }
+        private bool ExistAssetId(string no)
+        {
+            return this.SelectedAssetItems.Any(asset => asset.Id == no);
+        }
+        private bool ExistInOrigin(string no)
+        {
+            return this.ExistAssets.Any(id => id == no);
+        }
+        private void InitSelector()
+        {
+            RecommendAssetSelecter = new AssetSelector();
+            AllAssetSelecter = new AssetSelector();
+            RecommendAssetSelecter.Refresh = (selector) =>
+            {
+                LoadRecommendAssets(selector, ProjectId, VenderId);
+            };
+            AllAssetSelecter.Refresh = (selector) =>
+            {
+                LoadAllAssets(selector, ProjectId, string.Empty);
+            };
+            RecommendAssetSelecter.FilterControl.Refresh();
+            AllAssetSelecter.FilterControl.Refresh();
+        }
+        private void LoadRecommendAssets(AssetSelector selector, string projectId, string venderId)
+        {
+            string prefix = selector.FilterControl.FilterSetting["LocalName"].ToString();
+            int startIndex = Math.Max((selector.CurrentPageIndex - 1), 0) * AssetManager.PerPageCount;
+            var venderItem = VenderItem.CreateMaintainerItem(VenderName);
+            venderItem.Id = venderId;
+            SearchResultList<AssetShowItem> items = AssetManager.GetRecommendShowItems(projectId, prefix, startIndex,venderItem); ;
+            foreach (var item in items)
+            {
+                item.IsChecked = ExistInOrigin(item.Id);
+                if (item.IsChecked)
+                {
+                    item.IsEnabled = false;
+                }
+                else
+                {
+                    item.IsChecked = ExistAssetId(item.Id);
+                }
+            }
+
+            selector.PageCount = CommomUtils.CalcPageCount(items.TotalCount, AssetManager.PerPageCount);
+            RecommendAssetItems = new ObservableCollection<AssetShowItem>(items);
+        }
+        private void LoadAllAssets(AssetSelector selector, string projectId, string venderId)
+        {
+            string prefix = selector.FilterControl.FilterSetting["LocalName"].ToString();
+            int startIndex = Math.Max((selector.CurrentPageIndex - 1), 0) * AssetManager.PerPageCount;
+            SearchResultList<AssetShowItem> items = AssetManager.GetShowEqItems(projectId, prefix, startIndex); 
+            foreach (var item in items)
+            {
+                item.IsChecked = ExistInOrigin(item.Id);
+                if (item.IsChecked)
+                {
+                    item.IsEnabled = false;
+                }
+                else
+                {
+                    item.IsChecked = ExistAssetId(item.Id);
+                }
+            }
+            selector.PageCount = CommomUtils.CalcPageCount(items.TotalCount, AssetManager.PerPageCount);
+            AllAssetItems = new ObservableCollection<AssetShowItem>(items);
+        }
+        #endregion
+
+        #region 推荐资产 列表相关
+        private AssetSelector m_RecommendAssetSelecter;
+        /// <summary>
+        /// 推荐资产
+        /// </summary>
+        public AssetSelector RecommendAssetSelecter
+        {
+            get { return this.m_RecommendAssetSelecter; }
+            private set
+            {
+                this.m_RecommendAssetSelecter = value;
+                RaisePropertyChanged(nameof(this.RecommendAssetSelecter));
+            }
+        }
+        #endregion
+
+        #region 全部资产列表相关
+        private AssetSelector m_AllAssetSelecterr;
+        /// <summary>
+        /// 全部资产选择器
+        /// </summary>
+        public AssetSelector AllAssetSelecter
+        {
+            get { return this.m_AllAssetSelecterr; }
+            private set
+            {
+                this.m_AllAssetSelecterr = value;
+                RaisePropertyChanged(nameof(this.AllAssetSelecter));
+            }
+        }
+        #endregion
+    }
+}

+ 0 - 0
FirmLib/Com.FirmLib.UI/Maintainer/VmMaintainerBaseInfo.cs


Some files were not shown because too many files changed in this diff