看了这个文件这是一个非常完整的D365 二次开发框架基于 jQuery 和 Xrm 对象构建。我帮你梳理一下整体结构 整体架构1.依赖引入第1-1340行├── jQuery 3.2.0压缩版 ├── String 原型扩展format、startWith、endWith、contains └── 框架主代码2.核心命名空间第1342-1350行varRekTec{};// 全局命名空间这是整个框架的根对象所有功能都挂载在这个命名空间下。3.模块化组织按功能分类A. 基础工具模块(1352-1735行)RekTec.common{// 类型判断isNull,isNullOrWhiteSpace,isString,isNumber,isBoolean,// GUID 操作newGuid,isSameGuid,// 字符串处理trim,formatDate,formatDecimal,// URL 操作getUrlParam,getWebResourceParam,// 环境判断isUCI,isOnPremises,isOnMobile,isDev,// UI 辅助showWindow,showFullWindow,showLargeWindow,showSmallWindow,// 其他downloadFile,refresh,refreshParentPage,base64ToBlob,layerLoading}B. Ajax 请求模块(1737-1848行)RekTec.ajax{getXHR,// 获取 XMLHttpRequest 对象getResponse,// GET 同步请求postResponse,// POST 同步请求getAsync,// GET 异步请求PromisepostAsync,// POST 异步请求// ... 其他 HTTP 方法}C. CRM 表单操作模块(1850-2022行)RekTec.crmForm{disableAll,// 禁用所有控件disableField,// 禁用指定字段clearField,// 清空字段值forceSubmitAll,// 强制提交所有字段buildLookup,// 构建查找字段对象getLookupId,// 获取查找字段的 IDgetEntityId,// 获取实体 IDgetFormType,// 获取表单类型新建/编辑/只读// ... 更多表单操作方法}D. CRM 数据访问模块(2024-2440行)RekTec.crmData{getClientUrl,// 获取组织 URLgetWebAPIUrl,// 获取 WebAPI 地址getFieldValue,// 获取字段值同步getFieldValueAsync,// 获取字段值异步getParameterValue,// 获取系统参数getUserId,// 获取当前用户 IDisCurrentUserHasRoles,// 判断用户角色getUserRoles,// 获取用户角色列表export2Excel,// 导出 Excel// ... 其他数据访问方法}E. WebAPI 操作模块(2619-2939行)RekTec.webApi{create,// 创建记录update,// 更新记录delete,// 删除记录fetch,// 执行 FetchXML 查询fetchAsync,// 异步 FetchXMLinvokeAction,// 调用 ActioninvokeActionAsync,// 异步调用 ActioninvokeHiddenApi,// 调用隐藏 API核心方法invokeHiddenApiAsync,// 异步调用隐藏 API// ... 更多 WebAPI 方法}F. 流程审批模块(2941-3223行)RekTec.flow{flowSubmit,// 提交审批flowRecall,// 撤回审批flowAgree,// 审核通过flowReject,// 审核驳回flowCommunicate,// 审批沟通flowTransfer,// 审批转办flowUrge,// 催办// ... 其他流程方法}G. 元数据访问模块(2506-2617行)RekTec.crmMetadata{retrieveEntityMetadataAsync,// 获取实体元数据retrieveAttributesMetadataAsync,// 获取属性元数据retrieveOptionsetAsync,// 获取选项集retrieveWorkflowAsync,// 获取工作流// ... 元数据查询方法}H. 导航 UI 模块(3290-3409行)RekTec.navigation{openAlertDialog,// 打开警告框openConfirmDialog,// 打开确认框openForm,// 打开实体表单openWebResource,// 打开 Web 资源openUrl,// 打开 URLnavigateTo// 导航到指定页面}I. Ribbon 按钮控制模块(2527-2585行)RekTec.ribbon{isRibbonEnabledAccordingToRules,// 根据规则判断按钮是否启用isRibbonEnabledAccordingToApprovalStatus,// 根据审核状态判断isFlowSubmitButtonEnabled,// 判断提交按钮是否可用// ... Ribbon 控制方法}4.jQuery 风格的选择器封装最后部分varrtcrmfunction(selector){// 实现了类似 jQuery 的 DOM 选择器return{val,// 获取/设置值text,// 获取文本req,// 设置必填show,// 显示hide,// 隐藏disabled,// 启用/禁用// ... 链式操作}}// 将所有 RekTec 模块扩展到 rtcrm 对象上jQuery.extend(rtcrm,RekTec.common);jQuery.extend(rtcrm,RekTec.crmForm);jQuery.extend(rtcrm,RekTec.webApi);// ... 其他模块5.多语言支持最后部分window.$tfunction(key,defaultValue){// 国际化翻译函数}window.LocalizedStrings{[USER_LCID]:getlanguagepack()// 加载语言包} 设计模式总结设计模式体现命名空间模式RekTec作为全局唯一命名空间模块化模式按功能拆分成common、crmForm、webApi等子模块外观模式rtcrm函数封装了复杂的 Xrm 操作提供简洁 API链式调用类似 jQuery 的链式操作rtcrm(#field).val().show()Promise 模式大量异步方法返回 Promise适配器模式适配不同版本的 D365UCI/经典界面 核心价值这个框架本质上是一个D365 开发的 SDK 封装它简化了 Xrm API 的调用如rtcrm(#field).val()代替Xrm.Page.getAttribute(field).getValue()提供了大量业务常用方法审批流、WebAPI、Excel导出等统一了异步处理Promise 封装兼容多版本UCI 和经典界面集成了多语言支持这就是为什么你在代码中可以直接使用rtcrm.getEntityId()、rtcrm.invokeHiddenApi()等方法而不需要显式引用的原因——整个框架已经将所有功能挂载到全局rtcrm对象上了。
瑞泰D365前端封装
看了这个文件这是一个非常完整的D365 二次开发框架基于 jQuery 和 Xrm 对象构建。我帮你梳理一下整体结构 整体架构1.依赖引入第1-1340行├── jQuery 3.2.0压缩版 ├── String 原型扩展format、startWith、endWith、contains └── 框架主代码2.核心命名空间第1342-1350行varRekTec{};// 全局命名空间这是整个框架的根对象所有功能都挂载在这个命名空间下。3.模块化组织按功能分类A. 基础工具模块(1352-1735行)RekTec.common{// 类型判断isNull,isNullOrWhiteSpace,isString,isNumber,isBoolean,// GUID 操作newGuid,isSameGuid,// 字符串处理trim,formatDate,formatDecimal,// URL 操作getUrlParam,getWebResourceParam,// 环境判断isUCI,isOnPremises,isOnMobile,isDev,// UI 辅助showWindow,showFullWindow,showLargeWindow,showSmallWindow,// 其他downloadFile,refresh,refreshParentPage,base64ToBlob,layerLoading}B. Ajax 请求模块(1737-1848行)RekTec.ajax{getXHR,// 获取 XMLHttpRequest 对象getResponse,// GET 同步请求postResponse,// POST 同步请求getAsync,// GET 异步请求PromisepostAsync,// POST 异步请求// ... 其他 HTTP 方法}C. CRM 表单操作模块(1850-2022行)RekTec.crmForm{disableAll,// 禁用所有控件disableField,// 禁用指定字段clearField,// 清空字段值forceSubmitAll,// 强制提交所有字段buildLookup,// 构建查找字段对象getLookupId,// 获取查找字段的 IDgetEntityId,// 获取实体 IDgetFormType,// 获取表单类型新建/编辑/只读// ... 更多表单操作方法}D. CRM 数据访问模块(2024-2440行)RekTec.crmData{getClientUrl,// 获取组织 URLgetWebAPIUrl,// 获取 WebAPI 地址getFieldValue,// 获取字段值同步getFieldValueAsync,// 获取字段值异步getParameterValue,// 获取系统参数getUserId,// 获取当前用户 IDisCurrentUserHasRoles,// 判断用户角色getUserRoles,// 获取用户角色列表export2Excel,// 导出 Excel// ... 其他数据访问方法}E. WebAPI 操作模块(2619-2939行)RekTec.webApi{create,// 创建记录update,// 更新记录delete,// 删除记录fetch,// 执行 FetchXML 查询fetchAsync,// 异步 FetchXMLinvokeAction,// 调用 ActioninvokeActionAsync,// 异步调用 ActioninvokeHiddenApi,// 调用隐藏 API核心方法invokeHiddenApiAsync,// 异步调用隐藏 API// ... 更多 WebAPI 方法}F. 流程审批模块(2941-3223行)RekTec.flow{flowSubmit,// 提交审批flowRecall,// 撤回审批flowAgree,// 审核通过flowReject,// 审核驳回flowCommunicate,// 审批沟通flowTransfer,// 审批转办flowUrge,// 催办// ... 其他流程方法}G. 元数据访问模块(2506-2617行)RekTec.crmMetadata{retrieveEntityMetadataAsync,// 获取实体元数据retrieveAttributesMetadataAsync,// 获取属性元数据retrieveOptionsetAsync,// 获取选项集retrieveWorkflowAsync,// 获取工作流// ... 元数据查询方法}H. 导航 UI 模块(3290-3409行)RekTec.navigation{openAlertDialog,// 打开警告框openConfirmDialog,// 打开确认框openForm,// 打开实体表单openWebResource,// 打开 Web 资源openUrl,// 打开 URLnavigateTo// 导航到指定页面}I. Ribbon 按钮控制模块(2527-2585行)RekTec.ribbon{isRibbonEnabledAccordingToRules,// 根据规则判断按钮是否启用isRibbonEnabledAccordingToApprovalStatus,// 根据审核状态判断isFlowSubmitButtonEnabled,// 判断提交按钮是否可用// ... Ribbon 控制方法}4.jQuery 风格的选择器封装最后部分varrtcrmfunction(selector){// 实现了类似 jQuery 的 DOM 选择器return{val,// 获取/设置值text,// 获取文本req,// 设置必填show,// 显示hide,// 隐藏disabled,// 启用/禁用// ... 链式操作}}// 将所有 RekTec 模块扩展到 rtcrm 对象上jQuery.extend(rtcrm,RekTec.common);jQuery.extend(rtcrm,RekTec.crmForm);jQuery.extend(rtcrm,RekTec.webApi);// ... 其他模块5.多语言支持最后部分window.$tfunction(key,defaultValue){// 国际化翻译函数}window.LocalizedStrings{[USER_LCID]:getlanguagepack()// 加载语言包} 设计模式总结设计模式体现命名空间模式RekTec作为全局唯一命名空间模块化模式按功能拆分成common、crmForm、webApi等子模块外观模式rtcrm函数封装了复杂的 Xrm 操作提供简洁 API链式调用类似 jQuery 的链式操作rtcrm(#field).val().show()Promise 模式大量异步方法返回 Promise适配器模式适配不同版本的 D365UCI/经典界面 核心价值这个框架本质上是一个D365 开发的 SDK 封装它简化了 Xrm API 的调用如rtcrm(#field).val()代替Xrm.Page.getAttribute(field).getValue()提供了大量业务常用方法审批流、WebAPI、Excel导出等统一了异步处理Promise 封装兼容多版本UCI 和经典界面集成了多语言支持这就是为什么你在代码中可以直接使用rtcrm.getEntityId()、rtcrm.invokeHiddenApi()等方法而不需要显式引用的原因——整个框架已经将所有功能挂载到全局rtcrm对象上了。