图片/地图图片上标注/标点

在图片上标点,便于直观的让用户了解各标点的状态及完成情况,围绕标点进行进一步的场景延伸

序号特性是否支持
 1 用户自定义背景图片(地图/平面图/其它) 
 2 自定义标注点图标 
 3 自定义标注点颜色 
 4 支持地图放大及缩小 
 5 自定义标注点的分类 
 6 显示历史标注点 

 

(一)、具体的界面效果如下:

 

(二)、开发步骤:

1、在项目信息里面定义图片及其缩略图字段

2、绑定项目信息的新建及编辑事件,自动生成缩略图

参考生成缩略图的代码:
        #region 函数说明:生成项目缩略图纸
        /// <summary>
        /// 生成项目缩略图纸
        /// </summary>
        /// <param name="CallBackEvent"></param>
        /// <param name="DataTableName"></param>
        /// <param name="UniqueKey"></param>
        /// <returns></returns>
        public AjaxResultModel 生成项目缩略图纸(PublicFunctions.CallBackEvent.CallBackEventEnum CallBackEvent, string DataTableName, string UniqueKey)
        {
            AjaxResultModel AjaxResultObject = new AjaxResultModel();
            using (PublicFunctions.DBHelper.RawDBHelper.SqlDataFactory context = new PublicFunctions.DBHelper.RawDBHelper.SqlDataFactory(PublicSetting.RawDBHelper_CRM_ConnectionStringKey))
            {
                Dictionary<string, string> dic = context.GetCellRowDictionary("select 园建图纸,绿化图纸 from " + DataTableName + " where ID=" + UniqueKey);
                if (dic.Count > 0)
                {
                    if (true)
                    {
                        string 园建图纸 = PublicFunctions.PublicFunctions.GetDataFromDictionary("园建图纸", dic);
                        if (!Check.IsNull(园建图纸))
                        {
                            园建图纸 = PublicFunctions.ReplaceRestorStr.RestoreHTMLTag(园建图纸);
                            Dictionary<string, string> FileDictionary = PublicFunctions.HtmlControl.HtmlControl.GetFileListFromUploadFileCompenentModeHTML(园建图纸);
                            园建图纸 = FileDictionary.Count > 0 ? FileDictionary.First().Key : "";
                            if (!Check.IsNull(园建图纸))
                            {
                                if (园建图纸.ToLower().StartsWith("http"))
                                {
                                    园建图纸 = 园建图纸.Substring(园建图纸.IndexOf("UserUploadFiles/"));
                                }
                                string PreviewImagePath=PublicSetting.SystemFrameWorkPhysicalPath+"\\"+园建图纸.Replace("/","\\").Split('.').First()+"_Preview."+园建图纸.Split('.').Last();
                                int OriginImageWidth=0;
                                int OriginImageHeight=0;
                                if (PublicFunctions.ImageManagementClass.CreatePreviewImage(PublicSetting.SystemFrameWorkPhysicalPath + "\\" + 园建图纸.Replace("/", "\\"), 150, 300, PreviewImagePath, ref OriginImageWidth, ref OriginImageHeight, QualitySetting: 100))
                                {
                                    //更新园建图纸缩略图
                                    context.ExecuteSQLBool("update " + DataTableName + " set 园建图纸缩略图='" + (园建图纸.Split('.').First() + "_Preview." + 园建图纸.Split('.').Last()) + "' where ID=" + UniqueKey);
                                }
                            }
                        }
                    }

                    if (true)
                    {
                        string 绿化图纸 = PublicFunctions.PublicFunctions.GetDataFromDictionary("绿化图纸", dic);
                        if (!Check.IsNull(绿化图纸))
                        {
                            绿化图纸 = PublicFunctions.ReplaceRestorStr.RestoreHTMLTag(绿化图纸);
                            Dictionary<string, string> FileDictionary = PublicFunctions.HtmlControl.HtmlControl.GetFileListFromUploadFileCompenentModeHTML(绿化图纸);
                            绿化图纸 = FileDictionary.Count > 0 ? FileDictionary.First().Key : "";
                            if (!Check.IsNull(绿化图纸))
                            {
                                if (绿化图纸.ToLower().StartsWith("http"))
                                {
                                    绿化图纸 = 绿化图纸.Substring(绿化图纸.IndexOf("UserUploadFiles/"));
                                }
                                string PreviewImagePath = PublicSetting.SystemFrameWorkPhysicalPath + "\\" + 绿化图纸.Replace("/", "\\").Split('.').First() + "_Preview." + 绿化图纸.Split('.').Last();
                                int OriginImageWidth = 0;
                                int OriginImageHeight = 0;
                                if (PublicFunctions.ImageManagementClass.CreatePreviewImage(PublicSetting.SystemFrameWorkPhysicalPath + "\\" + 绿化图纸.Replace("/", "\\"), 150, 300, PreviewImagePath, ref OriginImageWidth, ref OriginImageHeight, QualitySetting: 100))
                                {
                                    //更新绿化图纸缩略图
                                    context.ExecuteSQLBool("update " + DataTableName + " set 绿化图纸缩略图='" + (绿化图纸.Split('.').First() + "_Preview." + 绿化图纸.Split('.').Last()) + "' where ID=" + UniqueKey);
                                }
                            }
                        }
                    }
                }
            }
            AjaxResultObject.IsSuccess = true;
            return AjaxResultObject;
        }
        #endregion
 
3、定义标注点分类,名称及对应的颜色:
 

参考字段的配置(可直接导入):

 

