package foundation.dao;
|
|
import java.util.ArrayList;
|
import java.util.List;
|
|
import org.apache.logging.log4j.LogManager;
|
import org.apache.logging.log4j.Logger;
|
|
import foundation.dao.bizlogic.IActionProvider;
|
import foundation.data.entity.Entity;
|
import foundation.data.entity.EntitySet;
|
import foundation.data.entity.Filter;
|
import foundation.data.entity.GroupBy;
|
import foundation.data.entity.OrderBy;
|
import foundation.data.entity.Page;
|
import foundation.data.entity.SummaryFields;
|
import foundation.data.entity.SummaryType;
|
import foundation.data.meta.property.MetaType;
|
import foundation.data.object.DataObject;
|
import foundation.json.JSONReader;
|
import foundation.json.JType;
|
import foundation.util.Util;
|
import foundation.workflow.WorkStep;
|
|
|
public class DataPipe implements IActionProvider {
|
|
protected static Logger logger;
|
private static DataPipe instance;
|
|
static {
|
logger = LogManager.getLogger(DataPipe.class);
|
}
|
|
private DataPipe() {
|
|
}
|
|
public static synchronized DataPipe getInstance() {
|
if (instance == null) {
|
instance = new DataPipe();
|
}
|
|
return instance;
|
}
|
|
@Override
|
public void exec(WorkStep step, String method) throws Exception {
|
if (step.isSimulate()) {
|
simulate(method);
|
}
|
|
OperatorCode code = step.getOperatorCode();
|
|
if (OperatorCode.GetBatch == code) {
|
processGetBatch(step);
|
}
|
else if (OperatorCode.GetTree == code) {
|
processGetTree(step);
|
}
|
else if (OperatorCode.NewOne == code) {
|
processNewOne(step);
|
}
|
else if (OperatorCode.GetOne == code) {
|
processGetOne(step);
|
}
|
else if (OperatorCode.Save == code) {
|
processSaveOne(step);
|
}
|
else if (OperatorCode.UniqueSave == code) {
|
processSaveUniqueOne(step);
|
}
|
else if (OperatorCode.CheckExist == code) {
|
processCheckExist(step);
|
}
|
else if (OperatorCode.Clone == code) {
|
processClone(step);
|
}
|
else if (OperatorCode.Activate == code) {
|
processActivateOne(step);
|
}
|
else if (OperatorCode.Fallback == code) {
|
processFallbackOne(step);
|
}
|
else if (OperatorCode.Alter == code) {
|
processAlter(step);
|
}
|
else if (OperatorCode.Delete == code) {
|
processDeleteOne(step);
|
}
|
else if (OperatorCode.lockRecord == code) {
|
lockRecord(step);
|
}
|
else if (OperatorCode.GetTotalCnt == code) {
|
processTotalCnt(step);
|
}
|
else if (OperatorCode.GetSummary == code) {
|
processSummary(step);
|
}
|
}
|
|
public void processGetBatch(WorkStep meta) throws Exception {
|
DataPackage dataPackage = meta.getDataPackage();
|
|
//1. load filter page order from JSON
|
dataPackage.loadFilterPageOrderByFromJSON();
|
|
//2. load data package from persist
|
dataPackage.loadBatchDataFromDB();
|
dataPackage.setResultData(DataSource.DB);
|
|
//3. set data to letter
|
DataWriter dataWriter = meta.getDataWriter();
|
dataWriter.setDataPackage(dataPackage);
|
}
|
|
private void processGetTree(WorkStep meta) throws Exception {
|
DataPackage dataPackage = meta.getDataPackage();
|
|
//1. load filter page order from JSON
|
dataPackage.loadFilterPageOrderByFromJSON();
|
|
//2. load data package from persist
|
dataPackage.loadTreeDataFromDB();
|
dataPackage.setResultData(DataSource.DB);
|
|
//3. set data to letter
|
DataWriter dataWriter = meta.getDataWriter();
|
dataWriter.setDataPackage(dataPackage);
|
}
|
|
public void processNewOne(WorkStep meta) throws Exception {
|
DataPackage dataPackage = meta.getDataPackage();
|
|
//1. 默认返回 meta
|
Domain domain = meta.getDataReader().getDomain();
|
domain.setMetaType(MetaType.Form);
|
|
//2. create default data
|
dataPackage.createDefaultOneData();
|
dataPackage.setResultData(DataSource.New);
|
|
//3. set data to letter
|
DataWriter dataWriter = meta.getDataWriter();
|
dataWriter.setDataPackage(dataPackage);
|
}
|
|
public void processGetOne(WorkStep meta) throws Exception {
|
DataPackage dataPackage = meta.getDataPackage();
|
|
//1. load id from JSON
|
dataPackage.loadFilterFromJSON();
|
|
//2. load data package from DB or cached
|
dataPackage.loadOneDataFromPersist();
|
dataPackage.setResultData(DataSource.DB);
|
|
if (dataPackage.refers != null) {
|
dataPackage.refers.setResultData(DataSource.DB);
|
}
|
|
//3. set data to letter
|
DataWriter dataWriter = meta.getDataWriter();
|
dataWriter.setDataPackage(dataPackage);
|
}
|
|
public void processSaveOne(WorkStep step) throws Exception {
|
DataReader dataReader = step.getDataReader();
|
DataWriter dataWriter = step.getDataWriter();
|
DataPackage dataPackage = step.getDataPackage();
|
|
//1. load data from JSON
|
dataPackage.loadDataFromRequest();
|
|
//2. validate
|
dataPackage.execValidateRules(dataWriter);
|
|
//3. save data to persist(包含数据本身和 Host)
|
dataPackage.saveOneDataToPersist(dataReader, dataWriter);
|
|
//4. 如果是insert,要将master id 回写到domain里面
|
writeBackMasterId(dataReader, dataPackage.getMasterId());
|
|
//5. set data to letter
|
dataWriter.setDataPackage(dataPackage);
|
}
|
|
public void processSaveUniqueOne(WorkStep step) throws Exception {
|
DataReader dataReader = step.getDataReader();
|
DataWriter dataWriter = step.getDataWriter();
|
DataPackage dataPackage = step.getDataPackage();
|
|
//1. load data from JSON
|
dataPackage.loadDataFromRequest();
|
|
//2. validate
|
dataPackage.execValidateRules(dataWriter);
|
|
boolean existsEntity = dataPackage.checkExists(true);
|
|
if (existsEntity) {
|
return;
|
}
|
|
//3. save data to persist(包含数据本身和 Host)
|
dataPackage.saveOneDataToPersist(dataReader, dataWriter);
|
|
//4. 如果是insert,要将master id 回写到domain里面
|
writeBackMasterId(dataReader, dataPackage.getMasterId());
|
|
//5. set data to letter
|
dataWriter.setDataPackage(dataPackage);
|
}
|
|
public void processCheckExist(WorkStep step) throws Exception {
|
DataReader dataReader = step.getDataReader();
|
DataPackage dataPackage = dataReader.getDataPackage();
|
boolean isCheck = dataReader.getBoolean("check_exists", true);
|
boolean checkResult = dataPackage.checkExists(isCheck);
|
|
if(checkResult) {
|
step.terminateTask();
|
}
|
}
|
|
public void processClone(WorkStep step) throws Exception {
|
DataReader dataReader = step.getDataReader();
|
DataWriter dataWriter = step.getDataWriter();
|
DataPackage changePackage = step.getDataPackage();
|
JSONReader refer = dataReader.getReader(IDataLetter.Refer, JType.Object);
|
DataPackage referPackage = DataPackage.getInstance(changePackage.getName());
|
|
//1. 如果是单条克隆
|
if (refer.getValue(IDataLetter.ID) instanceof String) {
|
String referId = refer.getString(IDataLetter.ID);
|
referPackage.setMasterId(referId);
|
referPackage.loadOneDataFromDB();
|
|
DataPackage target = referPackage.cloneOneData(DataSource.DB);
|
target.updateOneData(DataSource.New, changePackage);
|
target.saveOneDataToDB(DataSource.New, dataReader, dataWriter);
|
target.setResultData(DataSource.New);
|
|
dataWriter.setDataPackage(target);
|
|
return;
|
}
|
|
//2. 如果是多条克隆
|
JSONReader reader = refer.getReader(IDataLetter.ID, JType.Array);
|
|
if (reader != null) {
|
List<String> ids = reader.getStringList();
|
List<String> result = new ArrayList<String>();
|
|
for (String id: ids) {
|
referPackage.setMasterId(id);
|
referPackage.loadOneDataFromDB();
|
|
DataPackage target = referPackage.cloneOneData(DataSource.DB);
|
target.updateOneData(DataSource.New, changePackage);
|
target.saveOneDataToDB(DataSource.New);
|
|
result.add(target.getMasterId());
|
}
|
|
dataWriter.addValue(result);
|
return;
|
}
|
}
|
|
public void processActivateOne(WorkStep meta) throws Exception {
|
DataPackage dataPackage = meta.getDataPackage();
|
|
//1. load id from JSON
|
dataPackage.loadDataIdFromRequest();
|
|
//2. activate data from persist
|
dataPackage.loadHostIdFromDB();
|
|
//3. activate data from persist
|
DataPackage host = dataPackage.getHost();
|
|
if (host == null) {
|
host = dataPackage;
|
}
|
|
host.activateOneData();
|
|
//4. set data to letter
|
DataWriter dataWriter = meta.getDataWriter();
|
dataWriter.setDataPackage(dataPackage);
|
}
|
|
public void processFallbackOne(WorkStep meta) throws Exception {
|
DataPackage dataPackage = meta.getDataPackage();
|
|
//1. load id from JSON
|
dataPackage.loadDataIdFromRequest();
|
|
//2. fallback data from persist
|
DataPackage host = dataPackage.getHost();
|
|
if (host == null) {
|
host = dataPackage;
|
}
|
|
host.fallbackOneData();
|
|
//3. set data to letter
|
DataWriter dataWriter = meta.getDataWriter();
|
dataWriter.setDataPackage(dataPackage);
|
}
|
|
public void processAlter(WorkStep meta) throws Exception {
|
String dataName = meta.getDataName();
|
DataPackage dataPackage = meta.getDataPackage();
|
//1. load id from JSON
|
dataPackage.loadDataFromRequest();
|
dataPackage.loadFilterPageOrderByFromJSON();
|
|
Entity entity = dataPackage.getItemEntity(dataName, DataSource.Request);
|
Filter filter = dataPackage.getFilter();
|
DataObject dataObject = dataPackage.getDataObject(dataName);
|
|
//2. udpate data from persist
|
dataObject.updateByEntity(entity, filter);
|
|
DataWriter dataWriter = meta.getDataWriter();
|
dataWriter.setDataPackage(dataPackage);
|
}
|
|
public void processDeleteOne(WorkStep meta) throws Exception {
|
DataPackage dataPackage = meta.getDataPackage();
|
|
//1. load id from JSON
|
dataPackage.loadDataIdFromRequest();
|
|
//2. delete data from persist
|
dataPackage.deleteOneDataFromDB();
|
|
//3. set data to letter
|
DataWriter dataWriter = meta.getDataWriter();
|
dataWriter.setDataPackage(dataPackage);
|
}
|
|
private void lockRecord(WorkStep meta) throws Exception {
|
DataPackage dataPackage = meta.getDataPackage();
|
|
//1. load id from JSON
|
dataPackage.loadDataIdFromRequest();
|
|
//2. delete data from persist
|
dataPackage.lockMasterRecord();
|
}
|
|
public void processTotalCnt(WorkStep meta) throws Exception {
|
DataReader dataReader = meta.getDataReader();
|
DataPackage dataPackage = meta.getDataPackage();
|
|
//1. load filter page order from JSON
|
dataPackage.loadFilterFromJSON();
|
|
//2. load data package from persist
|
String dataName = dataReader.getDecodeString("dataName", "");
|
if (Util.isEmpty(dataName)) {
|
logger.error("dataName为空,无法执行processTotalCnt");
|
return;
|
}
|
|
DataObject dataObject = dataPackage.getDataObject(dataName);
|
Filter filter = dataPackage.filter;
|
int count = dataObject.getCount(filter, dataReader.getUser());
|
|
//3. set data
|
DataWriter dataWriter = meta.getDataWriter();
|
dataWriter.addValue(count);
|
}
|
|
private void processSummary(WorkStep meta) throws Exception {
|
DataReader dataReader = meta.getDataReader();
|
DataPackage dataPackage = meta.getDataPackage();
|
|
List<String> sumFields = dataReader.getStringList("sum");
|
List<String> cntFields = dataReader.getStringList("cnt");
|
String customerizeSql = dataReader.getString("customerize_sql");
|
String groupFields = dataReader.getString("group");
|
SummaryFields sum = SummaryFields.getInstance(sumFields, SummaryType.sum);
|
SummaryFields cnt = SummaryFields.getInstance(cntFields, SummaryType.count);
|
|
//1. load filter page order from JSON
|
dataPackage.loadFilterPageOrderByFromJSON();
|
dataPackage.loadUserLineFilter();
|
|
//2. load data package from persist
|
String dataName = dataReader.getDecodeString("dataName", "");
|
if (Util.isEmpty(dataName)) {
|
logger.error("dataName为空,无法执行processSummary");
|
return;
|
}
|
|
DataObject dataObject = dataPackage.getDataObject(dataName);
|
Filter filter = dataPackage.filter;
|
OrderBy orderBy = dataPackage.orderBy;
|
|
Page page = dataPackage.page;
|
GroupBy groupBy = new GroupBy(groupFields);
|
EntitySet entitySet = dataObject.getSummary(sum.getValue(), cnt.getValue(), customerizeSql, groupBy, page, orderBy, filter, dataReader.getUser());
|
page = dataObject.getSummaryCnt(sum.getValue(), cnt.getValue(), customerizeSql, groupBy, page, filter, dataReader.getUser());
|
|
//3. set data
|
DataWriter dataWriter = meta.getDataWriter();
|
if (Util.isEmpty(groupFields) && entitySet.size() == 1) {
|
dataWriter.addValue(entitySet.getEntity(0));
|
}
|
else {
|
dataWriter.addValue(entitySet);
|
}
|
dataWriter.addValue("page", page);
|
}
|
|
private void writeBackMasterId(DataReader dataReader, String masterId) throws Exception {
|
Domain domain = dataReader.getDomain();
|
|
if (domain == null) {
|
return;
|
}
|
|
if (domain.isEmptyId()) {
|
domain.setId(masterId);
|
}
|
}
|
|
public void simulate(String methodName) {
|
logger.info("action data.{} simulate", methodName);
|
}
|
}
|