当前位置: 首页 > news >正文

U9二次开发之BP定时任务插件开发

采购订单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,要引入代理。
在这里插入图片描述

编写代码:

在这里插入图片描述

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的内容手动复制。

在这里插入图片描述

还有记得要运行UBFV60\U9.VOB.Product.Other\Unconfiged\MetadataScript目录下的sql语句。

我忘了运行这里的sql导致在服务权限页面上找不到服务,浪费了很多时间。。。

在这里插入图片描述

发布组件

右键解决方案,点击发布服务组件,发布组件:
在这里插入图片描述

发布完成之后,会在解决方案目录下生成.sg文件。

在这里插入图片描述

在配置组件之前需要先配置environment.xml文件 。

1.配置 environment.xml文件

在\UBFV60\U9.VOB.Product.UBF\UBFStudio\Runtime目录下打开environment.xml文件,配置数据库连接信息。

在这里插入图片描述

在这里插入图片描述

2.配置组件

在\UBFV60\U9.VOB.Product.UBF\UBFStudio目录下打开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相关的编译文件,分别从

项目路径\BpImplement\bin\Debug

项目路径\BpAgent\bin\Debug

复制到Files文件夹下:

在这里插入图片描述

如果你不知道要复制哪些文件,可以参考AutoBuild.bat文件里的内容。
在这里插入图片描述

3.复制.bulk文件

然后,从UBFV60\U9.VOB.Product.Other\Unconfiged\MetadataScript路径下把.bulk文件复制到Metadata文件夹下:

在这里插入图片描述
做好补丁之后就可以发布啦。

最后

这就是BP定时任务插件开发的整个过程,步骤比较繁琐,网上u9二开的资料也比较少,仅仅做个记录,以备查看。

相关文章:

  • Java 经典面试题
  • Policy-Based Method RL
  • 001:你好Direct 2D! 在对话框中初次使用D2D
  • 文件系统基础
  • 2022/9/5开始第三版接口自动化(yaml用例)测试框架(记录搭建过程)
  • Github每日精选(第38期):Java 8+ Jar 和 Android APK 逆向工程套件(反编译器、编辑器、调试器等)bytecode-viewer
  • Pandas 操作数据(三)
  • 查题系统API无限搜题接口搭建
  • python之爬虫基础(1)
  • CVE-2022-22978 Spring-security 认证绕过漏洞分析和漏洞挖掘思考
  • 小孩取名:瑭字的寓意和含义
  • 7、IOC 之Bean定义继承 parent
  • J9数字论:模块化公链能否成为公链新趋势?
  • UVM环境中reset复位的处理
  • 示波器探头的选择和作用及原理
  • 〔开发系列〕一次关于小程序开发的深度总结
  • crontab执行失败的多种原因
  • express + mock 让前后台并行开发
  • go append函数以及写入
  • JavaScript类型识别
  • JavaScript设计模式之工厂模式
  • Laravel5.4 Queues队列学习
  • Making An Indicator With Pure CSS
  • SQL 难点解决:记录的引用
  • vue从创建到完整的饿了么(18)购物车详细信息的展示与删除
  • vue和cordova项目整合打包,并实现vue调用android的相机的demo
  • Vue小说阅读器(仿追书神器)
  • Zsh 开发指南(第十四篇 文件读写)
  • 不上全站https的网站你们就等着被恶心死吧
  • 记录一下第一次使用npm
  • 面试总结JavaScript篇
  • 前端每日实战:70# 视频演示如何用纯 CSS 创作一只徘徊的果冻怪兽
  • 使用前端开发工具包WijmoJS - 创建自定义DropDownTree控件(包含源代码)
  • 收藏好这篇,别再只说“数据劫持”了
  • 微信小程序上拉加载:onReachBottom详解+设置触发距离
  • 要让cordova项目适配iphoneX + ios11.4,总共要几步?三步
  • 移动互联网+智能运营体系搭建=你家有金矿啊!
  • 与 ConTeXt MkIV 官方文档的接驳
  • puppet连载22:define用法
  • 完善智慧办公建设,小熊U租获京东数千万元A+轮融资 ...
  • ​第20课 在Android Native开发中加入新的C++类
  • #传输# #传输数据判断#
  • (C语言)共用体union的用法举例
  • (附源码)springboot课程在线考试系统 毕业设计 655127
  • (论文阅读32/100)Flowing convnets for human pose estimation in videos
  • (五)关系数据库标准语言SQL
  • (一)pytest自动化测试框架之生成测试报告(mac系统)
  • ../depcomp: line 571: exec: g++: not found
  • .Net IOC框架入门之一 Unity
  • .NET NPOI导出Excel详解
  • .NET 材料检测系统崩溃分析
  • .net和jar包windows服务部署
  • @EnableAsync和@Async开始异步任务支持
  • [ CTF ] WriteUp- 2022年第三届“网鼎杯”网络安全大赛(朱雀组)
  • [BZOJ4010]菜肴制作