nc65 编码和名称唯一性校验

1.给编码和名称添加唯一性校验,首先要在如下目录新建rule类,实现nc.impl.pubapp.pattern.rule.IRule接口,重写process方法,接口的范型为对应的aggVO类(主子表),具体代码如下:


public class CodeUniqueCheck implements IRule<AggStressTestPlanVO> {

	@Override
	public void process(AggStressTestPlanVO[] vos) {
		if (null == vos  || 0 == vos.length) {
			return;
		}
		StressTestPlanVO parentVO = vos[0].getParentVO();
		StressTestPlanVO[] tempVos = {parentVO};
		StressTestPlanVO[] vosadd = null;
		if(null != parentVO){
			vosadd = this.convertArrayType(tempVos);
			this.checkDBUnique(vosadd);
		}
		StressTestPlanVO[] vosupd = null;
		if(null != parentVO){
			vosupd = this.convertArrayType(tempVos);
			this.checkDBUnique(vosupd);
		}
		
	}
	
	private StressTestPlanVO[] convertArrayType(Object[] vos) {
		StressTestPlanVO[] smartVOs = (StressTestPlanVO[]) Array.newInstance(StressTestPlanVO.class, vos.length);
		System.arraycopy(vos, 0, smartVOs, 0, vos.length);
		return smartVOs;
	}
	
	public void checkDBUnique(StressTestPlanVO[] vos) {
		if (null == vos && 0 == vos.length) {
			return;
		}
		for(int i = 0;i < vos.length;i++){
			StressTestPlanVO[] dbvo = new VOQuery<StressTestPlanVO>(StressTestPlanVO.class).query(new String[] { vos[i].getPrimaryKey() });
			this.doLock(dbvo);
			IRowSet codeRowSet = new DataAccessUtils().query(this.getCheckSql(dbvo[0].getTableName(),"code",dbvo[0].getCode()));
			IRowSet nameRowSet = new DataAccessUtils().query(this.getCheckSql(dbvo[0].getTableName(),"name",dbvo[0].getName()));
			if(codeRowSet.size() >1 && nameRowSet.size() > 1){
				ExceptionUtils.wrappBusinessException("保存失败,当前压力测试方案编码和名称都已经存在,不可重复添加 !");
			}
			if (codeRowSet.size() > 1) {
				ExceptionUtils.wrappBusinessException("保存失败,当前压力测试方案编码已经存在,不可重复添加 !");
			}
			if (nameRowSet.size() > 1) {
				ExceptionUtils.wrappBusinessException("保存失败,当前压力测试方案名称已经存在,不可重复添加 !");
			}
		}
	}


	private void doLock(StressTestPlanVO[] dbvo) {
		List<String> lockobj = new ArrayList<String>();
		for (int i = 0; i < dbvo.length; i++) {
			lockobj.add("#code_name#");
		}
		LockOperator lock = new LockOperator();
		lock.lock(lockobj.toArray(new String[lockobj.size()]), "当前单据记录有其他用户在操作,请稍候刷新后再操作 !");
	}

	/**
	 * 拼接唯一性校验的sql
	 * 
	 * @param vo
	 * @return
	 */
	private String getCheckSql(String tableName,String columnName,String columnValue) {
		StringBuffer sql = new StringBuffer();
		sql.append("select 1 from ");
		sql.append(tableName);
		sql.append(" where isnull(dr,0) = 0 ");
		sql.append(" and "+ columnName +"= '" + columnValue + "' ");
		return sql.toString();
	}

2.然后修改对应的插入和更新类中的新增后规则即可。

/**
	 * 新增后规则
	 * 
	 * @param processor
	 */
	private void addAfterRule(AroundProcesser<AggStressTestPlanVO> processor) {
		// TODO 新增后规则
		IRule<AggStressTestPlanVO> rule = null;
		rule = new CodeUniqueCheck();
		processor.addAfterFinalRule(rule);
	}

猜你喜欢

转载自blog.csdn.net/u014714841/article/details/80310870