`
ysen
  • 浏览: 122180 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

业务规则岗位清分

 
阅读更多


业务需求业务流程中的单据,在自动清分节点上根据不同的业务规则分配给不同岗位上的员工处理。业务规则存储在数据库中。每次清分单据的时候获取这些规则用drools 拼成业务规则模板
将单据记录分给不同岗位的员工。
使用业务规则的好处是避免程序代码中的if else 的不断增加需要重新编译code部署。

 

规则模板

 

template header
RULE_NAME
WHEN_DSL
DEAL_POST


package com.taikang.fol.module.common.vo
template "DispatchRule"
rule "DispatchRule_@{RULE_NAME}"
	when
		apply : TCommonApply(@{WHEN_DSL})
	then
		apply.setDealPost("@{DEAL_POST}");
end
end template
function boolean iscontain(String des,String org){
	return des.contains(org);
}

 

调用的action

 

 

public class WebServicesAction { 
	public static final Logger  log = Logger.getLogger(WebServicesAction.class) ;
	@In(value = "#{dispatchRuleBO}", required = false)
	private DispatchRuleBO dispatchRuleBO;// 清分规则业务方法
	@In(value = "#{reimBO}", required = false)
	private  ReimBO reimBO;
	@In(value = "#{budgetBO}", required = false)
	private BudgetBO budgetBO;
	// 数据库操作
	@In(value = "#{reimTravelBO}", required = false)
	private ReimTravelBO reimTravelBO;
	@In(value="#{ldapBO}",required=true)
	protected LdapBO ldapBO;
	@In(value = "#{OAInterfaceBO}", required = false)
	private OAInterfaceBO oaBo;
	
	private  DispatchRule createRule(String ruleName, String whenDsl,
			String dealPost) {
		DispatchRule rule = new DispatchRule(ruleName, whenDsl, dealPost);
		return rule;
	}

	public String dispatch(final String applyid) {
		try {
			/*
			 * 取出对应表单
			 */
			TCommonApply apply = dispatchRuleBO.getTCommonApplyByApplyid(applyid);
			if(apply==null){
				log.error("找不到单据"+applyid+",执行自动清分失败");
				return "";
			}
			
			final RuleDataDrivenTemplate template=RuleDataDrivenTemplate.getInstance();
			/*
			 * 取所有规则
			 */
			final List<TShareDispatchRule> ruleList = dispatchRuleBO.loadRules();
			template.execute(new RuleComplierCallBack(){

				/* (non-Javadoc)
				 * @see com.taikang.fol.module.share.rule.RuleComplierCallBack#doComplier(org.drools.template.DataProviderCompiler)
				 */
				public String doComplier(final DataProviderCompiler converter) {
					
					final List<DispatchRule> rules = new ArrayList<DispatchRule>();
					for(TShareDispatchRule rule : ruleList){
						List<TShareDispatchCondGroup> groups=rule.getTShareDispatchCondGroups();
						for (TShareDispatchCondGroup condGroup : groups) {
							/*
							 * 取第一个条件,第一个条件无逻辑运算符,此条件需排在首位
							 */
							String whenDsl = "";
							String firstWhenDsl="";
							List<TShareDispatchCond> conds=condGroup.getTShareDispatchConds();
							for (TShareDispatchCond cond : conds) {
								if(StringUtils.isEmpty(cond.getLogicOperator())){
									firstWhenDsl=cond.getWhenDsl();
									continue;
								}
								whenDsl += (" " + cond.getWhenDsl() + " ");
							}
						
							rules.add(createRule(condGroup.getId(), firstWhenDsl+whenDsl, condGroup.getPositioncode()));
						}
					}
					template.getDispatchDataProvider().setRules(rules);
					InputStream inputStream=new ByteArrayInputStream(template.getDispatchTemplateStr().getBytes());
					String dsl=converter.compile(template.getDispatchDataProvider(),inputStream);
					try {
						inputStream.close();
					} catch (IOException e) {
					}
					log.debug(applyid+"生成的规则内容:\n"+dsl);
					return dsl;
				}
				
			}, apply);
			log.info(applyid+"费用类型["+apply.getBusinesstypecode()+"]清分后的岗位为:<"+apply.getDealPost()+">");
			if(apply.getDealPost()==null||apply.getDealPost().equals("")){
				this.reimTravelBO.getBaseDAO().bulkUpdate("update TCommonApply set status=? where applyid=?", new String[]{SysConst.HAND_DISPATCH,applyid});//手动清分
			}else{
				this.reimTravelBO.getBaseDAO().bulkUpdate("update TCommonApply set status=? where applyid=?", new String[]{SysConst.AUDITING,applyid});//待审核
			}
			return apply.getDealPost() == null ? "" : apply.getDealPost();
		} catch (Exception e) {
			log.error("单据"+applyid+"执行自动清分失败", e);
			this.reimTravelBO.getBaseDAO().bulkUpdate("update TCommonApply set status=? where applyid=?", new String[]{SysConst.HAND_DISPATCH,applyid});//手动清分
			return "";
		}
	}

 

 

 

public class DispatchRule {
	private String ruleName;
	private String whenDsl;
	private String dealPost;
	public DispatchRule(){}
	public DispatchRule(String ruleName, String whenDsl, String dealPost) {
		this.ruleName = ruleName;
		this.whenDsl = whenDsl;
		this.dealPost = dealPost;
	}

}

 

 

public String getWhenDsl() {
	
		if(!StringUtils.isEmpty(logicOperator)){
			whenDsl+=(logicOperator.equals("and")?"&&":"||");
		}
		if(!StringUtils.isEmpty(operator)){
			if(operator.equals("in")){
				getOperatorValues();
				List<String> codeList=new ArrayList<String>();
				for(SelectItem item : operatorValues){
					codeList.add("("+item.getValue()+")");
				}
				String tempCode="\"(\"+"+code+"+\")\"";
				whenDsl+="eval(iscontain(\""+StringUtils.join(codeList, ',')+"\","+tempCode+"))";
			}else{
				operator=StringUtils.replace(operator, "lt", "<");
				if(code.equals("amount")){
					whenDsl+=(code+operator+operatorValue);
				}else{
					whenDsl+=(code+operator+"\""+operatorValue+"\"");
				}
				
			}
		}
		return whenDsl;
	}

 

public List<SelectItem> getOperatorValues() {
		operatorValues.clear();
		String[] strs=StringUtils.split(operatorValue, ',');
		for(String str : strs){
			//取公司名
			String name=StringUtils.substringBetween(str, "[", "(");
			String code=StringUtils.substringBetween(str, "(", ")");
			operatorValues.add(new SelectItem(code,name));
		}
		return operatorValues;
	}

 

 

public class RuleDataDrivenTemplate {
	private final static Logger logger = Logger.getLogger(RuleDataDrivenTemplate.class);
	
	private static RuleDataDrivenTemplate instance=null;
	private KnowledgeBuilder kbuilder=null;
	private DataProviderCompiler provider=null;
	private KnowledgeBase kbase = null;
	private StatelessKnowledgeSession ksession=null;
	private DispatchDataProvider dispatchDataProvider=null;
	//private InputStream dispatchTemplate=null;
	
	private String dispatchTemplateStr="";
	private RuleDataDrivenTemplate(){
		//kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
		provider=new DataProviderCompiler();
		kbase = KnowledgeBaseFactory.newKnowledgeBase();
		dispatchDataProvider=new DispatchDataProvider();
		
		//dispatchTemplate=RuleDataDrivenTemplate.class.getResourceAsStream("template/DispatchRules.drt");
		
		try {
			char[] bts=new char[1024];
			FileReader reader=new FileReader(RuleDataDrivenTemplate.class.getResource("template/DispatchRules.drt").getPath());
			int num=reader.read(bts);
			dispatchTemplateStr=new String(bts,0,num);
			reader.close();	 
		} catch (FileNotFoundException e) {
			logger.error("找不到文件DispatchRules.drt", e);
		}catch (IOException e) {
			logger.error("无法读取文件DispatchRules.drt", e);
		}
		
	}
	
	public static RuleDataDrivenTemplate getInstance(){
		if(instance==null){
			instance=new RuleDataDrivenTemplate();
		}
		return instance;
	}
	
	public String getDispatchTemplateStr() {
		return dispatchTemplateStr;
	}

	public void setDispatchTemplateStr(String dispatchTemplateStr) {
		this.dispatchTemplateStr = dispatchTemplateStr;
	}

	public DispatchDataProvider getDispatchDataProvider() {
		return dispatchDataProvider;
	}

	public void setDispatchDataProvider(DispatchDataProvider dispatchDataProvider) {
		this.dispatchDataProvider = dispatchDataProvider;
	}

	

	public void execute(RuleComplierCallBack complier,Object object){
		
		logger.debug("开始执行单据清分...");
		
		if(kbuilder==null){
			kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
			String dsl=complier.doComplier(provider);//这个方法被重写了
			kbuilder.add(ResourceFactory.newByteArrayResource(dsl.getBytes()), ResourceType.DRL);
			if (kbuilder.hasErrors()) {
				for(KnowledgeBuilderError error : kbuilder.getErrors()){
					logger.error("line:["+error.getErrorLines().toString()+"] message:"+error.getMessage());
				}
				throw new RuntimeException("ERROR-无法编译规则,规则执行失败");
			}
			final Collection<KnowledgePackage> pkgs = kbuilder.getKnowledgePackages();
			kbase = KnowledgeBaseFactory.newKnowledgeBase();
			kbase.addKnowledgePackages(pkgs);
		}
		ksession = kbase.newStatelessKnowledgeSession();
			
		ksession.execute(object);
	
		
		logger.debug("执行规则完成");
	}

	public KnowledgeBuilder getKbuilder() {
		return kbuilder;
	}

	public void setKbuilder(KnowledgeBuilder kbuilder) {
		this.kbuilder = kbuilder;
	}
	
}

 

 

 

public class DispatchDataProvider implements DataProvider {

    private Iterator<DispatchRule> iterator;

    public DispatchDataProvider() {
        
    }
    public void setRules(List<DispatchRule> rows){
    	this.iterator=rows.iterator();
    }
    public boolean hasNext() {
        return iterator.hasNext();
    }

    public String[] next() {
    	DispatchRule nextRule = iterator.next();
        String[] row = new String[]{ nextRule.getRuleName(),
                                     nextRule.getWhenDsl(), 
                                     nextRule.getDealPost()};
        return row;
    }

}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    【热门岗位职责说明书】24、业务员岗位职责范本.doc

    以下是对业务员岗位职责的详细解释: 1. 市场治理与秩序维护:业务员负责指定区域的市场管理,确保市场秩序良好,防止恶性竞争。这需要他们对市场动态有敏锐的洞察力,及时发现并解决可能导致不公平竞争的问题。 2...

    业务分析师岗位职责.pdf

    3. **撰写需求文档**:编写详细的需求规格说明书,这是开发团队进行系统设计和开发的重要依据,包括功能需求、非功能需求和业务规则等。 4. **项目协调**:协调不同的项目干系人,包括开发团队、测试团队、项目经理...

    4、岗位职责和部门职责梳理规则.docx

    文档"4、岗位职责和部门职责梳理规则.docx"提供了一套详细的梳理规则,旨在确保人力资源管理和员工培训的有效进行。 首先,部门职责的梳理是整个过程的基础。部门需要明确其职能概述,用简洁的专业术语概括主要工作...

    外贸业务主管经理岗位职责任职要求.docx

    【外贸业务主管经理岗位职责任职要求】 在外贸行业中,业务主管经理扮演着至关重要的角色,他们不仅是业务拓展的关键人物,也是团队管理的核心。以下是基于给出的文件内容对外贸业务主管经理岗位职责和任职要求的...

    岗位聘用管理办法.doc

    - 技术业务类岗位专注于技术保障和服务提供。 - 操作维护类岗位则负责具体的生产和维护工作。 #### 五、岗位设置与定员核定 1. **管理类岗位**: - 根据公司组织架构设置。 - 定员数量由人力资源部门提出方案,...

    商业银行柜面会计与结算业务.pptx

    总结起来,商业银行柜面会计与结算业务是银行业务运作的基础,涉及到柜员的职责划分、业务处理流程、会计核算规则和存款业务的管理,这些都构成了银行业务高效运行的核心框架。了解并掌握这些知识点对于理解和操作...

    bizbok-业务架构

    5. **业务规则和策略**:定义了业务操作的约束和指导原则,它们对决策和流程有直接影响。 6. **组织结构与角色**:描述了企业中不同部门和岗位的角色和职责,以及它们如何相互作用。 7. **业务指标和度量**:用于...

    客服中心员工岗位晋升实施细则.pdf

    例如,业务岗位等级晋升涉及学历、在岗时间、基本技能(如听打速度、平台点击效率)以及近三月的考评指标(如服务质量分、业务水平、客户感知度)。 晋升路径清晰,从神州行、动感地带、现场支持组的受理席,到VIP...

    技术部门管理办法(岗位与项目)

    系统工程师也遵循同样的分级规则,产品经理则包括助理产品经理、产品经理和高级产品经理等。 在岗位定级方面,新入职员工在试用期内按试用岗位定岗,试用期满后根据能力考核结果确定正式岗位。晋升条件包括通过公司...

    精品资料(2021-2022年收藏)中国农业银行专业序列岗位聘任管理办法.doc

    5. 晋升规则:专业序列岗位可在本序列内晋升,晋升到管理序列或其他专业序列,但晋升等级限制在三级以内。 这个管理办法确保了农业银行在专业序列岗位上的人员选拔和晋升公正、专业且有序,同时也为员工提供了清晰...

    OA办公系统流程命名规则.doc

    命名规则通常采用“[岗位/职位/角色]+环节动作”的形式。例如,“采购部经理审批”、“总裁加签”等。 - **常用环节动作**: - 开场节点:拟稿、提交、发起等。 - 中间节点:加签、审批、审核等。 - 结束节点:...

    高校信息化岗位平台设计思路探析.docx

    3. **权限管理**:细化岗位权限管理规则,根据不同岗位的特点设置相应的权限级别,保证数据的安全性和合规性。 4. **审计与监控**:实施定期的审计和监控机制,对岗位平台的操作日志进行审查,确保操作行为的合规性...

    岗位管理体系5大要素全解读.docx

    - **整分合原则**:确保岗位之间的相互协调和支持。 - **最少岗位数原则**:避免冗余的岗位设置。 - **规范化原则**:岗位设置需遵循一定的标准和规范。 - **客户导向原则**:岗位设计应以客户需求为导向。 - *...

    岗位管理体系5大要素全解读.pdf

    - 整分合原则:确保岗位之间的协同配合。 - 最少岗位数原则:精简岗位数量,避免冗余。 - 规范化原则:制定标准作业流程。 - 客户导向原则:注重内外部客户需求。 - 一般性原则:保持灵活性与适应性。 - **考虑...

    TOGAF:从业务架构到业务需求.docx

    3. **业务规则链接**:针对每一个具体的业务规则,提供详细的描述链接,便于开发人员理解和实现。 通过上述方法,不仅可以有效解决业务架构与业务需求之间的断层问题,还能确保整个开发过程更加高效、有序。TOGAF...

    业务部门考核制度.pdf

    业务提成计算以回款金额为基础,且有明确的发放时间和规则。例如,只有当业务回款达到一定比例时才会发放提成,剩余部分年终一次性发放。同时,提成会扣除相应的客户费用。对于不同类型的业务,如新开发业务和续签...

    人力资源岗位体系建设.pptx

    4. **岗位图谱和称谓**:制定岗位的命名规则和图形表示,以便于理解和沟通。 5. **岗位管理制度**:建立一套规范化的管理制度,包括岗位描述、任职资格、考核标准等,确保岗位管理的公正性和有效性。 【实际应用...

    岗位管理模式研发成果.doc

    制度清单列举了如会议治理、档案治理、发文和收文处理等关键领域的规定,确保业务操作的一致性和合规性。流程部分详细说明了如何执行这些任务,如发文和收文的处理流程,会议的安排和治理,以及行政用车、督查督办、...

    岗位管理体系建设研讨.PPT

    定岗定编是指根据企业的业务需求和战略规划,确定各个部门和岗位的设置数量,合理分配人力资源。这一过程需要综合考虑企业的规模、发展阶段、市场环境等因素,确保人岗匹配,提高组织效率。 六、岗位管理制度的建立...

    岗位设置实施细则宣讲提纲pptPowerPointP.pptx

    总结,这个提纲详尽地阐述了学校在管理岗位和教师岗位设置上的要求和规则,旨在确保学校人力资源的合理配置和有效管理,同时也为教职工提供了清晰的晋升路径和职业发展指导。这样的制度设计有助于提高学校的整体运作...

Global site tag (gtag.js) - Google Analytics