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

合并分支 'dev' 到 'master'

Dev

查看合并请求 !15
# **iBiz4j Spring R7 Template ChangeLog**
## [v2020.07.02]
- 支持测试行为模式
- 数据保存时增加版本检查
- 调整Service扩展目录
- 补充数据查询上下级权限控制
- 关闭mybatis-plus分页数量大小限制
\ No newline at end of file
......@@ -57,7 +57,6 @@ public interface I${item.codeName}Service extends IService<${item.codeName}>{
List<${de.codeName}> get${deCodeNameCamel}ByIds(List<String> ids) ;
List<${de.codeName}> get${deCodeNameCamel}ByEntities(List<${de.codeName}> entities) ;
</#if>
}
<#comment>NoSQL存储-MongoDB</#comment>
<#elseif de.getStorageMode()==2>
......@@ -146,6 +145,7 @@ public interface I${item.codeName}Service{
<#else>
${item.codeName} ${srfmethodname(deaction.getCodeName())}(${item.codeName} et) ;
</#if>
<@outputTestActionDetail deaction />
</#if>
</#list>
</#if>
......@@ -196,4 +196,42 @@ public interface I${item.codeName}Service{
</#if>
</#macro>
<#comment>输出测试行为</#comment>
<#macro outputTestActionDetail deaction>
<#if deaction.getTestActionMode?? && deaction.getTestActionMode()?? && (deaction.getTestActionMode() ==1 ||deaction.getTestActionMode() ==3) >
<#if (deaction.getActionType()=='USERCUSTOM')>
boolean test${srfmethodname(deaction.getCodeName())?cap_first}(${item.getCodeName()} et);
<#elseif deaction.getActionType()=='DELOGIC'>
boolean test${srfmethodname(deaction.getCodeName())?cap_first}(${item.getCodeName()} et);
<#elseif deaction.getCodeName()?lower_case == 'get'>
boolean testGet(${srfjavatype(keyfield.stdDataType)} key);
<#elseif deaction.getCodeName()?lower_case == "createbatch">
<#elseif deaction.getCodeName()?lower_case == "updatebatch">
<#elseif deaction.getCodeName()?lower_case == "removebatch">
<#elseif deaction.getCodeName()?lower_case == "savebatch">
<#elseif deaction.getCodeName()?lower_case == "create">
boolean testCreate(${item.getCodeName()} et);
boolean testCreateBatch(List<${item.getCodeName()}> list);
<#elseif deaction.getCodeName()?lower_case == "update">
boolean testUpdate(${item.getCodeName()} et);
boolean testUpdateBatch(List<${item.getCodeName()}> list);
<#elseif deaction.getCodeName()?lower_case == "save">
boolean testSave(${item.getCodeName()} et);
boolean testSaveOrUpdate(${item.getCodeName()} et);
boolean testSaveBatch(Collection<${item.getCodeName()}> list);
boolean testSaveBatch(List<${item.getCodeName()}> list);
<#elseif deaction.getCodeName()?lower_case == "remove">
boolean testRemove(${srfjavatype(keyfield.stdDataType)} key);
boolean testRemoveBatch(Collection<${srfjavatype(keyfield.stdDataType)}> idList);
<#elseif deaction.getCodeName()?lower_case == "getdraft">
boolean testGetDraft(${item.getCodeName()} et);
<#elseif deaction.getCodeName()?lower_case == "checkkey">
boolean testCheckKey(${item.getCodeName()} et);
<#else>
boolean test${srfmethodname(deaction.getCodeName())?cap_first}(${item.getCodeName()} et);
</#if>
</#if>
</#macro>
</#if>
\ No newline at end of file
......@@ -110,11 +110,11 @@ public class ${item.getCodeName()}ServiceImpl extends ServiceImpl<${de.getCodeNa
<#if !P.exists('DER1N',der.getMinorPSDataEntity().getCodeName())>
<#if der.getMinorPSDataEntity().getCodeName()==de.codeName>
private ${pub.getPKGCodeName()}.core.${der.getMinorPSDataEntity().getPSSystemModule().getCodeName()?lower_case}.service.I${der.getMinorPSDataEntity().getCodeName()}Service ${srfcaseformat(der.getMinorPSDataEntity().getCodeName(),'l_u2lC')}Service = this;
protected ${pub.getPKGCodeName()}.core.${der.getMinorPSDataEntity().getPSSystemModule().getCodeName()?lower_case}.service.I${der.getMinorPSDataEntity().getCodeName()}Service ${srfcaseformat(der.getMinorPSDataEntity().getCodeName(),'l_u2lC')}Service = this;
<#else>
@Autowired
@Lazy
private ${pub.getPKGCodeName()}.core.${der.getMinorPSDataEntity().getPSSystemModule().getCodeName()?lower_case}.service.I${der.getMinorPSDataEntity().getCodeName()}Service ${srfcaseformat(der.getMinorPSDataEntity().getCodeName(),'l_u2lC')}Service;
protected ${pub.getPKGCodeName()}.core.${der.getMinorPSDataEntity().getPSSystemModule().getCodeName()?lower_case}.service.I${der.getMinorPSDataEntity().getCodeName()}Service ${srfcaseformat(der.getMinorPSDataEntity().getCodeName(),'l_u2lC')}Service;
</#if>
</#if>
</#if>
......@@ -127,11 +127,11 @@ public class ${item.getCodeName()}ServiceImpl extends ServiceImpl<${de.getCodeNa
<#if !P.exists('DER1N',der.getMajorPSDataEntity().getCodeName())>
<#if der.getMajorPSDataEntity().getCodeName()==de.codeName>
private ${pub.getPKGCodeName()}.core.${der.getMajorPSDataEntity().getPSSystemModule().getCodeName()?lower_case}.service.I${der.getMajorPSDataEntity().getCodeName()}Service ${srfcaseformat(der.getMajorPSDataEntity().getCodeName(),'l_u2lC')}Service = this;
protected ${pub.getPKGCodeName()}.core.${der.getMajorPSDataEntity().getPSSystemModule().getCodeName()?lower_case}.service.I${der.getMajorPSDataEntity().getCodeName()}Service ${srfcaseformat(der.getMajorPSDataEntity().getCodeName(),'l_u2lC')}Service = this;
<#else>
@Autowired
@Lazy
private ${pub.getPKGCodeName()}.core.${der.getMajorPSDataEntity().getPSSystemModule().getCodeName()?lower_case}.service.I${der.getMajorPSDataEntity().getCodeName()}Service ${srfcaseformat(der.getMajorPSDataEntity().getCodeName(),'l_u2lC')}Service;
protected ${pub.getPKGCodeName()}.core.${der.getMajorPSDataEntity().getPSSystemModule().getCodeName()?lower_case}.service.I${der.getMajorPSDataEntity().getCodeName()}Service ${srfcaseformat(der.getMajorPSDataEntity().getCodeName(),'l_u2lC')}Service;
</#if>
</#if>
</#if>
......@@ -148,14 +148,16 @@ public class ${item.getCodeName()}ServiceImpl extends ServiceImpl<${de.getCodeNa
<#comment>实体行为附加逻辑</#comment>
<#if deAction.getPSDEActionLogics()??>
<#list deAction.getPSDEActionLogics() as deActionLogic>
<#if deActionLogic.isInternalLogic()>
<#assign deLogic=deActionLogic.getPSDELogic()>
<@importDELogic deLogic />
</#if>
</#list>
</#if>
</#list>
</#if>
private int batchSize = 500;
protected int batchSize = 500;
<#comment>输出实体行为</#comment>
<#if item.getAllPSDEActions()??>
......@@ -168,6 +170,8 @@ ${deaction.getRender().code}
@Override
@Transactional
public ${item.getCodeName()} ${srfmethodname(deaction.getCodeName())}(${item.getCodeName()} et) {
<#comment>输出测试行为</#comment>
<@outputTestAction deaction "usercustom"/>
<#comment>附加数据逻辑-操作前</#comment>
<@addBoforeLogic deaction/>
//自定义代码
......@@ -180,6 +184,8 @@ ${deaction.getRender().code}
@Override
@Transactional
public ${item.getCodeName()} ${srfmethodname(deaction.getCodeName())}(${item.getCodeName()} et) {
<#comment>输出测试行为</#comment>
<@outputTestAction deaction "delogic"/>
<#comment>附加数据逻辑-操作前</#comment>
<@addBoforeLogic deaction/>
${deaction.getPSDELogic().getCodeName()?lower_case}Logic.execute(et);
......@@ -192,6 +198,8 @@ ${deaction.getRender().code}
@Override
@Transactional
public ${item.getCodeName()} get(${srfjavatype(keyfield.stdDataType)} key) {
<#comment>输出测试行为</#comment>
<@outputTestAction deaction "get"/>
<#comment>附加数据逻辑-操作前</#comment>
<@buildEntityParam deaction/>
<@addGetActionBoforeLogic deaction/>
......@@ -239,6 +247,8 @@ ${deaction.getRender().code}
@Override
@Transactional
public boolean create(${item.getCodeName()} et) {
<#comment>输出测试行为</#comment>
<@outputTestAction deaction "create"/>
<#if hasMinorPSDERs gt 0>
fillParentData(et);
</#if>
......@@ -286,6 +296,8 @@ ${deaction.getRender().code}
@Override
public void createBatch(List<${item.getCodeName()}> list) {
<#comment>输出测试行为</#comment>
<@outputTestAction deaction "createBatch"/>
<#if hasMinorPSDERs gt 0>
list.forEach(item->fillParentData(item));
</#if>
......@@ -305,6 +317,8 @@ ${deaction.getRender().code}
@Override
@Transactional
public boolean update(${item.getCodeName()} et) {
<#comment>输出测试行为</#comment>
<@outputTestAction deaction "update"/>
<#if hasMinorPSDERs gt 0>
fillParentData(et);
</#if>
......@@ -356,6 +370,8 @@ ${deaction.getRender().code}
@Override
public void updateBatch(List<${item.getCodeName()}> list) {
<#comment>输出测试行为</#comment>
<@outputTestAction deaction "updateBatch"/>
<#if hasMinorPSDERs gt 0>
list.forEach(item->fillParentData(item));
</#if>
......@@ -370,6 +386,8 @@ ${deaction.getRender().code}
@Override
@Transactional
public boolean save(${item.getCodeName()} et) {
<#comment>输出测试行为</#comment>
<@outputTestAction deaction "save"/>
<#comment>附加数据逻辑-操作前</#comment>
<@addBoforeLogic deaction/>
if(!saveOrUpdate(et))
......@@ -384,6 +402,8 @@ ${deaction.getRender().code}
rollbackFor = {Exception.class}
)
public boolean saveOrUpdate(${item.getCodeName()} et) {
<#comment>输出测试行为</#comment>
<@outputTestAction deaction "saveOrUpdate"/>
if (null == et) {
return false;
} else {
......@@ -393,6 +413,8 @@ ${deaction.getRender().code}
@Override
public boolean saveBatch(Collection<${item.getCodeName()}> list) {
<#comment>输出测试行为</#comment>
<@outputTestAction deaction "saveBatch"/>
<#if hasMinorPSDERs gt 0>
list.forEach(item->fillParentData(item));
</#if>
......@@ -402,6 +424,8 @@ ${deaction.getRender().code}
@Override
public void saveBatch(List<${item.getCodeName()}> list) {
<#comment>输出测试行为</#comment>
<@outputTestAction deaction "saveBatch"/>
<#if hasMinorPSDERs gt 0>
list.forEach(item->fillParentData(item));
</#if>
......@@ -412,6 +436,8 @@ ${deaction.getRender().code}
@Override
@Transactional
public boolean remove(${srfjavatype(keyfield.stdDataType)} key) {
<#comment>输出测试行为</#comment>
<@outputTestAction deaction "remove"/>
<#comment>附加数据逻辑-操作前,通过key构造entity传入逻辑中</#comment>
<@buildEntityParam deaction/>
<@addBoforeLogic deaction/>
......@@ -442,6 +468,8 @@ ${deaction.getRender().code}
@Override
public void removeBatch(Collection<${srfjavatype(keyfield.stdDataType)}> idList) {
<#comment>输出测试行为</#comment>
<@outputTestAction deaction "removeBatch"/>
<#if hasPSDERsMapping>
List<${item.getCodeName()}> entities= baseMapper.selectBatchIds(idList);
</#if>
......@@ -455,6 +483,8 @@ ${deaction.getRender().code}
<#elseif deaction.getCodeName()?lower_case == "getdraft">
@Override
public ${item.getCodeName()} getDraft(${item.getCodeName()} et) {
<#comment>输出测试行为</#comment>
<@outputTestAction deaction "getdraft"/>
<#if hasMinorPSDERs gt 0>
fillParentData(et);
</#if>
......@@ -468,6 +498,8 @@ ${deaction.getRender().code}
<#elseif deaction.getCodeName()?lower_case == "checkkey">
@Override
public boolean checkKey(${item.getCodeName()} et) {
<#comment>输出测试行为</#comment>
<@outputTestAction deaction "checkkey"/>
return (!ObjectUtils.isEmpty(et.get${srfcaseformat(keyfield.codeName,'l_u2lC')?cap_first}()))&&(!Objects.isNull(this.getById(et.get${srfcaseformat(keyfield.codeName,'l_u2lC')?cap_first}())));
}
<#comment>用户扩展新建、更新</#comment>
......@@ -475,6 +507,8 @@ ${deaction.getRender().code}
@Override
@Transactional
public ${item.getCodeName()} ${srfmethodname(deaction.getCodeName())}(${item.getCodeName()} et) {
<#comment>输出测试行为</#comment>
<@outputTestAction deaction "userex"/>
<#comment>附加数据逻辑-操作前</#comment>
<@addBoforeLogic deaction/>
<#comment>附加实体行为参数</#comment>
......@@ -487,6 +521,8 @@ ${deaction.getRender().code}
@Override
@Transactional
public ${item.getCodeName()} ${srfmethodname(deaction.getCodeName())}(${item.getCodeName()} et) {
<#comment>输出测试行为</#comment>
<@outputTestAction deaction "other"/>
<#comment>附加数据逻辑-操作前</#comment>
<@addBoforeLogic deaction/>
<#comment>附加数据逻辑-操作后</#comment>
......@@ -496,6 +532,8 @@ ${deaction.getRender().code}
}
</#if>
<#comment>输出测试实体行为</#comment>
<@outputTestActionDetail deaction/>
</#if>
</#if>
</#list>
......@@ -753,7 +791,7 @@ ${deaction.getRender().code}
<#if !P.exists('DER1N',majorIndexDECodeName)>
@Autowired
@Lazy
private ${pub.getPKGCodeName()}.core.${majorIndexDE.getPSSystemModule().getCodeName()?lower_case}.service.I${majorIndexDECodeName}Service ${srfcaseformat(majorIndexDECodeName,'l_u2lC')}Service;
protected ${pub.getPKGCodeName()}.core.${majorIndexDE.getPSSystemModule().getCodeName()?lower_case}.service.I${majorIndexDECodeName}Service ${srfcaseformat(majorIndexDECodeName,'l_u2lC')}Service;
</#if>
/**
......@@ -835,7 +873,7 @@ import com.mongodb.QueryBuilder;
public class ${item.getCodeName()}ServiceImpl implements I${de.getCodeName()}Service {
@Autowired
private ${item.getCodeName()}Repository repository;
protected ${item.getCodeName()}Repository repository;
<#assign keyfield=de.getKeyPSDEField()>
<#comment>引入关联依赖</#comment>
......@@ -845,7 +883,7 @@ public class ${item.getCodeName()}ServiceImpl implements I${de.getCodeName()}Ser
<#if !P.exists('DEMinorPSDataEntity',der.getMinorPSDataEntity().getCodeName())>
@Autowired
@Lazy
private ${pub.getPKGCodeName()}.core.${der.getMinorPSDataEntity().getPSSystemModule().getCodeName()?lower_case}.service.I${der.getMinorPSDataEntity().getCodeName()}Service ${srfcaseformat(der.getMinorPSDataEntity().getCodeName(),'l_u2lC')}Service;
protected ${pub.getPKGCodeName()}.core.${der.getMinorPSDataEntity().getPSSystemModule().getCodeName()?lower_case}.service.I${der.getMinorPSDataEntity().getCodeName()}Service ${srfcaseformat(der.getMinorPSDataEntity().getCodeName(),'l_u2lC')}Service;
</#if>
</#if>
</#list>
......@@ -861,8 +899,10 @@ public class ${item.getCodeName()}ServiceImpl implements I${de.getCodeName()}Ser
<#comment>实体行为附加逻辑</#comment>
<#if deAction.getPSDEActionLogics()??>
<#list deAction.getPSDEActionLogics() as deActionLogic>
<#if deActionLogic.isInternalLogic()>
<#assign deLogic=deActionLogic.getPSDELogic()>
<@importDELogic deLogic />
</#if>
</#list>
</#if>
</#list>
......@@ -879,6 +919,7 @@ ${deaction.getRender().code}
@Override
@Transactional
public ${item.getCodeName()} ${srfmethodname(deaction.getCodeName())}(${item.getCodeName()} et) {
<@outputTestAction deaction "usercustom"/>
<#comment>附加数据逻辑-操作前</#comment>
<@addBoforeLogic deaction/>
//自定义代码
......@@ -891,6 +932,7 @@ ${deaction.getRender().code}
@Override
@Transactional
public ${item.getCodeName()} ${srfmethodname(deaction.getCodeName())}(${item.getCodeName()} et) {
<@outputTestAction deaction "delogic"/>
<#comment>附加数据逻辑-操作前</#comment>
<@addBoforeLogic deaction/>
${deaction.getPSDELogic().getCodeName()?lower_case}Logic.execute(et);
......@@ -903,6 +945,7 @@ ${deaction.getRender().code}
@Override
@Transactional
public ${item.getCodeName()} get(${srfjavatype(keyfield.stdDataType)} key) {
<@outputTestAction deaction "get"/>
<@buildEntityParam deaction/>
<@addGetActionBoforeLogic deaction/>
Optional<${item.getCodeName()}> result = repository.findById(key);
......@@ -951,6 +994,7 @@ ${deaction.getRender().code}
@Override
@Transactional
public boolean create(${item.getCodeName()} et) {
<@outputTestAction deaction "create"/>
<#comment>附加数据逻辑-操作前</#comment>
<@addBoforeLogic deaction/>
repository.insert(et);
......@@ -987,6 +1031,7 @@ ${deaction.getRender().code}
@Override
public void createBatch(List<${item.getCodeName()}> list) {
<@outputTestAction deaction "createBatch"/>
<#comment>联合主键,走SaveOrUpdateBatch,防止因主键冲突导致后续数据无法保存</#comment>
<#if item.getUnionKeyValuePSDEFields()??>
repository.saveAll(list);
......@@ -999,6 +1044,7 @@ ${deaction.getRender().code}
@Override
@Transactional
public boolean update(${item.getCodeName()} et) {
<@outputTestAction deaction "update"/>
<#comment>附加数据逻辑-操作前</#comment>
<@addBoforeLogic deaction/>
<#if de.getKeyPSDEField()??>
......@@ -1039,6 +1085,7 @@ ${deaction.getRender().code}
@Override
public void updateBatch(List<${item.getCodeName()}> list) {
<@outputTestAction deaction "updateBatch"/>
repository.saveAll(list);
}
......@@ -1046,6 +1093,7 @@ ${deaction.getRender().code}
@Override
@Transactional
public boolean save(${item.getCodeName()} et) {
<@outputTestAction deaction "save"/>
<#comment>附加数据逻辑-操作前</#comment>
<@addBoforeLogic deaction/>
<#if de.getKeyPSDEField()??>
......@@ -1087,6 +1135,7 @@ ${deaction.getRender().code}
@Override
public void saveBatch(List<${item.getCodeName()}> list) {
<@outputTestAction deaction "saveBatch"/>
repository.saveAll(list);
}
......@@ -1094,6 +1143,7 @@ ${deaction.getRender().code}
@Override
@Transactional
public boolean remove(${srfjavatype(keyfield.stdDataType)} key) {
<@outputTestAction deaction "remove"/>
<#comment>附加数据逻辑-操作前</#comment>
<@buildEntityParam deaction/>
<@addBoforeLogic deaction/>
......@@ -1114,12 +1164,14 @@ ${deaction.getRender().code}
@Override
public void removeBatch(Collection<${srfjavatype(keyfield.stdDataType)}> idList) {
<@outputTestAction deaction "removeBatch"/>
repository.deleteAll(repository.findAllById(idList));
}
<#elseif deaction.getCodeName()?lower_case == "getdraft">
@Override
public ${item.getCodeName()} getDraft(${item.getCodeName()} et) {
<@outputTestAction deaction "getdraft"/>
<#comment>附加数据逻辑-操作前</#comment>
<@addBoforeLogic deaction/>
<#comment>附加数据逻辑-操作后</#comment>
......@@ -1130,6 +1182,7 @@ ${deaction.getRender().code}
<#elseif deaction.getCodeName()?lower_case == "checkkey">
@Override
public boolean checkKey(${item.getCodeName()} et) {
<@outputTestAction deaction "checkkey"/>
return repository.findById(et.get${srfcaseformat(keyfield.codeName,'l_u2lC')?cap_first}()).isPresent();
}
......@@ -1137,7 +1190,7 @@ ${deaction.getRender().code}
@Override
@Transactional
public ${item.getCodeName()} ${srfmethodname(deaction.getCodeName())}(${item.getCodeName()} et) {
//自定义代码
<@outputTestAction deaction "other"/>
<#comment>附加数据逻辑-操作前</#comment>
<@addBoforeLogic deaction/>
<#comment>附加数据逻辑-操作后</#comment>
......@@ -1146,6 +1199,8 @@ ${deaction.getRender().code}
}
</#if>
<#comment>输出测试实体行为</#comment>
<@outputTestActionDetail deaction/>
</#if>
</#if>
</#list>
......@@ -1233,7 +1288,7 @@ ${deaction.getRender().code}
@Resource
private MongoTemplate mongoTemplate;
protected MongoTemplate mongoTemplate;
<#comment>输出数据查询</#comment>
<#if item.getAllPSDEDataSets()??>
......@@ -1311,7 +1366,7 @@ public class ${item.getCodeName()}ServiceImpl implements I${de.getCodeName()}Ser
<#if !P.exists('DEMinorPSDataEntity',der.getMinorPSDataEntity().getCodeName())>
@Autowired
@Lazy
private ${pub.getPKGCodeName()}.core.${der.getMinorPSDataEntity().getPSSystemModule().getCodeName()?lower_case}.service.I${der.getMinorPSDataEntity().getCodeName()}Service ${srfcaseformat(der.getMinorPSDataEntity().getCodeName(),'l_u2lC')}Service;
protected ${pub.getPKGCodeName()}.core.${der.getMinorPSDataEntity().getPSSystemModule().getCodeName()?lower_case}.service.I${der.getMinorPSDataEntity().getCodeName()}Service ${srfcaseformat(der.getMinorPSDataEntity().getCodeName(),'l_u2lC')}Service;
</#if>
</#if>
</#list>
......@@ -1328,6 +1383,7 @@ ${deaction.getRender().code}
@Override
@Transactional
public ${item.getCodeName()} ${srfmethodname(deaction.getCodeName())}(${item.getCodeName()} et) {
<@outputTestAction deaction "usercustom"/>
<#comment>附加数据逻辑-操作前</#comment>
<@addBoforeLogic deaction/>
//自定义代码
......@@ -1340,6 +1396,7 @@ ${deaction.getRender().code}
@Override
@Transactional
public ${item.getCodeName()} ${srfmethodname(deaction.getCodeName())}(${item.getCodeName()} et) {
<@outputTestAction deaction "delogic"/>
<#comment>附加数据逻辑-操作前</#comment>
<@addBoforeLogic deaction/>
${deaction.getPSDELogic().getCodeName()?lower_case}Logic.execute(et);
......@@ -1351,6 +1408,7 @@ ${deaction.getRender().code}
<#elseif deaction.getCodeName()?lower_case == 'get'>
@Override
public ${item.getCodeName()} get(${srfjavatype(keyfield.stdDataType)} ${keyfield.getCodeName()?lower_case}) {
<@outputTestAction deaction "get"/>
<#if item.isEnableAPIStorage()>
<#if deaction.getPSSubSysServiceAPIDEMethod()?? >
<#--<#comment>附加数据逻辑-操作前</#comment>-->
......@@ -1403,6 +1461,7 @@ ${deaction.getRender().code}
<#elseif deaction.getCodeName()?lower_case == "create">
@Override
public boolean create(${item.getCodeName()} et) {
<@outputTestAction deaction "create"/>
<#if item.isEnableAPIStorage()>
<#if deaction.getPSSubSysServiceAPIDEMethod()?? >
<#comment>附加数据逻辑-操作前</#comment>
......@@ -1448,6 +1507,7 @@ ${deaction.getRender().code}
}
public void createBatch(List<${item.codeName}> list){
<@outputTestAction deaction "createBatch"/>
<#if item.isEnableAPIStorage()>
<#if deaction.getPSSubSysServiceAPIDEMethod()?? >
${subSysServiceApiDECodeName?uncap_first}FeignClient.createBatch(list) ;
......@@ -1458,6 +1518,7 @@ ${deaction.getRender().code}
<#elseif deaction.getCodeName()?lower_case == "update">
@Override
public boolean update(${item.getCodeName()} et) {
<@outputTestAction deaction "update"/>
<#if item.isEnableAPIStorage()>
<#if deaction.getPSSubSysServiceAPIDEMethod()?? >
<#comment>附加数据逻辑-操作前</#comment>
......@@ -1504,6 +1565,7 @@ ${deaction.getRender().code}
}
public void updateBatch(List<${item.codeName}> list){
<@outputTestAction deaction "updateBatch"/>
<#if item.isEnableAPIStorage()>
<#if deaction.getPSSubSysServiceAPIDEMethod()?? >
${subSysServiceApiDECodeName?uncap_first}FeignClient.updateBatch(list) ;
......@@ -1515,6 +1577,7 @@ ${deaction.getRender().code}
@Override
@Transactional
public boolean save(${item.getCodeName()} et) {
<@outputTestAction deaction "save"/>
<#if item.isEnableAPIStorage()>
<#if deaction.getPSSubSysServiceAPIDEMethod()?? >
<#comment>附加数据逻辑-操作前</#comment>
......@@ -1560,6 +1623,7 @@ ${deaction.getRender().code}
@Override
public void saveBatch(List<${item.getCodeName()}> list) {
<@outputTestAction deaction "saveBatch"/>
<#if item.isEnableAPIStorage()>
<#if deaction.getPSSubSysServiceAPIDEMethod()?? >
${subSysServiceApiDECodeName?uncap_first}FeignClient.saveBatch(list) ;
......@@ -1570,6 +1634,7 @@ ${deaction.getRender().code}
<#elseif deaction.getCodeName()?lower_case == "remove">
@Override
public boolean remove(${srfjavatype(keyfield.stdDataType)} ${keyfield.getCodeName()?lower_case}) {
<@outputTestAction deaction "remove"/>
<#if de.getMajorPSDERs()??>
<#list de.getMajorPSDERs() as der>
<#if der.getDERType() =='DER1N' && der.isNestedRS() && der.getMinorPSDataEntity()?? && (der.getMinorPSDataEntity().getStorageMode()==1||der.getMinorPSDataEntity().getStorageMode()==2) >
......@@ -1597,6 +1662,7 @@ ${deaction.getRender().code}
}
public void removeBatch(Collection<${srfjavatype(keyfield.stdDataType)}> idList){
<@outputTestAction deaction "removeBatch"/>
<#if item.isEnableAPIStorage()>
<#if deaction.getPSSubSysServiceAPIDEMethod()?? >
${subSysServiceApiDECodeName?uncap_first}FeignClient.removeBatch(idList);
......@@ -1607,6 +1673,7 @@ ${deaction.getRender().code}
<#elseif deaction.getCodeName()?lower_case == "getdraft">
@Override
public ${item.getCodeName()} getDraft(${item.getCodeName()} et) {
<@outputTestAction deaction "getdraft"/>
<#if item.isEnableAPIStorage()>
<#if deaction.getPSSubSysServiceAPIDEMethod()?? >
<#comment>附加数据逻辑-操作前</#comment>
......@@ -1626,6 +1693,7 @@ ${deaction.getRender().code}
<#elseif deaction.getCodeName()?lower_case == "checkkey">
@Override
public boolean checkKey(${item.getCodeName()} et) {
<@outputTestAction deaction "checkkey"/>
<#if item.isEnableAPIStorage()>
<#if deaction.getPSSubSysServiceAPIDEMethod()?? >
return ${subSysServiceApiDECodeName?uncap_first}FeignClient.checkKey(et);
......@@ -1639,6 +1707,7 @@ ${deaction.getRender().code}
<#else>
@Override
public ${item.getCodeName()} ${srfmethodname(deaction.getCodeName())}(${item.getCodeName()} et) {
<@outputTestAction deaction "other"/>
<#if item.isEnableAPIStorage()>
<#if deaction.getPSSubSysServiceAPIDEMethod()?? >
<#comment>附加数据逻辑-操作前</#comment>
......@@ -1655,6 +1724,8 @@ ${deaction.getRender().code}
</#if>
}
</#if>
<#comment>输出测试实体行为</#comment>
<@outputTestActionDetail deaction/>
</#if>
</#if>
</#list>
......@@ -1788,7 +1859,7 @@ public class ${item.getCodeName()}ServiceImpl implements I${de.getCodeName()}Ser
<#if !P.exists('DEMinorPSDataEntity',der.getMinorPSDataEntity().getCodeName())>
@Autowired
@Lazy
private ${pub.getPKGCodeName()}.core.${der.getMinorPSDataEntity().getPSSystemModule().getCodeName()?lower_case}.service.I${der.getMinorPSDataEntity().getCodeName()}Service ${srfcaseformat(der.getMinorPSDataEntity().getCodeName(),'l_u2lC')}Service;
protected ${pub.getPKGCodeName()}.core.${der.getMinorPSDataEntity().getPSSystemModule().getCodeName()?lower_case}.service.I${der.getMinorPSDataEntity().getCodeName()}Service ${srfcaseformat(der.getMinorPSDataEntity().getCodeName(),'l_u2lC')}Service;
</#if>
</#if>
</#list>
......@@ -1804,8 +1875,10 @@ public class ${item.getCodeName()}ServiceImpl implements I${de.getCodeName()}Ser
<#comment>实体行为附加逻辑</#comment>
<#if deAction.getPSDEActionLogics()??>
<#list deAction.getPSDEActionLogics() as deActionLogic>
<#if deActionLogic.isInternalLogic()>
<#assign deLogic=deActionLogic.getPSDELogic()>
<@importDELogic deLogic />
</#if>
</#list>
</#if>
</#list>
......@@ -1822,6 +1895,7 @@ ${deaction.getRender().code}
@Override
@Transactional
public ${item.getCodeName()} ${srfmethodname(deaction.getCodeName())}(${item.getCodeName()} et) {
<@outputTestAction deaction "usercustom"/>
<#comment>附加数据逻辑-操作前</#comment>
<@addBoforeLogic deaction/>
//自定义代码
......@@ -1834,6 +1908,7 @@ ${deaction.getRender().code}
@Override
@Transactional
public ${item.getCodeName()} ${srfmethodname(deaction.getCodeName())}(${item.getCodeName()} et) {
<@outputTestAction deaction "delogic"/>
<#comment>附加数据逻辑-操作前</#comment>
<@addBoforeLogic deaction/>
${deaction.getPSDELogic().getCodeName()?lower_case}Logic.execute(et);
......@@ -1845,6 +1920,7 @@ ${deaction.getRender().code}
<#elseif deaction.getCodeName()?lower_case == 'get'>
@Override
public ${item.getCodeName()} get(${srfjavatype(keyfield.stdDataType)} key) {
<@outputTestAction deaction "get"/>
<#comment>附加数据逻辑-操作前</#comment>
<@buildEntityParam deaction/>
<@addGetActionBoforeLogic deaction/>
......@@ -1862,6 +1938,7 @@ ${deaction.getRender().code}
<#elseif deaction.getCodeName()?lower_case == "create">
@Override
public boolean create(${item.getCodeName()} et) {
<@outputTestAction deaction "create"/>
<#comment>附加数据逻辑-操作前</#comment>
<@addBoforeLogic deaction/>
//代码实现
......@@ -1871,12 +1948,13 @@ ${deaction.getRender().code}
}
public void createBatch(List<${item.codeName}> list){
<@outputTestAction deaction "createBatch"/>
}
<#elseif deaction.getCodeName()?lower_case == "update">
@Override
public boolean update(${item.getCodeName()} et) {
<@outputTestAction deaction "update"/>
<#comment>附加数据逻辑-操作前</#comment>
<@addBoforeLogic deaction/>
//代码实现
......@@ -1886,13 +1964,14 @@ ${deaction.getRender().code}
}
public void updateBatch(List<${item.codeName}> list){
<@outputTestAction deaction "updateBatch"/>
}
<#elseif deaction.getCodeName()?lower_case == "save">
@Override
@Transactional
public boolean save(${item.getCodeName()} et) {
<@outputTestAction deaction "save"/>
<#comment>附加数据逻辑-操作前</#comment>
<@addBoforeLogic deaction/>
//代码实现
......@@ -1903,12 +1982,13 @@ ${deaction.getRender().code}
@Override
public void saveBatch(List<${item.getCodeName()}> list) {
<@outputTestAction deaction "saveBatch"/>
}
<#elseif deaction.getCodeName()?lower_case == "remove">
@Override
public boolean remove(${srfjavatype(keyfield.stdDataType)} key) {
<@outputTestAction deaction "remove"/>
<#comment>附加数据逻辑-操作前</#comment>
<@buildEntityParam deaction/>
<@addBoforeLogic deaction/>
......@@ -1918,12 +1998,13 @@ ${deaction.getRender().code}
}
public void removeBatch(Collection<${srfjavatype(keyfield.stdDataType)}> idList){
<@outputTestAction deaction "removeBatch"/>
}
<#elseif deaction.getCodeName()?lower_case == "getdraft">
@Override
public ${item.getCodeName()} getDraft(${item.getCodeName()} et) {
<@outputTestAction deaction "getdraft"/>
<#comment>附加数据逻辑-操作前</#comment>
<@addBoforeLogic deaction/>
<#comment>附加数据逻辑-操作后</#comment>
......@@ -1934,6 +2015,7 @@ ${deaction.getRender().code}
<#elseif deaction.getCodeName()?lower_case == "checkkey">
@Override
public boolean checkKey(${item.getCodeName()} et) {
<@outputTestAction deaction "checkkey"/>
<#comment>附加数据逻辑-操作前</#comment>
<@addBoforeLogic deaction/>
<#comment>附加数据逻辑-操作后</#comment>
......@@ -1943,6 +2025,7 @@ ${deaction.getRender().code}
<#else>
@Override
public ${item.getCodeName()} ${srfmethodname(deaction.getCodeName())}(${item.getCodeName()} et) {
<@outputTestAction deaction "other"/>
<#comment>附加数据逻辑-操作前</#comment>
<@addBoforeLogic deaction/>
<#comment>附加数据逻辑-操作后</#comment>
......@@ -1950,6 +2033,8 @@ ${deaction.getRender().code}
return et;
}
</#if>
<#comment>输出测试实体行为</#comment>
<@outputTestActionDetail deaction/>
</#if>
</#if>
</#list>
......@@ -2118,7 +2203,7 @@ ${deaction.getRender().code}
@Autowired
@Lazy
private ${pub.getPKGCodeName()}.core.${de.getPSSystemModule().getCodeName()?lower_case}.service.logic.I${de.getCodeName()}${deLogic.codeName}Logic ${deLogic.getCodeName()?lower_case}Logic;
protected ${pub.getPKGCodeName()}.core.${de.getPSSystemModule().getCodeName()?lower_case}.service.logic.I${de.getCodeName()}${deLogic.codeName}Logic ${deLogic.getCodeName()?lower_case}Logic;
</#if>
</#macro>
......@@ -2172,4 +2257,141 @@ ${deaction.getRender().code}
</#if>
</#macro>
<#comment>输出测试行为</#comment>
<#macro outputTestAction deaction actionParam>
<#if deaction.isEnableBackend() && deaction.getTestActionMode?? && deaction.getTestActionMode()??>
<#if deaction.getTestActionMode() ==1 || deaction.getTestActionMode() ==3 >
<#if (deaction.getActionType()=='USERCUSTOM')>
test${srfmethodname(deaction.getCodeName())?cap_first}(et);
<#elseif deaction.getActionType()=='DELOGIC'>
test${srfmethodname(deaction.getCodeName())?cap_first}(et);
<#elseif deaction.getCodeName()?lower_case == 'get'>
testGet(key);
<#elseif deaction.getCodeName()?lower_case == "createbatch">
<#elseif deaction.getCodeName()?lower_case == "updatebatch">
<#elseif deaction.getCodeName()?lower_case == "removebatch">
<#elseif deaction.getCodeName()?lower_case == "savebatch">
<#elseif deaction.getCodeName()?lower_case == "create">
<#if actionParam=='createBatch'>
testCreateBatch(list);
<#else>
testCreate(et);
</#if>
<#elseif deaction.getCodeName()?lower_case == "update">
<#if actionParam=='updateBatch'>
testUpdateBatch(list);
<#else>
testUpdate(et);
</#if>
<#elseif deaction.getCodeName()?lower_case == "save">
<#if actionParam=='saveBatch'>
testSaveBatch(list);
<#elseif actionParam=='saveOrUpdate'>
testSaveOrUpdate(et);
<#else>
testSave(et);
</#if>
<#elseif deaction.getCodeName()?lower_case == "remove">
<#if actionParam=='removeBatch'>
testRemoveBatch(idList);
<#else>
testRemove(key);
</#if>
<#elseif deaction.getCodeName()?lower_case == "getdraft">
testGetDraft(et);
<#elseif deaction.getCodeName()?lower_case == "checkkey">
testCheckKey(et);
<#else>
test${srfmethodname(deaction.getCodeName())?cap_first}(et);
</#if>
</#if>
</#if>
</#macro>
<#comment>输出测试行为</#comment>
<#macro outputTestActionDetail deaction>
<#if deaction.isEnableBackend() && deaction.getTestActionMode?? && deaction.getTestActionMode()??>
<#if deaction.getTestActionMode() ==1 || deaction.getTestActionMode() ==3>
<#if (deaction.getActionType()=='USERCUSTOM')>
public boolean test${srfmethodname(deaction.getCodeName())?cap_first}(${item.getCodeName()} et) {
return true;
}
<#elseif deaction.getActionType()=='DELOGIC'>
public boolean test${srfmethodname(deaction.getCodeName())?cap_first}(${item.getCodeName()} et) {
return true;
}
<#elseif deaction.getCodeName()?lower_case == 'get'>
public boolean testGet(${srfjavatype(keyfield.stdDataType)} key) {
return true;
}
<#elseif deaction.getCodeName()?lower_case == "createbatch">
<#elseif deaction.getCodeName()?lower_case == "updatebatch">
<#elseif deaction.getCodeName()?lower_case == "removebatch">
<#elseif deaction.getCodeName()?lower_case == "savebatch">
<#elseif deaction.getCodeName()?lower_case == "create">
public boolean testCreate(${item.getCodeName()} et) {
return true;
}
public boolean testCreateBatch(List<${item.getCodeName()}> list) {
return true;
}
<#elseif deaction.getCodeName()?lower_case == "update">
public boolean testUpdate(${item.getCodeName()} et) {
return true;
}
public boolean testUpdateBatch(List<${item.getCodeName()}> list) {
return true;
}
<#elseif deaction.getCodeName()?lower_case == "save">
public boolean testSave(${item.getCodeName()} et) {
return true;
}
public boolean testSaveOrUpdate(${item.getCodeName()} et) {
return true;
}
public boolean testSaveBatch(Collection<${item.getCodeName()}> list) {
return true;
}
public boolean testSaveBatch(List<${item.getCodeName()}> list) {
return true;
}
<#elseif deaction.getCodeName()?lower_case == "remove">
public boolean testRemove(${srfjavatype(keyfield.stdDataType)} key) {
return true;
}
public boolean testRemoveBatch(Collection<${srfjavatype(keyfield.stdDataType)}> idList) {
return true;
}
<#elseif deaction.getCodeName()?lower_case == "getdraft">
public boolean testGetDraft(${item.getCodeName()} et) {
return true;
}
<#elseif deaction.getCodeName()?lower_case == "checkkey">
public boolean testCheckKey(${item.getCodeName()} et) {
return true;
}
<#else>
public boolean test${srfmethodname(deaction.getCodeName())?cap_first}(${item.getCodeName()} et) {
return true;
}
</#if>
</#if>
</#if>
</#macro>
</#if>
......@@ -8,52 +8,22 @@ TARGET=PSDATAENTITY
<#if deaction.isEnableBackend() && deaction.getActionType()=='USERCUSTOM'>
<#assign hasServiceEx=true>
<#break>
<#elseif deaction.isEnableBackend() && deaction.getTestActionMode?? && deaction.getTestActionMode()?? && (deaction.getTestActionMode() ==1 || deaction.getTestActionMode() ==3)>
<#assign hasServiceEx=true>
<#break>
</#if>
</#list>
</#if>
<#if hasServiceEx && (de.getStorageMode()==1 || de.getStorageMode()==2 ||de.getStorageMode()==4||de.getStorageMode()==0 ) >
package ${pub.getPKGCodeName()}.core.extensions.service;
import ${pub.getPKGCodeName()}.core.${item.getPSSystemModule().getCodeName()?lower_case}.service.impl.${item.codeName}ServiceImpl;
import lombok.extern.slf4j.Slf4j;
import ${pub.getPKGCodeName()}.core.${item.getPSSystemModule().getCodeName()?lower_case}.domain.${item.codeName};
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.context.annotation.Primary;
/**
* 实体[${item.getLogicName()}] 自定义服务对象
* 扩展目录已变更,请到[${pub.getPKGCodeName()}.core.extensions.service.xxExService]中来进行扩展
* 若您之前有在当前目录下扩展过其它的service对象,请将扩展的代码移到新的扩展类中,并注释掉老的扩展类,防止Bean重复
*/
@Slf4j
@Primary
@Service("${item.codeName}ServiceEx")
public class ${item.codeName}ServiceEx extends ${item.codeName}ServiceImpl {
@Deprecated
public class ${item.codeName}ServiceEx{
<#comment>SQL存储:解决mybatis继承service批操作报错</#comment>
<#if de.getStorageMode()==1>
@Override
protected Class currentModelClass() {
return com.baomidou.mybatisplus.core.toolkit.ReflectionKit.getSuperClassGenericType(this.getClass().getSuperclass(), 1);
}
</#if>
<#comment>输出实体行为</#comment>
<#if item.getAllPSDEActions()??>
<#list item.getAllPSDEActions() as deaction>
<#if deaction.isEnableBackend() && deaction.getActionType()=='USERCUSTOM'>
/**
* 自定义行为[${deaction.getCodeName()}]用户扩展
* @param et
* @return
*/
@Override
@Transactional
public ${item.getCodeName()} ${srfmethodname(deaction.getCodeName())}(${item.getCodeName()} et) {
return super.${srfmethodname(deaction.getCodeName())}(et);
}
</#if>
</#list>
</#if>
}
</#if>
......
<#ibiztemplate>
TARGET=PSDATAENTITY
</#ibiztemplate>
<#comment>判断当前实体是否包含自定义行为</#comment>
<#assign hasServiceEx=false>
<#if item.getAllPSDEActions()??>
<#list item.getAllPSDEActions() as deaction>
<#if deaction.isEnableBackend() && deaction.getActionType()=='USERCUSTOM'>
<#assign hasServiceEx=true>
<#break>
<#elseif deaction.isEnableBackend() && deaction.getTestActionMode?? && deaction.getTestActionMode()?? && (deaction.getTestActionMode() ==1 || deaction.getTestActionMode() ==3)>
<#assign hasServiceEx=true>
<#break>
</#if>
</#list>
</#if>
<#if hasServiceEx && (de.getStorageMode()==1 || de.getStorageMode()==2 ||de.getStorageMode()==4||de.getStorageMode()==0 ) >
package ${pub.getPKGCodeName()}.core.extensions.service;
import ${pub.getPKGCodeName()}.core.${item.getPSSystemModule().getCodeName()?lower_case}.service.impl.${item.codeName}ServiceImpl;
import lombok.extern.slf4j.Slf4j;
import ${pub.getPKGCodeName()}.core.${item.getPSSystemModule().getCodeName()?lower_case}.domain.${item.codeName};
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.context.annotation.Primary;
import java.util.*;
/**
* 实体[${item.getLogicName()}] 自定义服务对象
*/
@Slf4j
@Primary
@Service("${item.codeName}ExService")
public class ${item.codeName}ExService extends ${item.codeName}ServiceImpl {
<#assign keyfield=de.getKeyPSDEField()>
<#comment>SQL存储:解决mybatis继承service批操作报错</#comment>
<#if de.getStorageMode()==1>
@Override
protected Class currentModelClass() {
return com.baomidou.mybatisplus.core.toolkit.ReflectionKit.getSuperClassGenericType(this.getClass().getSuperclass(), 1);
}
</#if>
<#comment>输出实体行为</#comment>
<#if item.getAllPSDEActions()??>
<#list item.getAllPSDEActions() as deaction>
<#if deaction.isEnableBackend()>
<#if deaction.getActionType()=='USERCUSTOM'>
/**
* 自定义行为[${deaction.getCodeName()}]用户扩展
* @param et
* @return
*/
@Override
@Transactional
public ${item.getCodeName()} ${srfmethodname(deaction.getCodeName())}(${item.getCodeName()} et) {
return super.${srfmethodname(deaction.getCodeName())}(et);
}
</#if>
<#comment>输出测试行为</#comment>
<@outputTestActionDetail deaction />
</#if>
</#list>
</#if>
}
</#if>
<#comment>输出测试行为</#comment>
<#macro outputTestActionDetail deaction>
<#if deaction.isEnableBackend() && deaction.getTestActionMode?? && deaction.getTestActionMode()??>
<#if deaction.getTestActionMode() ==1 || deaction.getTestActionMode() ==3>
<#if (deaction.getActionType()=='USERCUSTOM')>
@Override
public boolean test${srfmethodname(deaction.getCodeName())?cap_first}(${item.getCodeName()} et) {
return super.test${srfmethodname(deaction.getCodeName())?cap_first}(et);
}
<#elseif deaction.getActionType()=='DELOGIC'>
@Override
public boolean test${srfmethodname(deaction.getCodeName())?cap_first}(${item.getCodeName()} et) {
return super.test${srfmethodname(deaction.getCodeName())?cap_first}(et);
}
<#elseif deaction.getCodeName()?lower_case == 'get'>
@Override
public boolean testGet(${srfjavatype(keyfield.stdDataType)} key) {
return super.testGet(key);
}
<#elseif deaction.getCodeName()?lower_case == "createbatch">
<#elseif deaction.getCodeName()?lower_case == "updatebatch">
<#elseif deaction.getCodeName()?lower_case == "removebatch">
<#elseif deaction.getCodeName()?lower_case == "savebatch">
<#elseif deaction.getCodeName()?lower_case == "create">
@Override
public boolean testCreate(${item.getCodeName()} et) {
return super.testCreate(et);
}
@Override
public boolean testCreateBatch(List<${item.getCodeName()}> list) {
return super.testCreateBatch(list);
}
<#elseif deaction.getCodeName()?lower_case == "update">
@Override
public boolean testUpdate(${item.getCodeName()} et) {
return super.testUpdate(et);
}
@Override
public boolean testUpdateBatch(List<${item.getCodeName()}> list) {
return super.testUpdateBatch(list);
}
<#elseif deaction.getCodeName()?lower_case == "save">
@Override
public boolean testSave(${item.getCodeName()} et) {
return super.testSave(et);
}
@Override
public boolean testSaveOrUpdate(${item.getCodeName()} et) {
return super.testSaveOrUpdate(et);
}
@Override
public boolean testSaveBatch(Collection<${item.getCodeName()}> list) {
return super.testSaveBatch(list);
}
@Override
public boolean testSaveBatch(List<${item.getCodeName()}> list) {
return super.testSaveBatch(list);
}
<#elseif deaction.getCodeName()?lower_case == "remove">
@Override
public boolean testRemove(${srfjavatype(keyfield.stdDataType)} key) {
return super.testRemove(key);
}
@Override
public boolean testRemoveBatch(Collection<${srfjavatype(keyfield.stdDataType)}> idList) {
return super.testRemoveBatch(idList);
}
<#elseif deaction.getCodeName()?lower_case == "getdraft">
@Override
public boolean testGetDraft(${item.getCodeName()} et) {
return super.testGetDraft(et);
}
<#elseif deaction.getCodeName()?lower_case == "checkkey">
@Override
public boolean testCheckKey(${item.getCodeName()} et) {
return super.testCheckKey(et);
}
<#else>
@Override
public boolean test${srfmethodname(deaction.getCodeName())?cap_first}(${item.getCodeName()} et) {
return super.test${srfmethodname(deaction.getCodeName())?cap_first}(et);
}
</#if>
</#if>
</#if>
</#macro>
......@@ -9,6 +9,7 @@ import ${pub.getPKGCodeName()}.util.helper.UniqueNameGenerator;
import com.baomidou.mybatisplus.core.injector.ISqlInjector;
<#--import com.baomidou.mybatisplus.extension.injector.LogicSqlInjector;-->
import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import com.baomidou.mybatisplus.extension.plugins.pagination.optimize.JsqlParserCountOptimize;
import org.apache.ibatis.mapping.DatabaseIdProvider;
import org.apache.ibatis.mapping.VendorDatabaseIdProvider;
import org.springframework.context.annotation.Bean;
......@@ -46,7 +47,14 @@ public class MybatisConfiguration {
*/
@Bean
public PaginationInterceptor paginationInterceptor() {
return new PaginationInterceptor();
PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
// 设置请求的页面大于最大页后操作, true调回到首页,false 继续请求 默认false
// paginationInterceptor.setOverflow(false);
// 设置最大单页限制数量,默认 500 条,-1 不受限制
paginationInterceptor.setLimit(-1);
// 开启 count join 优化,只针对部分 left join
paginationInterceptor.setCountSqlParser(new JsqlParserCountOptimize(true));
return paginationInterceptor;
}
<#--/**-->
......
......@@ -27,9 +27,9 @@ TARGET=PSSYSSERVICEAPI
<#assign redisHost = depSysApiPlatform.getUserParam("spring.redis.host","")>
</#if>
<#if depSysApi.getUserParam("spring.redis.port","")?? && depSysApi.getUserParam("spring.redis.port","")!="">
<#assign redisPort = depSysApi.getUserParam("")>
<#assign redisPort = depSysApi.getUserParam("spring.redis.port")>
<#elseif depSysApiPlatform.getUserParam("spring.redis.port","")?? && depSysApiPlatform.getUserParam("spring.redis.port","")!="">
<#assign redisPort = depSysApiPlatform.getUserParam("")>
<#assign redisPort = depSysApiPlatform.getUserParam("spring.redis.port")>
</#if>
<#if depSysApi.getUserParam("spring.redis.database","")?? && depSysApi.getUserParam("spring.redis.database","")!="">
<#assign redisDataBase = depSysApi.getUserParam("spring.redis.database","")>
......
......@@ -56,6 +56,7 @@ import ${pubPkgCodeName}.${itemSysApiCodeNameLC}.mapping.*;
import ${pubPkgCodeName}.core.${deModelCodeNameLC}.domain.${deCodeName};
import ${pubPkgCodeName}.core.${deModelCodeNameLC}.service.I${deCodeName}Service;
import ${pubPkgCodeName}.core.${deModelCodeNameLC}.filter.${deCodeName}SearchContext;
import ${pubPkgCodeName}.util.annotation.VersionCheck;
<#if item.getPSDEServiceAPIRSs()??>
<#list item.getPSDEServiceAPIRSs() as apider>
<#assign deapide=apider.getMinorPSDEServiceAPI().getPSDataEntity()>
......@@ -140,6 +141,8 @@ public class ${itemCodeName}Resource {
<#assign deaction = apiMethod.getPSDEAction()>
<#assign deactionName = deaction.getName()>
<#assign deactionCodeName = deaction.getCodeName()>
<#comment>输出主接口测试行为</#comment>
<@outputTestActionDetail deaction/>
<#if deaction.codeName?lower_case == 'create'>
<@SecurityAnnotation deaction/>
@ApiOperation(value = "新建${deLogicName}", tags = {"${deLogicName}" }, notes = "新建${deLogicName}")
......@@ -161,6 +164,7 @@ public class ${itemCodeName}Resource {
}
<#elseif deaction.codeName?lower_case == 'update'>
<@VersionCheckAnnotation/>
<@SecurityAnnotation deaction/>
@ApiOperation(value = "更新${deLogicName}", tags = {"${deLogicName}" }, notes = "更新${deLogicName}")
@RequestMapping(method = RequestMethod.PUT, value = "${fullPath}/{${itemCodeNameLC + keyCNLC}}")
......@@ -249,18 +253,17 @@ public class ${itemCodeName}Resource {
@RequestMapping(method = RequestMethod.${reqMtd}, value = "${fullPath}/{${itemCodeNameLC + keyCNLC}}/${deactionCodeName?lower_case}")
<#if de.getStorageMode()==4><#else> @Transactional</#if>
public ResponseEntity<${itemCodeName}DTO> ${deactionCodeName?uncap_first}(${id_etParams}) {
${deCodeName} ${deCodeNameLC} = ${itemCodeNameLC}Mapping.toDomain(${itemCodeNameLC}dto);
${deCodeNameLC}.set${dePKCodeName}(${itemCodeNameLC + keyCNLC});
${deCodeNameLC} = ${deCodeNameLC}Service.${srfmethodname(deactionCodeName)}(${deCodeNameLC});
${itemCodeNameLC}dto = ${itemCodeNameLC}Mapping.toDto(${deCodeNameLC});
${deCodeName} domain = ${itemCodeNameLC}Mapping.toDomain(${itemCodeNameLC}dto);
domain.set${dePKCodeName}(${itemCodeNameLC + keyCNLC});
domain = ${deCodeNameLC}Service.${srfmethodname(deactionCodeName)}(domain);
${itemCodeNameLC}dto = ${itemCodeNameLC}Mapping.toDto(domain);
return ResponseEntity.status(HttpStatus.OK).body(${itemCodeNameLC}dto);
}
</#if>
<#elseif apiMethod.getActionType()=='FETCH'>
<#assign deds = apiMethod.getPSDEDataSet()>
@PreAuthorize("hasAnyAuthority('ROLE_SUPERADMIN','${sys.codeName}-${de.codeName}-search${deds.codeName}-all')")
<#--<@SecurityAnnotation deds/>-->
<@DataQuerySecurityAnnotation deds/>
@ApiOperation(value = "获取${deds.getLogicName()}", tags = {"${deLogicName}" } ,notes = "获取${deds.getLogicName()}")
@RequestMapping(method= RequestMethod.${reqMtd} , value="${fullPath}/fetch<#if (deds.getName()=='DEFAULT')>${deds.getCodeName()?lower_case}<#else>${deds.getCodeName()?lower_case}</#if>")
public ResponseEntity<List<<#if deds.isEnableGroup()>HashMap<#else>${itemCodeName}DTO</#if>>> fetch<#if (deds.getName()=='DEFAULT')>${deds.getCodeName()}<#else>${deds.getCodeName()}</#if>(${deCodeName}SearchContext context) {
......@@ -283,8 +286,7 @@ public class ${itemCodeName}Resource {
</#if>
}
@PreAuthorize("hasAnyAuthority('ROLE_SUPERADMIN','${sys.codeName}-${de.codeName}-search${deds.codeName}-all')")
<#--<@SecurityAnnotation deds/>-->
<@DataQuerySecurityAnnotation deds/>
@ApiOperation(value = "查询${deds.getLogicName()}", tags = {"${deLogicName}" } ,notes = "查询${deds.getLogicName()}")
@RequestMapping(method= RequestMethod.POST , value="${fullPath}/search<#if (deds.getName()=='DEFAULT')>${deds.getCodeName()?lower_case}<#else>${deds.getCodeName()?lower_case}</#if>")
public ResponseEntity<Page<<#if deds.isEnableGroup()>HashMap<#else>${itemCodeName}DTO</#if>>> search<#if (deds.getName()=='DEFAULT')>${deds.getCodeName()}<#else>${deds.getCodeName()}</#if>(@RequestBody ${deCodeName}SearchContext context) {
......@@ -389,6 +391,8 @@ public class ${itemCodeName}Resource {
<#assign deaction = apiMethod.getPSDEAction()>
<#assign deactionName = deaction.getName()>
<#assign deactionCodeName = deaction.getCodeName()>
<#comment>输出从接口测试行为</#comment>
<@outputTestActionDetail2 deaction/>
<#if deaction.codeName?lower_case == 'create'>
<@SecurityAnnotation deaction/>
@ApiOperation(value = "${byTagParams}建立${deLogicName}", tags = {"${deLogicName}" }, notes = "${byTagParams}建立${deLogicName}")
......@@ -415,6 +419,7 @@ public class ${itemCodeName}Resource {
}
<#elseif deaction.codeName?lower_case == 'update'>
<@VersionCheckAnnotation/>
<@SecurityAnnotation deaction/>
@ApiOperation(value = "${byTagParams}更新${deLogicName}", tags = {"${deLogicName}" }, notes = "${byTagParams}更新${deLogicName}")
@RequestMapping(method = RequestMethod.PUT, value = "${fullPath}/{${itemCodeNameLC + keyCNLC}}")
......@@ -565,8 +570,7 @@ public class ${itemCodeName}Resource {
</#if>
<#elseif apiMethod.getActionType()=='FETCH'>
<#assign deds = apiMethod.getPSDEDataSet()>
@PreAuthorize("hasAnyAuthority('ROLE_SUPERADMIN','${sys.codeName}-${de.codeName}-search${deds.codeName}-all')")
<#--<@SecurityAnnotation deds/>-->
<@DataQuerySecurityAnnotation deds/>
@ApiOperation(value = "${byTagParams}获取${deds.getLogicName()}", tags = {"${deLogicName}" } ,notes = "${byTagParams}获取${deds.getLogicName()}")
@RequestMapping(method= RequestMethod.${reqMtd} , value="${fullPath}/fetch<#if (deds.getName()=='DEFAULT')>${deds.getCodeName()?lower_case}<#else>${deds.getCodeName()?lower_case}</#if>")
public ResponseEntity<List<<#if deds.isEnableGroup()>HashMap<#else>${itemCodeName}DTO</#if>>> fetch${itemCodeName}<#if (deds.getName()=='DEFAULT')>${deds.getCodeName()}<#else>${deds.getCodeName()}</#if>${byParams}(<#if parentParams!="">${parentParams},</#if>${deCodeName}SearchContext context) {
......@@ -589,8 +593,7 @@ public class ${itemCodeName}Resource {
</#if>
}
@PreAuthorize("hasAnyAuthority('ROLE_SUPERADMIN','${sys.codeName}-${de.codeName}-search${deds.codeName}-all')")
<#--<@SecurityAnnotation deds/>-->
<@DataQuerySecurityAnnotation deds/>
@ApiOperation(value = "${byTagParams}查询${deds.getLogicName()}", tags = {"${deLogicName}" } ,notes = "${byTagParams}查询${deds.getLogicName()}")
@RequestMapping(method= RequestMethod.POST , value="${fullPath}/search<#if (deds.getName()=='DEFAULT')>${deds.getCodeName()?lower_case}<#else>${deds.getCodeName()?lower_case}</#if>")
public ResponseEntity<Page<<#if deds.isEnableGroup()>HashMap<#else>${itemCodeName}DTO</#if>>> search${itemCodeName}<#if (deds.getName()=='DEFAULT')>${deds.getCodeName()}<#else>${deds.getCodeName()}</#if>${byParams}(<#if parentParams!="">${parentParams}, @RequestBody </#if>${deCodeName}SearchContext context) {
......@@ -616,6 +619,17 @@ public class ${itemCodeName}Resource {
</#if>
</#if>
<#comment>数据查询Security权限校验</#comment>
<#macro DataQuerySecurityAnnotation dataset>
<#if de.getStorageMode()==1 || de.getStorageMode()==2>
<#if hasDEPrefield==false>
@PreAuthorize("hasAnyAuthority('ROLE_SUPERADMIN','${sys.codeName}-${de.codeName}-search${dataset.codeName}-all')")
<#else>
@PreAuthorize("hasAnyAuthority('ROLE_SUPERADMIN','${sys.codeName}-${de.codeName}-search${dataset.codeName}-all') and hasPermission(#context,'${sys.codeName}-${de.codeName}-Get')")
</#if>
</#if>
</#macro>
<#comment>单条数据Security权限校验</#comment>
<#macro SecurityAnnotation deaction>
<#if de.getStorageMode()==1 || de.getStorageMode()==2>
......@@ -652,6 +666,267 @@ public class ${itemCodeName}Resource {
</#if>
</#macro>
<#comment>数据库版本检查注解</#comment>
<#macro VersionCheckAnnotation>
<#if item.getPSDEServiceAPIFields()??>
<#list item.getPSDEServiceAPIFields() as apifield>
<#if apifield.getPSDEField?? && apifield.getPSDEField()??>
<#assign defield=apifield.getPSDEField()>
<#if defield.getPredefinedType?? && defield.getPredefinedType()??>
<#if defield.getPredefinedType()=='UPDATEDATE'>
<#assign updatedateField=srfcaseformat(defield.codeName,'l_u2lC')>
@VersionCheck(entity = "${deCodeNameLC}" , versionfield = "${updatedateField}")
<#break>
</#if>
</#if>
</#if>
</#list>
</#if>
</#macro>
<#comment>输出主接口测试行为</#comment>
<#macro outputTestActionDetail deaction>
<#if deaction.getTestActionMode?? && deaction.getTestActionMode()?? && (deaction.getTestActionMode() ==3) >
<#assign deactionName = deaction.getName()>
<#assign deactionCodeName = deaction.getCodeName()>
<#if deaction.codeName?lower_case == 'create'>
<@SecurityAnnotation deaction/>
@ApiOperation(value = "新建${deLogicName}", tags = {"${deLogicName}" }, notes = "新建${deLogicName}")
@RequestMapping(method = RequestMethod.POST, value = "${fullPath}/test")
<#if de.getStorageMode()==4><#else> @Transactional</#if>
public ResponseEntity<Boolean> testCreate(${etParams}) {
return ResponseEntity.status(HttpStatus.OK).body(${deCodeNameLC}Service.testCreate(${itemCodeNameLC}Mapping.toDomain(${itemCodeNameLC}dto)));
}
<@SecurityBatchAnnotation deaction/>
@ApiOperation(value = "批量新建${deLogicName}", tags = {"${deLogicName}" }, notes = "批量新建${deLogicName}")
@RequestMapping(method = RequestMethod.POST, value = "${fullPath}/batch/test")
public ResponseEntity<Boolean> testCreateBatch(${etParamsList}) {
return ResponseEntity.status(HttpStatus.OK).body(${deCodeNameLC}Service.testCreateBatch(${itemCodeNameLC}Mapping.toDomain(${itemCodeNameLC}dtos)));
}
<#elseif deaction.codeName?lower_case == 'update'>
<@SecurityAnnotation deaction/>
@ApiOperation(value = "更新${deLogicName}", tags = {"${deLogicName}" }, notes = "更新${deLogicName}")
@RequestMapping(method = RequestMethod.PUT, value = "${fullPath}/{${itemCodeNameLC + keyCNLC}}/test")
<#if de.getStorageMode()==4><#else> @Transactional</#if>
public ResponseEntity<Boolean> testUpdate(${id_etParams}) {
${deCodeName} domain = ${itemCodeNameLC}Mapping.toDomain(${itemCodeNameLC}dto);
domain .set${dePKCodeName}(${itemCodeNameLC + keyCNLC});
return ResponseEntity.status(HttpStatus.OK).body(${deCodeNameLC}Service.testUpdate(domain));
}
<@SecurityBatchAnnotation deaction/>
@ApiOperation(value = "批量更新${deLogicName}", tags = {"${deLogicName}" }, notes = "批量更新${deLogicName}")
@RequestMapping(method = RequestMethod.PUT, value = "${fullPath}/batch/test")
public ResponseEntity<Boolean> testUpdateBatch(${etParamsList}) {
return ResponseEntity.status(HttpStatus.OK).body(${deCodeNameLC}Service.testUpdateBatch(${itemCodeNameLC}Mapping.toDomain(${itemCodeNameLC}dtos)));
}
<#elseif deaction.codeName?lower_case == 'save'>
<@SecurityAnnotation deaction/>
@ApiOperation(value = "保存${deLogicName}", tags = {"${deLogicName}" }, notes = "保存${deLogicName}")
@RequestMapping(method = RequestMethod.${reqMtd}, value = "${fullPath}/${deactionCodeName?lower_case}/test")
public ResponseEntity<Boolean> testSave(${etParams}) {
return ResponseEntity.status(HttpStatus.OK).body(${deCodeNameLC}Service.testSave(${itemCodeNameLC}Mapping.toDomain(${itemCodeNameLC}dto)));
}
<@SecurityBatchAnnotation deaction/>
@ApiOperation(value = "批量保存${deLogicName}", tags = {"${deLogicName}" }, notes = "批量保存${deLogicName}")
@RequestMapping(method = RequestMethod.POST, value = "${fullPath}/savebatch/test")
public ResponseEntity<Boolean> testSaveBatch(${etParamsList}) {
return ResponseEntity.status(HttpStatus.OK).body(${deCodeNameLC}Service.testSaveBatch(${itemCodeNameLC}Mapping.toDomain(${itemCodeNameLC}dtos)));
}
<#elseif deaction.codeName?lower_case == 'remove'>
<@SecurityAnnotation deaction/>
@ApiOperation(value = "删除${deLogicName}", tags = {"${deLogicName}" }, notes = "删除${deLogicName}")
@RequestMapping(method = RequestMethod.DELETE, value = "${fullPath}/{${itemCodeNameLC + keyCNLC}}/test")
<#if de.getStorageMode()==4><#else> @Transactional</#if>
public ResponseEntity<Boolean> testRemove(${idParams}) {
return ResponseEntity.status(HttpStatus.OK).body(${deCodeNameLC}Service.testRemove(${itemCodeNameLC + keyCNLC}));
}
<@SecurityBatchAnnotation deaction/>
@ApiOperation(value = "批量删除${deLogicName}", tags = {"${deLogicName}" }, notes = "批量删除${deLogicName}")
@RequestMapping(method = RequestMethod.DELETE, value = "${fullPath}/batch/test")
public ResponseEntity<Boolean> testRemoveBatch(@RequestBody List<${srfjavatype(de.getKeyPSDEField().getStdDataType())}> ids) {
return ResponseEntity.status(HttpStatus.OK).body(${deCodeNameLC}Service.testRemoveBatch(ids));
}
<#elseif deaction.codeName?lower_case == 'get'>
<@SecurityAnnotation deaction/>
@ApiOperation(value = "获取${deLogicName}", tags = {"${deLogicName}" }, notes = "获取${deLogicName}")
@RequestMapping(method = RequestMethod.GET, value = "${fullPath}/{${itemCodeNameLC + keyCNLC}}/test")
public ResponseEntity<Boolean> testGet(${idParams}) {
return ResponseEntity.status(HttpStatus.OK).body(${deCodeNameLC}Service.testGet(${itemCodeNameLC + keyCNLC}));
}
<#elseif deaction.codeName?lower_case == 'checkkey'>
@ApiOperation(value = "检查${deLogicName}", tags = {"${deLogicName}" }, notes = "检查${deLogicName}")
@RequestMapping(method = RequestMethod.${reqMtd}, value = "${fullPath}/${deactionCodeName?lower_case}/test")
public ResponseEntity<Boolean> testCheckKey(${etParams}) {
return ResponseEntity.status(HttpStatus.OK).body(${deCodeNameLC}Service.testCheckKey(${itemCodeNameLC}Mapping.toDomain(${itemCodeNameLC}dto)));
}
<#elseif deaction.codeName?lower_case == 'getdraft'><#comment>前端支持临时模式,后台不做处理</#comment>
@ApiOperation(value = "获取${deLogicName}草稿", tags = {"${deLogicName}" }, notes = "获取${deLogicName}草稿")
@RequestMapping(method = RequestMethod.${reqMtd}, value = "${fullPath}/${deactionCodeName?lower_case}/test")
public ResponseEntity<Boolean> testGetDraft() {
return ResponseEntity.status(HttpStatus.OK).body(${deCodeNameLC}Service.testGetDraft(new ${deCodeName}()));
}
<#elseif deaction.codeName?lower_case == 'createbatch'>
<#elseif deaction.codeName?lower_case == 'updatebatch'>
<#elseif deaction.codeName?lower_case == 'removebatch'>
<#elseif deaction.codeName?lower_case == 'savebatch'>
<#elseif deaction.getUserTag()?? && deaction.getActionType()?? && deaction.getUserTag() == 'REGIST' && deaction.getActionType() == 'USERCREATE'>
<#else>
<@SecurityAnnotation deaction/>
@ApiOperation(value = "${deaction.getLogicName()}", tags = {"${deLogicName}" }, notes = "${deaction.getLogicName()}")
@RequestMapping(method = RequestMethod.${reqMtd}, value = "${fullPath}/{${itemCodeNameLC + keyCNLC}}/${deactionCodeName?lower_case}/test")
<#if de.getStorageMode()==4><#else> @Transactional</#if>
public ResponseEntity<Boolean> test${deactionCodeName?cap_first}(${id_etParams}) {
${deCodeName} domain = ${itemCodeNameLC}Mapping.toDomain(${itemCodeNameLC}dto);
return ResponseEntity.status(HttpStatus.OK).body(${deCodeNameLC}Service.test${srfmethodname(deactionCodeName)?cap_first}(domain));
}
</#if>
</#if>
</#macro>
<#comment>输出关系接口测试行为</#comment>
<#macro outputTestActionDetail2 deaction>
<#if deaction.getTestActionMode?? && deaction.getTestActionMode()?? && (deaction.getTestActionMode() ==3) >
<#assign deactionName = deaction.getName()>
<#assign deactionCodeName = deaction.getCodeName()>
<#if deaction.codeName?lower_case == 'create'>
<@SecurityAnnotation deaction/>
@ApiOperation(value = "${byTagParams}建立${deLogicName}", tags = {"${deLogicName}" }, notes = "${byTagParams}建立${deLogicName}")
@RequestMapping(method = RequestMethod.POST, value = "${fullPath}/test")
<#if de.getStorageMode()==4><#else> @Transactional</#if>
public ResponseEntity<Boolean> testCreate${byParams}(${etParams}) {
${deCodeName} domain = ${itemCodeNameLC}Mapping.toDomain(${itemCodeNameLC}dto);
${parentSetParams}
return ResponseEntity.status(HttpStatus.OK).body(${deCodeNameLC}Service.testCreate(domain));
}
<@SecurityBatchAnnotation deaction/>
@ApiOperation(value = "${byTagParams}批量建立${deLogicName}", tags = {"${deLogicName}" }, notes = "${byTagParams}批量建立${deLogicName}")
@RequestMapping(method = RequestMethod.POST, value = "${fullPath}/batch/test")
public ResponseEntity<Boolean> testCreateBatch${byParams}(${etParamsList}) {
List<${deCodeName}> domainlist=${itemCodeNameLC}Mapping.toDomain(${itemCodeNameLC}dtos);
for(${deCodeName} domain:domainlist){
${parentSetParams}
}
return ResponseEntity.status(HttpStatus.OK).body(${deCodeNameLC}Service.testCreateBatch(domainlist));
}
<#elseif deaction.codeName?lower_case == 'update'>
<@SecurityAnnotation deaction/>
@ApiOperation(value = "${byTagParams}更新${deLogicName}", tags = {"${deLogicName}" }, notes = "${byTagParams}更新${deLogicName}")
@RequestMapping(method = RequestMethod.PUT, value = "${fullPath}/{${itemCodeNameLC + keyCNLC}}/test")
<#if de.getStorageMode()==4><#else> @Transactional</#if>
public ResponseEntity<Boolean> testUpdate${byParams}(${id_etParams}) {
${deCodeName} domain = ${itemCodeNameLC}Mapping.toDomain(${itemCodeNameLC}dto);
${parentSetParams}
domain.set${dePKCodeName}(${itemCodeNameLC + keyCNLC});
return ResponseEntity.status(HttpStatus.OK).body(${deCodeNameLC}Service.testUpdate(domain));
}
<@SecurityBatchAnnotation deaction/>
@ApiOperation(value = "${byTagParams}批量更新${deLogicName}", tags = {"${deLogicName}" }, notes = "${byTagParams}批量更新${deLogicName}")
@RequestMapping(method = RequestMethod.PUT, value = "${fullPath}/batch/test")
public ResponseEntity<Boolean> testUpdateBatch${byParams}(${etParamsList}) {
List<${deCodeName}> domainlist=${itemCodeNameLC}Mapping.toDomain(${itemCodeNameLC}dtos);
for(${deCodeName} domain:domainlist){
${parentSetParams}
}
return ResponseEntity.status(HttpStatus.OK).body(${deCodeNameLC}Service.testUpdateBatch(domainlist));
}
<#elseif deaction.codeName?lower_case == 'remove'>
<@SecurityAnnotation deaction/>
@ApiOperation(value = "${byTagParams}删除${deLogicName}", tags = {"${deLogicName}" }, notes = "${byTagParams}删除${deLogicName}")
@RequestMapping(method = RequestMethod.DELETE, value = "${fullPath}/{${itemCodeNameLC + keyCNLC}}/test")
<#if de.getStorageMode()==4><#else> @Transactional</#if>
public ResponseEntity<Boolean> testRemove${byParams}(${idParams}) {
return ResponseEntity.status(HttpStatus.OK).body(${deCodeNameLC}Service.testRemove(${itemCodeNameLC + keyCNLC}));
}
<@SecurityBatchAnnotation deaction/>
@ApiOperation(value = "${byTagParams}批量删除${deLogicName}", tags = {"${deLogicName}" }, notes = "${byTagParams}批量删除${deLogicName}")
@RequestMapping(method = RequestMethod.DELETE, value = "${fullPath}/batch/test")
public ResponseEntity<Boolean> testRemoveBatch${byParams}(@RequestBody List<${srfjavatype(de.getKeyPSDEField().getStdDataType())}> ids) {
return ResponseEntity.status(HttpStatus.OK).body(${deCodeNameLC}Service.testRemoveBatch(ids));
}
<#elseif deaction.codeName?lower_case == 'save'>
<@SecurityAnnotation deaction/>
@ApiOperation(value = "${byTagParams}保存${deLogicName}", tags = {"${deLogicName}" }, notes = "${byTagParams}保存${deLogicName}")
@RequestMapping(method = RequestMethod.${reqMtd}, value = "${fullPath}/${deactionCodeName?lower_case}/test")
public ResponseEntity<Boolean> testSave${byParams}(${etParams}) {
${deCodeName} domain = ${itemCodeNameLC}Mapping.toDomain(${itemCodeNameLC}dto);
${parentSetParams}
return ResponseEntity.status(HttpStatus.OK).body(${deCodeNameLC}Service.testSave(domain));
}
<@SecurityBatchAnnotation deaction/>
@ApiOperation(value = "${byTagParams}批量保存${deLogicName}", tags = {"${deLogicName}" }, notes = "${byTagParams}批量保存${deLogicName}")
@RequestMapping(method = RequestMethod.POST, value = "${fullPath}/savebatch/test")
public ResponseEntity<Boolean> testSaveBatch${byParams}(${etParamsList}) {
List<${deCodeName}> domainlist=${itemCodeNameLC}Mapping.toDomain(${itemCodeNameLC}dtos);
for(${deCodeName} domain:domainlist){
${parentSetParams}
}
return ResponseEntity.status(HttpStatus.OK).body(${deCodeNameLC}Service.testSaveBatch(domainlist));
}
<#elseif deaction.codeName?lower_case == 'get'>
<@SecurityAnnotation deaction/>
@ApiOperation(value = "${byTagParams}获取${deLogicName}", tags = {"${deLogicName}" }, notes = "${byTagParams}获取${deLogicName}")
@RequestMapping(method = RequestMethod.GET, value = "${fullPath}/{${itemCodeNameLC + keyCNLC}}/test")
public ResponseEntity<Boolean> testGet${byParams}(${idParams}) {
return ResponseEntity.status(HttpStatus.OK).body(${deCodeNameLC}Service.testGet(${itemCodeNameLC + keyCNLC}));
}
<#elseif deaction.codeName?lower_case == 'checkkey'>
@ApiOperation(value = "${byTagParams}检查${deLogicName}", tags = {"${deLogicName}" }, notes = "${byTagParams}检查${deLogicName}")
@RequestMapping(method = RequestMethod.${reqMtd}, value = "${fullPath}/${deactionCodeName?lower_case}/test")
public ResponseEntity<Boolean> testCheckKey${byParams}(${etParams}) {
return ResponseEntity.status(HttpStatus.OK).body(${deCodeNameLC}Service.testCheckKey(${itemCodeNameLC}Mapping.toDomain(${itemCodeNameLC}dto)));
}
<#elseif deaction.codeName?lower_case == 'getdraft'>
@ApiOperation(value = "${byTagParams}获取${deLogicName}草稿", tags = {"${deLogicName}" }, notes = "${byTagParams}获取${deLogicName}草稿")
@RequestMapping(method = RequestMethod.${reqMtd}, value = "${fullPath}/${deactionCodeName?lower_case}/test")
public ResponseEntity<Boolean> testGetDraft${byParams}(${parentParams}) {
${deCodeName} domain = new ${deCodeName}();
${parentSetParams}
return ResponseEntity.status(HttpStatus.OK).body(${itemCodeNameLC}Mapping.toDto(${deCodeNameLC}Service.testGetDraft(domain)));
}
<#elseif deaction.codeName?lower_case == 'createbatch'>
<#elseif deaction.codeName?lower_case == 'updatebatch'>
<#elseif deaction.codeName?lower_case == 'removebatch'>
<#elseif deaction.codeName?lower_case == 'savebatch'>
<#elseif deaction.getUserTag()?? && deaction.getActionType()?? && deaction.getUserTag() == 'REGIST' && deaction.getActionType() == 'USERCREATE'>
<#else>
<@SecurityAnnotation deaction/>
@ApiOperation(value = "${byTagParams}${deLogicName}", tags = {"${deLogicName}" }, notes = "${byTagParams}${deLogicName}")
@RequestMapping(method = RequestMethod.${reqMtd}, value = "${fullPath}/{${itemCodeNameLC + keyCNLC}}/${deactionCodeName?lower_case}/test")
<#if de.getStorageMode()==4><#else> @Transactional</#if>
public ResponseEntity<Boolean> test${deactionCodeName?cap_first}${byParams}(${id_etParams}) {
${deCodeName} domain = ${itemCodeNameLC}Mapping.toDomain(${itemCodeNameLC}dto);
${parentSetParams}
return ResponseEntity.status(HttpStatus.OK).body(${deCodeNameLC}Service.test${srfmethodname(deactionCodeName)?cap_first}(domain));
}
</#if>
</#if>
</#macro>
<#ibiztemplate>
TARGET=PSSYSTEM
</#ibiztemplate>
package ${pub.getPKGCodeName()}.util.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.METHOD})
public @interface VersionCheck
{
String entity();
String versionfield();
}
......@@ -26,7 +26,7 @@ import java.util.Map;
* 实体属性默认值切面,只有新建(Create)时才会填充默认值
*/
@Aspect
@Order(0)
@Order(50)
@Component
public class DEFieldDefaultValueAspect
{
......
<#ibiztemplate>
TARGET=PSSYSTEM
</#ibiztemplate>
package ${pub.getPKGCodeName()}.util.aspect;
import lombok.SneakyThrows;
import ${pub.getPKGCodeName()}.util.annotation.VersionCheck;
import ${pub.getPKGCodeName()}.util.domain.EntityBase;
import ${pub.getPKGCodeName()}.util.errors.BadRequestAlertException;
import ${pub.getPKGCodeName()}.util.helper.RuleUtils;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.core.annotation.Order;
import org.springframework.expression.EvaluationContext;
import org.springframework.expression.Expression;
import org.springframework.expression.ExpressionParser;
import org.springframework.expression.spel.standard.SpelExpressionParser;
import org.springframework.expression.spel.support.StandardEvaluationContext;
import org.springframework.stereotype.Component;
import org.springframework.util.ObjectUtils;
import org.springframework.util.StringUtils;
import java.lang.reflect.Field;
/**
* 数据库版本检查
*/
@Aspect
@Order(50)
@Component
public class VersionCheckAspect
{
private final ExpressionParser parser = new SpelExpressionParser();
@SneakyThrows
@Before("execution(* ${pub.getPKGCodeName()}.*.rest.*.update(..)) && @annotation(versionCheck)")
public void BeforeUpdate(JoinPoint point, VersionCheck versionCheck){
Object[] args = point.getArgs();
Object id=args[0];
Object dto=args[1];
if(ObjectUtils.isEmpty(id) || ObjectUtils.isEmpty(dto))
return;
String versionField=versionCheck.versionfield();
if(StringUtils.isEmpty(versionField))
return;
versionCheck(versionCheck,point.getTarget(),dto,id);
}
@SneakyThrows
@Before("execution(* ${pub.getPKGCodeName()}.*.rest.*.updateBy*(..)) && @annotation(versionCheck)")
public void BeforeUpdateBy(JoinPoint point, VersionCheck versionCheck){
Object[] args = point.getArgs();
Object id=args[1];
Object dto=args[2];
if(ObjectUtils.isEmpty(id) || ObjectUtils.isEmpty(dto))
return;
String versionField=versionCheck.versionfield();
if(StringUtils.isEmpty(versionField))
return;
versionCheck(versionCheck,point.getTarget(),dto,id);
}
private void versionCheck(VersionCheck versionCheck,Object resource,Object dto,Object id ){
EvaluationContext context = new StandardEvaluationContext();
context.setVariable("dto",dto);
Expression newExp = parser.parseExpression(String.format("#dto.%s",versionCheck.versionfield()));
Object newVersion=newExp.getValue(context);
if(ObjectUtils.isEmpty(newVersion))
return;
//进行版本检查
Object oldVersion =getDBVersion(versionCheck,getService(resource,versionCheck.entity()),id);
if(!ObjectUtils.isEmpty(oldVersion)){
if(RuleUtils.gt(newVersion,oldVersion))
throw new BadRequestAlertException("数据已变更,可能后台数据已被修改,请重新加载数据","VersionCheckAspect","versionCheck");
}
}
/**
* 获取实体服务对象
* @param resource
* @param entity
* @return
*/
@SneakyThrows
private Object getService(Object resource,String entity){
Object service = null;
Field[] fields= resource.getClass().getDeclaredFields();
for(Field field : fields){
if(field.getModifiers()==1 && field.getName().equalsIgnoreCase(String.format("%sService",entity))){
service=field.get(resource);
break;
}
}
return service;
}
/**
* 获取数据库版本
* @param versionCheck
* @param service
* @param id
* @return
*/
@SneakyThrows
private Object getDBVersion(VersionCheck versionCheck,Object service,Object id){
Object dbVersion=null;
String versionField=versionCheck.versionfield();
if(!ObjectUtils.isEmpty(service)){
EvaluationContext oldContext = new StandardEvaluationContext();
oldContext.setVariable("service",service);
oldContext.setVariable("id",id);
Expression oldExp = parser.parseExpression("#service.get(#id)");
EntityBase oldEntity =oldExp.getValue(oldContext, EntityBase.class);
return oldEntity.get(versionField);
}
return dbVersion;
}
}
......@@ -97,9 +97,11 @@ public class LayeringCache extends AbstractValueAdaptingCache {
@Override
public void put(Object key, Object value) {
if(value!=null) {
caffeineCache.put(key, value);
redisCache.put(key, value);
}
}
@Override
public ValueWrapper putIfAbsent(Object key, Object value) {
......
......@@ -95,7 +95,7 @@ public class DEFieldCacheMap {
if(cacheDEField.containsKey(className))
return cacheDEField.get(className);
else{
DEFieldCacheMap.getFieldMap(clazz);
DEFieldCacheMap.getFieldMap(className);
return cacheDEField.get(className);
}
}
......@@ -112,7 +112,7 @@ public class DEFieldCacheMap {
if(cacheDEKeyField.containsKey(className))
return cacheDEKeyField.get(className);
else{
DEFieldCacheMap.getFieldMap(clazz);
DEFieldCacheMap.getFieldMap(className);
return cacheDEKeyField.get(className);
}
}
......@@ -130,7 +130,7 @@ public class DEFieldCacheMap {
if(cacheList.containsKey(className))
return cacheList.get(className);
else{
DEFieldCacheMap.getFieldMap(clazz);
DEFieldCacheMap.getFieldMap(className);
return cacheList.get(className);
}
}
......@@ -158,7 +158,7 @@ public class DEFieldCacheMap {
if(cacheKey.containsKey(className))
return cacheKey.get(className);
else{
DEFieldCacheMap.getFieldMap(clazz);
DEFieldCacheMap.getFieldMap(className);
return cacheKey.get(className);
}
}
......
......@@ -58,6 +58,10 @@ public class AppController {
appData.put("unires",uniRes);
appData.put("appmenu",appMenu);
appData.put("enablepermissionvalid",enablePermissionValid);
if(curUser.getSuperuser()==1)
appData.put("enablepermissionvalid",false);
else
appData.put("enablepermissionvalid",enablePermissionValid);
return ResponseEntity.status(HttpStatus.OK).body(appData);
}
......
......@@ -3,9 +3,12 @@ TARGET=PSSYSTEM
</#ibiztemplate>
package ${pub.getPKGCodeName()}.util.security;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import lombok.SneakyThrows;
import ${pub.getPKGCodeName()}.util.annotation.DEField;
import ${pub.getPKGCodeName()}.util.domain.EntityBase;
import ${pub.getPKGCodeName()}.util.enums.DEPredefinedFieldType;
import ${pub.getPKGCodeName()}.util.filter.QueryWrapperContext;
import ${pub.getPKGCodeName()}.util.helper.DEFieldCacheMap;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.security.access.PermissionEvaluator;
......@@ -14,7 +17,10 @@ import org.springframework.security.core.GrantedAuthority;
import org.springframework.stereotype.Component;
import org.springframework.util.ObjectUtils;
import java.io.Serializable;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.*;
import java.util.function.Consumer;
/**
* spring security 权限管理类
......@@ -26,44 +32,144 @@ public class AuthPermissionEvaluator implements PermissionEvaluator {
@Value("${r'${ibiz.enablePermissionValid:false}'}")
boolean enablePermissionValid; //是否开启权限校验
/**
* 实体行为鉴权
* @param authentication
* @param entity
* @param action
* 服务接口鉴权
* @param authentication 用户
* @param entity 实体
* @param action 操作
* @return
*/
@Override
@SneakyThrows
public boolean hasPermission(Authentication authentication, Object entity, Object action) {
//未开启权限校验、超级管理员则不进行权限检查
if(AuthenticationUser.getAuthenticationUser().getSuperuser()==1 || !enablePermissionValid)
if(!enablePermissionValid)
return true;
Object principal = authentication.getPrincipal();
if(ObjectUtils.isEmpty(principal))
return false;
AuthenticationUser authenticationUser= (AuthenticationUser) authentication.getPrincipal();
if(authenticationUser.getSuperuser()==1)
return true;
String strAction=String.valueOf(action);
Set<String> userAuthorities = getAuthorities(authentication,strAction);
if(userAuthorities.size()==0)
return false;
//拥有全部数据访问权限时,则跳过权限检查
if(isAllData(strAction,userAuthorities)){
return true;
}
if(entity instanceof ArrayList){
List<EntityBase> entities= (List<EntityBase>) entity;
for(EntityBase entityBase: entities){
boolean result=actionValid(entityBase, strAction ,userAuthorities);
boolean result=actionValid(entityBase, strAction ,userAuthorities,authenticationUser);
if(!result){
return false;
}
}
}
else if (entity instanceof QueryWrapperContext){
QueryWrapperContext queryWrapperContext= (QueryWrapperContext) entity;
setPermissionCondToSearchContext(getEntity(queryWrapperContext),queryWrapperContext,userAuthorities,authenticationUser);
}
else{
EntityBase entityBase= (EntityBase) entity;
return actionValid(entityBase , strAction ,userAuthorities);
return actionValid(entityBase , strAction ,userAuthorities,authenticationUser);
}
return true;
}
/**
* 获取实体信息
* @param qc
* @return
*/
@SneakyThrows
private EntityBase getEntity(QueryWrapperContext qc){
EntityBase entity=null;
Type type =qc.getClass().getGenericSuperclass();
if(type instanceof ParameterizedType){
ParameterizedType parameterizedType= (ParameterizedType) qc.getClass().getGenericSuperclass();
Type [] typeArr= parameterizedType.getActualTypeArguments();
if(typeArr.length>0){
Class<EntityBase> entityClass = (Class) typeArr[0];
return entityClass.newInstance();
}
}
return entity;
}
/**
* searchContext中拼接权限条件
* @param entity 实体
* @param qc 查询上下文
* @param userAuthorities 用户权限
* @param authenticationUser 当前用户
*/
@SneakyThrows
private void setPermissionCondToSearchContext(EntityBase entity, QueryWrapperContext qc , Set<String> userAuthorities ,AuthenticationUser authenticationUser){
if(entity==null)
return ;
Map<String,String> permissionField=getPermissionField(entity);//获取组织、部门预置属性
String orgField=permissionField.get("orgfield");
String orgDeptField=permissionField.get("orgsecfield");
String createManField=permissionField.get("createmanfield");
Map<String, Set<String>> userInfo = authenticationUser.getOrgInfo();
Set<String> orgParent = userInfo.get("parentorg");
Set<String> orgChild = userInfo.get("suborg");
Set<String> orgDeptParent = userInfo.get("parentdept");
Set<String> orgDeptChild = userInfo.get("subdept");
Set<String> userOrg = new HashSet<>();
Set<String> userOrgDept = new HashSet<>();
Set<String> userCreateMan = new HashSet<>();
for(String authority:userAuthorities){
if(authority.endsWith("curorg")){ //本单位
userOrg.add(authenticationUser.getOrgid());
}
else if(authority.endsWith("porg")){//上级单位
userOrg.addAll(orgParent);
}
else if(authority.endsWith("sorg")){//下级单位
userOrg.addAll(orgChild);
}
else if(authority.endsWith("curorgdept")){//本部门
userOrgDept.add(authenticationUser.getMdeptid());
}
else if(authority.endsWith("porgdept")){//上级部门
userOrgDept.addAll(orgDeptParent);
}
else if(authority.endsWith("sorgdept")){//下级部门
userOrgDept.addAll(orgDeptChild);
}
else if (authority.endsWith("createman")){
userCreateMan.add(authority);
}
}
if(userOrg.size()==0 && userOrgDept.size()==0 && userCreateMan.size()==0){
qc.getSelectCond().apply("1<>1");
}
else{
Consumer<QueryWrapper> consumer = qw -> {
if(userOrg.size()>0){
Consumer<QueryWrapper> org = orgQw -> {
orgQw.in(orgField,userOrg);
};
qw.or(org);
}
if(userOrgDept.size()>0){
Consumer<QueryWrapper> dept = deptQw -> {
deptQw.in(orgDeptField,userOrgDept);
};
qw.or(dept);
}
if(userCreateMan.size()>0){
Consumer<QueryWrapper> createMan = createManQw -> {
createManQw.eq(createManField,authenticationUser.getUserid());
};
qw.or(createMan);
}
};
qc.getSelectCond().and(consumer);
}
}
@Override
public boolean hasPermission(Authentication authentication, Serializable id, String action, Object params) {
......@@ -109,13 +215,12 @@ public class AuthPermissionEvaluator implements PermissionEvaluator {
* @param userAuthorities
* @return
*/
private boolean actionValid(EntityBase entity, String action , Set<String> userAuthorities){
private boolean actionValid(EntityBase entity, String action , Set<String> userAuthorities ,AuthenticationUser authenticationUser){
Map<String,String> permissionField=getPermissionField(entity);//获取组织、部门预置属性
String orgField=permissionField.get("orgfield");
String orgDeptField=permissionField.get("orgsecfield");
String createManField=permissionField.get("createmanfield");
AuthenticationUser authenticationUser = AuthenticationUser.getAuthenticationUser();
Map<String, Set<String>> userInfo = authenticationUser.getOrgInfo();
Set<String> orgParent = userInfo.get("parentorg");
Set<String> orgChild = userInfo.get("suborg");
......
Markdown 格式
0% or
您添加了 0 到此讨论。请谨慎行事。
先完成此消息的编辑!
想要评论请 注册