












U9 是用友 U9 Cloud,基于BEAS 开发平台,底层 C# + .NET Framework,服务端是 IIS+WCF,数据库 SqlServer;二次开发分:插件扩展、WebService 接口、单据扩展、自定义页面、外部程序调用 U9 接口。 ⚠️ U9 二次开发不建议直接修改 U9 原代码,全部使用扩展、插件模式,升级不会覆盖。
U9.dll
U9.Common.dll
U9.DB.dll
U9.Platform.dll
U9.Shell.dll
U9.BO.dll
U9.WCF.dll
BEAS.Core.dll
路径:U9 安装目录
U9\WebSite\bin,复制到本地项目引用,复制本地 = False,服务器上本身有。
场景:销售订单、采购单,保存前校验、自动赋值、生成其他单据、审核后触发业务
VS 新建【类库 (.NET Framework)】,.NET4.7,引用上面 U9dll。
插件类必须继承 U9.Platform.Plugin.IBusinessPlugin
using System;
using U9.Platform;
using U9.Platform.Plugin;
using U9.BO;
using U9.Common;
namespace U9Plugin.Demo
{
/// <summary>
/// 销售订单插件示例
/// </summary>
public class SaleOrderPlugin : IBusinessPlugin
{
//插件执行入口
public void Execute(PluginContext context)
{
//获取当前业务对象
var bo = context.BusinessObject as ISaleOrder;
//区分事件类型
switch (context.EventType)
{
case PluginEventType.BeforeSave:
//保存前事件
BeforeSave(bo, context);
break;
case PluginEventType.AfterSave:
//保存后
break;
case PluginEventType.BeforeAudit:
//审核前
break;
case PluginEventType.AfterAudit:
//审核后
break;
}
}
private void BeforeSave(ISaleOrder saleOrder, PluginContext ctx)
{
//示例校验:订单金额不能小于0
if(saleOrder.TotalAmount < 0)
{
//抛出异常,阻止保存
throw new U9Exception("订单总金额不能小于0!");
}
//给字段赋值
saleOrder.Memo = "插件自动赋值备注";
//遍历分录
foreach(var line in saleOrder.Lines)
{
var qty = line.Qty;
}
}
//插件描述,U9平台识别
public PluginDescriptor GetDescriptor()
{
return new PluginDescriptor
{
Name = "SaleOrderDemoPlugin",
DisplayName = "销售订单自定义插件",
//绑定BO元数据ID,销售订单BO编码:SAL.SaleOrder
BOName = "SAL.SaleOrder",
//订阅哪些事件
SubscribeEvents = new PluginEventType[]
{
PluginEventType.BeforeSave,
PluginEventType.AfterSave,
PluginEventType.BeforeAudit
}
};
}
}
}
1. 编译生成 dll,放到 U9 服务器 U9\WebSite\bin\Plugin 2. 登录 U9【开发平台】→【插件管理】→注册插件,填入类的完整名 U9Plugin.Demo.SaleOrderPlugin,U9Plugin.Demo 3. 启用插件,重启 U9 应用池(IIS 回收应用程序池) 4. 测试新建销售订单触发插件。
关键点:BO 名称,每个单据有自己 BOName,比如 PO.PurchaseOrder 采购订单;可以在 BEAS 元数据浏览器查询 BO 编码。
场景:外部系统,C# 控制台 / WPF,新增、查询 U9 单据,不写插件。 U9 对外提供 WCF 服务地址:
http://ip/U9/Service/BusinessService.svc
VS 项目右键添加服务引用,填入上面地址,生成客户端代理。
简单调用示例:
//创建销售订单
var client = new BusinessServiceClient();
client.Open();
//构造DTO,调用Create接口
var result = client.Create("SAL.SaleOrder", saleOrderDto);
client.Close();
//需要账号密码,U9用户编码+密码
var loginInfo = new LoginInfo(){UserCode="admin",Password="xxx",OrgId=1001};
BusinessService svc = new BusinessService();
svc.Login(loginInfo);
//创建销售订单
svc.Create("SAL.SaleOrder", dto);
注意:跨服务器调用,需要 U9 服务器开启 WCF 权限,防火墙开放端口。
1. 登录 U9,打开【开发平台】,新建【自定义页面】 2. 拖拽控件(文本框、按钮、表格) 3. 按钮事件写 C# 脚本,脚本可以直接操作 BO 对象。
脚本环境是 U9 内置,不能引用外部 dll;复杂逻辑建议独立插件。
//Query查询BO
var list = U9.DB.DBContext.Current.Query("SAL.SaleOrder")
.Where("DocNo=@DocNo", new {DocNo="SO202608001"})
.ToList<ISaleOrder>();
throw new U9Exception("自定义提示信息");
//BOFactory创建采购订单
var po = BOFactory.Create<IPurchaseOrder>("PO.PurchaseOrder");
po.SupplierID = 123;
po.Save();
SqlConnection直接写 SQL 改 U9 表,必须走 BO 对象,否则缓存、触发器、业务逻辑失效,数据错乱。1. 服务器附加进程调试:VS 附加 w3wp.exe(IIS 进程),断点打插件代码。 2. 日志:U9 日志路径 U9\Log,可以代码写日志
U9.Common.LogHelper.LogInfo("我的日志信息");
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。