W3siSUQiOjk0MzE3LCJGb3JtS2V5IjoiQ1JNLuWunua1i+WunumHj+ajgOafpemhuS4xIiwiRGF0YUJhc2VUYWJsZU5hbWUiOiLlrp7mtYvlrp7ph4/mo4Dmn6XpobkiLCJDb2x1bW5OYW1lIjoi5qOA5p+l6aG5IiwiQ29sdW1uTmFtZUNOIjoi5qOA5p+l6aG5IiwiQ29sdW1uTGFiZWwiOiLmo4Dmn6XpobkiLCJDb2x1bW5PYmplY3RUeXBlIjoiVGV4dEZpZWxkIiwiRGF0YVR5cGUiOiJOVkFSQ0hBUiIsIkRhdGFMZW5ndGgiOiIzMDAiLCJPYmplY3RJRCI6IuajgOafpemhuSIsIkNTU0NsYXNzTmFtZSI6IiIsIkRlZmF1bHRWYWx1ZSI6IiIsIklzTm90QWxsb3dOdWxsVmFsdWVGaWVsZCI6dHJ1ZSwiTnVsbFZhbHVlQWxlcnRUZXh0IjoiIiwiSXNSZXN0cmljdE1vZGUiOmZhbHNlLCJPcHRpb25UZXh0IjoiIiwiVG9vZ2xlVGV4dCI6IiIsIkRpY3Rpb25hcnlLZXkiOiIiLCJBZGRpdGlvbmFsTXNnIjoiIiwiQWRkaXRpb25hbE1zZ0ZvclZhbHVlIjoiIiwiQWRkaXRpb25hbE1zZ0xheW91dCI6InRhYmxlICAgICAiLCJJc1JlYWRPbmx5IjpmYWxzZSwiSXNEaXNhYmxlIjpmYWxzZSwiVmFsaWRhdGVPbkJsdXIiOnRydWUsIklzU2VhcmNoYWJsZSI6dHJ1ZSwiSXNTb3J0YWJsZSI6dHJ1ZSwiQ29tYm9Cb3hNdWx0aVNlbGVjdCI6ZmFsc2UsIkNvbWJvQm94RWRpdGFibGUiOmZhbHNlLCJSYWRpb0F1dG9TZWxlY3RGaXJzdE9uZSI6ZmFsc2UsIkNoZWNrQm94TmVlZENoZWNrQWxsRnVuY3Rpb24iOmZhbHNlLCJNaW5WYWx1ZSI6IiIsIk1heFZhbHVlIjoiIiwiV2lkdGgiOjAsIkhlaWdodCI6MCwiSXNBbGxvd1VwbG9hZE11bHRpRmlsZSI6dHJ1ZSwiSXNTZXJpYWxpemVUb0JpbmFyeSI6ZmFsc2UsIk5lZWRSZXNldEJ1dHRvbiI6ZmFsc2UsIkFsbG93RmlsZUV4dGVuc2lvbkxpc3QiOiIqIiwiSW5pdGlhdGVVcGxvYWRGb3JtTnVtYmVyIjoxLCJGaWxlU2F2ZUZvbGRlciI6IiIsIkRhdGFTb3VyZURpY3Rpb25hcnkiOiIiLCJBZGRpdGlvbmFsUHJvcGVydHkiOiIiLCJEaXNwbGF5Q1NTQ2xhc3NOYW1lIjoiIiwiSXNQcmV2aWV3Q29sdW1uIjp0cnVlLCJJc1N5c3RlbUNvbHVtbiI6ZmFsc2UsIlByZXZpZXdDb2x1bW5XaWR0aCI6MCwiSXNDaGVja0R1cGxpY2F0ZWQiOnRydWUsIlRvZ2V0aGVyQ2hlY2tEdXBsaWNhdGVkQ29sdW1uTGlzdCI6IiIsIkN1c3RvbWl6ZWRWYWxpZGF0ZSI6IiIsIkh0bWwiOiIiLCJNaW5MZW5ndGgiOiIiLCJNYXhMZW5ndGgiOiIiLCJQcmVmaXhIVE1MIjoiIiwiRXh0cmFQcmVmaXhIVE1MIjoiIiwiRXh0cmFTdWZmaXhIVE1MIjoiIiwiSXNOb3RTdW1tYXJ5RmllbGQiOnRydWUsIklzQWNjdXJhdGVUb01pbnV0ZSI6ZmFsc2UsIk9yZGVyTnVtYmVyIjoxMDA1LCJJc0hpZGRlbiI6ZmFsc2UsIkRpc3BsYXlBc0ltYWdlcyI6ZmFsc2UsIkZvcmx1bWEiOiIiLCJJc1BsYWluVGV4dCI6ZmFsc2UsIkdldE1vYmlsZVBob3RvTW9kZSI6IiIsIlNob3dBZGRNaW51c0ljb24iOmZhbHNlLCJBZGRNaW51c0ludGVydmFsIjoxLjAwLCJJc0dyaWRIaWRkZW4iOmZhbHNlLCJJc0VxdWFsU2VhcmNoIjpmYWxzZX0seyJJRCI6OTQzMTgsIkZvcm1LZXkiOiJDUk0u5a6e5rWL5a6e6YeP5qOA5p+l6aG5LjEiLCJEYXRhQmFzZVRhYmxlTmFtZSI6IuWunua1i+WunumHj+ajgOafpemhuSIsIkNvbHVtbk5hbWUiOiLmj4/ngrnpopzoibIiLCJDb2x1bW5OYW1lQ04iOiLmj4/ngrnpopzoibIiLCJDb2x1bW5MYWJlbCI6IuaPj+eCueminOiJsiIsIkNvbHVtbk9iamVjdFR5cGUiOiJUZXh0RmllbGQiLCJEYXRhVHlwZSI6Ik5WQVJDSEFSIiwiRGF0YUxlbmd0aCI6IjMwMCIsIk9iamVjdElEIjoi5o+P54K56aKc6ImyIiwiQ1NTQ2xhc3NOYW1lIjoiIiwiRGVmYXVsdFZhbHVlIjoiIiwiSXNOb3RBbGxvd051bGxWYWx1ZUZpZWxkIjp0cnVlLCJOdWxsVmFsdWVBbGVydFRleHQiOiIiLCJJc1Jlc3RyaWN0TW9kZSI6ZmFsc2UsIk9wdGlvblRleHQiOiIiLCJUb29nbGVUZXh0IjoiUkdC6aKc6Imy5YC877yM5L6L77yaIzNlOGVmNyIsIkRpY3Rpb25hcnlLZXkiOiIiLCJBZGRpdGlvbmFsTXNnIjoiIiwiQWRkaXRpb25hbE1zZ0ZvclZhbHVlIjoiIiwiQWRkaXRpb25hbE1zZ0xheW91dCI6InRhYmxlICAgICAiLCJJc1JlYWRPbmx5IjpmYWxzZSwiSXNEaXNhYmxlIjpmYWxzZSwiVmFsaWRhdGVPbkJsdXIiOnRydWUsIklzU2VhcmNoYWJsZSI6dHJ1ZSwiSXNTb3J0YWJsZSI6dHJ1ZSwiQ29tYm9Cb3hNdWx0aVNlbGVjdCI6ZmFsc2UsIkNvbWJvQm94RWRpdGFibGUiOmZhbHNlLCJSYWRpb0F1dG9TZWxlY3RGaXJzdE9uZSI6ZmFsc2UsIkNoZWNrQm94TmVlZENoZWNrQWxsRnVuY3Rpb24iOmZhbHNlLCJNaW5WYWx1ZSI6IiIsIk1heFZhbHVlIjoiIiwiV2lkdGgiOjAsIkhlaWdodCI6MCwiSXNBbGxvd1VwbG9hZE11bHRpRmlsZSI6dHJ1ZSwiSXNTZXJpYWxpemVUb0JpbmFyeSI6ZmFsc2UsIk5lZWRSZXNldEJ1dHRvbiI6ZmFsc2UsIkFsbG93RmlsZUV4dGVuc2lvbkxpc3QiOiIqIiwiSW5pdGlhdGVVcGxvYWRGb3JtTnVtYmVyIjoxLCJGaWxlU2F2ZUZvbGRlciI6IiIsIkRhdGFTb3VyZURpY3Rpb25hcnkiOiIiLCJBZGRpdGlvbmFsUHJvcGVydHkiOiIiLCJEaXNwbGF5Q1NTQ2xhc3NOYW1lIjoiIiwiSXNQcmV2aWV3Q29sdW1uIjp0cnVlLCJJc1N5c3RlbUNvbHVtbiI6ZmFsc2UsIlByZXZpZXdDb2x1bW5XaWR0aCI6MCwiSXNDaGVja0R1cGxpY2F0ZWQiOmZhbHNlLCJUb2dldGhlckNoZWNrRHVwbGljYXRlZENvbHVtbkxpc3QiOiIiLCJDdXN0b21pemVkVmFsaWRhdGUiOiIiLCJIdG1sIjoiIiwiTWluTGVuZ3RoIjoiIiwiTWF4TGVuZ3RoIjoiIiwiUHJlZml4SFRNTCI6IiIsIkV4dHJhUHJlZml4SFRNTCI6IiIsIkV4dHJhU3VmZml4SFRNTCI6IiIsIklzTm90U3VtbWFyeUZpZWxkIjp0cnVlLCJJc0FjY3VyYXRlVG9NaW51dGUiOmZhbHNlLCJPcmRlck51bWJlciI6MTAxMCwiSXNIaWRkZW4iOmZhbHNlLCJEaXNwbGF5QXNJbWFnZXMiOmZhbHNlLCJGb3JsdW1hIjoiIiwiSXNQbGFpblRleHQiOmZhbHNlLCJHZXRNb2JpbGVQaG90b01vZGUiOiIiLCJTaG93QWRkTWludXNJY29uIjpmYWxzZSwiQWRkTWludXNJbnRlcnZhbCI6MS4wMCwiSXNHcmlkSGlkZGVuIjpmYWxzZSwiSXNFcXVhbFNlYXJjaCI6ZmFsc2V9LHsiSUQiOjk0MzE5LCJGb3JtS2V5IjoiQ1JNLuWunua1i+WunumHj+ajgOafpemhuS4xIiwiRGF0YUJhc2VUYWJsZU5hbWUiOiLlrp7mtYvlrp7ph4/mo4Dmn6XpobkiLCJDb2x1bW5OYW1lIjoi5o6S5bqP5Y+3IiwiQ29sdW1uTmFtZUNOIjoi5o6S5bqP5Y+3IiwiQ29sdW1uTGFiZWwiOiLmjpLluo/lj7ciLCJDb2x1bW5PYmplY3RUeXBlIjoiTnVtYmVyRmllbGQiLCJEYXRhVHlwZSI6IklOVCIsIkRhdGFMZW5ndGgiOiIiLCJPYmplY3RJRCI6IuaOkuW6j+WPtyIsIkNTU0NsYXNzTmFtZSI6IiIsIkRlZmF1bHRWYWx1ZSI6IiIsIklzTm90QWxsb3dOdWxsVmFsdWVGaWVsZCI6ZmFsc2UsIk51bGxWYWx1ZUFsZXJ0VGV4dCI6IiIsIklzUmVzdHJpY3RNb2RlIjpmYWxzZSwiT3B0aW9uVGV4dCI6IiIsIlRvb2dsZVRleHQiOiIiLCJEaWN0aW9uYXJ5S2V5IjoiIiwiQWRkaXRpb25hbE1zZyI6IiIsIkFkZGl0aW9uYWxNc2dGb3JWYWx1ZSI6IiIsIkFkZGl0aW9uYWxNc2dMYXlvdXQiOiJ0YWJsZSAgICAgIiwiSXNSZWFkT25seSI6ZmFsc2UsIklzRGlzYWJsZSI6ZmFsc2UsIlZhbGlkYXRlT25CbHVyIjp0cnVlLCJJc1NlYXJjaGFibGUiOnRydWUsIklzU29ydGFibGUiOnRydWUsIkNvbWJvQm94TXVsdGlTZWxlY3QiOmZhbHNlLCJDb21ib0JveEVkaXRhYmxlIjpmYWxzZSwiUmFkaW9BdXRvU2VsZWN0Rmlyc3RPbmUiOmZhbHNlLCJDaGVja0JveE5lZWRDaGVja0FsbEZ1bmN0aW9uIjpmYWxzZSwiTWluVmFsdWUiOiIiLCJNYXhWYWx1ZSI6IiIsIldpZHRoIjowLCJIZWlnaHQiOjAsIklzQWxsb3dVcGxvYWRNdWx0aUZpbGUiOnRydWUsIklzU2VyaWFsaXplVG9CaW5hcnkiOmZhbHNlLCJOZWVkUmVzZXRCdXR0b24iOmZhbHNlLCJBbGxvd0ZpbGVFeHRlbnNpb25MaXN0IjoiKiIsIkluaXRpYXRlVXBsb2FkRm9ybU51bWJlciI6MSwiRmlsZVNhdmVGb2xkZXIiOiIiLCJEYXRhU291cmVEaWN0aW9uYXJ5IjoiIiwiQWRkaXRpb25hbFByb3BlcnR5IjoiIiwiRGlzcGxheUNTU0NsYXNzTmFtZSI6IiIsIklzUHJldmlld0NvbHVtbiI6dHJ1ZSwiSXNTeXN0ZW1Db2x1bW4iOmZhbHNlLCJQcmV2aWV3Q29sdW1uV2lkdGgiOjAsIklzQ2hlY2tEdXBsaWNhdGVkIjpudWxsLCJUb2dldGhlckNoZWNrRHVwbGljYXRlZENvbHVtbkxpc3QiOiIiLCJDdXN0b21pemVkVmFsaWRhdGUiOiIiLCJIdG1sIjoiIiwiTWluTGVuZ3RoIjoiIiwiTWF4TGVuZ3RoIjoiIiwiUHJlZml4SFRNTCI6IiIsIkV4dHJhUHJlZml4SFRNTCI6IiIsIkV4dHJhU3VmZml4SFRNTCI6IiIsIklzTm90U3VtbWFyeUZpZWxkIjpudWxsLCJJc0FjY3VyYXRlVG9NaW51dGUiOmZhbHNlLCJPcmRlck51bWJlciI6MTAxNSwiSXNIaWRkZW4iOm51bGwsIkRpc3BsYXlBc0ltYWdlcyI6bnVsbCwiRm9ybHVtYSI6IiIsIklzUGxhaW5UZXh0IjpudWxsLCJHZXRNb2JpbGVQaG90b01vZGUiOiIiLCJTaG93QWRkTWludXNJY29uIjpudWxsLCJBZGRNaW51c0ludGVydmFsIjpudWxsLCJJc0dyaWRIaWRkZW4iOm51bGwsIklzRXF1YWxTZWFyY2giOm51bGx9LHsiSUQiOjk0MzIwLCJGb3JtS2V5IjoiQ1JNLuWunua1i+WunumHj+ajgOafpemhuS4xIiwiRGF0YUJhc2VUYWJsZU5hbWUiOiLlrp7mtYvlrp7ph4/mo4Dmn6XpobkiLCJDb2x1bW5OYW1lIjoi57G75YirIiwiQ29sdW1uTmFtZUNOIjoi57G75YirIiwiQ29sdW1uTGFiZWwiOiLnsbvliKsiLCJDb2x1bW5PYmplY3RUeXBlIjoiUmFkaW9Hcm91cCIsIkRhdGFUeXBlIjoiTlZBUkNIQVIiLCJEYXRhTGVuZ3RoIjoiNTAiLCJPYmplY3RJRCI6Iuexu+WIqyIsIkNTU0NsYXNzTmFtZSI6IiIsIkRlZmF1bHRWYWx1ZSI6IiIsIklzTm90QWxsb3dOdWxsVmFsdWVGaWVsZCI6dHJ1ZSwiTnVsbFZhbHVlQWxlcnRUZXh0IjoiIiwiSXNSZXN0cmljdE1vZGUiOmZhbHNlLCJPcHRpb25UZXh0IjoiIiwiVG9vZ2xlVGV4dCI6IiIsIkRpY3Rpb25hcnlLZXkiOiLlrp7mtYvlrp7ph4/mo4Dmn6XpobnliIbnsbsiLCJBZGRpdGlvbmFsTXNnIjoiIiwiQWRkaXRpb25hbE1zZ0ZvclZhbHVlIjoiIiwiQWRkaXRpb25hbE1zZ0xheW91dCI6InRhYmxlICAgICAiLCJJc1JlYWRPbmx5IjpmYWxzZSwiSXNEaXNhYmxlIjpmYWxzZSwiVmFsaWRhdGVPbkJsdXIiOnRydWUsIklzU2VhcmNoYWJsZSI6dHJ1ZSwiSXNTb3J0YWJsZSI6dHJ1ZSwiQ29tYm9Cb3hNdWx0aVNlbGVjdCI6ZmFsc2UsIkNvbWJvQm94RWRpdGFibGUiOmZhbHNlLCJSYWRpb0F1dG9TZWxlY3RGaXJzdE9uZSI6ZmFsc2UsIkNoZWNrQm94TmVlZENoZWNrQWxsRnVuY3Rpb24iOmZhbHNlLCJNaW5WYWx1ZSI6IiIsIk1heFZhbHVlIjoiIiwiV2lkdGgiOjAsIkhlaWdodCI6MCwiSXNBbGxvd1VwbG9hZE11bHRpRmlsZSI6dHJ1ZSwiSXNTZXJpYWxpemVUb0JpbmFyeSI6ZmFsc2UsIk5lZWRSZXNldEJ1dHRvbiI6ZmFsc2UsIkFsbG93RmlsZUV4dGVuc2lvbkxpc3QiOiIqIiwiSW5pdGlhdGVVcGxvYWRGb3JtTnVtYmVyIjoxLCJGaWxlU2F2ZUZvbGRlciI6bnVsbCwiRGF0YVNvdXJlRGljdGlvbmFyeSI6IiIsIkFkZGl0aW9uYWxQcm9wZXJ0eSI6IiIsIkRpc3BsYXlDU1NDbGFzc05hbWUiOiIiLCJJc1ByZXZpZXdDb2x1bW4iOnRydWUsIklzU3lzdGVtQ29sdW1uIjpmYWxzZSwiUHJldmlld0NvbHVtbldpZHRoIjpudWxsLCJJc0NoZWNrRHVwbGljYXRlZCI6ZmFsc2UsIlRvZ2V0aGVyQ2hlY2tEdXBsaWNhdGVkQ29sdW1uTGlzdCI6IiIsIkN1c3RvbWl6ZWRWYWxpZGF0ZSI6IiIsIkh0bWwiOiIiLCJNaW5MZW5ndGgiOiIiLCJNYXhMZW5ndGgiOiIiLCJQcmVmaXhIVE1MIjoiIiwiRXh0cmFQcmVmaXhIVE1MIjoiIiwiRXh0cmFTdWZmaXhIVE1MIjoiIiwiSXNOb3RTdW1tYXJ5RmllbGQiOmZhbHNlLCJJc0FjY3VyYXRlVG9NaW51dGUiOmZhbHNlLCJPcmRlck51bWJlciI6MTAwLCJJc0hpZGRlbiI6ZmFsc2UsIkRpc3BsYXlBc0ltYWdlcyI6ZmFsc2UsIkZvcmx1bWEiOiIiLCJJc1BsYWluVGV4dCI6ZmFsc2UsIkdldE1vYmlsZVBob3RvTW9kZSI6IiIsIlNob3dBZGRNaW51c0ljb24iOmZhbHNlLCJBZGRNaW51c0ludGVydmFsIjoxLjAwLCJJc0dyaWRIaWRkZW4iOmZhbHNlLCJJc0VxdWFsU2VhcmNoIjpmYWxzZX1d
 

 

