Przeglądaj źródła

support pos rule

liyuan 2 lat temu
rodzic
commit
2dc9114928

+ 2 - 1
ibps-bpmn-root/modules/bpmn-plugin/src/main/java/com/lc/ibps/bpmn/plugin/usercalc/ExecutorVar.java

@@ -11,7 +11,7 @@ public class ExecutorVar implements Serializable {
 	public static final String EXECUTOR_TYPE_USER ="user";
 	public static final String EXECUTOR_TYPE_USER ="user";
 	public static final String EXECUTOR_TYPE_PARTY ="party";
 	public static final String EXECUTOR_TYPE_PARTY ="party";
 	public static final String EXECUTOR_TYPE_ORG ="org";
 	public static final String EXECUTOR_TYPE_ORG ="org";
-	public static final String EXECUTOR_TYPE_POS ="pos";
+	public static final String EXECUTOR_TYPE_POS ="position";
 	public static final String EXECUTOR_TYPE_ROLE ="role";
 	public static final String EXECUTOR_TYPE_ROLE ="role";
 	public static final String EXECUTOR_TYPE_FIXED ="fixed";
 	public static final String EXECUTOR_TYPE_FIXED ="fixed";
 	
 	
@@ -19,6 +19,7 @@ public class ExecutorVar implements Serializable {
 	public static final String VALTYPE_ACCOUNT ="account";
 	public static final String VALTYPE_ACCOUNT ="account";
 	public static final String VALTYPE_ORGID ="orgId";
 	public static final String VALTYPE_ORGID ="orgId";
 	public static final String VALTYPE_ORGKEY ="orgKey";
 	public static final String VALTYPE_ORGKEY ="orgKey";
+	public static final String VALTYPE_POSID ="positionId";
 
 
 	/**来自BO还是流程变量*/
 	/**来自BO还是流程变量*/
 	private String source="";
 	private String source="";

+ 7 - 2
ibps-bpmn-root/modules/bpmn-plugin/src/main/java/com/lc/ibps/bpmn/plugin/usercalc/UserCalcHelper.java

@@ -35,7 +35,7 @@ public class UserCalcHelper {
 	/**
 	/**
 	 * 流程变量JSON解析       将参数和值进行匹配 
 	 * 流程变量JSON解析       将参数和值进行匹配 
 	 * @param executorVar
 	 * @param executorVar
-	 * @param pluginSession
+	 * @param vars
 	 * @return  userIds  or  groupIds
 	 * @return  userIds  or  groupIds
 	 */
 	 */
 	public List<String> getCalcsPKByExecutor(ExecutorVar executorVar, Map<String, Object> vars){
 	public List<String> getCalcsPKByExecutor(ExecutorVar executorVar, Map<String, Object> vars){
@@ -122,7 +122,12 @@ public class UserCalcHelper {
 					ids.add(orgAlias);
 					ids.add(orgAlias);
 				}
 				}
 			}
 			}
-		 }
+		 }else if(ExecutorVar.EXECUTOR_TYPE_POS.equals(executorVar.getExecutorType())){
+			String valType = executorVar.getValType();
+			if(ExecutorVar.VALTYPE_POSID.equals(valType)){
+				ids.addAll(Arrays.asList(PKs));
+			}
+		}
 		
 		
 		return ids;
 		return ids;
 	}
 	}

+ 1 - 1
ibps-bpmn-root/modules/bpmn-plugin/src/main/java/com/lc/ibps/bpmn/plugin/usercalc/pos/context/PosPluginContext.java

@@ -52,7 +52,7 @@ public class PosPluginContext extends AbstractUserCalcPluginContext implements I
 			sb.append("节点[").append(def.getNodeName()).append("]");
 			sb.append("节点[").append(def.getNodeName()).append("]");
 		}
 		}
 		else if("var".equals(source)){
 		else if("var".equals(source)){
-			sb.append("人员变量["+def.getExecutorVar().getName()+"]");
+			sb.append("岗位变量["+def.getExecutorVar().getName()+"]");
 		}
 		}
 		
 		
 		return sb.toString();
 		return sb.toString();

+ 81 - 14
ibps-bpmn-root/modules/bpmn-plugin/src/main/java/com/lc/ibps/bpmn/plugin/usercalc/pos/runtime/PosPlugin.java

@@ -1,31 +1,38 @@
 package com.lc.ibps.bpmn.plugin.usercalc.pos.runtime;
 package com.lc.ibps.bpmn.plugin.usercalc.pos.runtime;
 
 
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import javax.annotation.Resource;
-
-import org.springframework.beans.factory.annotation.Autowired;
-
 import com.lc.ibps.api.base.model.PartyEntity;
 import com.lc.ibps.api.base.model.PartyEntity;
 import com.lc.ibps.api.org.constant.PartyType;
 import com.lc.ibps.api.org.constant.PartyType;
