一转眼从.NET转JAVA已经大半个月了,刚进公司又被推到了项目一线现场,对基础并不怎么扎实的我来说也是有点惶恐,所幸有热心的小姐姐们愿意带我这个小白,在此记录一些二开常用的接口和方法以便以后查用。

- 常用接口

1. 任务插件执行接口
多用于执行后台循环任务,该接口实现后需要在前台进行插件注册。

public interface IBackgroundWorkPlugin {
	/**
	 * 任务插件执行体
	 * @param bgwc 执行环境
	 * @return PreAlertObject
	 * 	该返回值不允许为null!
	 * 	若后台任务插件成功执行但不打算发送消息,
	 *  那么请将PreAlertObject的returnType设为PreAlertReturnType.RETURNNOTHING
	 * @throws BusinessException
	 */
	PreAlertObject executeTask(BgWorkingContext bgwc) throws BusinessException;
}

2. 事件监听器
用于对各个流程之间的事件控制,该接口实现后需要在前台进行插件注册。

public interface IBusinessListener {
	/**
	 * 响应事件的动作
	 * @param event
	 * @throws BusinessException
	 */
	public void doAction(IBusinessEvent event) throws BusinessException;
}

实现类:

public class Xxxx implements IBusinessListener {
	@Override
	public void doAction(IBusinessEvent event) throws BusinessException {
		// 获取订单聚合VO
		OrderVO[] dataVOs=null;
	    if ((event instanceof BusinessEvent))
	    {
	    	BusinessEvent busievent = (BusinessEvent)event;
	    	dataVOs = (OrderVO[])busievent.getObject();
	    }
	    if ((dataVOs == null) || (dataVOs.length == 0)) {
	      return;
	    }
	}
}

- 常用父类

1.SuperVO

public class XxxxVO extends SuperVO{
	/**
	 * 此处为VO的属性
	 */
	 
	/**
	 * 此处为Get,Set方法
	 */
	 
	@Override
	public String getPKFieldName() {
		return "pk_xxxx";//获取表主键
	}
	@Override
	public String getParentPKFieldName() {
		return null;//获取父表主键
	}
	@Override
	public String getTableName() {
		return "xxxx";//获取表名
	}
}

- 常用类和方法

1.BaseDAO
内部数据库访问帮助类,封装了常用的持久层访问操作
调用方式和常用方法:

public class Xxxxxxxx implements Ixxxx{
    static BaseDAO baseDao = null;
	public static BaseDAO getBaseDao(){
		if(baseDao == null){
			baseDao = new BaseDAO(); 
		}
		return baseDao;
	}
	public void Invoke(){
	 /**
	 * 根据指定SQL 执行无参数的数据库更新操作
	 */
		getBaseDao().executeUpdate(String sqlStr);
		
	 /**
	 * 向数据表中插入VO数组
	 */
		getBaseDao().insertVOArray(SuperVO[]);
	
	 /**
	 *   查询单一字段
	 */
	 Object result = this.getBaseDao().executeQuery(sql, new ColumnProcessor());
	 
	 /**
	 *   查询两个字段
	 */
	 map = (Map<String, String>) this.getBaseDao().executeQuery(sql, new MapProcessor());
	}
	
	 /**
	 *   查询多行
	 */
	list = (List<String>)this.getBaseDao().executeQuery(sql, new ColumnListProcessor());
}

2.JDBC封装
用于访问外部数据库进行数据交换

Properties p ;
	private	Connection conn;
	private	PreparedStatement ps;
public Connection getsqlcon() {
		try {
			p = new Properties();
			InputStream in = this.getClass().getResourceAsStream("xxx.properties");
			p.load(in);
			Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
			String url = "jdbc:sqlserver://"+p.getProperty("IP")+":"+p.getProperty("PORT")+";DatabaseName="+p.getProperty("DatabaseName")+" ;";
			conn = DriverManager.getConnection(url, p.getProperty("User"), p.getProperty("Passwod"));			
		} catch (Exception e) {
			e.printStackTrace();
			   Logger.error(e.getMessage(), e);
			System.out.println("数据库连接失败");
		}
		return conn;
	}