4、创建标点的界面,以下用统计功能的GRID界面来示例:

参考代码,一定要引用标点的JS及CSS,相关文件目录为:ImagePointMaker
select 
巡检任务编号,项目编号,巡检项目,计划巡检日期,所属运营中心,项目群,巡检类型,
巡检组员=stuff((select ','+巡检组员 from 巡检任务 where 巡检任务编号=t9.巡检任务编号 for xml path('')),1,1,''),
硬景是否已描点=(case when 硬景是否已描点 IS NOT NULL and 硬景是否已描点='是' then '<div class="Center"><span class="mui-icon mui-icon-checkbox-filled" style="color:#11c26d; font-size:30px;"></span></div>' else '<div class="Center"><span class="mui-icon mui-icon-checkbox HandCursor" style="color:#e4eaec; font-size:30px;" onclick="UpdateTaskMakePointStatus('''+巡检任务编号+''',''硬景是否已描点'',''是'')"></span></div>' end),
软景是否已描点=(case when 软景是否已描点 IS NOT NULL and 软景是否已描点='是' then '<div class="Center"><span class="mui-icon mui-icon-checkbox-filled" style="color:#11c26d; font-size:30px;"></span></div>' else '<div class="Center"><span class="mui-icon mui-icon-checkbox HandCursor" style="color:#e4eaec; font-size:30px;" onclick="UpdateTaskMakePointStatus('''+巡检任务编号+''',''软景是否已描点'',''是'')"></span></div>' end),
硬景实测实量描点='<div class="Center"><button class="btn btn-primary btn-outline" style="padding-left:6px; padding-right:6px; font-size:12px; height:26px;line-height:26px;" onclick="HuaYuanImagePointMakerClass.Initiate('''+巡检任务编号+''',''硬景实测实量'', true)">硬景描点</button></div>',
软景实测实量描点='<div class="Center"><button class="btn btn-primary btn-outline" style="padding-left:6px; padding-right:6px; font-size:12px; height:26px;line-height:26px;" onclick="HuaYuanImagePointMakerClass.Initiate('''+巡检任务编号+''',''软景实测实量'', true)">软景描点</button></div>'
from
(
select distinct 巡检任务编号,项目编号,巡检项目,计划巡检日期,所属运营中心,项目群,巡检类型,硬景是否已描点,软景是否已描点 from 巡检任务 where 巡检类型 in('月度评测','验收前评测','验收后评测') and 巡检组员 in(select Realname from EmployeeTable where <$PermissionStrWhere$>) and (硬景是否已描点 IS NULL OR 硬景是否已描点='否' OR 软景是否已描点 IS NULL OR 软景是否已描点='否') group by 巡检任务编号,项目编号,巡检项目,计划巡检日期,所属运营中心,项目群,巡检类型,硬景是否已描点,软景是否已描点
)t9
<style type="text/css">
	#MainContentDIVDataTableDIV .WorkFlowCSSTable { box-shadow: none; }
	.CommonTabContainer { border-bottom: 1px solid #eee; }
	.TagList { float: left; margin-top: 28px; margin-left: 10px; }
	.TagList span { padding: 5px 3px 5px 8px; cursor: pointer; border-radius: 5px; margin-right: 10px; border: 0px solid #33b5e5; color: #33b5e5; }
	.TagList span i { font-size: 14px; line-height: 14px; margin-left: 2px; }
</style>

    <!-- lhpMegaImgViewer plugin css -->
    <link rel="stylesheet" type="text/css" href="ImagePointMaker/ImagePointMaker.css" />

    <!-- jQuery easing plugin-->
    <script type="text/javascript" src="ImagePointMaker/jquery.easing.1.3.js"></script>
    <!-- jQuery mousewheel plugin-->
    <script type="text/javascript" src="ImagePointMaker/jquery.mousewheel.min.js"></script>
    <!-- jQuery hammer plugin-->
    <script type="text/javascript" src="ImagePointMaker/jquery.hammer-full.min.js"></script>
    <!-- lhpMegaImgViewer plugin -->
    <script type="text/javascript" src="ImagePointMaker/jquery.lhpMegaImgViewer.min.js"></script>
    <!-- swfobject -->
    <script type="text/javascript" src="ImagePointMaker/swfobject.js"></script>
    <!-- 华苑的描述类 -->
    <script type="text/javascript" src="script/HuaYuanImagePointMaker/HuaYuanImagePointMakerClass.js"></script>
    <style type="text/css">
        .wb-map { font-size: 40px; text-shadow: 1px 1px 6px #fff; }
        .lhp_miv_marker .label { text-align: center; font-size: 12px; font-weight: bold; border: 1px solid #fff; margin-top: 5px; background-color: #fff; border-radius: 10px; }
    </style>

<div class="panel panel-bordered CenterDIV Relative" style="margin-top: 10px; display: table; min-width: 100%;">
	<div class="panel-heading Relative">
		<h3 class="panel-title">待描点的巡检任务</h3>
	</div>

	<div style="padding: 0px 10px;">
		<div id="GridQuickFilterSummaryDIV" style="padding-bottom: 0px; margin-bottom: 0px !important;"></div>
		<$DataGrid$>
	</div>
    <script>
        function UpdateTaskMakePointStatus(巡检任务编号, ColumnName, Value)
        {
            if (confirm("请确认" + ColumnName.replace("是否已描点", "已完成描点") + "?"))
            {
                ShowLoadingStatusDIV(null, "正在提交...");
                LoadServiceClass.LoadServiceInterfaceByDLLSetting("华苑园林插件wyz.dll|标准项目插件.描点类|UpdateTaskMakePointStatus", "完成描点", false, "", "", { 巡检任务编号: 巡检任务编号, ColumnName: ColumnName, Value: Value }, function (返回值)
                {
                    HideLoadingStatusDIV();
                    PopupToastMessage("info", "提交成功");
                    RefreshGrid();
                }, Common_Error, { ActionName: "完成描点" });
            }
        }
    </script>

</div>

5、控制标注的源代码参考HuaYuanImagePointMakerClass.js:

var HuaYuanImagePointMakerClass =
    {
        //类型:硬景实测实量、软景实测实量
        Config: null,
        InitiateConfig: null,
        Initiate: function (巡检任务编号, 类别, IsAdminMode, IsDisplayHistoryPoint, position)
        {
            if (typeof (IsDisplayHistoryPoint) == "undefined")
            {
                IsDisplayHistoryPoint = false;
            }

            if (typeof (position) == "undefined")
            {
                position = null;
            }

            if (HuaYuanImagePointMakerClass.InitiateConfig == null)
            {
                HuaYuanImagePointMakerClass.InitiateConfig = { 巡检任务编号: 巡检任务编号, 类别: 类别, IsAdminMode: IsAdminMode, IsDisplayHistoryPoint: IsDisplayHistoryPoint };
            }
            else
            {
                HuaYuanImagePointMakerClass.InitiateConfig.巡检任务编号 = 巡检任务编号;
                HuaYuanImagePointMakerClass.InitiateConfig.类别 = 类别;
                HuaYuanImagePointMakerClass.InitiateConfig.IsAdminMode = IsAdminMode;
                HuaYuanImagePointMakerClass.InitiateConfig.IsDisplayHistoryPoint = IsDisplayHistoryPoint;
            }

            ShowLoadingStatusDIV(null, "正在加载...");
            LoadServiceClass.LoadServiceInterfaceByDLLSetting("华苑园林插件wyz.dll|标准项目插件.描点类|GetConfig", "加载配置", false, "", "", { 巡检任务编号: 巡检任务编号, 类别: 类别 }, function (返回值)
            {
                HideLoadingStatusDIV();

                //获得配置
                HuaYuanImagePointMakerClass.Config = eval("(" + 返回值.Result + ")");

                //创建容器
                var html = "";
                html += "<div style='width:calc(100% - 320px);  overflow-y: auto;' id=\"ProjectMainInfoDIV\">";
                html += "<div style='padding:20px 0px 0px 20px;'>";
                html += "<h4 class=\"project-title Relative\" style=\"padding-left:10px; padding-top:5px; font-size:18px;\"><span class=\"wb-small-point\" style=\"margin-right:10px;\"></span>";
                html += 类别 + "描点 - " + HuaYuanImagePointMakerClass.Config.巡检任务.巡检项目 + " - " + 巡检任务编号;
                html += "<div style='position:absolute; right:70px; top:10px; font-size:12px; font-weight:normal;'>显示历史描点:</div>";
                html += "<div style='position:absolute; right:10px; top:5px;'><input type=\"checkbox\" name=\"IsDisplayHistoryPoint\" id='IsDisplayHistoryPoint' value=\"1\" class='IsDisplayHistoryPoint' " + (IsDisplayHistoryPoint ? "checked='checked'" : "") + " /></div>";
                html += "</h4>";
                html += "<div id=\"ImagePointMakerMapDiv\" style=\"width: 900px; height: 600px; margin-top:25px; overflow: hidden; border: solid 1px #ddd; background: #333; box-shadow: 0 5px 5px rgba(0, 0, 0, 0.1); border-radius: 5px; padding:5px;\" class=\"CenterDIV\"></div>";
                html += "<div id=\"MyHotspots\" style=\"display: none;\"></div>";
                html += "</div>";
                html += "</div>";

                //右侧的区域
                html += "<div style=\"position:absolute; right:0px;top:0px;width: 300px; background-color: #fff; border-left: 1px solid #e4eaec; overflow-y: auto; box-shadow: -10px 0 20px 0 rgba(66, 66, 66, .2);\" id=\"测量点容器层\"><div id=\"测量点层\" style=\"height: 1500px;\"><div id=\"PointListDIV\" class=\"PointListDIV\" style=\"padding:20px; padding-top:10px;\">" + GetLoadingMsg("正在加载...") + "</div></div></div>";
                var size = Element.Size($("#PageRightContentSliderDIV"));
                if (size.width > 300)
                {
                    Element.SetHtml($("#PageRightContentSliderContentDIV"), html);
                }
                else
                {
                    PageRightContentSliderClass.Show(Element.Size($(".main-container-inner")).width, html, true, "#fff");
                    Element.SetStyle($("#PageRightContentSliderContentDIV"), "padding", "0px");
                }

                //显示历史描点
                InitiateSwitchCheckBox($('#IsDisplayHistoryPoint'), '是', '否', function ()
                {
                    //选中的回调
                    HuaYuanImagePointMakerClass.Initiate(巡检任务编号, 类别, IsAdminMode, true);
                },
                function ()
                {
                    //取消的回调
                    HuaYuanImagePointMakerClass.Initiate(巡检任务编号, 类别, IsAdminMode, false);
                });

                //显示检查项列表
                HuaYuanImagePointMakerClass.DisplayPointCategoryList();

                window.setTimeout(function ()
                {
                    //计算高度
                    var height = (Element.Size($(".main-container")).height - 5);
                    Element.SetStyle($("#测量点容器层"), "height", height + "px");
                    ScrollBarClass.Initiate($("#测量点容器层"));
                    $("#测量点容器层").scrollTop(0);
                    Element.SetStyle($("#ImagePointMakerMapDiv"), "height", (height - 100) + "px");

                    //加载描点列表
                    HuaYuanImagePointMakerClass.LoadPointList(IsDisplayHistoryPoint, function ()
                    {
                        //调用地图
                        HuaYuanImagePointMakerClass.InitiateMap(类别 == "硬景实测实量" ? HuaYuanImagePointMakerClass.Config.园建图纸 : HuaYuanImagePointMakerClass.Config.绿化图纸, 类别 == "硬景实测实量" ? HuaYuanImagePointMakerClass.Config.园建图纸缩略图 : HuaYuanImagePointMakerClass.Config.绿化图纸缩略图, 类别, IsAdminMode, position);
                    });
                }, 1000);
            }, Common_Error, { ActionName: "加载配置" });
        },
        Refresh: function ()
        {
            HuaYuanImagePointMakerClass.InitiateConfig["CheckAllPointCategory"] = document.getElementById("CheckAllPointCategory").checked;
            HuaYuanImagePointMakerClass.InitiateConfig["PointCategoryList"] = GetCheckBoxValue("PointCategory").join(",");
            HuaYuanImagePointMakerClass.Initiate(HuaYuanImagePointMakerClass.InitiateConfig.巡检任务编号, HuaYuanImagePointMakerClass.InitiateConfig.类别, HuaYuanImagePointMakerClass.InitiateConfig.IsAdminMode, HuaYuanImagePointMakerClass.InitiateConfig.IsDisplayHistoryPoint, CurrentMapPosition);
        },
        InitiateMap: function (url, thumburl, 类别, IsAdminMode, position)
        {
            var settings = {
                'viewportWidth': '100%',
                'viewportHeight': '100%',
                'fitToViewportShortSide': true,
                'contentSizeOver100': false,
                'loadingBgColor': '#ffffff',
                'startScale': .5,
                'startX': position == null ? 0 : position.x,
                'startY': position == null ? 0 : position.y,
                'animTime': 500,
                'draggInertia': 10,
                'zoomLevel': 1,
                'zoomStep': 0.1,
                'contentUrl': url,
                'intNavEnable': true,
                'intNavPos': 'B',
                'intNavAutoHide': false,
                'intNavMoveDownBtt': true,
                'intNavMoveUpBtt': true,
                'intNavMoveRightBtt': true,
                'intNavMoveLeftBtt': true,
                'intNavZoomBtt': true,
                'intNavUnzoomBtt': true,
                'intNavFitToViewportBtt': true,
                'intNavFullSizeBtt': true,
                'intNavBttSizeRation': 1,
                'mapEnable': true,
                'mapThumb': thumburl,
                'mapPos': 'BL',
                'popupShowAction': 'click',
                'testMode': true
            };

            $('#ImagePointMakerMapDiv').lhpMegaImgViewer(settings, 'MyHotspots');

            $("#ImagePointMakerMapDiv").resizable({
                resize: function (event, ui)
                {
                    $('#resizeIco').hide();
                    $(this).lhpMegaImgViewer('adaptsToContainer');
                }
            });

            if (IsAdminMode)
            {
                //绑定双击事件
                $("#ImagePointMakerMapDiv").dblclick(function ()
                {
                    HuaYuanImagePointMakerClass.LoadAddNewPage(类别, CurrentMapPosition.x + 20, CurrentMapPosition.y + 15);
                });
            }
        },
        DisplayPointCategoryList: function ()
        {
            var html = "";
            var list = eval("(" + HuaYuanImagePointMakerClass.Config.实测实量检查项 + ")");
            html += "<div style=\"padding:0px; font-size:13px; font-weight:bold; padding-left:10px; background-color:#3e8ef7; color:#fff; border-radius:5px; margin-top:25px; margin-bottom:5px; padding-right:5px;\" ><div class='FloatLeft' style='margin-top:10px;'><span class=\"wb-map\" style=\"margin-right:5px; font-size:14px;\"></span>描点总数:<span id='检查项总数量'></span></div>    <div class='FloatRight'><div class=\"checkbox-custom checkbox-default\"><input type=\"checkbox\" id=\"CheckAllPointCategory\" name=\"CheckAllPointCategory\" " + (!HuaYuanImagePointMakerClass.InitiateConfig.hasOwnProperty("CheckAllPointCategory") || HuaYuanImagePointMakerClass.InitiateConfig.CheckAllPointCategory ? "checked='checked'" : "") + " autocomplete=\"off\" onclick=\"this.checked?CheckAll('PointCategory'):UnCheckAll('PointCategory'); HuaYuanImagePointMakerClass.Refresh();\" /><label for=\"CheckAllPointCategory\"> </label></div></div>   <div class='ClearFloat'></div></div>";
            list.foreach(function (item, index)
            {
                var CategoryKey = item.检查项[0];
                html += "<div style=\"padding:0px; font-size:12px; font-weight:bold; padding-left:10px; padding-bottom:0px; color:#999; padding-right:5px;\" class='Relative'><div class='FloatLeft' style='margin-top:15px;'><span class=\"wb-small-point\" style=\"margin-right:5px; color:" + item.描点颜色 + ";\"></span>" + item.检查项 + "<span id='检查项数量" + CategoryKey + "'></span></div>   <div class='FloatRight'><div class=\"checkbox-custom checkbox-default\"><input type=\"checkbox\" class=\"PointCategory\" id=\"PointCategory" + CategoryKey + "\" name=\"PointCategory\" " + (!HuaYuanImagePointMakerClass.InitiateConfig.hasOwnProperty("PointCategoryList") || Array.contains(HuaYuanImagePointMakerClass.InitiateConfig.PointCategoryList, item.检查项) ? "checked='checked'" : "") + " value=\"" + item.检查项 + "\" autocomplete=\"off\" onclick=\"HuaYuanImagePointMakerClass.Refresh()\" /><label for=\"PointCategory" + CategoryKey + "\"> </label></div></div>  <div class='ClearFloat'></div></div>";
            });
            Element.SetHtml($("#PointListDIV"), html);
        },
        LoadAddNewPage: function (类别, x, y)
        {
            var list = eval("(" + HuaYuanImagePointMakerClass.Config.实测实量检查项 + ")");
            var html = "";
            html += "<table class='FixedTable FullWidth TableCSSClassPadding5'>";
            html += "<tr>";
            html += "<td style='width:90px;'>检查项:</td>";
            html += "<td>";
            html += "<select id='描点检查项' class='form-control'>";
            list.foreach(function (item, index)
            {
                var CategoryKey = item.检查项[0];
                html += "<option value=\"" + item.检查项 + "\">" + item.检查项 + "</option>";
            });
            html += "</select>";
            html += "</td>";
            html += "</tr>";

            html += "<tr>";
            html += "<td>备注:</td>";
            html += "<td><input type='text' class='form-control' id='描点备注'></td>";
            html += "</tr>";

            html += "</table>";

            PopupDialogModelWindow();
            PopupDialogModelWindowSetTitle("新建检查点");
            PopupDialogModelWindowSetContent("<div id='AddNewPointPageDIV' class='Padding10' style='padding-top:0px;'>" + html + "</div> <div class='Padding10' style='margin-top:20px;'><button type=\"button\" class=\"btn btn-primary\" onclick=\"HuaYuanImagePointMakerClass.AddNewPoint('" + 类别 + "','" + x + "','" + y + "')\" style='margin-right:5px;'>确定</button><button type=\"button\" class=\"btn btn-outline btn-default\" onclick='ClosePopupDialogModelWindow()'>取消</button></div>");
        },
        AddNewPoint: function (类别, x, y)
        {
            var dic = {};
            dic["巡检任务编号"] = HuaYuanImagePointMakerClass.Config.巡检任务.巡检任务编号;
            dic["类别"] = 类别;
            dic["x"] = x;
            dic["y"] = y;
            dic["检查项"] = Element.GetValue($("#描点检查项"));
            dic["备注"] = Element.GetValue($("#描点备注")).replace(/'/ig, "");

            ShowLoadingStatusDIV(null, "正在保存...");
            LoadServiceClass.LoadServiceInterfaceByDLLSetting("华苑园林插件wyz.dll|标准项目插件.描点类|AddNewPoint", "新建测量点", false, "", "", { dic: JSON.encode(dic) }, function (返回值)
            {
                ClosePopupDialogModelWindow();
                HideLoadingStatusDIV();
                PopupToastMessage("info", "新建测量点成功");
                HuaYuanImagePointMakerClass.Refresh();
            }, Common_Error, { ActionName: "新建测量点" });
        },
        LoadEditPage: function (测量点编号, 检查项, 备注)
        {
            var list = eval("(" + HuaYuanImagePointMakerClass.Config.实测实量检查项 + ")");
            var html = "";
            html += "<table class='FixedTable FullWidth TableCSSClassPadding5'>";

            html += "<tr>";
            html += "<td style='width:90px;'>测量点编号:</td>";
            html += "<td>" + 测量点编号 + "</td>";
            html += "</tr>";

            html += "<tr>";
            html += "<td>检查项:</td>";
            html += "<td>";
            html += "<select id='描点检查项' class='form-control'>";
            list.foreach(function (item, index)
            {
                var CategoryKey = item.检查项[0];
                html += "<option value=\"" + item.检查项 + "\" " + (检查项 == item.检查项 ? "selected='selected'" : "") + ">" + item.检查项 + "</option>";
            });
            html += "</select>";
            html += "</td>";
            html += "</tr>";

            html += "<tr>";
            html += "<td>备注:</td>";
            html += "<td><input type='text' class='form-control' id='描点备注' value=\"" + 备注 + "\"></td>";
            html += "</tr>";

            html += "</table>";

            PopupDialogModelWindow();
            PopupDialogModelWindowSetTitle("编辑检查点");
            PopupDialogModelWindowSetContent("<div id='EditPointPageDIV' class='Padding10' style='padding-top:0px;'>" + html + "</div> <div class='Padding10' style='margin-top:20px;'><button type=\"button\" class=\"btn btn-primary\" onclick=\"HuaYuanImagePointMakerClass.EditPoint('" + 测量点编号 + "')\" style='margin-right:5px;'>确定</button><button type=\"button\" class=\"btn btn-outline btn-default\" onclick='ClosePopupDialogModelWindow()'>取消</button></div>");
        },
        EditPoint: function (测量点编号)
        {
            var dic = {};
            var 检查项 = Element.GetValue($("#描点检查项"));
            var 备注 = Element.GetValue($("#描点备注")).replace(/'/ig, "");

            ShowLoadingStatusDIV(null, "正在保存...");
            LoadServiceClass.LoadServiceInterfaceByDLLSetting("华苑园林插件wyz.dll|标准项目插件.描点类|EditPoint", "新建测量点", false, "", "", { 测量点编号: 测量点编号, 检查项: 检查项, 备注: 备注 }, function (返回值)
            {
                ClosePopupDialogModelWindow();
                HideLoadingStatusDIV();
                PopupToastMessage("info", "编辑测量点成功");
                HuaYuanImagePointMakerClass.Refresh();
            }, Common_Error, { ActionName: "编辑测量点" });
        },
        AjaxLoader: null,
        LoadPointList: function (IsDisplayHistoryPoint, SuccessCallBack)
        {
            if (HuaYuanImagePointMakerClass.AjaxLoader != null)
            {
                try
                {
                    HuaYuanImagePointMakerClass.AjaxLoader.abort();
                }
                catch (e)
                { }
            }

            var PointCategoryList = GetCheckBoxValue("PointCategory");
            HuaYuanImagePointMakerClass.AjaxLoader = LoadServiceClass.LoadServiceInterfaceByDLLSetting("华苑园林插件wyz.dll|标准项目插件.描点类|LoadPointList", "加载描点列表", false, "", "", { 巡检任务编号: HuaYuanImagePointMakerClass.Config.巡检任务.巡检任务编号, 类别: HuaYuanImagePointMakerClass.InitiateConfig.类别, PointCategoryList: PointCategoryList.join(","), IsDisplayHistoryPoint: IsDisplayHistoryPoint }, function (返回值)
            {
                var Config = eval("(" + 返回值.Result + ")");

                //更新检查项的数量
                var TotalValue = 0;
                for (var Key in Config.检查项数量统计)
                {
                    var value = Config.检查项数量统计[Key];
                    Element.SetHtml($("#检查项数量" + Key[0]), "(" + value + ")");
                    TotalValue += value;
                }
                Element.SetHtml($("#检查项总数量"), TotalValue);

                //显示测量点清单
                var 测量点清单 = eval("(" + Config.测量点清单 + ")");
                HuaYuanImagePointMakerClass.DisplayPointList(测量点清单, false);

                //显示历史测量点清单
                var 历史测量点清单 = eval("(" + Config.历史测量点清单 + ")");
                HuaYuanImagePointMakerClass.DisplayPointList(历史测量点清单, true);

                //回调
                SuccessCallBack();
            }, Common_Error, { ActionName: "加载描点列表" });
        },
        GetColor: function (检查项)
        {
            var color = "";
            var list = eval("(" + HuaYuanImagePointMakerClass.Config.实测实量检查项 + ")");
            list.foreach(function (item, index)
            {
                if (item.检查项 == 检查项)
                {
                    color = item.描点颜色;
                }
            });
            return color;
        },
        DisplayPointList: function (PointList, IsHistoryPoint)
        {
            var html = "";
            PointList.foreach(function (item, index)
            {
                var color = IsHistoryPoint ? "#fff" : HuaYuanImagePointMakerClass.GetColor(item.检查项);
                html += "<div class=\"lhp_miv_hotspot\" data-x=\"" + item.x + "\" data-y=\"" + item.y + "\" data-visible-scale=\"0.5\">";
                html += "<!-- marker -->";
                html += "<div class=\"lhp_miv_marker pos-BR\">";
                html += "<span class=\"wb-map\" style=\"color: " + color + ";" + (IsHistoryPoint ? "text-shadow:none !important;" : "") + "\"></span>";
                html += "<div class=\"label\" style=\"color: " + (IsHistoryPoint ? "#000" : color) + ";\">" + item.测量点编号.split("-").last() + "</div>";
                html += "</div>";
                html += "<!-- pop-up -->";
                html += "<div class=\"lhp_miv_popup pos-R\">";
                html += "<div class=\"content\" style=\"height: 180px; width: 120px;\">";
                html += "<div>" + item.测量点编号.split("-").last() + " - " + item.检查项 + "</div>";
                html += "<div style='margin-top:10px; color:#aaa;'>巡检任务编号:</div>";
                html += "<div>" + item.巡检任务编号 + "</div>";
                html += "<div style='margin-top:5px; color:#aaa;'>备注:</div>";
                html += "<div>" + (item.备注.length == 0 ? "无" : item.备注) + "</div>";
                if (!IsHistoryPoint)
                {
                    html += "<div style='margin-top:15px;text-align:center;'><a href=\"javascript:HuaYuanImagePointMakerClass.LoadEditPage('" + item.测量点编号 + "', '" + item.检查项 + "', '" + item.备注 + "')\">编辑</a>  <a href=\"javascript:HuaYuanImagePointMakerClass.DeletePoint('" + item.测量点编号 + "')\">删除</a></div>";
                }
                html += "</div>";
                html += "</div>";
                html += "</div>";
            });

            Element.AppendByElement($("#MyHotspots"), html);
        },
        DeletePoint: function (测量点编号)
        {
            if (confirm("请确认是否要删除此测量点(" + 测量点编号 + ")?"))
            {
                ShowLoadingStatusDIV(null, "正在删除...");
                LoadServiceClass.LoadServiceInterfaceByDLLSetting("华苑园林插件wyz.dll|标准项目插件.描点类|DeletePoint", "删除测量点", false, "", "", { 测量点编号: 测量点编号 }, function (返回值)
                {
                    $(".lhp_miv_popup_close").fireEvent("click");
                    HideLoadingStatusDIV();
                    PopupToastMessage("info", "删除测量点成功");
                    HuaYuanImagePointMakerClass.Refresh();
                }, Common_Error, { ActionName: "删除测量点" });
            }
        }
    };
 
6、控制标注的插件源代码参考《描点类》
 
//-----------------------------------------------------------------------
// <copyright file="描点类.cs" company="企管宝">
//  CustomizedWCFUI
// </copyright>
// <author>wyz</author>
// <createdate>2020-10-28</createdate>
// <revisionhistory>
// </revisionhistory>
//-----------------------------------------------------------------------
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Text;
using System.Data;
using PublicFunctions;
using PublicFunctions.Service;
using PublicFunctions.Button;
using PublicFunctions.Form;
using PublicFunctions.Grid;
using PublicFunctions.PageTemplate;

namespace 标准项目插件
{
    /// <summary>
    /// 描点类
    /// </summary>
    public class 描点类 : ServiceFactoryBase
    {
        #region 函数说明:构造函数
        /// <summary>
        /// 构造函数,必须保留
        /// </summary>
        /// <param name="ServiceData"></param>
        public 描点类(ServiceDataModel ServiceData)
            : base(ServiceData)
        { }
        #endregion

        #region 函数说明:GetConfig加载描点配置
        /// <summary>
        /// GetConfig加载描点配置
        /// </summary>
        /// <returns></returns>
        public AjaxResultModel GetConfig()
        {
            AjaxResultModel AjaxResultObject = new AjaxResultModel();
            string 巡检任务编号 = PublicFunctions.PublicFunctions.GetDataFromDictionary("巡检任务编号", ServiceData.RequestFormDictionary);
            string 类别 = PublicFunctions.PublicFunctions.GetDataFromDictionary("类别", ServiceData.RequestFormDictionary);
            if (Check.IsNull(巡检任务编号) || Check.IsNull(类别))
            {
                AjaxResultObject.ErrorMsg = "必要参数缺失";
            }
            else
            {
                using (PublicFunctions.DBHelper.RawDBHelper.SqlDataFactory context = new PublicFunctions.DBHelper.RawDBHelper.SqlDataFactory(PublicSetting.RawDBHelper_CRM_ConnectionStringKey))
                {
                    //巡检任务
                    Dictionary<string, string> 巡检任务 = context.GetCellRowDictionary("select * from 巡检任务 where 巡检任务编号='" + 巡检任务编号 + "'");
                    if (巡检任务 == null || 巡检任务.Count == 0)
                    {
                        AjaxResultObject.ErrorMsg = "巡检任务不存在";
                    }
                    else
                    {
                        //项目编号 
                        string 项目编号 = 巡检任务["项目编号"];

                        //实测实量检查项
                        string ErrorMsg = "";
                        DataTable 实测实量检查项 = new DataTable();
                        if (context.GetDataAll(ref 实测实量检查项, "select 检查项,描点颜色 from 实测实量检查项 where 类别='" + 类别 + "' order by 排序号 asc", ref ErrorMsg))
                        {
                            //还原数据
                            PublicFunctions.MyDataTableClass.RestoreDataTableStringData(ref 实测实量检查项);
                        }

                        //读取项目信息字典
                        Dictionary<string, string> 项目信息 = context.GetCellRowDictionary("select 园建图纸,绿化图纸,园建图纸缩略图,绿化图纸缩略图 from 项目信息 where 项目编号='" + 项目编号 + "'");
                        if (项目信息.Count == 0)
                        {
                            AjaxResultObject.ErrorMsg = "项目不存在【" + 项目编号 + "】";
                        }
                        else
                        {
                            //读取项目的园建图及绿化图
                            string 园建图纸 = PublicFunctions.PublicFunctions.GetDataFromDictionary("园建图纸", 项目信息);
                            if (!Check.IsNull(园建图纸))
                            {
                                园建图纸 = PublicFunctions.ReplaceRestorStr.RestoreHTMLTag(园建图纸);
                                Dictionary<string, string> FileDictionary = PublicFunctions.HtmlControl.HtmlControl.GetFileListFromUploadFileCompenentModeHTML(园建图纸);
                                园建图纸 = FileDictionary.Count > 0 ? FileDictionary.First().Key : "";
                            }

                            string 绿化图纸 = PublicFunctions.PublicFunctions.GetDataFromDictionary("绿化图纸", 项目信息);
                            if (!Check.IsNull(绿化图纸))
                            {
                                绿化图纸 = PublicFunctions.ReplaceRestorStr.RestoreHTMLTag(绿化图纸);
                                Dictionary<string, string> FileDictionary = PublicFunctions.HtmlControl.HtmlControl.GetFileListFromUploadFileCompenentModeHTML(绿化图纸);
                                绿化图纸 = FileDictionary.Count > 0 ? FileDictionary.First().Key : "";
                            }

                            AjaxResultObject.IsSuccess = true;
                            AjaxResultObject.Result = Serializer.SerializeJSON(new { 巡检任务 = 巡检任务, 实测实量检查项 = JSONClass.DataTableToJSON(实测实量检查项), 园建图纸 = 园建图纸, 绿化图纸 = 绿化图纸, 园建图纸缩略图 = PublicFunctions.PublicFunctions.GetDataFromDictionary("园建图纸缩略图", 项目信息), 绿化图纸缩略图 = PublicFunctions.PublicFunctions.GetDataFromDictionary("绿化图纸缩略图", 项目信息) });
                        }

                        if (实测实量检查项 != null)
                        {
                            实测实量检查项.Dispose();
                            实测实量检查项 = null;
                        }
                    }
                }
            }
            return AjaxResultObject;
        }
        #endregion

        #region 函数说明:AddNewPoint新建测量点
        /// <summary>
        /// AddNewPoint新建测量点
        /// </summary>
        /// <returns></returns>
        public AjaxResultModel AddNewPoint()
        {
            AjaxResultModel AjaxResultObject = new AjaxResultModel();
            string json = PublicFunctions.PublicFunctions.GetDataFromDictionary("dic", ServiceData.RequestFormDictionary);
            if (Check.IsNull(json))
            {
                AjaxResultObject.ErrorMsg = "必要参数缺失";
            }
            else
            {
                string ErrorMsg;
                Dictionary<string, string> dic = Serializer.DeSerializeJSON<Dictionary<string, string>>(json, out ErrorMsg);
                if (dic == null)
                {
                    AjaxResultObject.ErrorMsg = ErrorMsg;
                }
                else
                {
                    using (PublicFunctions.DBHelper.RawDBHelper.SqlDataFactory context = new PublicFunctions.DBHelper.RawDBHelper.SqlDataFactory(PublicSetting.RawDBHelper_CRM_ConnectionStringKey))
                    {
                        AddNewPointCore(context, ref AjaxResultObject, dic);
                    }
                }
            }
            return AjaxResultObject;
        }

        /// <summary>
        /// AddNewPoint新建测量点(核心)
        /// </summary>
        /// <param name="context"></param>
        /// <param name="AjaxResultObject"></param>
        /// <param name="dic"></param>
        public void AddNewPointCore(PublicFunctions.DBHelper.RawDBHelper.SqlDataFactory context, ref AjaxResultModel AjaxResultObject, Dictionary<string, string> dic)
        {
            string 巡检任务编号 = dic["巡检任务编号"];
            string 检查项 = dic["检查项"];

            #region 代码块说明:自动计算排序号
            List<int> 排序号列表 = context.GetDistinctDataList<int>("排序号", "select 排序号 from 测量点清单 where 巡检任务编号='" + 巡检任务编号 + "' and 检查项='" + 检查项 + "' order by 排序号 asc");
            int 排序号 = 1;
            if (排序号列表.Count > 0)
            {
                //首先判断《排序号列表》有没有因为删除描点引起的断号产生,如果有则用现在的断号
                bool 是否使用断号 = false;
                int MaxValue = 排序号列表.Max();
                for (int i = 1; i < MaxValue; i++)
                {
                    if (!排序号列表.Contains(i))
                    {
                        排序号 = i;
                        是否使用断号 = true;
                        break;
                    }
                }

                if (!是否使用断号)
                {
                    排序号 = MaxValue + 1;
                }
            }
            dic["排序号"] = 排序号.ToString();
            dic["测量点编号"] = 巡检任务编号 + "-" + 检查项[0] + 排序号.ToString();
            #endregion

            dic["UserGuid"] = ServiceData.UserInfo.UserGuid;
            dic["UpdateUserGuid"] = ServiceData.UserInfo.UserGuid;
            dic["AddDate"] = DateTime.Now.ToString();
            dic["UpdateDate"] = DateTime.Now.ToString();
            string sql;
            AjaxResultObject.IsSuccess = context.InsertDataReturnIDDebug("测量点清单", dic, out sql) > 0;
            if (!AjaxResultObject.IsSuccess)
            {
                AjaxResultObject.ErrorMsg = sql;
            }
        }
        #endregion

        #region 函数说明:LoadPointList加载测量点列表
        /// <summary>
        /// LoadPointList加载测量点列表
        /// </summary>
        /// <returns></returns>
        public AjaxResultModel LoadPointList()
        {
            AjaxResultModel AjaxResultObject = new AjaxResultModel();
            string 类别 = PublicFunctions.PublicFunctions.GetDataFromDictionary("类别", ServiceData.RequestFormDictionary);
            string 巡检任务编号 = PublicFunctions.PublicFunctions.GetDataFromDictionary("巡检任务编号", ServiceData.RequestFormDictionary);
            string PointCategoryList = PublicFunctions.PublicFunctions.GetDataFromDictionary("PointCategoryList", ServiceData.RequestFormDictionary);
            bool IsDisplayHistoryPoint = ConvertData.ConvertToBool(PublicFunctions.PublicFunctions.GetDataFromDictionary("IsDisplayHistoryPoint", ServiceData.RequestFormDictionary));
            if (Check.IsNull(巡检任务编号) || Check.IsNull(类别))
            {
                AjaxResultObject.ErrorMsg = "必要参数缺失";
            }
            else
            {
                string ErrorMsg = "";
                using (PublicFunctions.DBHelper.RawDBHelper.SqlDataFactory context = new PublicFunctions.DBHelper.RawDBHelper.SqlDataFactory(PublicSetting.RawDBHelper_CRM_ConnectionStringKey))
                {
                    #region 代码块说明:统计各检查项的数量
                    Dictionary<string, int> 检查项数量统计 = context.GetDictionary<string, int>("检查项", "数量", "select 检查项,数量=count(1) from 测量点清单 where 巡检任务编号='" + 巡检任务编号 + "' and 类别='" + 类别 + "' group by 检查项");
                    #endregion

                    #region 代码块说明:加载当前《巡检任务编号》的《测量点清单》
                    DataTable 测量点清单 = new DataTable();
                    if (context.GetDataAll(ref 测量点清单, "select 测量点编号,巡检任务编号,类别,检查项,备注,x,y from 测量点清单 where 巡检任务编号='" + 巡检任务编号 + "' and 检查项 in(" + ConvertData.ConvertStringToSqlString(PointCategoryList) + ")", ref ErrorMsg))
                    {
                        PublicFunctions.MyDataTableClass.RestoreDataTableStringData(ref 测量点清单);
                    }
                    #endregion

                    #region 代码块说明:加载当前《巡检任务编号》的《历史测量点清单》
                    DataTable 历史测量点清单 = new DataTable();
                    if (IsDisplayHistoryPoint)
                    {
                        Dictionary<string, string> 巡检任务 = context.GetCellRowDictionary("select ID,项目编号 from 巡检任务 where 巡检任务编号='" + 巡检任务编号 + "'");
                        string 项目编号 = PublicFunctions.PublicFunctions.GetDataFromDictionary("项目编号", 巡检任务);
                        string 巡检任务ID = PublicFunctions.PublicFunctions.GetDataFromDictionary("ID", 巡检任务);
                        if (context.GetDataAll(ref 历史测量点清单, "select 测量点编号,巡检任务编号,类别,检查项,备注,x,y from 测量点清单 where 巡检任务编号!='" + 巡检任务编号 + "' and 巡检任务编号 in(select 巡检任务编号 from 巡检任务 where 项目编号='" + 项目编号 + "') and 检查项 in(" + ConvertData.ConvertStringToSqlString(PointCategoryList) + ")", ref ErrorMsg))
                        {
                            PublicFunctions.MyDataTableClass.RestoreDataTableStringData(ref 历史测量点清单);
                        }
                    }
                    #endregion

                    AjaxResultObject.IsSuccess = true;
                    AjaxResultObject.Result = Serializer.SerializeJSON(new { 检查项数量统计 = 检查项数量统计, 测量点清单 = JSONClass.DataTableToJSON(测量点清单), 历史测量点清单 = JSONClass.DataTableToJSON(历史测量点清单) });
                    测量点清单.Dispose();
                    测量点清单 = null;
                    历史测量点清单.Dispose();
                    历史测量点清单 = null;
                }
            }
            return AjaxResultObject;
        }
        #endregion

        #region 函数说明:DeletePoint删除测量点
        /// <summary>
        /// DeletePoint删除测量点
        /// </summary>
        /// <returns></returns>
        public AjaxResultModel DeletePoint()
        {
            AjaxResultModel AjaxResultObject = new AjaxResultModel();
            string 测量点编号 = PublicFunctions.PublicFunctions.GetDataFromDictionary("测量点编号", ServiceData.RequestFormDictionary);
            if (Check.IsNull(测量点编号))
            {
                AjaxResultObject.ErrorMsg = "必要参数缺失";
            }
            else
            {
                using (PublicFunctions.DBHelper.RawDBHelper.SqlDataFactory context = new PublicFunctions.DBHelper.RawDBHelper.SqlDataFactory(PublicSetting.RawDBHelper_CRM_ConnectionStringKey))
                {
                    DeletePointCore(context, ref AjaxResultObject, 测量点编号);
                }
            }
            return AjaxResultObject;
        }

        /// <summary>
        /// DeletePointCore删除测量点(核心)
        /// </summary>
        /// <param name="context"></param>
        /// <param name="AjaxResultObject"></param>
        /// <param name="测量点编号"></param>
        public void DeletePointCore(PublicFunctions.DBHelper.RawDBHelper.SqlDataFactory context, ref AjaxResultModel AjaxResultObject, string 测量点编号)
        {
            AjaxResultObject.IsSuccess = context.ExecuteSQLBool("delete from 测量点清单 where 测量点编号='" + 测量点编号 + "'");
        }
        #endregion

        #region 函数说明:EditPoint编辑测量点
        /// <summary>
        /// EditPoint编辑测量点
        /// </summary>
        /// <returns></returns>
        public AjaxResultModel EditPoint()
        {
            AjaxResultModel AjaxResultObject = new AjaxResultModel();
            string 测量点编号 = PublicFunctions.PublicFunctions.GetDataFromDictionary("测量点编号", ServiceData.RequestFormDictionary);
            string 检查项 = PublicFunctions.PublicFunctions.GetDataFromDictionary("检查项", ServiceData.RequestFormDictionary);
            string 备注 = PublicFunctions.PublicFunctions.GetDataFromDictionary("备注", ServiceData.RequestFormDictionary);
            if (Check.IsNull(测量点编号))
            {
                AjaxResultObject.ErrorMsg = "必要参数缺失";
            }
            else
            {
                using (PublicFunctions.DBHelper.RawDBHelper.SqlDataFactory context = new PublicFunctions.DBHelper.RawDBHelper.SqlDataFactory(PublicSetting.RawDBHelper_CRM_ConnectionStringKey))
                {
                    Dictionary<string, string> dic = context.GetCellRowDictionary("select 巡检任务编号,类别,x,y from 测量点清单 where 测量点编号='" + 测量点编号 + "'");

                    //删除测量点
                    DeletePointCore(context, ref AjaxResultObject, 测量点编号);

                    if (AjaxResultObject.IsSuccess)
                    {
                        //新建测量点
                        dic["检查项"] = 检查项;
                        dic["备注"] = 备注;
                        AddNewPointCore(context, ref AjaxResultObject, dic);
                    }
                }
            }
            return AjaxResultObject;
        }
        #endregion

        #region 函数说明:UpdateTaskMakePointStatus更新描点是否完成的状态
        /// <summary>
        /// UpdateTaskMakePointStatus更新描点是否完成的状态
        /// </summary>
        /// <returns></returns>
        public AjaxResultModel UpdateTaskMakePointStatus()
        {
            AjaxResultModel AjaxResultObject = new AjaxResultModel();
            string 巡检任务编号 = PublicFunctions.PublicFunctions.GetDataFromDictionary("巡检任务编号", ServiceData.RequestFormDictionary);
            string ColumnName = PublicFunctions.PublicFunctions.GetDataFromDictionary("ColumnName", ServiceData.RequestFormDictionary);
            string Value = PublicFunctions.PublicFunctions.GetDataFromDictionary("Value", ServiceData.RequestFormDictionary);
            if (Check.IsNull(巡检任务编号) || Check.IsNull(ColumnName) || Check.IsNull(Value))
            {
                AjaxResultObject.ErrorMsg = "必要参数缺失";
            }
            else
            {
                using (PublicFunctions.DBHelper.RawDBHelper.SqlDataFactory context = new PublicFunctions.DBHelper.RawDBHelper.SqlDataFactory(PublicSetting.RawDBHelper_CRM_ConnectionStringKey))
                {
                    AjaxResultObject.IsSuccess = context.ExecuteSQLBool("update 巡检任务 set " + ColumnName + "='" + Value + "' where 巡检任务编号='" + 巡检任务编号 + "'");
                }
            }
            return AjaxResultObject;
        }
        #endregion
    }
}
 
7、所调用的插件官网