+import com.lc.ibps.base.core.constants.StringPool;
 import com.lc.ibps.base.core.exception.BaseException;
 import com.lc.ibps.base.core.exception.BaseException;
 import com.lc.ibps.base.core.util.BeanUtils;
 import com.lc.ibps.base.core.util.BeanUtils;
 import com.lc.ibps.bpmn.api.constant.BpmConstants;
 import com.lc.ibps.bpmn.api.constant.BpmConstants;
+import com.lc.ibps.bpmn.api.constant.ExtractType;
+import com.lc.ibps.bpmn.api.constant.LogicType;
 import com.lc.ibps.bpmn.api.model.identity.BpmIdentity;
 import com.lc.ibps.bpmn.api.model.identity.BpmIdentity;
 import com.lc.ibps.bpmn.api.model.task.IBpmTaskApproval;
 import com.lc.ibps.bpmn.api.model.task.IBpmTaskApproval;
 import com.lc.ibps.bpmn.api.plugin.define.IBpmPluginDefine;
 import com.lc.ibps.bpmn.api.plugin.define.IBpmPluginDefine;
 import com.lc.ibps.bpmn.api.plugin.session.BpmUserCalcPluginSession;
 import com.lc.ibps.bpmn.api.plugin.session.BpmUserCalcPluginSession;
 import com.lc.ibps.bpmn.api.service.BpmApprovalService;
 import com.lc.ibps.bpmn.api.service.BpmApprovalService;
 import com.lc.ibps.bpmn.plugin.core.runtime.AbstractUserCalcPlugin;
 import com.lc.ibps.bpmn.plugin.core.runtime.AbstractUserCalcPlugin;
+import com.lc.ibps.bpmn.plugin.usercalc.ExecutorVar;
+import com.lc.ibps.bpmn.plugin.usercalc.UserCalcHelper;
 import com.lc.ibps.bpmn.plugin.usercalc.UserCalcPluginUtil;
 import com.lc.ibps.bpmn.plugin.usercalc.UserCalcPluginUtil;
 import com.lc.ibps.bpmn.plugin.usercalc.pos.def.PosPluginDefine;
 import com.lc.ibps.bpmn.plugin.usercalc.pos.def.PosPluginDefine;
 import com.lc.ibps.cloud.entity.APIResult;
 import com.lc.ibps.cloud.entity.APIResult;
+import com.lc.ibps.org.api.IPartyEntityService;
 import com.lc.ibps.org.api.IPartyPositionService;
 import com.lc.ibps.org.api.IPartyPositionService;
+import com.lc.ibps.org.party.persistence.entity.PartyEntityTreePo;
 import com.lc.ibps.org.party.persistence.entity.PartyPositionPo;
 import com.lc.ibps.org.party.persistence.entity.PartyPositionPo;
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import javax.annotation.Resource;
+import java.util.*;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
 
 /** 
 /** 
  * 岗位插件
  * 岗位插件
@@ -39,12 +46,13 @@ import com.lc.ibps.org.party.persistence.entity.PartyPositionPo;
  */
  */
 public class PosPlugin extends AbstractUserCalcPlugin
 public class PosPlugin extends AbstractUserCalcPlugin
 {
 {
-	
+	private static final Logger logger = LoggerFactory.getLogger(PosPlugin.class);
 	@Autowired
 	@Autowired
 	private IPartyPositionService partyPositionService;
 	private IPartyPositionService partyPositionService;
 	@Resource
 	@Resource
 	private BpmApprovalService bpmApprovalService;
 	private BpmApprovalService bpmApprovalService;
-
+	@Autowired
+	private IPartyEntityService partyEntityService ;
 	@Override
 	@Override
 	public List<BpmIdentity> queryByPluginDef(BpmUserCalcPluginSession pluginSession, IBpmPluginDefine pluginDef)
 	public List<BpmIdentity> queryByPluginDef(BpmUserCalcPluginSession pluginSession, IBpmPluginDefine pluginDef)
 	{
 	{
@@ -71,8 +79,7 @@ public class PosPlugin extends AbstractUserCalcPlugin
 		if(BeanUtils.isNotEmpty(list)){
 		if(BeanUtils.isNotEmpty(list)){
 			return getIdentity(list);
 			return getIdentity(list);
 		}
 		}
-		
-		return Collections.emptyList();
+		return getIdentityExtend(def, pluginSession, vars, source);
 	}
 	}
 
 
 	private List<PartyEntity> getPoses(PosPluginDefine def, BpmUserCalcPluginSession pluginSession,
 	private List<PartyEntity> getPoses(PosPluginDefine def, BpmUserCalcPluginSession pluginSession,
@@ -147,6 +154,66 @@ public class PosPlugin extends AbstractUserCalcPlugin
 		}
 		}
 		return getBpmIdentityConverter().convertByMapList(gs);
 		return getBpmIdentityConverter().convertByMapList(gs);
 	}
 	}
