如何将服务管理销售订单状态与单号同步至服务订单自定义字段
服务订单与生成销售订单的字段同步实现方案
核心思路
在创建销售订单的动作执行完成后,获取生成的销售订单数据,再同步更新对应服务订单明细行的自定义字段。以下是具体实现步骤和代码示例:
1. 定位创建销售订单的触发逻辑
找到服务订单页面中「CREATE SALES ORDER」按钮对应的动作(Action),通常是在ServiceOrderEntry图中的自定义或原生动作。我们需要通过重写该动作来添加同步逻辑。
2. 实现同步逻辑的代码示例
在ServiceOrderEntry的扩展类中,重写创建销售订单的方法,完成字段同步:
public class ServiceOrderEntry_Extension : PXGraphExtension<ServiceOrderEntry> { // 重写创建销售订单的动作 public delegate void CreateSalesOrderDelegate(); [PXOverride] public void CreateSalesOrder(CreateSalesOrderDelegate baseMethod) { // 先执行原生的创建销售订单逻辑 baseMethod(); // 获取当前服务订单记录 ServiceOrder currentServiceOrder = Base.ServiceOrder.Current; if (currentServiceOrder == null) return; // 根据关联关系获取刚生成的销售订单 // 注:需确保创建销售订单时,已将服务订单号关联到SalesOrder的对应字段(如RefNbr或自定义关联字段) SalesOrder createdSO = PXSelect<SalesOrder, Where<SalesOrder.refNbr, Equal<Current<ServiceOrder.nbr>>>>.Select(Base); if (createdSO == null) return; // 遍历服务订单明细行,更新指定自定义字段 foreach (ServiceOrderDetail detail in Base.ServiceOrderDetails.Select()) { // 仅更新「Mark for SO」激活的行(假设标识字段为UsrMarkForSO) if (detail.UsrMarkForSO == true) { ServiceOrderDetail updatedDetail = Base.ServiceOrderDetails.Update(detail); updatedDetail.UsrSONumber = createdSO.OrderNbr; updatedDetail.UsrSOStatus = createdSO.Status; Base.ServiceOrderDetails.Update(updatedDetail); } } // 保存服务订单的更新内容 Base.Save.Press(); } }
3. 关键注意事项
- 关联关系验证:确保创建销售订单时,已将服务订单号绑定到销售订单的
RefNbr或自定义关联字段,否则无法准确匹配到刚生成的销售订单。 - 权限控制:确认执行该逻辑的用户拥有服务订单明细的修改权限,避免因权限不足导致同步失败。
- 异常处理:可添加
try-catch块捕获异常,保证创建销售订单成功后,服务订单的更新操作能稳定执行,避免数据不一致。 - 测试验证:在测试环境先验证逻辑,确认仅目标明细行被更新,且字段值同步准确。
内容的提问来源于stack exchange,提问作者DevFuture
相关产品推荐
相关产品推荐