public void closeTest(Connection conn,PreparedStatement ps) {
			try {
				if (ps != null) {
					ps.close();
					ps = null;
				}
				if (conn != null) {
					conn.close();
					conn = null;
				}
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}

xxx.properties:

IP=xxx.xxx.xxx.xxx
PORT=xxxx
DatabaseName=xx_xxxx
User=****
Passwod=******

3.NCLocator
接口访问类,NC对Java 远程调用RMI的封装,nc调用类不能直接new,一般用于获取自定义接口的实例

NCLocator.getInstance().lookup(Xxx.class);

4.BillQuery
单据查询类,根据单据主键加载单据VO
下例为查询订单VO:

private AbstractBill[] queryVOByPk(String[] pks) {
		if(new BillQuery<OrderVO>(OrderVO.class).query(pks)!=null
				&& new BillQuery<OrderVO>(OrderVO.class).query(pks).length>0){
			return new BillQuery<OrderVO>(OrderVO.class).query(pks);
		}else{
			return new BillQuery<BillVO>(BillVO.class).query(pks);
		}
	}

5.IUAPQueryBS
数据库查询帮助类
常用方法:

IUAPQueryBS iUAPQueryBS = (IUAPQueryBS) NCLocator.getInstance().lookup(IUAPQueryBS.class.getName());

List<String> list = (List<String>)iUAPQueryBS.executeQuery(sql, new ColumnListProcessor());//返回结果集

String result = (String)iUAPQueryBS.executeQuery(sql, new ColumnProcessor());//返回单一结果

6.PfUtilTools
流程平台后台工具类
单据转换方法,通过前台先查询单据转换规则,明确两种单据VO之间的映射关系,再根据具体需求补全单据剩余字段属性:

/**
	 * 进行VO交换 <li>不支持分单
	 * @param srcTranstype  源交易类型PK
	 * @param destTranstype  目的交易类型PK
	 * @param sourceBillVO 源单据聚合VO
	 * @return 目的单据聚合VO
	 * @throws BusinessException
	 */
	public static AggregatedValueObject runChangeData(String srcTranstype,
			String destTranstype, AggregatedValueObject sourceBillVO)
			throws BusinessException {
		return getExchangeService().runChangeData(srcTranstype, destTranstype,
				sourceBillVO, null);
	}

例:采购单据---->采购出库的VO转化

PurchaseInVO vo = (PurchaseInVO) PfUtilTools.runChangeData("21", "45", orderVO);

7.IplatFormEntry
流程平台进行的单据动作处理的入口类

/**
	 * @param actionName 动作编码,比如“SAVE”、“APPROVE”
	 * @param billType 单据类型PK
	 * @param currentDate 当前日期
	 * @param worknoteVO 工作项VO
	 * @param billvo 单据聚合VO
	 * @param userObj 用户对象
	 * @param eParam 环境参数
	 * @return 动作处理返回值
	 * @throws BusinessException
	 */
	public Object processAction(String actionName, String billType, WorkflownoteVO worknoteVO,
			AggregatedValueObject billvo, Object userObj, HashMap eParam) throws BusinessException;

例:新增采购入库单据

PurchaseInVO vo;
HashMap map = new HashMap();
map.put("notechecked", "notechecked");

Object aggvo =  NCLocator.getInstance().lookup(IplatFormEntry.class).processAction("WRITE", vo.getParentVO().getVtrantypecode(), null, vo, null, map);

8.I + { 单据 } + Maintain
单据维护接口,一般情况下封装了签字,退签,增删改差等常用单据接口,如果没有请调用接口7实现
例 ISaleOutMaintain:

public interface ISaleOutMaintain {
	/**
	 * 销售出库单新增
	 */
	public SaleOutVO[]  insert(SaleOutVO[] billVOs) throws BusinessException;
  /**
   * 销售出库单保存
   */   
  public SaleOutVO[] update(SaleOutVO[] billVOs,SaleOutVO[] originBillVOs) throws BusinessException;

	/**
	 * 销售出库单删除
	 */
	public void delete(SaleOutVO[] billVOs) throws BusinessException;

	/**
	 * 销售出库单签字
	 */
	public SaleOutVO[] sign(SaleOutVO[] billVOs) throws BusinessException;

	/**
	 * 销售出库取消签字
	 */
	public SaleOutVO[] cancelSign(SaleOutVO[] billVOs) throws BusinessException;
}