重要
Dynamics 365 Project Service Automation 已发展为 Dynamics 365 Project Operations. 有关详细信息,请参阅 Project Service Automation 过渡。
类型字段
Dynamics 365 项目服务自动化依赖于机会、报价、订单和发票实体的 Type (msdyn_ordertype)字段,以区分这些实体的工作型版本与项目型和服务型版本。 这些实体的工作版本由 PSA 处理。 解决方案客户端和服务器端的大量业务逻辑取决于 “类型” 字段。 因此,请务必在创建实体时使用正确的值初始化字段。 不正确的值可能会导致行为不正确,某些业务逻辑可能无法正确运行。
自动窗体切换
为了避免销售实体记录错误初始化和编辑导致的数据潜在损坏和意外行为,PSA 现在在自带窗体中增加了窗体自动切换逻辑。 此逻辑会将用户带到正确的窗体以处理商机、报价单、订单或发票实体的基于工作的版本或其他任何类型。 当用户打开商机、报价单、订单或发票实体基于工作的版本时,窗体将切换到项目信息。
自动窗体切换逻辑依赖于 formId 值与 msdyn_ordertype 字段之间的映射。 所有开箱即用的表单都已添加到该映射中。 但是,必须手动添加自定义窗体,以指示应该处理实体的哪个版本。 这基于 msdyn_ordertype 字段。 如果映射中缺少窗体切换,逻辑将基于实体的 msdyn_ordertype 字段中保存的值切换到自带窗体。
添加自定义窗体并打开窗体切换逻辑
下面的示例演示如何添加自定义窗体 “我的项目信息”,以便它适用于基于工作的机会。 相同的过程用于添加自定义表单,以便它们处理报价、订单和发票。
按照以下步骤创建自定义版本的 “项目信息” 窗体。
在“机会”实体中,打开 “项目信息” 窗体,并在名称 “我的项目信息”下保存副本。
打开新窗体,然后在属性中,确保项目 信息 窗体中的表单初始化脚本存在。
重要
请勿删除脚本。 否则,某些数据可能初始化不正确。
验证窗体中是否存在 Type (msdyn_ordertype) 字段。
重要
请勿删除此字段。 否则,初始化脚本将失败。
查找新窗体的 formId 值。 可以通过两种方式完成此步骤:
- 将 “我的项目信息” 窗体导出为非托管解决方案的一部分,然后在导出解决方案的 customization.xml 文件中查找 formId 值。
- 在窗体编辑器中打开 “我的项目信息 ”窗体,然后查找 URL 中 fromId 参数旁边的全局唯一标识符(GUID),如下图所示。
通过编辑 msdyn_ /SalesDocument/PSSalesDocumentCustomFormIds.js Web 资源,为 formId 值创建msdyn_ordertype映射。 从资源中删除代码,并将其替换为以下代码。
define(["require", "exports"], function (require, exports) { "use strict"; var SalesDocumentCustomFormIds = (function () { function SalesDocumentCustomFormIds() { } SalesDocumentCustomFormIds.overwriteFormIds = function (mappedFormIds) { /* ---- Notes ---- mappedFormIds[SalesEntity][OrderType] => The array of forms IDs that support particular entity and order type Add or overwrite customized formId for the particular entity and order type by calling: mappedFormIds[<EntityType>][<msdyn_ordertype>].push("<formId>"); Allowed msdyn_ordertype values for reference: ServiceBased: 690970002 (Field Service version of the entity) WorkBased: 192350001 (PSA version of the entity) ItemBased: 192350000 (Regular out of the box entity) Uncomment and update one of the following lines to register custom PSA form for required entity: */ //mappedFormIds[1][192350001].push("<formId>"); //Quote //mappedFormIds[5][192350001].push("<formId>"); //Quote Line //mappedFormIds[2][192350001].push("<formId>"); //Sales Order //mappedFormIds[6][192350001].push("<formId>"); //Sales Order Line // In this example we have added new form for Opportunity mappedFormIds[0][192350001].push("192EE537-DCC4-45D3-B7AF-EA694B9113D2"); //Opportunity //mappedFormIds[4][192350001].push("<formId>"); //Opportunity Line }; return SalesDocumentCustomFormIds; }()); exports.default = SalesDocumentCustomFormIds; });保存并发布自定义项。