采购订单BP定时任务插件开发
最近我们公司要做采购订单审批和OA的集成,也就是把u9的审批流程搬到OA里去做。
当业务员点击标准采购提交按钮的时候,把采购订单的信息触发到OA流程,在OA里做审核,OA审核完成之后,再把审核结果回写到U9。
要实现这个功能需要用到BE插件和BP插件。
BE插件负责在业务员提交审核的时候,把采购订单的信息写到中间表里,然后再触发OA流程。
(请看这篇文章:U9二次开发之BE插件开发)
BP插件负责定时查询中间表,把审核结果写回到u9系统。
这里我讲解下BP插件的开发流程。
生成项目代码
1.打开ubfdev工具新建解决方案
打开ubfdev工具,点击文件-新建解决方案,勾选操作项目,输入解决方案的名称,点击确定按钮。
2.修改项目名称
修改项目名称,并删除自动生成的.ubfbp文件。
点击属性按钮,修改名称:
修改后:
3.新建业务组件
右键项目--新建,选择业务操作组件,填写组件名称,点确定按钮。
选择模型视图,双击项目,就可以打开操作页面。
拖动操作按钮到窗体:
点击操作实体,点击属性按钮,修改名称:
修改事务类型为required:
4.构造代码
右键项目点击构造
在消息列表中可以看到生成代码的路径
编写代码
打开生成的项目,右键引用,添加引用:
注意:BP需要引入*PMISV.Agent.dll,要引入代理。
编写代码:
代码语言:javascript复制namespace UpdatePurchaseOrderAuditStatus
{
using System;
using System.Collections.Generic;
using System.Data;
using System.Text;
using UFIDA.U9.CBO.Pub.Controller;
using UFIDA.U9.PM.PO;
using UFSoft.UBF.AopFrame;
using UFSoft.UBF.Util.Context;
using UFSoft.UBF.Util.DataAccess;
using UFIDA.U9.Base.DTOs;
using UFIDA.U9.PM.DTOs;
/// <summary>
/// UpdateStatus partial
/// </summary>
public partial class UpdateStatus
{
internal BaseStrategy Select()
{
return new UpdateStatusImpementStrategy();
}
}
#region implement strategy
/// <summary>
/// Impement Implement
///
/// </summary>
internal partial class UpdateStatusImpementStrategy : BaseStrategy
{
public UpdateStatusImpementStrategy() { }
public override object Do(object obj)
{
UpdateStatus bpObj = (UpdateStatus)obj;
//get business operation context is as follows
//IContext context = ContextManager.Context
//auto generating code end,underside is user custom code
//and if you Implement replace this Exception Code...
//throw new NotImplementedException();
DataSet ds = new DataSet();
DataParamList paras = new DataParamList();
StringBuilder sql = new StringBuilder();
//查找OA审核通过并未同步的数据,OA审核不通过的不处理
sql.Append("select * from PurchaseOrder_Middle where audit_status = 1 and state = 0");
DataAccessor.RunSQL(UFSoft.UBF.Util.DataAccess.DataAccessor.GetConn(), sql.ToString(), paras, out ds);
if (ds != null)
{
if (ds.Tables.Count > 0)
{
// 生成审核状态BP对象
UFIDA.U9.ISV.PO.Proxy.ApprovePOISVProxy approveProxy = new UFIDA.U9.ISV.PO.Proxy.ApprovePOISVProxy();
foreach (DataRow dataRow in ds.Tables[0].Rows)
{
try
{
string auditPerson = Convert.ToString(dataRow["audit_person"]);
if (auditPerson != null)
{
//设置审核人
setApprovedBy(auditPerson);
}
List<IDCodeNameDTOData> dtoDatas = new List<IDCodeNameDTOData>();
IDCodeNameDTOData dtoData = new IDCodeNameDTOData();
dtoData.ID = Convert.ToInt64(dataRow["PRID"]);
dtoDatas.Add(dtoData);
//审核通过
approveProxy.ActionType = 8; // 审核:8
approveProxy.POList = dtoDatas;
approveProxy.TargetOrgCode = UFIDA.U9.Base.Context.LoginOrg.Code;
approveProxy.Do();
//修改中间表状态
sql.Clear();
sql.Append("update PurchaseOrder_Middle set state = 1,memo = '审核状态同步成功',update_by = 'sys',update_time = GETDATE() where id = " dataRow["id"]);
DataAccessor.RunSQL(UFSoft.UBF.Util.DataAccess.DataAccessor.GetConn(), sql.ToString(), paras, out ds);
}
catch (Exception ex)
{
//记录异常信息
sql.Clear();
sql.Append("update PurchaseOrder_Middle set state = -1, memo = '" ex.Message "',update_by = 'sys',update_time = GETDATE() where id = " dataRow["id"]);
DataAccessor.RunSQL(UFSoft.UBF.Util.DataAccess.DataAccessor.GetConn(), sql.ToString(), paras, out ds);
//throw ex; //throw 异常会导致sql回滚
}
}
}
}
return null;
}
//设置审核人
private void setApprovedBy(String UserCode)
{
PlatformContext context = PlatformContext.Current;
if (!((context == null) || string.IsNullOrEmpty(context.OrgCode)))
{
ContextDTO tdto = new ContextDTO();
//传入审核人工号
tdto.UserCode = UserCode;
tdto.EntCode = context.EnterpriseID;
tdto.CultureName = context.Culture;
tdto.OrgCode = context.OrgCode;
tdto.WriteToContext();
}
}
}
#endregion
}
编译后,执行AutoBuild.bat批处理程序,会自动拷贝对应的项目的dll文件到u9系统目录中。
如果复制失败,请参考AutoBuild.bat的内容手动复制。
还有记得要运行UBFV60U9.VOB.Product.OtherUnconfigedMetadataScript目录下的sql语句。
我忘了运行这里的sql导致在服务权限页面上找不到服务,浪费了很多时间。。。
发布组件
右键解决方案,点击发布服务组件,发布组件:
发布完成之后,会在解决方案目录下生成.sg文件。
在配置组件之前需要先配置environment.xml文件 。
1.配置 environment.xml文件
在UBFV60U9.VOB.Product.UBFUBFStudioRuntime目录下打开environment.xml文件,配置数据库连接信息。
2.配置组件
在UBFV60U9.VOB.Product.UBFUBFStudio目录下打开BuildupDesigner.exe文件
选择供应链--采购管理,点击增加组件按钮。
载入组件
选择.sg文件:
选择要加载的组件,然后点确定就行了。
然后选择工具--发布即可。
3.添加服务权限
打开u9服务权限页面,选择采购管理模块,选择我们添加的BP服务,一般在最后一页,然后在执行下拉框中选择允许。
4.插入UBF_JOB_NoParaRunableBPSVList表数据
U9 6.0最新补丁优化了请求管理中选择异步程序功能,需要在预制表UBF_JOB_NoParaRunableBPSVList中插入BP相关数据,才可以选择到BP(预制时需要BP的全名)。
预置脚本如下:(每个调度执行的BP都需要预置)
INSERT INTO UBF_JOB_NoParaRunableBPSVList VALUES( NewID(), 'UpdatePurchaseOrderAuditStatus.UpdateStatus','修改采购单审核状态')
注意:UBF_JOB_NoParaRunableBPSVList 表的 FullName 字段即:‘UpdatePurchaseOrderAuditStatus.UpdateStatus’,要去服务权限页面中复制,不要搞错了。
5.添加请求管理
打开请求管理页面,填写编码、请求名称,然后选择调度方案,选择应用和异步程序,点击保存即可。
保存后,点击操作--提交请求,有了提交人和提交时间就算成功了。
6.调试程序
注意一下,如果要调试BP,选择附加的进程是ApplicationService.exe而不是w3wp.exe:
制作补丁
关于补丁制作可以参考这篇文章:U9二次开发之补丁制作
1.复制bdxml文件
把ubfdev解决方案路径下的.bdxml文件复制到AssemblyInfo文件夹下:
2.复制bp相关的编译文件
我们把bp相关的编译文件,分别从
项目路径BpImplementbinDebug
项目路径BpAgentbinDebug
复制到Files文件夹下:
如果你不知道要复制哪些文件,可以参考AutoBuild.bat文件里的内容。
3.复制.bulk文件
然后,从UBFV60U9.VOB.Product.OtherUnconfigedMetadataScript路径下把.bulk文件复制到Metadata文件夹下:
做好补丁之后就可以发布啦。
最后
这就是BP定时任务插件开发的整个过程,步骤比较繁琐,网上u9二开的资料也比较少,仅仅做个记录,以备查看。