实现自定义插件以更新多家公司
要创建自定义插件,只需创建一个派生自 CustomizationPlug 的类并将其打包到自定义中。当系统发布自定义项目时,它将仅在当前公司范围内执行自定义插件中实现的 OnPublished 和 UpdateDatabase 方法。 ******
话虽如此,自定义插件永远不会对当前公司以外的任何其他公司进行更改,除非它使用 PXLoginScope 一个接一个地登录所有公司,可供当前用户发布自定义。
以下是自定义插件的示例,该插件在当前用户可用的所有公司中创建 MyVerticalSolution 用户角色:
public class MyVerticalSolutionInit : CustomizationPlugin
{
public override void UpdateDatabase()
{
var companies = PXAccess.GetCompanies();
foreach (var company in companies)
{
using (var loginScope = new PXLoginScope(string.Format("{0}@{1}",
PXAccess.GetUserLogin(), company)))
{
string roleName = "MyVerticalSolution";
RoleAccess graph = PXGraph.CreateInstance<RoleAccess>();
Roles existingRole = graph.Roles.Search<Roles.rolename>(roleName);
if (existingRole != null)
{
WriteLog(string.Format("{0} already exists in company '{1}' - skipped", roleName, company));
continue;
}
var wmsRole = new Roles();
wmsRole.Rolename = roleName;
wmsRole.Descr = "User Role for MyVerticalSolution";
graph.Roles.Insert(wmsRole);
graph.Save.Press();
WriteLog(string.Format("{0} was succesfully created in company '{1}'", roleName, company));
}
}
}
}
要获取当前用户可用的公司列表,只需调用静态 PXAccess.GetCompanies()
方法即可。然后使用 PXLoginScope 登录每个可用公司以创建 MyVerticalSolution 用户角色。注意为每个公司重新初始化 RoleAccess BLC 的实例 - 这是一次对多个公司进行更改的绝对必要步骤。
假设你的 Acumatica 实例中有 2 家公司:CompanyA 和 CompanyB。你将用于发布自定义的管理员用户可以访问两个公司,并且由 CustomA 插件创建的 MyVerticalSolution 角色已存在于 CompanyA 中:
使用早期开发的自定义插件发布自定义(登录到 CompanyA 或 CompanyB 时) 以在当前用户可用的所有公司中创建 MyVerticalSolution 角色后,请注意为 CompanyA 跳过 MyVerticalSolution 角色并成功为 CompanyB 创建。
下次发布此自定义时,将为你的 Acumatica 应用程序中的两家公司跳过 MyVerticalSolution 角色: