提交 69558065 编写于 作者: zhouweidong's avatar zhouweidong

dst功能迁移

上级 a9068ea8
package cn.ibizlab.core.extensions.domain;
import cn.ibizlab.core.extensions.util.IEntityActionHelper;
import cn.ibizlab.util.helper.RuleUtils;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import lombok.Data;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Hashtable;
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;
@JsonIgnoreProperties(ignoreUnknown = true)
@Data
public class BaseEntity extends ConcurrentHashMap implements IEntity {
public String KEY;
public String ENTITYNAME;
public String KEYFIELDNAME;
public BaseEntity FACTENTITY;
public BaseEntity getFACTENTITY()
{
return FACTENTITY;
}
public void setFACTENTITY(BaseEntity FACTENTITY)
{
this.FACTENTITY = FACTENTITY;
}
@Override
public String toString()
{
return "";
}
public BaseEntity findRoot(String key)
{
if(key.equalsIgnoreCase("root")&&super.containsKey("rootentity"))
{
return (BaseEntity)super.get("rootentity");
}
return null;
}
public void regesitAttr(String key,BaseEntity val)
{
if(key.equalsIgnoreCase("root")&& !super.containsKey("rootentity"))
super.put("rootentity", val);
}
private IEntityActionHelper iEntityActionHelper = null;
public static BaseEntity createEntity(String factentity,BaseEntity item)
{
try
{
BaseEntity bt=(BaseEntity)Class.forName("net.ibizsys.dst.common.domain."+factentity).newInstance();
bt.putAll(item);
bt.regesitAttr("root", bt);
return bt;
}catch (Exception ex)
{
BaseEntity bt=new BaseEntity();
bt.putAll(item);
bt.regesitAttr("root", bt);
return bt;
}
}
private BaseField nullFiled=new BaseField();
@Override
public IField $(String key)
{
if(StringUtils.isEmpty(key))
return nullFiled;
Object obj=this.get(key);
if(obj instanceof IField)
{
IField f= (IField)obj;
if(f.getValue()!=null&&key.indexOf(".")>0)
{
String[] arr=key.split("[.]");
if(arr.length>=2)
{
if((!StringUtils.isEmpty(arr[0]))&&(!StringUtils.isEmpty(arr[1])))
{
f.setEntity(arr[0]);
f.setField(arr[1]);
}
}
}
return f;
}
else
return nullFiled;
}
@Override
public Double $D(String key)
{
IField field=this.$(key);
Object val=field.getValue();
if(val==null)
return 0d;
else if((val instanceof Integer)||(val instanceof Double)||(val instanceof Long)||(val instanceof BigDecimal)||(val instanceof BigInteger)||(val instanceof Float))
return (double)val;
return 1d;
}
@Override
public boolean IF(String cond)
{
return test(cond);
}
public boolean isDel(String members)
{
String[] arr=members.split("[.]");
if(arr.length>=2&&(!StringUtils.isEmpty(arr[0])))
{
if(this.get(arr[0]+".SFSC")!=null)
{
if(this.get(arr[0]+".SFSC").toString().equals("Y")||this.get(arr[0]+".SFSC").toString().equals("1"))
{
return true;
}
}
}
return false;
}
@Override
public boolean test(String cond)
{
String[] arr=cond.split("\\s+");
String option="";
String members="";
String exp="";
if(arr.length>=2)
{
members=arr[0];
option=arr[1];
}
String[] ms=members.split("[.]");
if(ms.length>=2&&(!StringUtils.isEmpty(ms[0])))
{
Object sub=this.get(ms[0]);
if(sub!=null&& sub instanceof BaseEntityList)
{
return ((BaseEntityList)sub).test(cond);
}
}
if(arr.length>=3)
{
exp=arr[2];
if(exp.startsWith("%"))
{
if(isDel(members))
{
return false;
}
return test(this, members, option, execFunc(exp));
}
}
if(isDel(members))
{
return false;
}
return test(this, members, option, exp);
}
private Object execFunc(String exp)
{
Object rt=null;
exp=exp.replace("%", "").trim();
if(exp.startsWith("DAY("))
{
Calendar calendar = Calendar.getInstance();
String quStr=exp.substring(exp.indexOf("(")+1,exp.indexOf(")"));
quStr=quStr.replace("+","").trim();
int day=0;
if(!StringUtils.isEmpty(quStr)){
day= Integer.parseInt(quStr);
}
calendar.add(Calendar.DATE, day);
return new Timestamp(calendar.getTime().getTime());
}
else if(exp.endsWith(")"))
{
String quStr=exp.substring(exp.indexOf("(")+1,exp.indexOf(")"));
exp = exp.substring(0,exp.indexOf("(")).trim();
quStr=quStr.replace("+","").trim();
Integer day=0;
if(!StringUtils.isEmpty(quStr)){
day= Integer.parseInt(quStr);
}
Object val=null;
if(this.findRoot("root")!=null)
val= this.findRoot("root").$(exp).getValue();
else
val= this.$(exp).getValue();
if(val!=null)
{
if(val instanceof Timestamp)
{
Calendar calendar = Calendar.getInstance();
calendar.setTime((Timestamp)val);
calendar.add(Calendar.DATE, day);
return new Timestamp(calendar.getTime().getTime());
}
else if(val instanceof Integer)
{
return (int)val+day;
}
else if(val instanceof BigDecimal)
{
return ((BigDecimal)val).intValue()+day;
}
}
return val;
}
if(this.findRoot("root")!=null)
return this.findRoot("root").$(exp).getValue();
return this.$(exp).getValue();
}
public static boolean test(BaseEntity object,String members,String option,Object exp)
{
Object obj=object.getObj(members);
if(obj==null)
obj=new BaseField();
if(!(obj instanceof IField))
return false;
IField field=(IField)obj;
if(option.equalsIgnoreCase("eq")||option.equalsIgnoreCase("equal")||option.equalsIgnoreCase("="))
return field.EQ(exp);
else if (option.equalsIgnoreCase("noteq")||option.equalsIgnoreCase("notequal")||option.equalsIgnoreCase("<>")||option.equalsIgnoreCase("!="))
return field.NOTEQ(exp);
else if (option.equalsIgnoreCase("gt")||option.equalsIgnoreCase(">"))
return field.GT(exp);
else if (option.equalsIgnoreCase("lt")||option.equalsIgnoreCase("<"))
return field.LT(exp);
else if (option.equalsIgnoreCase("gtandeq")||option.equalsIgnoreCase("ge")||option.equalsIgnoreCase(">="))
return field.GTANDEQ(exp);
else if (option.equalsIgnoreCase("ltandeq")||option.equalsIgnoreCase("le")||option.equalsIgnoreCase("<="))
return field.LTANDEQ(exp);
else if (option.equalsIgnoreCase("null")||option.equalsIgnoreCase("isnull"))
return field.ISNULL(exp);
else if (option.equalsIgnoreCase("notnull")||option.equalsIgnoreCase("isnotnull"))
return field.ISNOTNULL(exp);
else if (option.equalsIgnoreCase("like")||option.equalsIgnoreCase("matchor"))
return field.LIKE(exp.toString());
else if (option.equalsIgnoreCase("leftlike")||option.equalsIgnoreCase("startswith"))
return field.LEFTLIKE(exp.toString());
else if (option.equalsIgnoreCase("rightlike")||option.equalsIgnoreCase("endswith"))
return field.RIGHTLIKE(exp.toString());
else if (option.equalsIgnoreCase("match")||option.equalsIgnoreCase("matchand")||option.equalsIgnoreCase("matches"))
return field.MATCHES(exp.toString());
else if (option.equalsIgnoreCase("in"))
return field.IN(exp.toString());
else if (option.equalsIgnoreCase("notin"))
return field.NOTIN(exp.toString());
else if (option.equalsIgnoreCase("inc2s"))
return field.INC2S(exp.toString());
else if (option.equalsIgnoreCase("notinc2s"))
return field.NOTINC2S(exp.toString());
else if (option.equalsIgnoreCase("NOTLIKE"))
return field.NOTLIKE(exp.toString());
else if (option.equalsIgnoreCase("LEFTNOTLIKE"))
return field.LEFTNOTLIKE(exp.toString());
else if (option.equalsIgnoreCase("RIGHTNOTLIKE"))
return field.RIGHTNOTLIKE(exp.toString());
else if (option.equalsIgnoreCase("NOTMATCHES"))
return field.NOTMATCHES(exp.toString());
else
return false;
}
@Override
public void setActionHelper(IEntityActionHelper iEntityActionHelper) {
this.iEntityActionHelper = iEntityActionHelper;
}
@Override
public IEntityActionHelper getActionHelper()
{
if (this.iEntityActionHelper == null ) {
return null;
}
return this.iEntityActionHelper;
}
@Override
public List<BaseEntity> selectRow(String dblink,String sql)
{
return this.getActionHelper().select(dblink,sql);
}
public void onFillObj(Object key)
{
if(key.toString().equalsIgnoreCase(this.ENTITYNAME))
{
if(this.getFACTENTITY()==null)
this.set(key.toString(), this);
else
this.set(key.toString() ,this.getFACTENTITY());
return ;
}
DSTEntityModel entityModel =this.getActionHelper().getModel(this.ENTITYNAME);
DSTEntityModel refmodel =this.getActionHelper().getModel(key.toString());
if (refmodel!=null&&entityModel!=null&&entityModel.getLookups().containsKey(key.toString()))
{
this.getRow(refmodel.getDblink(),key.toString(),refmodel.getSqltable(),entityModel.getLookups().get(key.toString()).getSelectCondition(),entityModel.getLookups().get(key.toString()).getParamsCondition());
}
else{
BaseEntity ret=new BaseEntity();
this.put(key,ret);
}
}
private Object objLock=new Object();
private Hashtable<Object,Integer> filled=new Hashtable<Object,Integer>();
@Override
public IEntity $E(String key) {
synchronized (objLock)
{
if(!filled.containsKey(key))
{
// if(!StringUtils.isEmpty(CodeListBase.getCodeListText("DST_CLEntityCodeList",key.toString())))
// this.onFillObj(key);
filled.put(key,1);
}
}
Object val=super.get(key);
if(val instanceof IEntity)
return (IEntity)val;
else if(val!=null&&val.getClass().isArray()){
BaseEntityList list=new BaseEntityList();
List<BaseEntity> acts=(ArrayList)val;
if(acts.size()==1)
{
this.put(key,acts.get(0));
return acts.get(0);
}
for(BaseEntity item : acts)
list.add(item);
this.put(key, list);
}
else{
val = new BaseEntity();
this.put(key, val);
}
return (IEntity)val;
}
@Override
public Object get(Object key) {
if(key.toString().indexOf(".")>0)
return this.getObj(key.toString());
synchronized (objLock)
{
if(!filled.containsKey(key))
{
// if(!StringUtils.isEmpty(CodeListBase.getCodeListText("DST_CLEntityCodeList",key.toString())))
// this.onFillObj(key);
filled.put(key,1);
}
}
Object val=super.get(key);
if(val instanceof IField)
return val;
else if(val instanceof IEntity)
return val;
else if(val!=null&&val.getClass().isArray()){
BaseEntityList list=new BaseEntityList();
List<BaseEntity> acts=(ArrayList)val;
if(acts.size()==1)
{
this.put(key,acts.get(0));
return acts.get(0);
}
for(BaseEntity item : acts)
list.add(item);
this.put(key, list);
}
else{
BaseField field=new BaseField();
field.setValue(val);
this.put(key, field);
}
return val;
}
@Override
public Object put(Object key, Object val) {
if(val instanceof IField)
return super.put(key, val);
else if(val instanceof IEntity) {
((IEntity) val).setENTITYNAME(key.toString());
((IEntity) val).regesitAttr("root", this.findRoot("root"));
return super.put(key, val);
}
else if(val!=null&&val.getClass().isArray()){
BaseEntityList list=new BaseEntityList();
List<BaseEntity> acts=(ArrayList)val;
if(acts.size()==1)
{
acts.get(0).setENTITYNAME(key.toString());
acts.get(0).regesitAttr("root",this.findRoot("root"));
return super.put(key,acts.get(0));
}
for(BaseEntity item : acts)
{
item.setENTITYNAME(key.toString());
item.regesitAttr("root",this.findRoot("root"));
list.add(item);
}
list.setENTITYNAME(key.toString());
list.regesitAttr("root",this.findRoot("root"));
return super.put(key, list);
}
else
{
BaseField field=new BaseField();
field.setValue(val);
return super.put(key, field);
}
}
public void putEntity(String key,BaseEntity val) {
if (val == null) {
return;
}
synchronized (objLock) {
if (!filled.containsKey(key)) {
this.put(key, val);
filled.put(key, 1);
return;
}
}
}
public void addEntity(String key,BaseEntity val)
{
if (val==null)
{
return;
}
val.setENTITYNAME(key);
val.regesitAttr("root",this.findRoot("root"));
synchronized (objLock)
{
if(!filled.containsKey(key))
{
this.put(key, val);
filled.put(key,1);
return ;
}
}
Object obj=super.get(key);
if(obj instanceof BaseEntity)
{
BaseEntityList list=new BaseEntityList();
list.add((BaseEntity)obj);
list.add(val);
list.setENTITYNAME(key);
list.regesitAttr("root",this.findRoot("root"));
this.put(key,list);
}
else if(obj instanceof BaseEntityList)
{
((BaseEntityList)obj).add(val);
}
else
{
this.put(key, val);
}
}
public Object set(Object key, Object val)
{
return this.put(key,val);
}
public Object getObj(String key)
{
return RuleUtils.getObj(this,key);
}
public Object getRow(String dblink,String itemkey,String selectcommand,String lookupcond,List<String> lookupkeys)
{
if(StringUtils.isEmpty(selectcommand))
selectcommand="select * from " + itemkey + " where 1=1 ";
List<String> params=new ArrayList<String>();
for(String lookupkey:lookupkeys)
{
Object key=this.getObj(lookupkey);
if((key instanceof IField))
{
params.add(((IField) key).getCondValue());
}
else
params.add("null");
}
List<BaseEntity> list= this.selectRow( dblink,selectcommand+String.format(lookupcond,params.toArray()));
if(list==null||list.size()==0)
{
BaseEntity ret=new BaseEntity();
this.put(itemkey,ret);
return ret;
}
else if(list.size()==1)
{
this.put(itemkey,list.get(0));
return list.get(0);
}
else
{
BaseEntityList rt=new BaseEntityList();
for(BaseEntity item : list)
{
item.setENTITYNAME(itemkey);
item.regesitAttr("root",this.findRoot("root"));
rt.add(item);
}
this.put(itemkey, rt);
return rt;
}
}
}
\ No newline at end of file
package cn.ibizlab.core.extensions.domain;
import cn.ibizlab.core.extensions.util.IEntityActionHelper;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import lombok.Data;
import org.springframework.util.StringUtils;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.List;
@JsonIgnoreProperties(ignoreUnknown = true)
@Data
public class BaseEntityList extends ArrayList<BaseEntity> implements IEntity {
public String KEY;
public String ENTITYNAME;
private BaseField nullFiled=new BaseField();
private BaseEntity root;
public void regesitAttr(String key,BaseEntity val)
{
if(key.equalsIgnoreCase("root")&&root==null)
root=val;
}
@Override
public IEntity $E(String key) {
return new BaseEntity();
}
@Override
public Object get(Object key) {
if(key instanceof Integer)
return super.get((int)key);
BaseFieldList list=new BaseFieldList();
for(BaseEntity item:this)
{
Object val=item.get(key);
if(val instanceof BaseField)
list.add((BaseField)val);
}
if(list.size()==1)
return list.get(0);
else if(list.size()==0)
return nullFiled;
else
return list;
}
@Override
public IField $(String key)
{
if(StringUtils.isEmpty(key))
return nullFiled;
Object obj=this.get(key);
if(obj instanceof IField)
{
IField f= (IField)obj;
if(f.getValue()!=null&&key.indexOf(".")>0)
{
String[] arr=key.split("[.]");
if(arr.length>=2)
{
if((!StringUtils.isEmpty(arr[0]))&&(!StringUtils.isEmpty(arr[1])))
{
f.setEntity(arr[0]);
f.setField(arr[1]);
}
}
}
return f;
}
else
return nullFiled;
}
@Override
public Double $D(String key)
{
IField field=this.$(key);
Object val=field.getValue();
if(field instanceof BaseFieldList)
val=((BaseFieldList) field).get(0);
if(val==null)
return 0d;
else if((val instanceof Integer)||(val instanceof Double)||(val instanceof Long)||(val instanceof BigDecimal)||(val instanceof BigInteger)||(val instanceof Float))
return (double)val;
return 1d;
}
@Override
public boolean IF(String cond)
{
return test(cond);
}
@Override
public boolean test(String cond)
{
{
for(BaseEntity obj:this)
{
obj.setENTITYNAME(this.ENTITYNAME);
if(obj.test(cond))
return true;
}
return false;
}
}
private IEntityActionHelper iEntityActionHelper = null;
@Override
public void setActionHelper(IEntityActionHelper iEntityActionHelper) {
this.iEntityActionHelper = iEntityActionHelper;
}
@Override
public IEntityActionHelper getActionHelper()
{
if (this.iEntityActionHelper == null ) {
return null;
}
return this.iEntityActionHelper;
}
@Override
public List<BaseEntity> selectRow(String dblink,String sql)
{
return (BaseEntityList)this.getActionHelper().select(dblink,sql);
}
}
\ No newline at end of file
package cn.ibizlab.core.extensions.domain;
import cn.ibizlab.util.helper.RuleUtils;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import lombok.Data;
import org.springframework.util.ObjectUtils;
import java.io.BufferedReader;
import java.io.Reader;
import java.math.BigDecimal;
import java.math.BigInteger;
@JsonIgnoreProperties(ignoreUnknown = true)
@Data
public class BaseField implements IField {
private String field;
private String entity;
private Object value=null;
public void setValue(Object value)
{
if(value instanceof java.sql.Clob)
{
// Clob类型 转String
BufferedReader br =null;
Reader is = null;
try {
String reString = "";
is = ((java.sql.Clob)value).getCharacterStream();
br = new BufferedReader(is);
String s = br.readLine();
StringBuffer sb = new StringBuffer();
while (s != null) {
sb.append(s);
s = br.readLine();
}
reString = sb.toString();
this.value=reString;
}
catch (Exception ex)
{
}
finally {
try
{
if(br!=null){
br.close();
}
}
catch (Exception ex)
{}
try
{
if(is!=null){
is.close();
}
}
catch (Exception ex)
{}
}
}
else
this.value=value;
}
public Object getValue()
{
return this.value;
}
@Override
public String getCondValue() {
Object val=getValue();
if(ObjectUtils.isEmpty(val))
return "null";
String str="";
if((val instanceof Integer)||(val instanceof Double)||(val instanceof Long)||(val instanceof BigDecimal)||(val instanceof BigInteger)||(val instanceof Float))
str=val.toString();
else
str="'"+val.toString()+"'";
return str;
}
@Override
public Object getFecthValue() {
return getValue();
}
public static BaseField from(Object value)
{
BaseField field=new BaseField();
field.setValue(value);
return field;
}
@Override
public boolean EQ(Object val) {
return RuleUtils.equal(val, this.value);
}
@Override
public boolean NOTEQ(Object val) {
return !RuleUtils.equal(val, this.value);
}
@Override
public boolean GTANDEQ(Object val) {
return RuleUtils.ge(val,this.value);
}
@Override
public boolean GT(Object val) {
return RuleUtils.gt(val, this.value);
}
@Override
public boolean LTANDEQ(Object val) {
return RuleUtils.le(val,this.value);
}
@Override
public boolean LT(Object val) {
return RuleUtils.lt(val,this.value);
}
@Override
public boolean ISNULL(Object val) {
return RuleUtils.isNull(this.value);
}
@Override
public boolean ISNOTNULL(Object val) {
return RuleUtils.isNotNull(this.value);
}
@Override
public boolean LIKE(String val) {
return RuleUtils.matchor(val, this.value);
}
@Override
public boolean LEFTLIKE(String val) {
return RuleUtils.leftmatchor(val, this.value);
}
@Override
public boolean RIGHTLIKE(String val) {
return RuleUtils.rightmatchor(val, this.value);
}
@Override
public boolean IN(String val) {
return RuleUtils.in(val, this.value);
}
@Override
public boolean NOTIN(String val) {
return RuleUtils.notin(val, this.value);
}
@Override
public boolean INC2S(String val) {
return RuleUtils.inc2s(val, this.value);
}
@Override
public boolean NOTINC2S(String val) {
return RuleUtils.notinc2s(val, this.value);
}
@Override
public boolean MATCHES(String val) {
return RuleUtils.matchand(val, this.value);
}
@Override
public String toString()
{
if(ObjectUtils.isEmpty(this.getValue()))
return "";
else
return this.getValue().toString();
}
@Override
public boolean NOTLIKE(String val) {
return !LIKE(val);
}
@Override
public boolean LEFTNOTLIKE(String val) {
return !LEFTLIKE(val);
}
@Override
public boolean RIGHTNOTLIKE(String val) {
return !RIGHTLIKE(val);
}
@Override
public boolean NOTMATCHES(String val) {
return !MATCHES(val);
}
}
\ No newline at end of file
package cn.ibizlab.core.extensions.domain;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import lombok.Data;
import org.springframework.util.ObjectUtils;
import org.springframework.util.StringUtils;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Hashtable;
@JsonIgnoreProperties(ignoreUnknown = true)
@Data
public class BaseFieldList extends ArrayList<BaseField> implements IField {
private String field;
private String entity;
public Object getValue()
{
String rt="";
Hashtable<Object,Integer> setcheck=new Hashtable<Object, Integer>();
if(this.size()==0)
return null;
if(this.size()==1)
return this.get(0).getValue();
Object sObj=null;
for(BaseField obj:this)
{
Object val=obj.getValue();
if(ObjectUtils.isEmpty(val))
continue;
if(setcheck.containsKey(val))
continue;
else
setcheck.put(val,1);
String str=val.toString();
sObj=val;
if(!StringUtils.isEmpty(rt))
rt=rt+",";
rt=rt+str;
}
if(StringUtils.isEmpty(rt))
rt=null;
if(setcheck.size()==1)
return sObj;
return rt;
}
@Override
public String getCondValue() {
String rt="";
Hashtable<Object,Integer> setcheck=new Hashtable<Object, Integer>();
for(BaseField obj:this)
{
Object val=obj.getValue();
if(ObjectUtils.isEmpty(val))
continue;
if(setcheck.containsKey(val))
continue;
else
setcheck.put(val,1);
String str="";
if((val instanceof Integer)||(val instanceof Double)||(val instanceof Long)||(val instanceof BigDecimal)||(val instanceof BigInteger)||(val instanceof Float))
str=val.toString();
else
str="'"+val.toString()+"'";
if(!StringUtils.isEmpty(rt))
rt=rt+",";
rt=rt+str;
}
if(StringUtils.isEmpty(rt))
rt="null";
return rt;
}
@Override
public Object getFecthValue() {
return null;
}
@Override
public boolean EQ(Object val) {
for(BaseField obj:this)
if(obj.EQ(val))
return true;
return false;
}
@Override
public boolean NOTEQ(Object val) {
return !EQ(val);
}
@Override
public boolean GTANDEQ(Object val) {
for(BaseField obj:this)
if(obj.GTANDEQ(val))
return true;
return false;
}
@Override
public boolean GT(Object val) {
for(BaseField obj:this)
if(obj.GT(val))
return true;
return false;
}
@Override
public boolean LTANDEQ(Object val) {
for(BaseField obj:this)
if(obj.LTANDEQ(val))
return true;
return false;
}
@Override
public boolean LT(Object val) {
for(BaseField obj:this)
if(obj.LT(val))
return true;
return false;
}
@Override
public boolean ISNULL(Object val) {
for(BaseField obj:this)
if(obj.ISNULL(val))
return true;
return false;
}
@Override
public boolean ISNOTNULL(Object val) {
return !ISNULL(val);
}
@Override
public boolean LIKE(String val) {
for(BaseField obj:this)
if(obj.LIKE(val))
return true;
return false;
}
@Override
public boolean LEFTLIKE(String val) {
for(BaseField obj:this)
if(obj.LEFTLIKE(val))
return true;
return false;
}
@Override
public boolean RIGHTLIKE(String val) {
for(BaseField obj:this)
if(obj.RIGHTLIKE(val))
return true;
return false;
}
@Override
public boolean IN(String val) {
for(BaseField obj:this)
if(obj.IN(val))
return true;
return false;
}
@Override
public boolean NOTIN(String val) {
return !IN(val);
}
@Override
public boolean INC2S(String val) {
for(BaseField obj:this)
if(obj.INC2S(val))
return true;
return false;
}
@Override
public boolean NOTINC2S(String val) {
return !INC2S(val);
}
@Override
public boolean MATCHES(String val) {
for(BaseField obj:this)
if(obj.MATCHES(val))
return true;
return false;
}
@Override
public String toString()
{
if(ObjectUtils.isEmpty(this.getValue()))
return "";
else
{
String rt="";
for(BaseField obj:this)
{
Object val=obj.getValue();
if(ObjectUtils.isEmpty(val))
continue;
String str=val.toString();
if(!StringUtils.isEmpty(rt))
rt=rt+",";
rt=rt+str;
}
if(StringUtils.isEmpty(rt))
rt="";
return rt;
}
}
@Override
public boolean NOTLIKE(String val) {
return !LIKE(val);
}
@Override
public boolean LEFTNOTLIKE(String val) {
return !LEFTLIKE(val);
}
@Override
public boolean RIGHTNOTLIKE(String val) {
return !RIGHTLIKE(val);
}
@Override
public boolean NOTMATCHES(String val) {
return !MATCHES(val);
}
}
\ No newline at end of file
package cn.ibizlab.core.extensions.domain;
import cn.ibizlab.core.lite.domain.MetaField;
import lombok.Data;
import java.io.Serializable;
import java.util.List;
import java.util.Map;
@Data
public class DSTEntityModel implements Serializable {
private String dblink;
private String sqltable;
private String sqlKeyField;
private String getCondition;
private Map<String,DSTLookupModel> lookups;
private List<String > releations;
private List<String > subentity;
private List<MetaField> keyFields;
private List<MetaField> f1nFields;
private List<MetaField> fn1Fields;
private String lastUpdateField;
}
package cn.ibizlab.core.extensions.domain;
import lombok.Data;
import java.io.Serializable;
import java.util.List;
@Data
public class DSTLookupModel implements Serializable {
private String refentity;
private String selectCondition;
private List<String> reffieldsCondition;
private String entity;
private List<String> paramsCondition;
}
package cn.ibizlab.core.extensions.domain;
import cn.ibizlab.core.extensions.util.IEntityActionHelper;
import java.io.Serializable;
import java.util.List;
public interface IEntity extends Serializable {
Object get(Object key);
String getENTITYNAME();
void setENTITYNAME(String name);
void regesitAttr(String key, BaseEntity val);
String getKEY();
void setKEY(String KEY);
IField $(String key);
Double $D(String key);
IEntity $E(String key);
boolean IF(String cond);
boolean test(String cond);
void setActionHelper(IEntityActionHelper iEntityActionHelper);
/**
* 获取操作辅助对象
*
* @return
*/
IEntityActionHelper getActionHelper();
List<BaseEntity> selectRow(String dblink, String sql);
}
package cn.ibizlab.core.extensions.domain;
import java.io.Serializable;
public interface IField extends Serializable {
String getField();
void setField(String field);
String getEntity();
void setEntity(String entity);
Object getValue();
String getCondValue();
Object getFecthValue();
boolean EQ(Object val);
boolean NOTEQ(Object val);
boolean GTANDEQ(Object val);
boolean GT(Object val);
boolean LTANDEQ(Object val);
boolean LT(Object val);
boolean ISNULL(Object val);
boolean ISNOTNULL(Object val);
boolean LIKE(String val);
boolean LEFTLIKE(String val);
boolean RIGHTLIKE(String val);
boolean NOTLIKE(String val);
boolean LEFTNOTLIKE(String val);
boolean RIGHTNOTLIKE(String val);
boolean IN(String val);
boolean NOTIN(String val);
boolean INC2S(String val);
boolean NOTINC2S(String val);
boolean MATCHES(String val);
boolean NOTMATCHES(String val);
}
package cn.ibizlab.core.extensions.service;
import cn.ibizlab.core.extensions.domain.BaseEntity;
import cn.ibizlab.core.extensions.domain.IEntity;
import cn.ibizlab.core.extensions.domain.IField;
import cn.ibizlab.core.rule.domain.ExecLog;
import cn.ibizlab.util.errors.BadRequestAlertException;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;
/**
* 实体[DSTEntity] 服务对象接口
*/
public interface BaseEntityService extends IService<BaseEntity> {
void resetKC(String keyC);
List<BaseEntity> selectRow(String dblink, String sql);
ExecLog processAll(BadRequestAlertException msg);
void saveResult(IEntity param, String RULEID, String RULENAME, String RU_EXECRESULTNAME, String BUSINESSCAT, Integer RETVALUE, Object KEYVALUEFIELD, IField DOMAINSFIELD, IField METRICFIELD, IField TIMEFIELD, IField EXT1FIELD, IField EXT2FIELD);
}
\ No newline at end of file
package cn.ibizlab.core.extensions.service;
import cn.ibizlab.core.analysis.service.impl.DAMetricServiceImpl;
import cn.ibizlab.core.rule.domain.RuleItem;
import cn.ibizlab.core.rule.service.IRuleItemService;
import lombok.extern.slf4j.Slf4j;
import cn.ibizlab.core.analysis.domain.DAMetric;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.context.annotation.Primary;
......@@ -16,6 +20,25 @@ import java.util.*;
@Service("DAMetricExService")
public class DAMetricExService extends DAMetricServiceImpl {
@Autowired
@Lazy
IRuleItemService ruleService;
@Override
public boolean create(DAMetric et) {
super.create(et);
syncRule(et);
return true;
}
@Override
public boolean update(DAMetric et) {
super.update(et);
syncRule(et);
return true;
}
@Override
protected Class currentModelClass() {
return com.baomidou.mybatisplus.core.toolkit.ReflectionKit.getSuperClassGenericType(this.getClass().getSuperclass(), 1);
......@@ -29,6 +52,17 @@ public class DAMetricExService extends DAMetricServiceImpl {
@Override
@Transactional
public DAMetric syncRule(DAMetric et) {
RuleItem rule =new RuleItem();
rule.setRuleCode(et.getMetricId());
rule.setRuleName(et.getMetricName());
rule.setModelId(et.getModelId());
rule.setModelName(et.getModelName());
rule.setCfg(et.getCfg());
rule.setFieldSet(et.getFieldSet());
rule.setGroup("REP");
rule.setBusinessCat(et.getMetricType());
rule.setMemo(et.getModelName()+"."+et.getMetricName());
ruleService.save(rule);
return super.syncRule(et);
}
}
......
package cn.ibizlab.core.extensions.service;
import cn.ibizlab.core.extensions.util.FreeMakerHelper;
import cn.ibizlab.core.rule.service.impl.RuleItemServiceImpl;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import cn.ibizlab.core.rule.domain.RuleItem;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.context.annotation.Primary;
import org.springframework.util.StringUtils;
import java.io.File;
import java.util.*;
/**
......@@ -18,6 +22,22 @@ import java.util.*;
@Service("RuleItemExService")
public class RuleItemExService extends RuleItemServiceImpl {
@Value("${ibiz.rulepath:/app/file/rules/}")
String rulePath;
private Object lockModel=new Object();
@Override
public boolean create(RuleItem et) {
buildRuleFile(et);
return super.create(et);
}
@Override
public boolean update(RuleItem et) {
buildRuleFile(et);
return super.update(et);
}
@Override
protected Class currentModelClass() {
return com.baomidou.mybatisplus.core.toolkit.ReflectionKit.getSuperClassGenericType(this.getClass().getSuperclass(), 1);
......@@ -37,5 +57,342 @@ public class RuleItemExService extends RuleItemServiceImpl {
}
return super.modelchange(et);
}
/**
* 按照规则生成drl文件
* @param et
* @throws Exception
*/
@Override
public RuleItem buildRuleFile(RuleItem et){
try {
//获取实体配置信息
String strCfg = et.getCfg();
String strRuleid = et.getRuleId();
String strRulename = et.getRuleName();
String strMemo = et.getMemo();
String strRuleGroup = et.getGroup();
String strFieldset=et.getFieldSet();
String strMetricfield = "",strTimefield= "",strExt1field= "",strKeyvaluefield= "",strExt2field= "",strDomainsfield="" ,strDimfield="" ,strBusinesscatfield="" ,strBusinesscat="";
if(StringUtils.isEmpty(strRuleGroup)){
log.error(String.format("由于[%s-%s]规则尚未选择规则分组,将不予生成drl规则文件~!",strRuleid,strRulename));
return et;
}
if(StringUtils.isEmpty(strCfg)){
log.error(String.format("由于[%s-%s]规则尚未配置规则,将不予生成drl规则文件~!",strRuleid,strRulename));
return et;
}
//准备模板参数
JSONObject obj=null;
if(!StringUtils.isEmpty(strFieldset)){
obj=JSONObject.parseObject(strFieldset);
strMetricfield=obj.getString("metricfield");
strTimefield=obj.getString("timefield");
strExt1field=obj.getString("ext1field");
strKeyvaluefield=obj.getString("keyvaluefield");
strExt2field=obj.getString("ext2field");
strDimfield=obj.getString("dimfield");
strBusinesscatfield=obj.getString("businesscatfield");
strDomainsfield=StringUtils.isEmpty(strDimfield)?obj.getString("domainsfield"):strDimfield;
strBusinesscat=StringUtils.isEmpty(strBusinesscatfield)?et.getBusinessCat():strBusinesscatfield;
}
if(StringUtils.isEmpty(strDomainsfield))
strDomainsfield=et.getModelName()+".CBDW_BM";
Map param=new HashMap();
param.put("ruleid",strRuleid);
param.put("rulename",strRulename);
param.put("memo",strMemo);
synchronized(lockModel)
{
Hashtable<String,String> modelset=new Hashtable<String,String>();
param.put("rulecond",parseGroup(JSONObject.parseObject(strCfg),modelset));
param.put("releationcond",parseRelationArr(JSONObject.parseObject(strCfg),modelset));
String strCond="";
for(String key : modelset.keySet()) {
if(!StringUtils.isEmpty(strCond))
{
strCond+=",";
}
strCond+=key;
strCond+="-";
}
et.setCond(strCond);
param.put("metricfield",getFieldset(strMetricfield,modelset));
param.put("timefield",getFieldset(strTimefield,modelset));
param.put("ext1field",getFieldset(strExt1field,modelset));
param.put("keyvaluefield",getFieldkeyset(strKeyvaluefield,modelset));
param.put("ext2field",getFieldset(strExt2field,modelset));
param.put("domainsfield",getFieldset(strDomainsfield,modelset));
}
param.put("businesscat",strBusinesscat);
String[] groupArr=strRuleGroup.split(";");
//按照规则类别输出drl文件
for(String ruleGroup:groupArr){
param.put("rulegroup",ruleGroup);
String ruleGroupFolderPath=String.format("%s%s/",rulePath,ruleGroup.toUpperCase());
File outputFileFolder=new File(ruleGroupFolderPath);
if(!outputFileFolder.exists())
outputFileFolder.mkdirs();
File outputFilePath=new File(String.format("%s/%s.drl",ruleGroupFolderPath,strRuleid));
FreeMakerHelper.outputFreeMaker("/ftl/","DSTRule.drl.ftl",param,outputFilePath);
}
} catch (Exception e) {
e.printStackTrace();
}
return et;
}
/**
* 组查询
* @param groupObj
* @return
*/
private String parseGroup(JSONObject groupObj,Hashtable<String,String> modelset){
if(StringUtils.isEmpty(groupObj))
return "";
String conn=groupObj.getString("groupcond").replaceAll("AND","&&").replaceAll("OR","||"); //获取组合方式
JSONArray fieldArr=groupObj.getJSONArray("field"); //获取值项数组
String strFieldCond=parseFieldList(fieldArr,conn,modelset); //获取值项表达式
JSONArray groupArr=groupObj.getJSONArray("group");//获取组合条件
String strGroupCond="";
if((!StringUtils.isEmpty(groupArr)) && groupArr.size()>0){
strGroupCond=parseGroupList(groupArr,conn,modelset); //获取组合条件表达式
}
String strRuleCond=getRuleCond(strFieldCond,strGroupCond,conn);//获取总表达式(值项+组合)
return strRuleCond;
}
/**
* 获取规则总表达式(值项+组合)
* @param strFieldCond 值项表达式
* @param strGroupCond 组合表达式
* @param conn 组合方式
* @return
*/
private String getRuleCond(String strFieldCond,String strGroupCond,String conn)
{
String strRuleCond="";
if((!StringUtils.isEmpty(strFieldCond) && (!StringUtils.isEmpty(strGroupCond)))){
strRuleCond=String.format("(%s %s %s)",strFieldCond,conn,strGroupCond);
}
else if(!StringUtils.isEmpty(strFieldCond)){
strRuleCond=String.format("%s",strFieldCond);
}
else if(!StringUtils.isEmpty(strGroupCond)){
strRuleCond=String.format("%s",strGroupCond);
}
return strRuleCond;
}
/**
* 组查询
* @param GroupArr
* @param conn
* @return
*/
private String parseGroupList(JSONArray GroupArr,String conn,Hashtable<String,String> modelset){
if(StringUtils.isEmpty(GroupArr)||GroupArr.size()==0)
return "";
StringBuffer sbf=new StringBuffer();
for(int a=0;a<GroupArr.size();a++){
String strGroupCond=parseGroup(GroupArr.getJSONObject(a),modelset);
sbf.append(strGroupCond);
if(a!=GroupArr.size()-1)//去掉最后的连接符
sbf.append(conn+" ");
}
return String.format("(%s)",sbf.toString());
}
/**
* @param fieldArr field数组
* @param conn field连接符
* @return
*/
private String parseFieldList(JSONArray fieldArr,String conn,Hashtable<String,String> modelset){
if(StringUtils.isEmpty(fieldArr)||fieldArr.size()==0)
return "";
StringBuffer sbf=new StringBuffer();
for(int a=0;a<fieldArr.size();a++){
JSONObject fieldObj=fieldArr.getJSONObject(a);
String fieldCond=parseField(fieldObj,modelset);
sbf.append(fieldCond);
if(a!=fieldArr.size()-1)//去掉最后的连接符
sbf.append(conn+" ");
}
return String.format("(%s)",sbf.toString());
}
/**
* 拼接field表达式
* @param fieldObj
* @return
*/
private String parseField(JSONObject fieldObj,Hashtable<String,String> modelset){
String fieldName=fieldObj.getString("fieldname");
String fieldCond=fieldObj.getString("fieldcond");
String condValue=fieldObj.getString("condvalue");
if(modelset!=null)
{
String[] arr=fieldName.split("[.]");
if(arr.length>=2)
{
if(!modelset.containsKey(arr[0]))
{
modelset.put(arr[0], "item");
}
}
}
return String.format("IF(\"%s %s %s\")",fieldName,fieldCond,condValue);
}
/**
* 解析子逻辑数组
* @return
*/
private String parseRelationArr(JSONObject groupObj ,Hashtable<String,String> modelset){
if(!groupObj.containsKey("releation"))
return null;
JSONArray RelationArr=groupObj.getJSONArray("releation");
if(StringUtils.isEmpty(RelationArr)||RelationArr.size()==0)
return null;
StringBuffer sbf=new StringBuffer();
for(int a=0;a<RelationArr.size();a++){
String strRelationCond=parseRelation(RelationArr.getJSONObject(a),modelset);
sbf.append(strRelationCond);
}
return sbf.toString();
}
/**
* 解析子数据逻辑
* @param relationObj
* @param modelset
* @return
*/
private String parseRelation(JSONObject relationObj,Hashtable<String,String> modelset){
if(StringUtils.isEmpty(relationObj))
return "";
String relaConn=relationObj.getString("releationcond");//操作符
String relaEntity=relationObj.getString("releationentity");//实体
JSONArray relaGroup=relationObj.getJSONArray("group");//规则数组
if(relaConn.equals("exists"))
{
if(modelset!=null)
{
if(!StringUtils.isEmpty(relaEntity))
{
if(!modelset.containsKey(relaEntity))
{
modelset.put(relaEntity, relaEntity);
}
else
{
modelset.remove(relaEntity);
modelset.put(relaEntity, relaEntity);
}
}
}
}
String strGroupCond="";
if((!StringUtils.isEmpty(relaGroup)) && relaGroup.size()>0){
strGroupCond=parseGroupList(relaGroup,"&&",modelset);//Relation各组之间用and连接
}
String strRelationResult="";
if(!StringUtils.isEmpty(strGroupCond)){
if(relaConn.equals("exists"))
{
strRelationResult=String.format("%s:BaseEntity %s from item.$E(\"%s\")",relaEntity,strGroupCond,relaEntity);
}
else if(relaConn.equals("not exists")){
strRelationResult=String.format("not(exists IEntity %s from item.$E(\"%s\"))",strGroupCond,relaEntity);
}
}
if(!StringUtils.isEmpty(strRelationResult))
strRelationResult=String.format(" %s ",strRelationResult);
return strRelationResult;
}
private String getFieldkeyset(String fieldName,Hashtable<String,String> modelset)
{
String str=this.getFieldset(fieldName, modelset);
if(str.equals("null"))
return "item.KEY";
return str+".getValue()";
}
private String getFieldset(String fieldName,Hashtable<String,String> modelset)
{
if(StringUtils.isEmpty(fieldName))
return "null";
if(modelset!=null)
{
String[] arr=fieldName.split("[.]");
if(arr.length>=2)
{
if(modelset.containsKey("AJXYRHZ"))
{
String tmp=arr[0];
if(tmp.equalsIgnoreCase("TYYW_GG_XYRJBXX")||tmp.equalsIgnoreCase("TYYW_GS_XYRQK")||tmp.equalsIgnoreCase("TYYW_KG_BXFRQK")||
tmp.equalsIgnoreCase("TYYW_SHB_XYRQK")||tmp.equalsIgnoreCase("TYYW_WJ_BYXBLQK")||tmp.equalsIgnoreCase("TYYW_WJ_FZXYR")||
tmp.equalsIgnoreCase("TYYW_WJ_QTXZQK")||tmp.equalsIgnoreCase("TYYW_WJ_XYR")||tmp.equalsIgnoreCase("TYYW_WJ_XYRQK")||tmp.equalsIgnoreCase("TYYW_ZIZ_FZXYR")
||tmp.equalsIgnoreCase("TYYW_ZJ_FZXYR"))
{
return "AJXYRHZ.$(\""+ fieldName+"\")";
}
}
if(modelset.containsKey("AJWSHZ"))
{
String tmp=arr[0];
if(tmp.equalsIgnoreCase("YX_WS_SL")||tmp.equalsIgnoreCase("YX_WS_AJJZWJ"))
{
return "AJWSHZ.$(\""+ fieldName+"\")";
}
}
if(modelset.containsKey("AJDZJZMLHZ"))
{
String tmp=arr[0];
if(tmp.equalsIgnoreCase("YX_DZJZ_JZML"))
{
return "AJDZJZMLHZ.$(\""+ fieldName+"\")";
}
}
if(modelset.containsKey("AJGGQZCSQKHZ"))
{
String tmp=arr[0];
if(tmp.equalsIgnoreCase("TYYW_GG_QZCSQK"))
{
return "AJGGQZCSQKHZ.$(\""+ fieldName+"\")";
}
}
if(modelset.containsKey(arr[0]))
{
return modelset.get(arr[0])+".$(\""+ fieldName+"\")";
}
}
}
return "item.$(\""+ fieldName+"\")";
}
}
package cn.ibizlab.core.extensions.util;
import freemarker.cache.ClassTemplateLoader;
import freemarker.cache.TemplateLoader;
import freemarker.template.Configuration;
import freemarker.template.Template;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import java.io.File;
import java.io.FileWriter;
import java.io.Writer;
import java.util.Map;
public class FreeMakerHelper {
private static Log log = LogFactory.getLog(FreeMakerHelper.class);
/**
* 根据ftl生成目标文件
* @param basePackagePath ftl文件目录(classpath相对路径)
* @param templateFileName ftl文件名
* @param param ftl文件所需参数
* @param outputFilePath 目标文件输出路径
* @throws Exception
*/
public static void outputFreeMaker(String basePackagePath,String templateFileName,Map param, File outputFilePath) throws Exception{
log.info("------freemaker正在进行文件输出任务------");
// 第一步:创建一个Configuration对象,直接new一个对象。构造方法的参数就是freemarker对于的版本号。
Configuration configuration = new Configuration(Configuration.getVersion());
// 第二步:设置模板文件所在的路径
TemplateLoader templateLoader= new ClassTemplateLoader(FreeMakerHelper.class,basePackagePath);
configuration.setTemplateLoader(templateLoader);
// 第三步:设置模板文件使用的字符集。一般就是utf-8.
configuration.setDefaultEncoding("utf-8");
// 第四步:加载一个模板,创建一个模板对象。
Template template = configuration.getTemplate(templateFileName);
// 第五步:创建一个模板使用的数据集,可以是pojo也可以是map。一般是Map。
// 第六步:创建一个Writer对象,一般创建一FileWriter对象,指定生成的文件名。
Writer out = new FileWriter(outputFilePath);
// 第七步:调用模板对象的process方法输出文件。
template.process(param, out);
// 第八步:关闭流。
out.close();
log.info("------freemaker已完成文件输出任务------");
}
}
package cn.ibizlab.core.extensions.util;
import cn.ibizlab.core.extensions.domain.BaseEntity;
import cn.ibizlab.core.extensions.domain.DSTEntityModel;
import java.util.List;
public interface IEntityActionHelper {
List<BaseEntity> select(String dblink, String sql);
DSTEntityModel getModel(String etname);
}
package com.engineer;
import net.ibizsys.dst.common.domain.BaseEntity;
import net.ibizsys.dst.common.domain.IEntity;
import net.ibizsys.dst.common.service.BaseEntityService;
global BaseEntityService BaseService;
rule "<#if ruleid??>${ruleid}_1</#if>"
salience 100
activation-group "<#if ruleid??>${ruleid}</#if>"
when
item:BaseEntity( <#if rulecond??>${rulecond}</#if> )
<#if (releationcond??)>${releationcond}</#if>
then
BaseService.saveResult(item,"<#if ruleid??>${ruleid}</#if>","<#if rulename??>${rulename}</#if>","<#if memo??>${memo}</#if>","<#if businesscat??>${businesscat}</#if>",1,${keyvaluefield},${domainsfield},${metricfield},${timefield},${ext1field},${ext2field});
end
rule "<#if ruleid??>${ruleid}_d</#if>"
salience 0
activation-group "<#if ruleid??>${ruleid}</#if>"
when
item:BaseEntity( )
<#if (releationcond??)>${releationcond}</#if>
then
BaseService.saveResult(item,"<#if ruleid??>${ruleid}</#if>","<#if rulename??>${rulename}</#if>", null,"<#if businesscat??>${businesscat}</#if>",0,item.KEY,${domainsfield},${metricfield},${timefield},null,null);
end
\ No newline at end of file
......@@ -580,4 +580,56 @@ public class RuleUtils
}
return acts;
}
public static boolean inc2s(String tvs, Object finalObject)
{
if (ObjectUtils.isEmpty(finalObject))
return false;
if(StringUtils.isEmpty(tvs))
return false;
if (finalObject instanceof String)
{
tvs="s:"+tvs;
}
else
return false;
List acts = parseTvs(tvs);
for (Iterator localIterator = acts.iterator(); localIterator.hasNext();)
{
Object act = localIterator.next();
if (equal(c2s(act.toString()),c2s(finalObject.toString())))
return true;
}
return false;
}
public static String c2s(String str)
{
if(str==null)
return null;
if(str.length()<300)
{
str=str.trim();//1234567890()【】〔2018〕
str=str.replace("1","1").replace("2","2").replace("3","3").replace("4","4").
replace("5","5").replace("6","6").replace("7","7")
.replace("8","8").replace("9","9").replace("0","0")
.replace("(","〔").replace(")","〕")
.replace("(","〔").replace(")","〕")
.replace("【","〔").replace("】","〕")
.replace("[","〔").replace("]","〕");
}
return str;
}
public static boolean notinc2s(String tvs, Object finalObject)
{
return (!inc2s(tvs,finalObject));
}
}
\ No newline at end of file
Markdown 格式
0% or
您添加了 0 到此讨论。请谨慎行事。
先完成此消息的编辑!
想要评论请 注册