
edi.rule.model.JSRuleEdit Maven / Gradle / Ivy
package edi.rule.model;
import java.util.Map;
import java.util.Map.Entry;
import com.fasterxml.jackson.annotation.JsonAlias;
import com.fasterxml.jackson.annotation.JsonIgnore;
import edi.rule.annotation.JSRuleCheck;
import edi.rule.annotation.JSRuleInject;
import edi.rule.config.JSRuleMessage;
import edi.rule.core.JSRuleArgsVessel;
import edi.rule.core.JSRuleJdbc;
import edi.rule.core.JSRuleMethod;
import edi.rule.util.ZSString;
import edi.rule.work.enums.JSRuleCrudEnum;
import edi.rule.work.custom.JSRuleException;
import edi.rule.work.interfaces.IJSRuleCondition;
import edi.rule.work.interfaces.IJSRuleDmlModel;
import lombok.Data;
/**
* @author 摩拉克斯
* @date 2022年1月4日 下午1:42:10
* 修改数据对象
*/
@Data
public class JSRuleEdit> implements IJSRuleDmlModel,IJSRuleCondition{
/**
* 映射类的类名,别名class,必须存在的属性,用于指定关联要修改的表
* */
@JsonAlias({"class"})
@JSRuleCheck(required=true)
public String className;
/**
*
修改属性集合,必须存在的属性,key为要修改的字段名,value为要修改的字段值,例子:"set": {"name": "your value"}
* */
@JSRuleCheck(required=true)
public Map set;
/**
* 条件模型
* */
@JSRuleCheck
public JSRuleConditions condition;
/**
*
是否允许修改全部数据,默认为false
* */
public Boolean editAll;
/**
*
是否执行最终形成的sql语句,默认为true,为false时将返回sql语句,子查询或union时使用的仅是其解析后的sql,并不需要真正的执行,因此可将其设置为false以避免多余的计算
* */
public Boolean execute;
@JSRuleInject
@JsonIgnore
private JSRuleArgsVessel vessel;
@JSRuleInject
@JsonIgnore
private JSRuleJdbc jdbc;
public JSRuleEdit() {
this.editAll = false;
execute = true;
}
@Override
public final Object startCrudModel(A action) {
dataProcess(getSet(),action);
StringBuilder builder = new StringBuilder();
builder.append("update ").append(action.cache.getMappingInfo(getClassName()).tableName).append(" set ");
for (Entry setEntry:getSet().entrySet()) {
builder.append(action.cache.getFieldInfo(setEntry.getKey()).tableFieldName).append("='").append(setEntry.getValue()).append("',");
}
builder.delete(builder.length()-1,builder.length());
String conditions = JSRuleMethod.addConditions(getCondition(),action.cache, vessel.getActionArgs());
if (ZSString.isBlank(conditions)) {
if (!getEditAll()) {
throw new JSRuleException(action.cache.name, JSRuleMessage.read("condition.is.required"));
}
}else {
conditions = where+conditions;
}
builder.append(conditions);
String sql = beforeSql(builder.toString(),action);
vessel.getActionArgs().get(action.cache.name).setSql(sql);
if (!getExecute()) {
return sql;
}
return jdbc.update(sql);
}
/**
* 检查映射类信息以及对应的角色信息是否具有edit操作权限
* */
@Override
public final void checkCrudPermit(A action) {
checkCrudPermit(action.name,JSRuleCrudEnum.U, vessel.getGlobalArgs().getRoles());
}
/**
*
执行此模型前执行
* @param set 待修改的数据集合
* */
protected void dataProcess(Map set,A action) {}
/**
* 修改数据前组装成的sql语句
* @param sql 拼装后的sql语句,action 所要执行的动作对象
* */
protected String beforeSql(String sql,A action) {
return sql;
}
}