这是一个老问题,但我在协助客户进行第三方集成时刚刚遇到了同样的问题。第三方开发人员坚持认为他们只能使用 REST 服务,因为在意识到无法将文件附加到销售订单行之前,他们已经围绕该服务构建了其余的集成。
我能够使用自定义构建一个解决方法。目前的问题是 Acumatica 的 REST API 附加文件的方式只能由顶级实体访问 - 这意味着必须有一个使用该对象作为主 DAC 的屏幕。
解决方法是创建一个新的自定义屏幕,使用 SOLine 对象作为其主 DAC。为了使选择器可用,我必须删除并替换关键字段上的几个属性,以便它们可见并启用。这是图形代码 - 它非常简单,因为这基本上只是能够创建使用 SOLine DAC 作为顶级实体的自定义端点所需的最低限度。
public class SOLineAttachmentEntry : PXGraph<SOLineAttachmentEntry, SOLine>
{
public PXSelect<SOLine> SOLineDetail;
[PXMergeAttributes(Method = MergeMethod.Append)]
[PXRemoveBaseAttribute(typeof(PXUIFieldAttribute))]
[PXUIField(DisplayName = "Order Type", Visible=true, Enabled = true)]
protected virtual void SOLine_OrderType_CacheAttached(PXCache sender) { }
[PXMergeAttributes(Method = MergeMethod.Append)]
[PXRemoveBaseAttribute(typeof(PXUIFieldAttribute))]
[PXUIField(DisplayName = "Order Nbr", Visible=true, Enabled = true)]
protected virtual void SOLine_OrderNbr_CacheAttached(PXCache sender) { }
[PXMergeAttributes(Method = MergeMethod.Append)]
[PXRemoveBaseAttribute(typeof(PXUIFieldAttribute))]
[PXRemoveBaseAttribute(typeof(PXLineNbrAttribute))]
[PXUIField(DisplayName = "Line Nbr", Visible=true, Enabled = true)]
protected virtual void SOLine_LineNbr_CacheAttached(PXCache sender) { }
}
自定义屏幕布局应该是一个简单的表单,只有这三个关键字段:OrderType、OrderNbr、LineNbr。在自定义的屏幕编辑器中,您需要在每个字段的布局属性选项卡中设置 CommitChanges=true。
屏幕发布后,您可以使用它来创建新的自定义端点,并通过从自定义屏幕中选择 SOLine 视图来添加单个实体。我将端点命名为“SalesOrderDetailAttach”,将端点版本指定为 1.0,并将新实体命名为“SalesOrderDetail”。使用这些名称,文件附件请求应该是一个 PUT 请求,请求正文中包含二进制文件数据,使用 url 格式:
[AcumaticaBaseUrl]/entity/SalesOrderDetailAttach/1.0/SalesOrderDetail/[OrderType]/[OrderNbr]/[LineNbr]/files/[Desired filename in Acumatica]
这适用于这一非常特殊的情况,将文件附加到 SOLine 对象。屏幕和端点实际上不应该用于其他任何用途,并且除了管理员和 API 用户之外的任何用户都不应访问自定义屏幕。最终,我建议使用其他答案中的基于屏幕的方法,但如果使用 REST API 是绝对必须的,那么这是一个潜在的解决方法。