+
+	/**
+	 *  if type of newBpmIdentities is position, we NEED TO:
+	 * 	1. filter the existBpmIdentities when the id don't belong to newBpmIdentities
+	 * 	2. if the filtered list is empty, existBpmIdentities should be returned.
+	 *
+	 */
+	private List<BpmIdentity> getIdentityExtend(PosPluginDefine def, BpmUserCalcPluginSession pluginSession, Map<String, Object> vars, String source) {
+		if("var".equals(source) && def.getLogicCal().getKey().equals(LogicType.EXCLUDE.getKey())){
+			//we don't need to exact user for this rule.
+			def.setExtract(ExtractType.EXACT_NOEXACT);
+			List<BpmIdentity> list = new ArrayList<BpmIdentity>();
+			ExecutorVar executorVar = def.getExecutorVar();
+			UserCalcHelper uch = new UserCalcHelper();
+			List<String> pks = uch.getCalcsPKByExecutor(executorVar, pluginSession);
+			String[] pkArray = pks.toArray(new String[pks.size()]);
+			//find all position nodes
+			APIResult<List<PartyEntityTreePo>> tree = partyEntityService.findTreeByType(PartyType.POSITION.getValue());
+			if(!tree.isSuccess()) {
+				return list;
+			}
+			List<PartyEntityTreePo> treeData = tree.getData();
+			//remove root node
+			treeData = treeData.stream().filter(x -> !x.getId().equals(StringPool.ZERO)).collect(Collectors.toList());
+			//get child
+			List<String> posWithChild = treeData.stream().filter(x -> StringUtils.containsAny(x.getPath(), pkArray))
+					.map(PartyEntityTreePo::getId)
+					.collect(Collectors.toList());
+			//get parent nodes
+			List<String> posWithParent = treeData.stream().filter(x -> StringUtils.containsAny(x.getId(), pkArray))
+					.flatMap(y -> Arrays.stream(y.getPath().split("\\.",0)))
+					.collect(Collectors.toList());
+			//combine and distinct
+			List<String> pksWithParentChild = Stream.of(posWithChild, posWithParent)
+					.flatMap(Collection::stream)
+					.distinct()
+					.collect(Collectors.toList());
+
+			List<BpmIdentity> calcBpmIdentity = (List<BpmIdentity>)pluginSession.getVariables().get("calcBpmIdentity");
+			for(BpmIdentity identity: calcBpmIdentity) {
+
+				APIResult<List<PartyPositionPo>> usersResult = partyPositionService.findByUserId(identity.getId());
+				if(usersResult.isSuccess()) {
+					List<PartyPositionPo> pos = usersResult.getData();
+					if (BeanUtils.isNotEmpty(pos)) {
+						List<String> ids = pos.stream().map(PartyPositionPo::getId).collect(Collectors.toList());
+						//filter
+						if(Collections.disjoint(ids, pksWithParentChild)){
+							list.add(identity);
+						}
+					}
+				}
+			}
+			if(CollectionUtils.isNotEmpty(list)){
+				logger.info("skipped users: {}",list.toString());
+				return list;
+			}
+		}
+		return Collections.emptyList();
+	}
 	
 	
 	public boolean supportRuntimePreView(){
 	public boolean supportRuntimePreView(){
 		return true;
 		return true;

+ 3 - 0
ibps-bpmnbase-root/modules/bpmn-plugin-base/src/main/java/com/lc/ibps/bpmn/plugin/core/util/UserAssignRuleQueryHelper.java

@@ -135,6 +135,8 @@ public class UserAssignRuleQueryHelper {
 						//集合运算
 						//集合运算
 						calc(bpmIdentities, biList,pluginDef.getLogicCal());
 						calc(bpmIdentities, biList,pluginDef.getLogicCal());
 					}
 					}
+					//set bpmIdentities to session
+					pluginSession.getVariables().put("calcBpmIdentity",bpmIdentities);
 				}
 				}
 			} catch (Exception exception) {
 			} catch (Exception exception) {
 				e = exception;
 				e = exception;
@@ -148,6 +150,7 @@ public class UserAssignRuleQueryHelper {
 			}
 			}
 			
 			
 		}
 		}
+		pluginSession.getVariables().remove("calcBpmIdentity");
 		return bpmIdentities;
 		return bpmIdentities;
 	}	
 	}