提交 23db10cc 编写于 作者: sq3536's avatar sq3536

modify

上级 26b298c1
package cn.ibizlab.core.extensions.domain;
import cn.ibizlab.core.lite.extensions.domain.ModelObj;
import lombok.Data;
import org.springframework.util.ObjectUtils;
import org.springframework.util.StringUtils;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
@Data
public class BaseRequest
{
private String id;
private String msg;
@Override
public String toString() {
return "BaseRequest{" +
"id='" + id + '\'' +
", msg='" + msg + '\'' +
", datas=" + datas.size() +
", model='" + model + '\'' +
", batch='" + batch + '\'' +
", rules=" + rules.size() +
'}';
}
public String toString2() {
return "BaseRequest{" +
"id='" + id + '\'' +
", msg='" + msg + '\'' +
", datas=" + datas +
", model='" + model + '\'' +
", batch='" + batch + '\'' +
", rules=" + rules.size() +
'}';
}
private List<ModelObj> datas;
private String model;
private String batch;
private List<String> rules;
private SimpleDateFormat format =new SimpleDateFormat("yyyyMMddHHmmss");
public String getBatch()
{
if(batch==null || batch.equals(""))
{
batch= format.format(new java.util.Date())+"["+model+"]";
}
return this.batch;
}
}
package cn.ibizlab.core.extensions.service;
import cn.ibizlab.core.extensions.domain.BaseRequest;
import cn.ibizlab.core.lite.extensions.domain.ModelObj;
import cn.ibizlab.core.rule.domain.ExecLog;
import cn.ibizlab.core.rule.service.IExecLogService;
import cn.ibizlab.core.rule.service.IExecResultService;
import cn.ibizlab.util.errors.BadRequestAlertException;
import com.baomidou.mybatisplus.core.toolkit.IdWorker;
import lombok.extern.slf4j.Slf4j;
import org.kie.api.KieBase;
import org.kie.api.KieServices;
import org.kie.api.builder.*;
import org.kie.api.cdi.KContainer;
import org.kie.api.definition.KiePackage;
import org.kie.api.definition.rule.Rule;
import org.kie.api.io.Resource;
import org.kie.api.runtime.KieContainer;
import org.kie.api.runtime.KieSession;
import org.kie.api.runtime.rule.FactHandle;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import java.sql.Timestamp;
import java.util.Collection;
import java.util.Hashtable;
import java.util.List;
/**
* 规则服务对象接口
*/
@Service
@Primary
@Slf4j
public class BaseEntityServiceImpl
{
public BaseEntityServiceImpl()
{
System.setProperty("drools.dateformat", "yyyy/MM/dd HH:mm:ss");
KieServices ks = KieServices.Factory.get();
KieContainer kContainer = ks.getKieClasspathContainer();
}
public void saveResult(ModelObj param, String RULECODE, String RULENAME, String RU_EXECRESULTNAME, String BUSINESSCAT, Integer RETVALUE, String KEYVALUEFIELD, String DOMAINSFIELD, Double METRICFIELD,
Timestamp TIMEFIELD, String EXT1FIELD, String EXT2FIELD)
{
}
@Autowired
private IExecResultService ruExecResultService;
protected Hashtable<String, KieSession> setkieSession=new Hashtable<String,KieSession>();
protected Hashtable<String,KieContainer> setKc=new Hashtable<String,KieContainer>();
protected Hashtable<String,Integer> setRuleCount=new Hashtable<String,Integer>();
public void printFactsMessageCount(KieSession kieSession)
{
Collection allHandles = kieSession.getFactHandles();
String msg = new StringBuilder().append("\nAll facts count:").append(allHandles.size()).append("\n").toString();
log.debug(msg);
}
public void printFactsMessage(KieSession kieSession)
{
Collection<FactHandle> allHandles = kieSession.getFactHandles();
String msg = "\nAll facts:\n";
for (FactHandle handle : allHandles)
msg = new StringBuilder().append(msg).append(" ").append(kieSession.getObject(handle)).append("\n").toString();
log.debug(msg);
}
public void DeleteFactsMessage(KieSession kieSession)
{
Collection<FactHandle> allHandles = kieSession.getFactHandles();
String msg = "\nAll facts:\n";
for (FactHandle handle : allHandles)
kieSession.delete(handle);
}
public static String prettyBuildMessage(Message msg)
{
return new StringBuilder().append("Message: {id=").append(msg.getId()).append(", level=").append(msg.getLevel()).append(", path=").append(msg.getPath()).append(", line=").append(msg.getLine())
.append(", column=").append(msg.getColumn()).append(", text=\"").append(msg.getText()).append("\"}").toString();
}
public static String knowledgeBaseDetails(KieBase kbase)
{
if (kbase == null)
return "Knowledge Base is null.";
StringBuilder sb = new StringBuilder("Knowledge base built from the following packages:");
Collection<KiePackage> packages = kbase.getKiePackages();
for (KiePackage kp : packages)
{
sb.append(new StringBuilder().append("\n Package: [").append(kp.getName()).append("]").toString());
for (Rule rule : kp.getRules())
sb.append(new StringBuilder().append("\n Rule: [").append(rule.getName()).append("]").toString());
}
return sb.toString();
}
public void initCommonData()
{
try
{
}
catch (Exception ex)
{
log.error("baseservice:initcommondata:" + ex.getMessage());
}
}
@Value("${ibiz.rulepath:}")
private String drlpath;
public void reset(String keyC)
{
if(setKc.containsKey(keyC))
{
try
{
setKc.get(keyC).dispose();
}
catch (Exception ex){}
setKc.remove(keyC);
}
}
public String initRule(List<String> rulefilelist,String keyC)
{
String strRt="";
try
{
initCommonData();
String strResId= "RES"+ IdWorker.getIdStr();
KieContainer kContainer=null;
if(setKc.containsKey(keyC))
{
kContainer=setKc.get(keyC);
}
else{
KieServices ks = KieServices.Factory.get();
KieRepository kr = ks.getRepository();
KieFileSystem kfs = ks.newKieFileSystem();
for (String rulefile : rulefilelist)
{
log.debug(new StringBuilder().append("init rule file: rules/").append(rulefile).toString());
//Resource rs = ks.getResources().newClassPathResource(new StringBuilder().append("rules/").append(rulefile).toString());
String path=(new StringBuilder().append(rulefile).toString());
Resource rs = ks.getResources().newFileSystemResource(path.replace("\\","/"),"UTF-8");
kfs.write(rs);
}
KieBuilder kb = ks.newKieBuilder(kfs);
kb.buildAll();
if (kb.getResults().hasMessages(new Message.Level[] { Message.Level.ERROR }))
{
List<Message> errors = kb.getResults().getMessages(new Message.Level[] { Message.Level.ERROR });
StringBuilder sb = new StringBuilder("Errors:");
for (Message msg : errors)
{
sb.append(new StringBuilder().append("\n ").append(prettyBuildMessage(msg)).toString());
}
log.error(new StringBuilder().append("build rule failed:").append(sb.toString()).toString());
return "";
}
log.info(new StringBuilder().append("KieServices built: ").append(toString()).toString());
kContainer = ks.newKieContainer(kr.getDefaultReleaseId());
setKc.put(keyC, kContainer);
}
KieSession kieSession = kContainer.newKieSession();
kieSession.setGlobal("BaseService", this);
setkieSession.put(strResId,kieSession);
setRuleCount.put(strResId,rulefilelist.size());
strRt=strResId;
}
catch (Exception e)
{
log.error(e.toString());
return "";
}
return strRt;
}
public void processRule(ModelObj entity, String strCurKeyValue,String strResId) throws Exception
{
if(!setkieSession.containsKey(strResId))
{
log.error("Service规则容器查找失败:" + strResId);
throw new Exception("Service规则容器查找失败:" + strResId);
}
KieSession kieSession=setkieSession.get(strResId);
int rulescount=setRuleCount.get(strResId);
FactHandle fireHandle = kieSession.insert(entity);
int rulesFired = 0;
printFactsMessageCount(kieSession);
// for (int iloop = 0; iloop < this.rulescount; ++iloop)
// {
try
{
rulesFired = kieSession.fireAllRules(rulescount);
}
catch (Exception e)
{
log.error("Service规则执行错误:" + e.toString());
throw e;
}
finally
{
try
{
kieSession.delete(fireHandle);
}
catch (Exception ex){}
}
// }
log.info(new StringBuilder().append("Service,Process ").append(rulesFired).append(" rules for record.\n").toString());
}
@Autowired
protected IExecLogService ruExecLogService;
public ExecLog processAll(BaseRequest msg)
{
ExecLog execlog=new ExecLog();
execlog.setId(msg.getId());
execlog.setName(msg.getBatch());
execlog.setKeyValueField(msg.getModel());
execlog.setRunBody(msg.toString());
ruExecLogService.save(execlog);
StringBuilder strErrorInfo=new StringBuilder();
int count = 0;
int errorcount = 0;
String strResId=initRule(msg.getRules(),msg.getBatch());
if (StringUtils.isEmpty(strResId))
{
strErrorInfo.append("准备rule文件错误");
strErrorInfo.append("\r\n");
execlog.setRetCode(2);
execlog.setCnt(count);
execlog.setSucc(errorcount);
execlog.setRunResult(strErrorInfo.toString());
ruExecLogService.save(execlog);
return execlog;
}
try
{
for (ModelObj modelObj : msg.getDatas())
{
try
{
count++;
modelObj.set("BATCH",msg.getBatch());
processRule(modelObj, modelObj.getRowKey(),strResId);
}
catch (Exception e)
{
errorcount++;
log.error("Service错误,加载数据详细信息:" + modelObj.getRowKey() + "," + e.getMessage());
if (strErrorInfo.toString().length() <= 5000)
{
strErrorInfo.append("加载数据详细信息:" + modelObj.getRowKey() + ",错误:" + e.getMessage());
strErrorInfo.append("\r\n");
if (e.getCause() != null && e.getCause().getMessage() != null)
{
strErrorInfo.append(e.getCause().getMessage());
strErrorInfo.append("\r\n");
}
}
}
}
}
catch(Exception e)
{
log.error("Service读取BaseRequest错误:" + e.toString());
strErrorInfo.append("读取BaseRequest错误:" + e.getMessage());
strErrorInfo.append("\r\n");
if (e.getCause() != null && e.getCause().getMessage() != null)
{
strErrorInfo.append(e.getCause().getMessage());
strErrorInfo.append("\r\n");
}
execlog.setRetCode(1);
execlog.setCnt(count);
if (errorcount == 0)
execlog.setSucc(0);
else
execlog.setSucc(count-errorcount);
execlog.setRunResult(strErrorInfo.toString());
ruExecLogService.save(execlog);
return execlog;
}
finally
{
if(setkieSession.containsKey(strResId))
{
KieSession kieSession=setkieSession.get(strResId);
try
{
kieSession.dispose();
}
catch (Exception ex){}
setkieSession.remove(strResId);
setRuleCount.remove(strResId);
}
}
log.info(new StringBuilder().append("Service成功,process successfully:").append(msg.toString()).toString());
strErrorInfo.append("Service成功,process successfully\r\n");
execlog.setCnt(count);
execlog.setSucc(count-errorcount);
if(execlog.getCnt()==0)
execlog.setRetCode(3);
else
execlog.setRetCode(0);
execlog.setRunResult(strErrorInfo.toString());
this.ruExecLogService.save(execlog);
return execlog;
}
}
\ No newline at end of file
......@@ -9,6 +9,7 @@ import com.fasterxml.jackson.annotation.JsonIgnore;
import org.springframework.util.StringUtils;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Calendar;
......@@ -283,8 +284,19 @@ public class ModelObj extends DataObj<String,Object> {
{
String name=epair[0];
String column=epair[1];
//if(this.get(key))
return this.getEntity(name).get(column);
Property property=this.getDataModel().findObjectProperty(name,"UP");
if(property!=null)
return this.getEntity(name).get(column);
property=this.getDataModel().findObjectProperty(name,"DOWN");
if(property!=null)
{
return this.getNested(property.getOwnerDataModel().getDataModelName()).get(column);
}
if(this.getParent()!=null)
return this.getParent().$(key);
}
}
......@@ -305,7 +317,6 @@ public class ModelObj extends DataObj<String,Object> {
public boolean IF(String cond)
{
String[] arr=cond.split("\\s+");
......
......@@ -7,6 +7,7 @@ import com.fasterxml.jackson.annotation.JsonIgnore;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.LinkedHashSet;
public class NestedArray extends ArrayList<ModelObj> {
......@@ -64,4 +65,54 @@ public class NestedArray extends ArrayList<ModelObj> {
return last;
}
public LinkedHashSet<Object> get(String key)
{
LinkedHashSet<Object> list=new LinkedHashSet<>();
if(key==null)
return null;
if(key.indexOf(".")>0)
{
String[] epair=key.toString().split("[.]");
if(epair.length>=2)
{
String name=epair[0];
String column=epair[1];
this.forEach(modelObj -> {
Object obj=modelObj.getEntity(name).get(column);
if(obj!=null)
list.add(obj);
});
}
}
return list;
}
public LinkedHashSet<Object> get(String key,String cond)
{
LinkedHashSet<Object> list=new LinkedHashSet<>();
if(key==null)
return null;
if(key.indexOf(".")>0)
{
String[] epair=key.toString().split("[.]");
if(epair.length>=2)
{
String name=epair[0];
String column=epair[1];
this.forEach(modelObj -> {
if(modelObj.IF(cond))
{
Object obj=modelObj.getEntity(name).get(column);
if(obj!=null)
list.add(obj);
}
});
}
}
return list;
}
}
Markdown 格式
0% or
您添加了 0 到此讨论。请谨慎行事。
先完成此消息的编辑!
想要评论请 注册