package com.common.core.domain; import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.annotation.JSONType; import com.common.core.exception.BizException; import com.common.core.utils.DateUtils; import com.common.security.utils.SecurityUtils; import com.jfinal.plugin.activerecord.TableMapping; import lombok.extern.slf4j.Slf4j; import java.lang.reflect.Field; import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * @author 廖振钦 * @date 2022-01-29 */ @Slf4j @JSONType(ignores = {"tableName","id","isDelete","updateTime","createTime","createBy","updateBy"}) public abstract class EntityModel extends BaseModel { @Override public boolean save(){ Field[] fields = getClass().getDeclaredFields(); for(Field f : fields){ f.setAccessible(true); try { Object o = f.get(this); if(null != o) { if (RecordAttrHas(humpToLine2(f.getName()))) { set(humpToLine2(f.getName()), f.get(this)); } else if (RecordAttrHas(f.getName())) { set(f.getName(), f.get(this)); } } } catch (IllegalAccessException e) { } } String appid = SecurityUtils.byId(); setIsDelete(0); setCreateTime(DateUtils.now()); setUpdateTime(DateUtils.now()); setCreateBy(appid); setUpdateBy(appid); return super.save(); } @Override public boolean update(){ Field[] fields = getClass().getDeclaredFields(); for(Field f : fields){ f.setAccessible(true); if(!"id".equals(f.getName())) { try { Object o = f.get(this); if(null != o) { if (RecordAttrHas(humpToLine2(f.getName()))) { set(humpToLine2(f.getName()), f.get(this)); } else if (RecordAttrHas(f.getName())) { set(f.getName(), f.get(this)); } } } catch (IllegalAccessException e) { log.error(e.getMessage(), e); } } } String appid = SecurityUtils.byId(); setIsDelete(0); setCreateTime(DateUtils.now()); setUpdateTime(DateUtils.now()); setCreateBy(appid); setUpdateBy(appid); return super.update(); } @Override public boolean saveOrUpdate(){ if(null == getId()){ return this.save(); } else{ return this.update(); } } @Override public M findFirst(String sql){ M m = super.findFirst(sql); if(null == m){ return null; } RelectionField(m); return m; } @Override public M findFirst(String sql,Object...params){ M m = super.findFirst(sql, params); if(null == m){ return null; } RelectionField(m); return m; } @Override public M findById(Object id){ return this.findFirst("select * from "+getTableName()+" where id = ? and is_delete='0'",id); } @Override public List findAll(){ List list = super.findAll(); List returnlist = new ArrayList(); for(M m : list){ RelectionField(m); returnlist.add(m); } return returnlist; } @Override public List find(String sql){ List list = super.find(sql); List returnlist = Collections.emptyList(); for(M m : list){ RelectionField(m); returnlist.add(m); } return returnlist; } @Override public List find(String sql,Object...params){ List list = super.find(sql, params); List returnlist = new ArrayList(); for(M m : list){ RelectionField(m); returnlist.add(m); } return returnlist; } private void RelectionField(M m){ Field[] fields = m.getClass().getDeclaredFields(); for(Field f : fields) { f.setAccessible(true); try { if(RecordAttrHas(humpToLine2(f.getName()))){ f.set(m, m.get(humpToLine2(f.getName()))); }else if(RecordAttrHas(f.getName())){ f.set(m, m.get(f.getName())); } } catch (IllegalAccessException e) { } } } private String humpToLine2(String str) { Pattern humpPattern = Pattern.compile("[A-Z]"); Matcher matcher = humpPattern.matcher(str); StringBuffer sb = new StringBuffer(); while (matcher.find()) { matcher.appendReplacement(sb, "_" + matcher.group(0).toLowerCase()); } matcher.appendTail(sb); return sb.toString(); } private String lineToHump(String str) { Pattern linePattern = Pattern.compile("_(\\w)"); str = str.toLowerCase(); Matcher matcher = linePattern.matcher(str); StringBuffer sb = new StringBuffer(); while (matcher.find()) { matcher.appendReplacement(sb, matcher.group(1).toUpperCase()); } matcher.appendTail(sb); return sb.toString(); } private Boolean RecordAttrHas(String columnName){ Set names = TableMapping.me().getTable(this.getClass()).getColumnNameSet(); if(names.contains(columnName)){ return true; } return false; } public String json(){ return JSONObject.toJSONString(this); } public JSONObject jsonObject(){ return JSONObject.parseObject(json()); } }