package com.norteksoft.wf.engine.client;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.lang.StringUtils;
import com.norteksoft.wf.base.enumeration.DataDictProcessType;
import com.norteksoft.wf.base.enumeration.DataDictUseType;
/**
* 数据字典API查询条件
*/
public class DictQueryCondition {
public static final String DICT_HQL_ALIAS = "dict";
public static final String PROCESS_HQL_ALIAS = "process";
private StringBuilder condition = new StringBuilder();
private List<Object> conditionValue = new ArrayList<Object>();
private String typeCode; //类型编号typeNo
private String typeName; //类型名称
private String processName; //流程名称
private String tacheName; //环节名称
private DataDictUseType dataDictUseType; //用途
public DictQueryCondition(){}
public DictQueryCondition(String typeCode, String processName, String tacheName, DataDictUseType dataDictUseType) {
super();
this.typeCode = typeCode;
this.processName = processName;
this.tacheName = tacheName;
this.dataDictUseType = dataDictUseType;
}
/**
* 获取查询条件的HQL
* @return
*/
public String getCondition(){
addTypeCodeCondition();
addTypeNameCondition();
addUseTypeCondition();
addProcessNameCondition();
addTacheNameCondition();
return condition.toString();
}
/**
* 获取查询条件的值
* @return
*/
public List<Object> getConditionValues(){
return conditionValue;
}
/*
* 类型条件
* and dict.typeName=?
*/
private void addTypeCodeCondition(){
if(StringUtils.isNotBlank(typeCode)){
condition.append(" and ").append("dict.typeNo=?");
conditionValue.add(typeCode);
}
}
/*
* 类型条件
* and dict.typeName=?
*/
private void addTypeNameCondition(){
if(StringUtils.isNotBlank(typeName)){
condition.append(" and ").append("dict.typeName=?");
conditionValue.add(typeName);
}
}
/*
* 使用类型条件
* and dict.type=?
*/
private void addUseTypeCondition() {
if(dataDictUseType != null){
condition.append(" and ").append("dict.type=?");
conditionValue.add(dataDictUseType.ordinal());
}
}
/*
* 流程名称条件
* and (dict.processType=? or ( dict.processType=? and process.processDefinitionName=? and process.tacheName is null ))
*/
private void addProcessNameCondition(){
if(StringUtils.isNotBlank(processName) && StringUtils.isBlank(tacheName)){
condition.append(" and (");
condition.append("dict.processType=?");
condition.append(" or ( ").append("dict.processType=?");
condition.append(" and ").append("process.processDefinitionName=? and ").append("process.tacheName is null ").append(" )");
condition.append(") ");
conditionValue.add(DataDictProcessType.COMMON.ordinal());
conditionValue.add(DataDictProcessType.SELECT.ordinal());
conditionValue.add(processName);
}
}
/*
* 环节名称条件
* and (
* dict.processType=?
* or ( dict.processType=? and process.processDefinitionName=? and process.tacheName is null )
* or ( dict.processType=? and process.processDefinitionName=? and process.tacheName=? )
*/
private void addTacheNameCondition() {
if(StringUtils.isNotBlank(tacheName)){
if(StringUtils.isBlank(processName)){
throw new IllegalArgumentException("设置了流程环节后,必须设置流程名称");
}
condition.append(" and (");
condition.append("dict.processType=?");
condition.append(" or (").append("dict.processType=?");
condition.append(" and ").append("process.processDefinitionName=? and ").append("process.tacheName is null ").append(" )");
condition.append(" or (").append("dict.processType=?");
condition.append(" and ").append("process.processDefinitionName=? and ").append("process.tacheName=?").append(" )");
condition.append(") ");
conditionValue.add(DataDictProcessType.COMMON.ordinal());
conditionValue.add(DataDictProcessType.SELECT.ordinal());
conditionValue.add(processName);
conditionValue.add(DataDictProcessType.SELECT.ordinal());
conditionValue.add(processName);
conditionValue.add(tacheName);
}
}
/**
* 添加类型编号参数
* @param typeCode 类型编号
*/
public void addTypeCode(String typeCode){
this.typeCode = typeCode;
}
/**
* 添加类型名称参数
* @param typeName 类型名称
*/
public void addTypeName(String typeName){
this.typeName = typeName;
}
/**
* 添加流程名称参数
* @param processName 流程名称
*/
public void addProcessName(String processName){
this.processName = processName;
}
/**
* 添加环节名称参数,如果调用了此方法,必须还调用addProcessName方法
* @param tacheName 环节名称
*/
public void addTacheName(String tacheName){
this.tacheName = tacheName;
}
/**
* 添加使用类型参数
* @param dataDictUseType 使用类型
*/
public void addUseType(DataDictUseType useType){
this.dataDictUseType = useType;
}
}