优化代码位于/BIZ/SA/task/logic/code/dsrc/TaskUtils.java的getExecutorCondition
本次优化将like换成了=,充分利用SA_TASK_SEXECUTORFID索引提升待办任务的查询效率
后面如果使用过程中再次出现性能下降,只要检查一下SA_TASK_SEXECUTORFID的索引碎片,优化一下就会好了
5.2.7版本中修改如下:
public static String getExecutorCondition(String alias, Collection<PersonMember> pms, boolean useAgentProcess){
/*
String result = "";
List<String> items = new ArrayList<String>();
for (PersonMember pm : pms){
String item = "'" + pm.getFID() + "' like concat(" + alias + ".sExecutorFID, '%')";
if (useAgentProcess){
String agentProcess = pm.getAgentProcess();
if (Utils.isNotEmptyString(agentProcess)){
String agentProcessCondition = getAgentProcessCondition(alias, agentProcess);
item = appendCondition(item, "and", agentProcessCondition);
}
}
items.add(item);
}
if (items.isEmpty()){
result = "1<>1";
}else{
for (String item : items){
if (result.equals("")){
result = item;
}else{
result = result + " or " + item;
}
}
result = appendCondition(result, "and", alias + ".sExecutorFID like '/%'");
}
return result;
*/
String result = "";
for (PersonMember pm : pms) {
com.justep.system.opm.OrgNode org = pm;
String psmFilter = "";
while (org != null) {
if (psmFilter.length() > 0) {
psmFilter = psmFilter + " OR ";
}
psmFilter = psmFilter + "(" + alias + ".sExecutorFID = '" + org.getFID() + "')";
org = org.getParent();
}
if (useAgentProcess){
String agentProcess = pm.getAgentProcess();
if (Utils.isNotEmptyString(agentProcess)){
String agentProcessCondition = getAgentProcessCondition(alias, agentProcess);
psmFilter = "(" + psmFilter + ") AND (" + agentProcessCondition + ")";
}
}
if (result.length() > 0) {
result = result + " OR ";
}
result = result + "(" + psmFilter + ")";
}
if (result.length() == 0) {
result = "1=1";
}
result = "(" + result + ")";
}
5.3.8版本(5.3版本中都是通用的)中修改如下:
public static String getExecutorCondition(String alias, Collection<PersonMember> pms, boolean useAgentProcess, Map<String, Object> vars){
/*
if (taskExecutorOnlyPerson()){
return getExecutorConditionWithPerson(alias, pms, useAgentProcess, vars);
}
String result = "";
List<String> items = new ArrayList<String>();
int i = 0;
for (PersonMember pm : pms){
String var = "_efid" + i++;
vars.put(var, pm.getFID());
String item = ":" + var + " like concat(" + alias + ".sExecutorFID, '%')";
if (useAgentProcess){
String agentProcess = pm.getAgentProcess();
if (Utils.isNotEmptyString(agentProcess)){
String agentProcessCondition = getAgentProcessCondition(alias, agentProcess, vars);
item += " and " + agentProcessCondition;
}
}
items.add(item);
}
if (items.isEmpty()){
result = "1<>1";
}else{
for (String item : items){
if (result.equals("")){
result = item;
}else{
result = result + " or " + item;
}
}
result = "(" + result + ") and " + alias + ".sExecutorFID like '/%' ";
}
return result;
*/
if (taskExecutorOnlyPerson()){
return getExecutorConditionWithPerson(alias, pms, useAgentProcess, vars);
}
String result = "";
for (PersonMember pm : pms) {
com.justep.system.opm.OrgNode org = pm;
String psmFilter = "";
while (org != null) {
if (psmFilter.length() > 0) {
psmFilter = psmFilter + " OR ";
}
psmFilter = psmFilter + "(" + alias + ".sExecutorFID = '" + org.getFID() + "')";
org = org.getParent();
}
if (useAgentProcess){
String agentProcess = pm.getAgentProcess();
if (Utils.isNotEmptyString(agentProcess)){
String agentProcessCondition = getAgentProcessCondition(alias, agentProcess, vars);
psmFilter = "(" + psmFilter + ") AND (" + agentProcessCondition + ")";
}
}
if (result.length() > 0) {
result = result + " OR ";
}
result = result + "(" + psmFilter + ")";
}
if (result.length() == 0) {
result = "1=1";
}
result = "(" + result + ")";
return result;
}
评一波