初始化

This commit is contained in:
2026-02-22 18:56:10 +08:00
commit 26677972a6
3112 changed files with 255972 additions and 0 deletions

View File

@@ -0,0 +1,14 @@
package tech.easyflow.datacenter.service;
import com.mybatisflex.core.service.IService;
import tech.easyflow.datacenter.entity.DatacenterTableField;
/**
* 服务层。
*
* @author ArkLight
* @since 2025-07-10
*/
public interface DatacenterTableFieldService extends IService<DatacenterTableField> {
}

View File

@@ -0,0 +1,35 @@
package tech.easyflow.datacenter.service;
import com.alibaba.fastjson2.JSONObject;
import com.mybatisflex.core.paginate.Page;
import com.mybatisflex.core.row.Row;
import com.mybatisflex.core.service.IService;
import tech.easyflow.common.entity.DatacenterQuery;
import tech.easyflow.common.entity.LoginAccount;
import tech.easyflow.datacenter.entity.DatacenterTable;
import tech.easyflow.datacenter.entity.DatacenterTableField;
import tech.easyflow.datacenter.entity.vo.HeaderVo;
import java.math.BigInteger;
import java.util.List;
public interface DatacenterTableService extends IService<DatacenterTable> {
void saveTable(DatacenterTable entity, LoginAccount loginUser);
void removeTable(BigInteger tableId);
Long getCount(DatacenterQuery where);
List<Row> getListData(DatacenterQuery where);
Page<Row> getPageData(DatacenterQuery where);
List<HeaderVo> getHeaders(BigInteger tableId);
void saveValue(BigInteger tableId, JSONObject object, LoginAccount account);
void removeValue(BigInteger tableId, BigInteger id, LoginAccount account);
List<DatacenterTableField> getFields(BigInteger tableId);
}

View File

@@ -0,0 +1,18 @@
package tech.easyflow.datacenter.service.impl;
import com.mybatisflex.spring.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
import tech.easyflow.datacenter.entity.DatacenterTableField;
import tech.easyflow.datacenter.mapper.DatacenterTableFieldMapper;
import tech.easyflow.datacenter.service.DatacenterTableFieldService;
/**
* 服务层实现。
*
* @author ArkLight
* @since 2025-07-10
*/
@Service
public class DatacenterTableFieldServiceImpl extends ServiceImpl<DatacenterTableFieldMapper, DatacenterTableField> implements DatacenterTableFieldService {
}

View File

@@ -0,0 +1,260 @@
package tech.easyflow.datacenter.service.impl;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson2.JSONObject;
import com.mybatisflex.core.keygen.impl.SnowFlakeIDKeyGenerator;
import com.mybatisflex.core.paginate.Page;
import com.mybatisflex.core.query.QueryWrapper;
import com.mybatisflex.core.row.Db;
import com.mybatisflex.core.row.Row;
import com.mybatisflex.spring.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import tech.easyflow.common.entity.DatacenterQuery;
import tech.easyflow.common.entity.LoginAccount;
import tech.easyflow.common.web.exceptions.BusinessException;
import tech.easyflow.datacenter.adapter.DbHandleManager;
import tech.easyflow.datacenter.adapter.DbHandleService;
import tech.easyflow.datacenter.entity.DatacenterTable;
import tech.easyflow.datacenter.entity.DatacenterTableField;
import tech.easyflow.datacenter.entity.vo.HeaderVo;
import tech.easyflow.datacenter.mapper.DatacenterTableFieldMapper;
import tech.easyflow.datacenter.mapper.DatacenterTableMapper;
import tech.easyflow.datacenter.service.DatacenterTableService;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.*;
import java.util.stream.Collectors;
@Service
public class DatacenterTableServiceImpl extends ServiceImpl<DatacenterTableMapper, DatacenterTable> implements DatacenterTableService {
@Resource
private DbHandleManager dbHandleManager;
@Resource
private DatacenterTableFieldMapper fieldsMapper;
@Override
@Transactional(rollbackFor = Exception.class)
public void saveTable(DatacenterTable entity, LoginAccount loginUser) {
DbHandleService dbHandler = dbHandleManager.getDbHandler();
List<DatacenterTableField> fields = entity.getFields();
BigInteger tableId = entity.getId();
if (tableId == null) {
long snowId = new SnowFlakeIDKeyGenerator().nextId();
entity.setId(new BigInteger(String.valueOf(snowId)));
String actualTable = getActualTableName(entity);
entity.setActualTable(actualTable);
// 先 DDL 操作DDL会默认提交事务不然报错了事务不会回滚。
dbHandler.createTable(entity);
// 保存主表和字段表
save(entity);
for (DatacenterTableField field : fields) {
// 插入
field.setCreated(new Date());
field.setCreatedBy(loginUser.getId());
field.setModified(new Date());
field.setModifiedBy(loginUser.getId());
field.setTableId(entity.getId());
fieldsMapper.insert(field);
}
} else {
// actualTable 前端不可见,所以要设置
DatacenterTable tableRecord = getById(tableId);
entity.setActualTable(tableRecord.getActualTable());
dbHandler.updateTable(entity, tableRecord);
updateById(entity);
// 查询所有字段
QueryWrapper w = QueryWrapper.create();
w.eq(DatacenterTableField::getTableId, entity.getId());
List<DatacenterTableField> fieldRecords = fieldsMapper.selectListByQuery(w);
Map<BigInteger, DatacenterTableField> fieldsMap = fieldRecords.stream()
.collect(Collectors.toMap(DatacenterTableField::getId, field -> field));
for (DatacenterTableField field : fields) {
BigInteger id = field.getId();
if (id == null) {
// 新增字段到物理表
dbHandler.addField(entity, field);
// 插入
field.setCreated(new Date());
field.setCreatedBy(loginUser.getId());
field.setModified(new Date());
field.setModifiedBy(loginUser.getId());
field.setTableId(entity.getId());
fieldsMapper.insert(field);
} else {
// 删除的字段
if (field.isHandleDelete()) {
// 删除物理表中的字段
dbHandler.deleteField(entity, field);
// 删除字段
fieldsMapper.deleteById(id);
} else {
// 修改物理表中的字段
DatacenterTableField fieldRecord = fieldsMap.get(id);
dbHandler.updateField(entity, fieldRecord, field);
// 更新字段,字段类型不允许修改
field.setFieldType(field.getFieldType());
field.setModified(new Date());
field.setModifiedBy(loginUser.getId());
fieldsMapper.update(field);
}
}
}
}
}
@Override
@Transactional(rollbackFor = Exception.class)
public void removeTable(BigInteger tableId) {
DatacenterTable record = getById(tableId);
dbHandleManager.getDbHandler().deleteTable(record);
removeById(tableId);
QueryWrapper wrapper = QueryWrapper.create();
wrapper.eq(DatacenterTableField::getTableId, tableId);
fieldsMapper.deleteByQuery(wrapper);
}
@Override
public Long getCount(DatacenterQuery where) {
String actualTable = getActualTable(where.getTableId());
QueryWrapper wrapper = QueryWrapper.create();
buildCondition(wrapper, where);
return Db.selectCountByQuery(actualTable, wrapper);
}
@Override
public List<Row> getListData(DatacenterQuery where) {
String actualTable = getActualTable(where.getTableId());
QueryWrapper wrapper = QueryWrapper.create();
buildCondition(wrapper, where);
List<Row> rows = Db.selectListByQuery(actualTable, wrapper);
handleBigNumber(rows);
return rows;
}
@Override
public Page<Row> getPageData(DatacenterQuery where) {
Long pageNumber = where.getPageNumber();
Long pageSize = where.getPageSize();
Long count = getCount(where);
if (count == 0) {
return new Page<>(new ArrayList<>(), pageNumber, pageSize, count);
}
String actualTable = getActualTable(where.getTableId());
QueryWrapper wrapper = QueryWrapper.create();
buildCondition(wrapper, where);
Page<Row> page = new Page<>(pageNumber, pageSize, count);
Page<Row> paginate = Db.paginate(actualTable, page, wrapper);
handleBigNumber(paginate.getRecords());
return paginate;
}
private void handleBigNumber(List<Row> records) {
for (Row record : records) {
Map<String, Object> newMap = new LinkedHashMap<>();
for (Map.Entry<String, Object> entry : record.entrySet()) {
Object value = entry.getValue();
if ((value instanceof BigInteger ||
value instanceof BigDecimal ||
value instanceof Long)) {
newMap.put(entry.getKey(), value.toString());
} else {
newMap.put(entry.getKey(), value);
}
}
record.clear();
record.putAll(newMap);
}
}
@Override
public List<HeaderVo> getHeaders(BigInteger tableId) {
QueryWrapper wrapper = QueryWrapper.create();
wrapper.eq(DatacenterTableField::getTableId, tableId);
wrapper.orderBy("id");
List<DatacenterTableField> fields = fieldsMapper.selectListByQuery(wrapper);
List<HeaderVo> headers = new ArrayList<>();
for (DatacenterTableField field : fields) {
HeaderVo header = new HeaderVo();
header.setKey(field.getFieldName());
header.setDataIndex(field.getFieldName());
header.setTitle(field.getFieldDesc());
header.setFieldType(field.getFieldType());
header.setRequired(field.getRequired());
header.setFieldId(field.getId());
header.setTableId(field.getTableId());
headers.add(header);
}
return headers;
}
@Override
public void saveValue(BigInteger tableId, JSONObject object, LoginAccount account) {
DatacenterTable table = getById(tableId);
QueryWrapper wrapper = QueryWrapper.create();
wrapper.eq(DatacenterTableField::getTableId, tableId);
List<DatacenterTableField> fields = fieldsMapper.selectListByQuery(wrapper);
if (CollectionUtil.isEmpty(fields)) {
throw new BusinessException("请先添加字段");
}
table.setFields(fields);
Object valueId = object.get("id");
if (valueId == null) {
dbHandleManager.getDbHandler().saveValue(table, object, account);
} else {
dbHandleManager.getDbHandler().updateValue(table, object, account);
}
}
@Override
public void removeValue(BigInteger tableId, BigInteger id, LoginAccount account) {
DatacenterTable record = getById(tableId);
dbHandleManager.getDbHandler().removeValue(record, id, account);
}
@Override
public List<DatacenterTableField> getFields(BigInteger tableId) {
QueryWrapper wrapper = QueryWrapper.create();
wrapper.eq(DatacenterTableField::getTableId, tableId);
return fieldsMapper.selectListByQuery(wrapper);
}
private String getActualTable(BigInteger tableId) {
DatacenterTable record = getById(tableId);
return record.getActualTable();
}
private String getActualTableName(DatacenterTable table) {
String tableName = table.getTableName();
BigInteger id = table.getId();
return "tb_dynamic_" + tableName + "_" + id;
}
/**
* 构建查询条件
*/
private void buildCondition(QueryWrapper wrapper, DatacenterQuery where) {
// 构建查询条件
String condition = where.getWhere();
if (StrUtil.isNotEmpty(condition)) {
wrapper.where(condition);
}
}
}