提交 2e33f64d 编写于 作者: zhouweidong's avatar zhouweidong

合并分支 'dev' 到 '2020.08.10【669】'

Dev

查看合并请求 !26
# **iBiz4j Spring R7 Template ChangeLog**
## [v2020.09.22]
- 处理逻辑:支持处理逻辑中启动工作流
- 实体属性:模板全局属性javaType调整(请用户自行确认并同步调整USR代码)
- 虚拟主键:支持虚拟主键,虚拟主键由联合键值构成,新建、更新、删除等操作均通过联合键值实现
- 值规则:支持非空、长度属性值规则校验(只在“新建”时校验)
- 实体对象:支持实体对象拷贝, entity.copyTo(entity2,true); 将entity对象值拷贝到entity2对象中,支持空值不拷贝(true/false)
- RT:补充支付、通知、Lite 客户端配置
- 附加逻辑:支持实体行为附加实体行为配置
- 修复service填充父数据时,由于无法获取父数据而把父数据置空问题
## [v2020.09.06]
- 修复oracle数据库时间精度为毫秒导致版本检查异常问题
- 调整ou feign, 由ibz** 调整sys**
- 为AuthenticationUser添加相关注释
## [v2020.08.31]
- 消息集成:适配RT消息接口,通过钉钉、微信消息及短信等方式发送工作流待办消息
- 数据导入:批量数据采用异步方式进行导入,避免因数据量过大导致前端请求超时问题
......
......@@ -81,6 +81,10 @@ zuul:
path: /dictionarys/**/Ibzou**
serviceId: ${r'${ibiz.ref.service.ou:ibzou-api}'}
stripPrefix: false
ou:
path: /ibzdepartments/**
serviceId: ${r'${ibiz.ref.service.ou:ibzou-api}'}
stripPrefix: false
uaadict:
path: /dictionarys/**/SysOperator
serviceId: ${r'${ibiz.ref.service.uaa:ibzuaa-api}'}
......@@ -93,6 +97,18 @@ zuul:
path: /net-disk/**
serviceId: ${r'${ibiz.ref.service.disk:ibzdisk-api}'}
stripPrefix: false
ou_sys_org:
path: /sysorganizations/**
serviceId: ${r'${ibiz.ref.service.ou:ibzou-api}'}
stripPrefix: false
ou_sys_dept:
path: /sysdepartments/**
serviceId: ${r'${ibiz.ref.service.ou:ibzou-api}'}
stripPrefix: false
lite-core:
path: /lite/**
serviceId: ${r'${ibiz.ref.service.lite:ibzlite-api}'}
stripPrefix: false
</#if>
</#if>
<#comment>通过设置该参数,避免Zuul转发请求时丢失Authorization请求头信息</#comment>
......
......@@ -55,6 +55,9 @@ public class DevBootSecurityConfig extends WebSecurityConfigurerAdapter {
@Value("${r'${ibiz.file.previewpath:ibizutil/preview}"'})
private String previewpath;
@Value("${r'${ibiz.auth.excludesPattern:}"'})
private String[] excludesPattern;
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
......@@ -116,8 +119,15 @@ public class DevBootSecurityConfig extends WebSecurityConfigurerAdapter {
// 文件操作
.antMatchers("/"+downloadpath+"/**").permitAll()
.antMatchers("/"+uploadpath).permitAll()
.antMatchers("/"+previewpath+"/**").permitAll()
.anyRequest().authenticated()
.antMatchers("/"+previewpath+"/**").permitAll();
for (String excludePattern : excludesPattern) {
authenticationTokenFilter.addExcludePattern(excludePattern);
httpSecurity.authorizeRequests().antMatchers(excludePattern).permitAll();
}
httpSecurity.authorizeRequests().anyRequest().authenticated()
// 防止iframe 造成跨域
.and().headers().frameOptions().disable();
httpSecurity
......
......@@ -91,6 +91,10 @@ zuul:
path: /dictionarys/**/Ibzou**
serviceId: ${r'${ibiz.ref.service.ou:ibzou-api}'}
stripPrefix: false
ou:
path: /ibzdepartments/**
serviceId: ${r'${ibiz.ref.service.ou:ibzou-api}'}
stripPrefix: false
uaadict:
path: /dictionarys/**/SysOperator
serviceId: ${r'${ibiz.ref.service.uaa:ibzuaa-api}'}
......@@ -103,6 +107,18 @@ zuul:
path: /net-disk/**
serviceId: ${r'${ibiz.ref.service.disk:ibzdisk-api}'}
stripPrefix: false
ou_sys_org:
path: /sysorganizations/**
serviceId: ${r'${ibiz.ref.service.ou:ibzou-api}'}
stripPrefix: false
ou_sys_dept:
path: /sysdepartments/**
serviceId: ${r'${ibiz.ref.service.ou:ibzou-api}'}
stripPrefix: false
lite-core:
path: /lite/**
serviceId: ${r'${ibiz.ref.service.lite:ibzlite-api}'}
stripPrefix: false
</#if>
</#if>
<#comment>通过设置该参数,避免Zuul转发请求时丢失Authorization请求头信息</#comment>
......
......@@ -46,17 +46,17 @@ public class ${item.codeName}Fallback implements ${item.codeName}FeignClient{
<#-- ${return_type} ${srfmethodname(apiMethod.getCodeName())}(<#if req_param_type?? && req_param_type=='ENTITY'><#if apiMethod.getPSDEName()??>${apiMethod.getPSDEName()} entity</#if></#if>); -->
<#if apiMethod.getCodeName()?lower_case == 'get'>
<#--@RequestMapping(method = RequestMethod.<#if apiMethod.getRequestMethod()??>${apiMethod.getRequestMethod()}<#else>POST</#if>, value = "${fullpath}/{${item.getKeyDEField().getCodeName()?lower_case}}")-->
public ${refDE.codeName} get(${srfjavatype(refDE.getKeyDEField().stdDataType)} ${refDE.getKeyDEField().getCodeName()?lower_case}){
public ${refDE.codeName} get(${srfr7javatype(refDE.getKeyDEField().stdDataType)} ${refDE.getKeyDEField().getCodeName()?lower_case}){
return null;
}
<#elseif apiMethod.getCodeName()?lower_case == 'remove'>
<#--@RequestMapping(method = RequestMethod.<#if apiMethod.getRequestMethod()??>${apiMethod.getRequestMethod()}<#else>POST</#if>, value = "${fullpath}/{${item.getKeyDEField().getCodeName()?lower_case}}")-->
public Boolean remove(${srfjavatype(refDE.getKeyDEField().stdDataType)} ${refDE.getKeyDEField().getCodeName()?lower_case}){
public Boolean remove(${srfr7javatype(refDE.getKeyDEField().stdDataType)} ${refDE.getKeyDEField().getCodeName()?lower_case}){
return false;
}
<#--@RequestMapping(method = RequestMethod.<#if apiMethod.getRequestMethod()??>${apiMethod.getRequestMethod()}<#else>POST</#if>, value = "${fullpath}/${apiMethod.getCodeName()?lower_case}")-->
public Boolean removeBatch(Collection<${srfjavatype(refDE.getKeyDEField().stdDataType)}> idList){
public Boolean removeBatch(Collection<${srfr7javatype(refDE.getKeyDEField().stdDataType)}> idList){
return false;
}
<#elseif apiMethod.getCodeName()?lower_case == 'create'>
......@@ -79,7 +79,7 @@ public class ${item.codeName}Fallback implements ${item.codeName}FeignClient{
}
<#elseif apiMethod.getCodeName()?lower_case == 'update'>
<#--@RequestMapping(method = RequestMethod.<#if apiMethod.getRequestMethod()??>${apiMethod.getRequestMethod()}<#else>POST</#if>, value = "${fullpath}/{${item.getKeyDEField().getCodeName()?lower_case}}")-->
public ${refDE.codeName} update(${srfjavatype(refDE.getKeyDEField().stdDataType)} ${refDE.getKeyDEField().getCodeName()?lower_case}, ${refDE.codeName} ${refDE.codeName?lower_case}){
public ${refDE.codeName} update(${srfr7javatype(refDE.getKeyDEField().stdDataType)} ${refDE.getKeyDEField().getCodeName()?lower_case}, ${refDE.codeName} ${refDE.codeName?lower_case}){
return null;
}
<#--@RequestMapping(method = RequestMethod.<#if apiMethod.getRequestMethod()??>${apiMethod.getRequestMethod()}<#else>POST</#if>, value = "${fullpath}/${apiMethod.getCodeName()?lower_case}")-->
......@@ -104,7 +104,7 @@ public class ${item.codeName}Fallback implements ${item.codeName}FeignClient{
<#elseif apiMethod.getCodeName()?lower_case == 'savebatch'>
<#else>
<#--@RequestMapping(method = RequestMethod.<#if apiMethod.getRequestMethod()??>${apiMethod.getRequestMethod()}<#else>POST</#if>, value = "${fullpath}/{${item.getKeyDEField().getCodeName()?lower_case}}/${apiMethod.getCodeName()?lower_case}")-->
public ${refDE.codeName} ${apiMethod.getCodeName()?uncap_first}( ${srfjavatype(refDE.getKeyDEField().stdDataType)} ${refDE.getKeyDEField().getCodeName()?lower_case}, ${refDE.codeName} ${refDE.codeName?lower_case}){
public ${refDE.codeName} ${apiMethod.getCodeName()?uncap_first}( ${srfr7javatype(refDE.getKeyDEField().stdDataType)} ${refDE.getKeyDEField().getCodeName()?lower_case}, ${refDE.codeName} ${refDE.codeName?lower_case}){
return null;
}
</#if>
......
......@@ -49,14 +49,14 @@ public interface ${item.codeName}FeignClient {
<#-- ${return_type} ${srfmethodname(apiMethod.getCodeName())}(<#if req_param_type?? && req_param_type=='ENTITY'><#if apiMethod.getPSDEName()??>${apiMethod.getPSDEName()} entity</#if></#if>); -->
<#if apiMethod.getCodeName()?lower_case == 'get'>
@RequestMapping(method = RequestMethod.<#if apiMethod.getRequestMethod()??>${apiMethod.getRequestMethod()}<#else>POST</#if>, value = "${fullpath}/{${refDE.getKeyDEField().getCodeName()?lower_case}}")
${refDE.codeName} get(@PathVariable("${refDE.getKeyDEField().getCodeName()?lower_case}") ${srfjavatype(refDE.getKeyDEField().stdDataType)} ${refDE.getKeyDEField().getCodeName()?lower_case});
${refDE.codeName} get(@PathVariable("${refDE.getKeyDEField().getCodeName()?lower_case}") ${srfr7javatype(refDE.getKeyDEField().stdDataType)} ${refDE.getKeyDEField().getCodeName()?lower_case});
<#elseif apiMethod.getCodeName()?lower_case == 'remove'>
@RequestMapping(method = RequestMethod.<#if apiMethod.getRequestMethod()??>${apiMethod.getRequestMethod()}<#else>POST</#if>, value = "${fullpath}/{${refDE.getKeyDEField().getCodeName()?lower_case}}")
Boolean remove(@PathVariable("${refDE.getKeyDEField().getCodeName()?lower_case}") ${srfjavatype(refDE.getKeyDEField().stdDataType)} ${refDE.getKeyDEField().getCodeName()?lower_case});
Boolean remove(@PathVariable("${refDE.getKeyDEField().getCodeName()?lower_case}") ${srfr7javatype(refDE.getKeyDEField().stdDataType)} ${refDE.getKeyDEField().getCodeName()?lower_case});
@RequestMapping(method = RequestMethod.DELETE, value = "${fullpath}/batch}")
Boolean removeBatch(@RequestBody Collection<${srfjavatype(refDE.getKeyDEField().stdDataType)}> idList);
Boolean removeBatch(@RequestBody Collection<${srfr7javatype(refDE.getKeyDEField().stdDataType)}> idList);
<#elseif apiMethod.getCodeName()?lower_case == 'create'>
@RequestMapping(method = RequestMethod.<#if apiMethod.getRequestMethod()??>${apiMethod.getRequestMethod()}<#else>POST</#if>, value = "${fullpath}")
......@@ -69,7 +69,7 @@ public interface ${item.codeName}FeignClient {
@RequestMapping(method = RequestMethod.<#if apiMethod.getRequestMethod()??>${apiMethod.getRequestMethod()}<#else>POST</#if>, value = "${fullpath}/save")
Boolean save(@RequestBody ${refDE.codeName} ${refDE.codeName?lower_case});
@RequestMapping(method = RequestMethod.<#if apiMethod.getRequestMethod()??>${apiMethod.getRequestMethod()}<#else>POST</#if>, value = "${fullpath}/${apiMethod.getCodeName()?lower_case}")
@RequestMapping(method = RequestMethod.<#if apiMethod.getRequestMethod()??>${apiMethod.getRequestMethod()}<#else>POST</#if>, value = "${fullpath}/savebatch")
Boolean saveBatch(@RequestBody List<${refDE.codeName}> ${srfpluralize(refDE.getCodeName()?lower_case)});
<#elseif apiMethod.getCodeName()?lower_case == 'getdraft'>
......@@ -82,7 +82,7 @@ public interface ${item.codeName}FeignClient {
<#elseif apiMethod.getCodeName()?lower_case == 'update'>
@RequestMapping(method = RequestMethod.<#if apiMethod.getRequestMethod()??>${apiMethod.getRequestMethod()}<#else>POST</#if>, value = "${fullpath}/{${refDE.getKeyDEField().getCodeName()?lower_case}}")
${refDE.codeName} update(@PathVariable("${refDE.getKeyDEField().getCodeName()?lower_case}") ${srfjavatype(refDE.getKeyDEField().stdDataType)} ${refDE.getKeyDEField().getCodeName()?lower_case},@RequestBody ${refDE.codeName} ${refDE.codeName?lower_case});
${refDE.codeName} update(@PathVariable("${refDE.getKeyDEField().getCodeName()?lower_case}") ${srfr7javatype(refDE.getKeyDEField().stdDataType)} ${refDE.getKeyDEField().getCodeName()?lower_case},@RequestBody ${refDE.codeName} ${refDE.codeName?lower_case});
@RequestMapping(method = RequestMethod.PUT, value = "${fullpath}/batch")
Boolean updateBatch(@RequestBody List<${refDE.codeName}> ${srfpluralize(refDE.getCodeName()?lower_case)});
......@@ -93,7 +93,7 @@ public interface ${item.codeName}FeignClient {
<#elseif apiMethod.getCodeName()?lower_case == 'savebatch'>
<#else>
@RequestMapping(method = RequestMethod.<#if apiMethod.getRequestMethod()??>${apiMethod.getRequestMethod()}<#else>POST</#if>, value = "${fullpath}/{${refDE.getKeyDEField().getCodeName()?lower_case}}/${apiMethod.getCodeName()?lower_case}")
${refDE.codeName} ${apiMethod.getCodeName()?uncap_first}(@PathVariable("${refDE.getKeyDEField().getCodeName()?lower_case}") ${srfjavatype(refDE.getKeyDEField().stdDataType)} ${refDE.getKeyDEField().getCodeName()?lower_case},@RequestBody ${refDE.codeName} ${refDE.codeName?lower_case});
${refDE.codeName} ${apiMethod.getCodeName()?uncap_first}(@PathVariable("${refDE.getKeyDEField().getCodeName()?lower_case}") ${srfr7javatype(refDE.getKeyDEField().stdDataType)} ${refDE.getKeyDEField().getCodeName()?lower_case},@RequestBody ${refDE.codeName} ${refDE.codeName?lower_case});
</#if>
<#elseif apiMethod.getActionType()=='SELECT'><#comment>简单查询</#comment>
......
......@@ -47,7 +47,7 @@ public class ${item.codeName}SearchContext extends QueryWrapperContext<${item.co
@JsonFormat(pattern="HH:mm", timezone="GMT+8")
@JSONField(format="HH:mm")
</#if>
<#assign formItemDataType=srfjavatype(formitem.getPSDEField().stdDataType)>
<#assign formItemDataType=srfr7javatype(formitem.getPSDEField().stdDataType)>
<#comment>in条件通过String接,通过split拆后再进行查询</#comment>
<#if formitem.getValueOp() == "IN">
<#assign formItemDataType="String">
......@@ -156,7 +156,7 @@ public class ${item.codeName}SearchContext extends QueryBuildContext {
@JsonFormat(pattern="HH:mm", timezone="GMT+8")
@JSONField(format="HH:mm")
</#if>
<#assign formItemDataType=srfjavatype(formitem.getPSDEField().stdDataType)>
<#assign formItemDataType=srfr7javatype(formitem.getPSDEField().stdDataType)>
<#comment>in条件通过String接,通过split拆后再进行查询</#comment>
<#if formitem.getValueOp() == "IN">
<#assign formItemDataType="String">
......@@ -252,7 +252,7 @@ public class ${item.codeName}SearchContext extends SearchContextBase {
@JsonFormat(pattern="HH:mm", timezone="GMT+8")
@JSONField(format="HH:mm")
</#if>
<#assign formItemDataType=srfjavatype(formitem.getPSDEField().stdDataType)>
<#assign formItemDataType=srfr7javatype(formitem.getPSDEField().stdDataType)>
<#comment>in条件通过String接,通过split拆后再进行查询</#comment>
<#if formitem.getValueOp() == "IN">
<#assign formItemDataType="String">
......@@ -289,7 +289,7 @@ public class ${item.codeName}SearchContext extends SearchContextBase {
@JsonFormat(pattern="HH:mm", timezone="GMT+8")
@JSONField(format="HH:mm")
</#if>
<#assign formItemDataType=srfjavatype(formitem.getPSDEField().stdDataType)>
<#assign formItemDataType=srfr7javatype(formitem.getPSDEField().stdDataType)>
<#comment>in条件通过String接,通过split拆后再进行查询</#comment>
<#if formitem.getValueOp() == "IN">
<#assign formItemDataType="String">
......
......@@ -118,7 +118,7 @@ public interface I${item.codeName}Service{
<#elseif deaction.getActionType()=='DELOGIC'>
${item.codeName} ${srfmethodname(deaction.getCodeName())}(${item.codeName} et) ;
<#elseif deaction.codeName?lower_case == 'get'>
${item.codeName} get(${srfjavatype(keyfield.stdDataType)} key) ;
${item.codeName} get(${srfr7javatype(keyfield.stdDataType)} key) ;
<#elseif deaction.codeName?lower_case == "create">
boolean create(${item.codeName} et) ;
<#if item.isEnableEntityCache()==true>
......@@ -132,11 +132,11 @@ public interface I${item.codeName}Service{
</#if>
void updateBatch(List<${item.codeName}> list) ;
<#elseif deaction.codeName?lower_case == "remove">
boolean remove(${srfjavatype(keyfield.stdDataType)} key) ;
boolean remove(${srfr7javatype(keyfield.stdDataType)} key) ;
<#if item.isEnableEntityCache()==true>
@CacheEvict(value="${item.codeName?lower_case}",allEntries=true)
</#if>
void removeBatch(Collection<${srfjavatype(keyfield.stdDataType)}> idList) ;
void removeBatch(Collection<${srfr7javatype(keyfield.stdDataType)}> idList) ;
<#elseif deaction.codeName?lower_case == "save">
boolean save(${item.codeName} et) ;
<#if item.isEnableEntityCache()==true>
......@@ -176,11 +176,11 @@ public interface I${item.codeName}Service{
<#if de.getDefaultPSDEDataSet()??>
<#assign deDefaultDataSet=de.getDefaultPSDEDataSet()>
<#if deDefaultDataSet.getPSDEDataQueries()??>
List<${item.getCodeName()}> selectBy${srfcaseformat(MajorField.codeName,'l_u2lC')?cap_first}(${srfjavatype(MajorField.stdDataType)} ${MajorkeyField.codeName?lower_case}) ;
List<${item.getCodeName()}> selectBy${srfcaseformat(MajorField.codeName,'l_u2lC')?cap_first}(${srfr7javatype(MajorField.stdDataType)} ${MajorkeyField.codeName?lower_case}) ;
<#if item.isEnableEntityCache()==true>
@CacheEvict(value="${item.codeName?lower_case}",allEntries=true)
</#if>
void removeBy${srfcaseformat(MajorField.codeName,'l_u2lC')?cap_first}(${srfjavatype(MajorField.stdDataType)} ${MajorkeyField.codeName?lower_case}) ;
void removeBy${srfcaseformat(MajorField.codeName,'l_u2lC')?cap_first}(${srfr7javatype(MajorField.stdDataType)} ${MajorkeyField.codeName?lower_case}) ;
<#assign nested=MinorPSDER.isNestedRS()>
<#if nested == false && MinorPSDER.getMinorPSDataEntity().getAllPSDEServiceAPIs()??>
<#list MinorPSDER.getMinorPSDataEntity().getAllPSDEServiceAPIs() as api>
......@@ -193,7 +193,7 @@ public interface I${item.codeName}Service{
<#if item.isEnableEntityCache()==true>
@CacheEvict(value="${item.codeName?lower_case}",allEntries=true)
</#if>
void saveBy${srfcaseformat(MajorField.codeName,'l_u2lC')?cap_first}(${srfjavatype(MajorField.stdDataType)} ${MajorkeyField.codeName?lower_case},List<${item.getCodeName()}> list) ;
void saveBy${srfcaseformat(MajorField.codeName,'l_u2lC')?cap_first}(${srfr7javatype(MajorField.stdDataType)} ${MajorkeyField.codeName?lower_case},List<${item.getCodeName()}> list) ;
</#if>
</#if>
</#if>
......@@ -220,7 +220,7 @@ public interface I${item.codeName}Service{
<#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);
boolean testGet(${srfr7javatype(keyfield.stdDataType)} key);
<#elseif deaction.getCodeName()?lower_case == "createbatch">
<#elseif deaction.getCodeName()?lower_case == "updatebatch">
<#elseif deaction.getCodeName()?lower_case == "removebatch">
......@@ -237,8 +237,8 @@ public interface I${item.codeName}Service{
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);
boolean testRemove(${srfr7javatype(keyfield.stdDataType)} key);
boolean testRemoveBatch(Collection<${srfr7javatype(keyfield.stdDataType)}> idList);
<#elseif deaction.getCodeName()?lower_case == "getdraft">
boolean testGetDraft(${item.getCodeName()} et);
......
<#ibiztemplate>
TARGET=PSDELOGIC
</#ibiztemplate>
<#if item.isEnableBackend()>
package ${pub.getPKGCodeName()}.core.${item.getPSDataEntity().getPSSystemModule().getCodeName()?lower_case}.service.logic;
import java.sql.Timestamp;
......@@ -19,3 +20,4 @@ public interface I${de.codeName}${item.codeName}Logic {
void execute(${de.codeName} et) ;
}
</#if>
\ No newline at end of file
<#ibiztemplate>
TARGET=PSDELOGIC
</#ibiztemplate>
<#if item.isEnableBackend()>
<#assign startWF=false>
package ${pub.getPKGCodeName()}.core.${item.getPSDataEntity().getPSSystemModule().getCodeName()?lower_case}.service.logic.impl;
import java.sql.Timestamp;
......@@ -44,6 +46,14 @@ public class ${de.codeName}${item.codeName}LogicImpl implements I${de.codeName}$
</#if>
</#if>
<#comment>启动工作流</#comment>
<#if deLogicNode.getLogicNodeType()=='STARTWF'>
<#assign startWF=true>
<#if !P.exists("delogic","wfclient")>
@Autowired
${pub.getPKGCodeName()}.util.client.IBZWFFeignClient wfClient;
</#if>
</#if>
</#list>
</#if>
......@@ -91,6 +101,10 @@ public class ${de.codeName}${item.codeName}LogicImpl implements I${de.codeName}$
<#comment>插入当前实体的defaultService对象,供自定义查询使用</#comment>
kieSession.setGlobal("iBzSys${de.codeName?lower_case?cap_first}DefaultService",iBzSysDefaultService);<#comment>将逻辑中引用到的service存储到global</#comment>
kieSession.setGlobal("curuser", ${pub.getPKGCodeName()}.util.security.AuthenticationUser.getAuthenticationUser());
<#comment>插入wfclient</#comment>
<#if startWF>
kieSession.setGlobal("wfClient",wfClient);
</#if>
kieSession.startProcess("${pub.getPKGCodeName()}.core.${de.getPSSystemModule().codeName?lower_case}.service.logic.${de.codeName?lower_case}${item.getCodeName()?lower_case}");<#comment>执行所要执行的流程</#comment>
}catch(Exception e){
......@@ -103,3 +117,4 @@ public class ${de.codeName}${item.codeName}LogicImpl implements I${de.codeName}$
}
}
</#if>
\ No newline at end of file
......@@ -88,7 +88,7 @@ public class ${item.codeName}ExService extends ${item.codeName}ServiceImpl {
<#elseif deaction.getCodeName()?lower_case == 'get'>
@Override
public boolean testGet(${srfjavatype(keyfield.stdDataType)} key) {
public boolean testGet(${srfr7javatype(keyfield.stdDataType)} key) {
return super.testGet(key);
}
......@@ -141,12 +141,12 @@ public class ${item.codeName}ExService extends ${item.codeName}ServiceImpl {
<#elseif deaction.getCodeName()?lower_case == "remove">
@Override
public boolean testRemove(${srfjavatype(keyfield.stdDataType)} key) {
public boolean testRemove(${srfr7javatype(keyfield.stdDataType)} key) {
return super.testRemove(key);
}
@Override
public boolean testRemoveBatch(Collection<${srfjavatype(keyfield.stdDataType)}> idList) {
public boolean testRemoveBatch(Collection<${srfr7javatype(keyfield.stdDataType)}> idList) {
return super.testRemoveBatch(idList);
}
......
......@@ -16,6 +16,12 @@ import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.mybatis.spring.annotation.MapperScan;
import java.util.Properties;
<#if sys.getSaaSMode()==2>
import com.baomidou.mybatisplus.extension.plugins.tenant.TenantSqlParser;
import com.baomidou.mybatisplus.core.parser.ISqlParser;
import java.util.ArrayList;
import java.util.List;
</#if>
/**
* mybatis全局配置类
......@@ -46,12 +52,24 @@ public class MybatisConfiguration {
* @return
*/
@Bean
public PaginationInterceptor paginationInterceptor() {
public PaginationInterceptor paginationInterceptor(<#if sys.getSaaSMode()==2>SaaSTenantHandler saaSTenantHandler</#if>) {
PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
// 设置请求的页面大于最大页后操作, true调回到首页,false 继续请求 默认false
// paginationInterceptor.setOverflow(false);
// 设置最大单页限制数量,默认 500 条,-1 不受限制
paginationInterceptor.setLimit(-1);
<#if sys.getSaaSMode()==2>
// 创建SQL解析器集合
List<ISqlParser> sqlParserList = new ArrayList<>();
// 创建租户SQL解析器
TenantSqlParser tenantSqlParser = new TenantSqlParser();
// 设置租户处理器
tenantSqlParser.setTenantHandler(saaSTenantHandler);
sqlParserList.add(tenantSqlParser);
paginationInterceptor.setSqlParserList(sqlParserList);
</#if>
// 开启 count join 优化,只针对部分 left join
paginationInterceptor.setCountSqlParser(new JsqlParserCountOptimize(true));
return paginationInterceptor;
......
<#ibiztemplate>
TARGET=PSSYSTEM
</#ibiztemplate>
<#if sys.getSaaSMode()==2>
package ${pub.getPKGCodeName()}.core.util.config;
import ${pub.getPKGCodeName()}.util.security.AuthenticationUser;
import com.baomidou.mybatisplus.extension.plugins.tenant.TenantHandler;
import net.sf.jsqlparser.expression.Expression;
import net.sf.jsqlparser.expression.StringValue;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.stereotype.Component;
@Component
@EnableConfigurationProperties(SaaSTenantProperties.class)
public class SaaSTenantHandler implements TenantHandler {
@Autowired
private SaaSTenantProperties saaSTenantProperties;
@Override
public Expression getTenantId(boolean where) {
AuthenticationUser user = AuthenticationUser.getAuthenticationUser();
return new StringValue(user.getDomain());
}
@Override
public String getTenantIdColumn() {
return saaSTenantProperties.getColumn();
}
@Override
public boolean doTableFilter(String tableName) {
tableName = tableName.replace("`","") ;
if (saaSTenantProperties.getSysTables().contains(tableName))
return true;
return false;
}
}
</#if>
\ No newline at end of file
<#ibiztemplate>
TARGET=PSSYSTEM
</#ibiztemplate>
<#if sys.getSaaSMode()==2>
package ${pub.getPKGCodeName()}.core.util.config;
import lombok.Getter;
import lombok.Setter;
import org.springframework.boot.context.properties.ConfigurationProperties;
import java.util.ArrayList;
import java.util.List;
@Getter
@Setter
@ConfigurationProperties(prefix = "ibiz.saas")
public class SaaSTenantProperties {
/**
* 多租户字段名称
*/
private String column;
/**
* 多租户系统数据表
*/
private List<String> sysTables = new ArrayList<>();
}
</#if>
\ No newline at end of file
......@@ -33,7 +33,7 @@ TARGET=PSSYSTEM
<#list de.getAllPSDEFields() as defield>
<#if defield.isPhisicalDEField()==true><#comment>物理属性</#comment>
<#assign dataType="${srfdatatype(defield.getStdDataType())}">
<#assign javaType="${srfjavatype(defield.stdDataType)}">
<#assign javaType="${srfr7javatype(defield.stdDataType)}">
<#comment>varchar需要设置字段长度,若不设置,则liquibase比较时会自动填充,最终恢复到生产库会报错</#comment>
<#if javaType=='String'>
<#if defield.getLength()?? && defield.getLength()?c!='-1'>
......
......@@ -45,7 +45,9 @@ TARGET=PSDATAENTITY
<!--通过mybatis将查询结果注入到entity中,通过配置autoMapping="true"由mybatis自动处理映射关系 -->
<resultMap id="${de.codeName}ResultMap" type="${pub.getPKGCodeName()}.core.${de.getPSSystemModule().codeName?lower_case}.domain.${de.codeName}" autoMapping="true">
<id property="${srfcaseformat(de.getKeyPSDEField().codeName,'l_u2lC')}" column="${de.getKeyPSDEField().getName()?lower_case}" /><!--主键字段映射-->
<#if de.getKeyPSDEField().isPhisicalDEField()==true>
<id property="${srfcaseformat(de.getKeyPSDEField().codeName,'l_u2lC')}" column="${de.getKeyPSDEField().getName()?lower_case}" /><!--主键字段映射-->
</#if>
<#comment>外键值字段映射:由于需要将一个数据库列注入到2个domian属性中(主关系实体对象),由于已经手动将列映射给主关系对象,所以autoMapping将不会自动注入外键id,需要再次声明映射关系</#comment>
<#comment>属性名称与代码名称不一致时,强制进行映射</#comment>
<#list item.getPSDEFields() as defield>
......@@ -225,16 +227,28 @@ TARGET=PSDATAENTITY
<#if hasIgnoreNullValueCond>
<![CDATA[ ${contextParamConvert(srfjavasqlcode(dedqcode.getQueryCode()))} ]]>
<#if dedqcode.getPSDEDataQueryCodeConds()??>
<#if sys.getSaaSMode()==1 && item.getSaaSMode()==1>
<#list dedqcode.getPSDEDataQueryCodeConds() as dedqfieldcond>
<#if (dedqfieldcond_index>0)><#if (dedqfieldcond_index==1)> WHERE </#if> <#if (dedqfieldcond_index>1)> AND </#if>${checkNullContextParamConvert(srfjavasqlcode(dedqfieldcond.getCustomCond()))}</#if>
</#list>
<#else>
<#list dedqcode.getPSDEDataQueryCodeConds() as dedqfieldcond>
<#if (dedqfieldcond_index==0)> WHERE </#if> <#if (dedqfieldcond_index>0)> AND </#if>${checkNullContextParamConvert(srfjavasqlcode(dedqfieldcond.getCustomCond()))}
</#list>
</#if>
</#if>
<#else>
<![CDATA[ ${contextParamConvert(srfjavasqlcode(dedqcode.getQueryCode()))}
<#if dedqcode.getPSDEDataQueryCodeConds()??>
<#if sys.getSaaSMode()==1 && item.getSaaSMode()==1>
<#list dedqcode.getPSDEDataQueryCodeConds() as dedqfieldcond>
<#if (dedqfieldcond_index>0)><#if (dedqfieldcond_index==1)> WHERE </#if> <#if (dedqfieldcond_index>1)> AND </#if>${contextParamConvert(srfjavasqlcode(dedqfieldcond.getCustomCond()))}</#if>
</#list>
<#else>
<#list dedqcode.getPSDEDataQueryCodeConds() as dedqfieldcond>
<#if (dedqfieldcond_index==0)> WHERE </#if> <#if (dedqfieldcond_index>0)> AND </#if>${contextParamConvert(srfjavasqlcode(dedqfieldcond.getCustomCond()))}
</#list>
</#if>
</#if>]]>
</#if>
</sql>
......@@ -258,6 +272,9 @@ TARGET=PSDATAENTITY
<#list params as param>
<#assign resultParam=resultParam?replace(param,param?lower_case,'i')>
</#list>
<#if sys.getSaaSMode()==1 && item.getSaaSMode()==1>
<#assign resultParam=resultParam?replace("AND t11.SRFDCID = '__SRFSAASDCID__'","")>
</#if>
<#return resultParam>
</#function>
......
<#ibiztemplate>
TARGET=PSDELOGIC
</#ibiztemplate>
<#if item.isEnableBackend()>
package ${pub.getPKGCodeName()}.${de.getPSSystemModule().codeName?lower_case}.logic.${de.codeName?lower_case}logic.${item.getCodeName()?lower_case};
<#comment>是否包含启动工作流节点</#comment>
<#assign startWF=false>
<#if item.getPSDELogicNodes?? && item.getPSDELogicNodes()??>
<#list item.getPSDELogicNodes() as deLogicNode>
<#if deLogicNode.getLogicNodeType()=='STARTWF'>
<#assign startWF=true>
<#break>
</#if>
</#list>
</#if>
<#assign logicName=(de.codeName+item.codeName)?lower_case>
<#assign delogic=item>
<#assign defaultLogicParam="">
......@@ -11,6 +21,9 @@ package ${pub.getPKGCodeName()}.${de.getPSSystemModule().codeName?lower_case}.lo
import java.util.Map;
import java.util.HashMap;
import com.alibaba.fastjson.JSONObject;
import org.springframework.util.StringUtils;
import org.springframework.util.ObjectUtils;
import ${pub.getPKGCodeName()}.util.errors.BadRequestAlertException;
<#list delogic.getPSDELogicParams() as logicParam>
<#if logicParam.isDefault()==true>
<#assign defaultLogicParam=logicParam><#comment>获取处理逻辑中默认逻辑参数</#comment>
......@@ -23,6 +36,10 @@ global java.util.Map ${logicName+logicParam.codeName?lower_case};
</#if>
</#list>
</#if>
<#comment>插入wfclient</#comment>
<#if startWF>
global ${pub.getPKGCodeName()}.util.client.IBZWFFeignClient wfClient;
</#if>
<#comment>插入处理逻辑中所用到的service对象</#comment>
<#if delogic.getPSDELogicNodes?? && delogic.getPSDELogicNodes()??>
<#list delogic.getPSDELogicNodes() as deLogicNode>
......@@ -38,6 +55,7 @@ global ${pub.getPKGCodeName()}.core.${de.getPSSystemModule().codeName?lower_case
global ${pub.getPKGCodeName()}.util.security.AuthenticationUser curuser;
</#if>
no-loop
<#if delogic.getPSDELogicNodes?? && delogic.getPSDELogicNodes()??>
<#list delogic.getPSDELogicNodes() as deLogicNode>
......@@ -161,7 +179,28 @@ ruleflow-group "${logicName+deLogicNode.getCodeName()?lower_case}"
}
</#if>
}
<#elseif deLogicNode.getLogicNodeType()=='STARTWF'><#comment>启动工作流</#comment>
<#assign wfDE=deLogicNode.getPSDEWF().getPSDataEntity()>
<#assign wfDEKeyField=srfcaseformat(wfDE.getKeyPSDEField().codeName,'l_u2lC')>
<#assign wfParam=deLogicNode.getDstPSDELogicParam()>
<#assign wfLogicParam=(logicName+wfParam.codeName)?lower_case>
<#assign wfDECodeName=srfpluralize(wfDE.getCodeName()?lower_case)>
<#assign appName="">
<#if wfDE.hasPSAppDataEntity()??>
<#list wfDE.getAllPSAppDataEntities() as WFAppDE>
<#assign appName=((WFAppDE.getPSApplication().getPKGCodeName())!'')?lower_case>
<#break>
</#list>
</#if>
JSONObject activeData=(JSONObject) JSONObject.toJSON(${wfLogicParam});
Object businessKey=${wfLogicParam}.get("${wfDEKeyField}");
String appName="${appName}";
if(StringUtils.isEmpty(appName))
throw new BadRequestAlertException("无法获取流程应用名称,请检查[${wfDE.getLogicName()}]实体是否已经添加到应用","StartWF","");
if(ObjectUtils.isEmpty(businessKey))
throw new BadRequestAlertException("启动流程失败,逻辑参数[${wfParam.codeName?lower_case}]中未包含实体业务主键","StartWF","");
wfClient.wfstart("${sys.codeName}",appName,"${wfDECodeName}",String.valueOf(businessKey),activeData);
</#if>
<#if delogic.getPSDELogicParams?? && delogic.getPSDELogicParams()??>
<#list delogic.getPSDELogicParams() as logicParam>
update(${logicName+logicParam.codeName?lower_case});//更新fact中变量值
......@@ -171,6 +210,7 @@ ruleflow-group "${logicName+deLogicNode.getCodeName()?lower_case}"
end
</#list>
</#if>
</#if>
<#macro getCallSQL2 deLogicNode >
Map param =new HashMap();
......
<#ibiztemplate>
TARGET=PSDELOGIC
</#ibiztemplate>
<#if item.isEnableBackend()>
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" xmlns:g="http://www.jboss.org/drools/flow/gpd" xmlns:tns="http://www.jboss.org/drools" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" expressionLanguage="http://www.mvel.org/2.0" id="Definition" name="" targetNamespace="http://www.jboss.org/drools" typeLanguage="http://www.java.com/javaTypes">
<process id="${pub.getPKGCodeName()}.core.${de.getPSSystemModule().codeName?lower_case}.service.logic.${de.codeName?lower_case}${item.getCodeName()?lower_case}" isClosed="false" isExecutable="true" name="ScoreRule" processType="Private" tns:packageName="${pub.getPKGCodeName()}.core.${de.getPSSystemModule().codeName?lower_case}.service.logic.${de.codeName?lower_case}${item.getCodeName()?lower_case}">
......@@ -24,24 +25,25 @@ TARGET=PSDELOGIC
<#if item.getPSDELogicNodes?? && item.getPSDELogicNodes()??>
<#list item.getPSDELogicNodes() as logicNode>
<#if logicNode.getLogicNodeType()=='BEGIN'>
<startEvent id="${logicNode.getId()}" isInterrupting="true"/>
<startEvent id="${logicNode.getCodeName()?lower_case}" isInterrupting="true"/>
<#else>
<businessRuleTask activiti:exclusive="true" g:ruleFlowGroup="${logicName+logicNode.getCodeName()?lower_case}" id="${logicNode.getId()}" implementation="http://www.jboss.org/drools/rule" name="${logicNode.getName()}"/>
<businessRuleTask activiti:exclusive="true" g:ruleFlowGroup="${logicName+logicNode.getCodeName()?lower_case}" id="${logicNode.getCodeName()?lower_case}" implementation="http://www.jboss.org/drools/rule" name="${logicNode.getName()}"/>
</#if>
<#if !(logicNode.getPSDELogicLinks()??)><#comment>是否为流程最后一个处理节点,若为最后一个处理节点则生成End节点</#comment>
<endEvent id="${logicNode.getId()}_End" name="End"/>
<sequenceFlow id="${logicNode.getId()}_End_Line" sourceRef="${logicNode.getId()}" targetRef="${logicNode.getId()}_End"/><#comment>生成流程最后一个处理节点与End节点之间的连线</#comment>
<endEvent id="${logicNode.getCodeName()?lower_case}_end" name="end"/>
<sequenceFlow id="${logicNode.getCodeName()?lower_case}_end_line" sourceRef="${logicNode.getCodeName()?lower_case}" targetRef="${logicNode.getCodeName()?lower_case}_end"/><#comment>生成流程最后一个处理节点与End节点之间的连线</#comment>
</#if>
</#list>
</#if>
<#comment>绘制节点连线</#comment>
<#if item.getPSDELogicLinks?? && item.getPSDELogicLinks()??>
<#list item.getPSDELogicLinks() as LogicLink>
<#assign sourceNodeid=LogicLink.getSrcPSDELogicNode().getId()>
<#assign sourceNodeId=LogicLink.getSrcPSDELogicNode().getCodeName()?lower_case>
<#if LogicLink.getPSDELogicLinkGroupCond?? && LogicLink.getPSDELogicLinkGroupCond()??><#comment>判断连接线含有条件,若有条件,则将源节点指向网关</#comment>
<#assign sourceNodeid="gateway-"+LogicLink.getSrcPSDELogicNode().getId()>
<#assign sourceNodeId=("gateway-"+LogicLink.getSrcPSDELogicNode().getCodeName())?lower_case>
</#if>
<sequenceFlow id="${LogicLink.getId()}" sourceRef="${sourceNodeid}" targetRef="${LogicLink.getDstPSDELogicNode().getId()}">
<#assign targetNodeId=LogicLink.getDstPSDELogicNode().getCodeName()?lower_case>
<sequenceFlow id="${sourceNodeId}_${targetNodeId}" sourceRef="${sourceNodeId}" targetRef="${targetNodeId}">
<#if LogicLink.getPSDELogicLinkGroupCond?? && LogicLink.getPSDELogicLinkGroupCond()??><#comment>连接线含有条件</#comment>
<conditionExpression language="http://www.jboss.org/drools/rule" ><![CDATA[
<#comment>准备逻辑参数</#comment>
......@@ -70,23 +72,25 @@ TARGET=PSDELOGIC
<#if item.getPSDELogicLinks?? && item.getPSDELogicLinks()??>
<#list item.getPSDELogicLinks() as LogicLink>
<#if LogicLink.getPSDELogicLinkGroupCond?? && LogicLink.getPSDELogicLinkGroupCond()??><#comment>连接线含有条件</#comment>
<#assign gatewayid="gateway-"+LogicLink.getSrcPSDELogicNode().getId()>
<#if !P.exists("gateway",gatewayid)>
<#assign gatewayId="gateway-"+LogicLink.getSrcPSDELogicNode().getCodeName()?lower_case>
<#if !P.exists("gateway",gatewayId)>
<#comment>绘制网关</#comment>
<exclusiveGateway id="${gatewayid}" name="Gateway" gatewayDirection="Diverging" default="${gatewayid}_End_Line"></exclusiveGateway>
<exclusiveGateway id="${gatewayId}" name="Gateway" gatewayDirection="Diverging" default="${gatewayId}_end_line"></exclusiveGateway>
<#comment>绘制网关与源节点的连线</#comment>
<sequenceFlow id="${LogicLink.getId()}-gatewayline" sourceRef="${LogicLink.getSrcPSDELogicNode().getId()}" targetRef="${gatewayid}"></sequenceFlow>
<#assign sourceNodeId=LogicLink.getSrcPSDELogicNode().getCodeName()?lower_case>
<sequenceFlow id="${sourceNodeId}_${gatewayId}_gatewayline" sourceRef="${sourceNodeId}" targetRef="${gatewayId}"></sequenceFlow>
</#if>
<#comment>绘制网关默认结束节点</#comment>
<#if !P.exists("gateway-end",gatewayid)>
<sequenceFlow id="${gatewayid}_End_Line" sourceRef="${gatewayid}" targetRef="${gatewayid}_End"/><#comment>生成流程最后一个处理节点与End节点之间的连线</#comment>
<endEvent id="${gatewayid}_End" name="End"/>
<#if !P.exists("gateway-end",gatewayId)>
<sequenceFlow id="${gatewayId}_end_line" sourceRef="${gatewayId}" targetRef="${gatewayId}_end"/><#comment>生成流程最后一个处理节点与End节点之间的连线</#comment>
<endEvent id="${gatewayId}_end" name="end"/>
</#if>
</#if>
</#list>
</#if>
</process>
</definitions>
</#if>
<#comment>获取组合条件表达式</#comment>
<#function getGroupCond LogicLinkCond>
......
<#ibiztemplate>
TARGET=PSSYSTEM
</#ibiztemplate>
{
"systemid":"${sys.codeName}",
"systemname":"${sys.getLogicName()}",
"entities":[
<#if sys.getAllPSDataEntities()??>
<#list sys.getAllPSDataEntities() as de>
{
"entity_name":"${de.name}",
"logic_name":"${de.logicName}",
"code_name":"${de.codeName}",
"table_name":"${de.getTableName()}",
"system_id":"${sys.codeName}",
"system_name":"${sys.logicName}",
<#--"ds_id":null,-->
<#--"ds_name":"",-->
"fields":[
<#if de.getPSDEFields()??>
<#list de.getPSDEFields() as defield>
{
"fieldname":"${defield.name}" ,
"codename":"${defield.codeName}",
"field_logic_name":"${defield.logicName}",
"entity_name":"${de.codeName}",
<#if defield.getRelatedPSDEField?? && defield.getRelatedPSDEField()??>
"ref_de":"${defield.getRelatedPSDEField().getPSDataEntity().name}",
"ref_field_name":"${defield.getRelatedPSDEField().name}",
</#if>
<#if (((defield.getDataType())!'')=='PICKUP' || ((defield.getDataType())!'')=='PICKUPDATA' || ((defield.getDataType())!'')=='PICKUPTEXT' ) && defield.getPSDER1N()?? >
"relation_name":"${defield.getPSDER1N().getName()}",
"relation_codename":"${defield.getPSDER1N().getCodeName()}",
</#if>
"field_type":"${defield.getDataType()}",
<#if defield.getPSCodeList()??>
"dict":"${defield.getPSCodeList().codeName}",
</#if>
"nullable":<#if defield.isAllowEmpty()>1<#else>0</#if>,
"physical_field":<#if defield.isPhisicalDEField()>1<#else>0</#if>,
"data_type":"${srfdatatype(defield.getStdDataType())}",
<#if defield.getLength()?c!='-1'>
"data_length":${defield.getLength()?c},
</#if>
<#if defield.getPrecision()?c!='0'>
"data_preci":${defield.getPrecision()?c},
</#if>
<#--"expression":"",-->
<#if defield.getPredefinedType()?? && defield.getPredefinedType()!=''>
"predefined":"${defield.getPredefinedType()}",
</#if>
"key_field":<#if defield.isKeyDEField()==true>1<#else>0</#if>,
<#if defield.getUnionKeyValue()?? && defield.getUnionKeyValue()!=''>
"union_key":"${defield.getUnionKeyValue()}",
</#if>
"major_field":<#if defield.isMajorDEField()==true>1<#else>0</#if>
}<#if defield_has_next>,</#if>
</#list>
</#if>
],
"subEntitys":[
<#if de.getMinorPSDERs()??>
<#list de.getMajorPSDERs() as majorPSDER>
{"name":"${majorPSDER.name}",
"relation_type":"${majorPSDER.getDERType()}",
"code_name":"${majorPSDER.getCodeName()}",
"entity_name":"${majorPSDER.getMajorPSDataEntity().name}",
"ref_entity_name":"${majorPSDER.getMinorPSDataEntity().name}"
<#--"nested_name":"",-->
<#--"lookup":""-->
}<#if majorPSDER_has_next>,</#if>
</#list>
</#if>
],
"parentEntitys":[
<#if de.getMinorPSDERs()??>
<#list de.getMinorPSDERs() as minorPSDER>
{"name":"${minorPSDER.name}",
"relation_type":"${minorPSDER.getDERType()}",
"code_name":"${minorPSDER.getCodeName()}",
"entity_name":"${minorPSDER.getMajorPSDataEntity().name}",
"ref_entity_name":"${minorPSDER.getMinorPSDataEntity().name}"
<#--"nested_name":"",-->
<#--"lookup":""-->
}<#if minorPSDER_has_next>,</#if>
</#list>
</#if>
]
}
<#if de_has_next>,</#if>
</#list>
</#if>
]
}
......@@ -57,6 +57,9 @@ public class ${item.codeName}SecurityConfig extends WebSecurityConfigurerAdapter
@Value("${r'${ibiz.file.previewpath:ibizutil/preview}"'})
private String previewpath;
@Value("${r'${ibiz.auth.excludesPattern:}"'})
private String[] excludesPattern;
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
......@@ -121,9 +124,15 @@ public class ${item.codeName}SecurityConfig extends WebSecurityConfigurerAdapter
// 文件操作
.antMatchers("/"+downloadpath+"/**").permitAll()
.antMatchers("/"+uploadpath).permitAll()
.antMatchers("/"+previewpath+"/**").permitAll()
// 所有请求都需要认证
.anyRequest().authenticated()
.antMatchers("/"+previewpath+"/**").permitAll();
for (String excludePattern : excludesPattern) {
authenticationTokenFilter.addExcludePattern(excludePattern);
httpSecurity.authorizeRequests().antMatchers(excludePattern).permitAll();
}
// 所有请求都需要认证
httpSecurity.authorizeRequests().anyRequest().authenticated()
// 防止iframe 造成跨域
.and().headers().frameOptions().disable();
......
......@@ -24,6 +24,9 @@ import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.alibaba.fastjson.annotation.JSONField;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import ${pub.getPKGCodeName()}.util.domain.DTOBase;
import ${pub.getPKGCodeName()}.util.domain.DTOClient;
import lombok.Data;
......@@ -44,6 +47,7 @@ public class ${item.getCodeName()}DTO extends ${dtoBase} implements Serializable
<#assign prvateCodeName = srfcaseformat(apifield.getCodeName(),'l_u2lC') >
<#assign publicCodeName = prvateCodeName?cap_first >
<#assign jsonfield = apifield.getCodeName()?lower_case >
<#assign defield=(apifield.getPSDEField())!"">
<#if defDataType!='ONE2MANYDATA'>
/**
* 属性 [${apifield.getName()}]
......@@ -56,13 +60,14 @@ public class ${item.getCodeName()}DTO extends ${dtoBase} implements Serializable
@JsonFormat(pattern="yyyy-MM-dd", locale = "zh" , timezone="GMT+8")
@JSONField(name = "${jsonfield}" , format="yyyy-MM-dd")
<#elseif defDataType == "TIME" || ((defDataType=='PICKUPDATA'||defDataType=='INHERIT') && srfdatatype(apifield.getStdDataType())== "DATETIME" && apifield.getPSDEField().getValueFormat()=="%1$tH:%1$tM:%1$tS")>
@JsonFormat(pattern="HH:mm", locale = "zh" , timezone="GMT+8")
@JSONField(name = "${jsonfield}" , format="HH:mm")
@JsonFormat(pattern="HH:mm:ss", locale = "zh" , timezone="GMT+8")
@JSONField(name = "${jsonfield}" , format="HH:mm:ss")
<#else>
@JSONField(name = "${jsonfield}")
</#if>
@JsonProperty("${jsonfield}")
private ${srfjavatype(apifield.getStdDataType())} ${prvateCodeName};
<@valueRule defield />
private ${srfr7javatype(apifield.getStdDataType())} ${prvateCodeName};
</#if>
</#list>
......@@ -81,7 +86,7 @@ public class ${item.getCodeName()}DTO extends ${dtoBase} implements Serializable
/**
* 设置 [${apifield.getName()}]
*/
public void set${publicCodeName}(${srfjavatype(apifield.getStdDataType())} ${prvateCodeName}){
public void set${publicCodeName}(${srfr7javatype(apifield.getStdDataType())} ${prvateCodeName}){
this.${prvateCodeName} = ${prvateCodeName} ;
this.modify("${columnname}",${prvateCodeName});
}
......@@ -112,4 +117,39 @@ public class ${item.getCodeName()}DTO extends ${dtoBase} implements Serializable
</#if>
}
</#if>
\ No newline at end of file
</#if>
<#comment>属性值规则</#comment>
<#macro valueRule defield>
<#if defield !=''>
<#if defield.isKeyDEField()==true || defield.getPredefinedType()?? && defield.getPredefinedType()!=''>
<#else>
<#if defield.isAllowEmpty()==false>
<#assign notNullMsg="["+defield.getLogicName()+"]不允许为空!">
<#if srfr7javatype(defield.stdDataType)=='String'>
@NotBlank(message = "${notNullMsg}")
<#else>
@NotNull(message = "${notNullMsg}")
</#if>
</#if>
</#if>
<#if defield.getAllPSDEFValueRules()??>
<#list defield.getAllPSDEFValueRules() as defieldVR>
<#if defieldVR.getPSDEFVRGroupCondition?? && defieldVR.getPSDEFVRGroupCondition()?? && defieldVR.getCodeName()=='Default'>
<#assign vrCond=defieldVR.getPSDEFVRGroupCondition()>
<#assign vrCondType=vrCond.getCondType()>
<#assign vrCondOp=vrCond.getCondOp()>
<#if vrCond.getPSDEFVRConditions?? && vrCond.getPSDEFVRConditions()??>
<#list vrCond.getPSDEFVRConditions() as subVRCond>
<#if subVRCond.getCondType()=='STRINGLENGTH'>
<#if subVRCond.getMaxValue()?c!='-1'>
@Size(min = 0, max = ${subVRCond.getMaxValue()?c}, message = "${subVRCond.getRuleInfo()}")
</#if>
</#if>
</#list>
</#if>
</#if>
</#list>
</#if>
</#if>
</#macro>
\ No newline at end of file
......@@ -216,7 +216,7 @@ public class DEFieldDefaultValueAspect
private void fillPreFieldValue(String fieldname , DEPredefinedFieldType preFieldType ,EntityBase et , String actionName,String logicValue ,AuthenticationUser curUser) throws Exception {
Object fieldValue = et.get(fieldname);
//为预置属性进行赋值
if( actionName.equalsIgnoreCase("create")||
if( actionName.toLowerCase().startsWith("create") ||
preFieldType== DEPredefinedFieldType.UPDATEDATE|| preFieldType== DEPredefinedFieldType.UPDATEMAN||
preFieldType== DEPredefinedFieldType.UPDATEMANNAME){
......
......@@ -21,6 +21,9 @@ import org.springframework.stereotype.Component;
import org.springframework.util.ObjectUtils;
import org.springframework.util.StringUtils;
import java.lang.reflect.Field;
import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;
/**
......@@ -112,7 +115,8 @@ public class VersionCheckAspect
*/
@SneakyThrows
private Object getDBVersion(VersionCheck versionCheck,Object service,Object id){
Object dbVersion=null;
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Timestamp dbVersion=null;
String versionField=versionCheck.versionfield();
if(!ObjectUtils.isEmpty(service)){
EvaluationContext oldContext = new StandardEvaluationContext();
......@@ -120,7 +124,12 @@ public class VersionCheckAspect
oldContext.setVariable("id",id);
Expression oldExp = parser.parseExpression("#service.get(#id)");
EntityBase oldEntity =oldExp.getValue(oldContext, EntityBase.class);
return oldEntity.get(versionField);
Object oldDate=oldEntity.get(versionField);
if(oldDate!=null && oldDate instanceof Timestamp){
Timestamp db_time= (Timestamp) oldDate;
Date db_date = sdf.parse(sdf.format(db_time));
dbVersion=new Timestamp(db_date.getTime());
}
}
return dbVersion;
}
......
<#ibiztemplate>
TARGET=PSSYSTEM
</#ibiztemplate>
package ${pub.getPKGCodeName()}.util.client;
import com.alibaba.fastjson.JSONObject;
import org.springframework.stereotype.Component;
@Component
public class IBZLiteFallback implements IBZLiteFeignClient {
@Override
public Boolean syncSysModel(JSONObject system) {
return null;
}
}
<#ibiztemplate>
TARGET=PSSYSTEM
</#ibiztemplate>
package ${pub.getPKGCodeName()}.util.client;
import com.alibaba.fastjson.JSONObject;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.*;
@FeignClient(value = "${r'${ibiz.ref.service.lite:ibzlite-api}'}",contextId = "lite",fallback = IBZLiteFallback.class)
public interface IBZLiteFeignClient
{
/**
* 同步系统资模型到lite
* @param system 系统模型信息
* @return
*/
@PostMapping("/lite/syncsysmodel")
Boolean syncSysModel(@RequestBody JSONObject system);
}
......@@ -3,7 +3,7 @@ TARGET=PSSYSTEM
</#ibiztemplate>
package ${pub.getPKGCodeName()}.util.client;
import com.alibaba.fastjson.JSONArray;
import ${pub.getPKGCodeName()}.util.domain.MsgBody;
import com.alibaba.fastjson.JSONObject;
import org.springframework.stereotype.Component;
......@@ -11,7 +11,7 @@ import org.springframework.stereotype.Component;
public class IBZNotifyFallback implements IBZNotifyFeignClient {
@Override
public Boolean SendMsg(JSONObject msg) {
public Boolean sendMsg(MsgBody msg) {
return null;
}
......@@ -19,4 +19,19 @@ public class IBZNotifyFallback implements IBZNotifyFeignClient {
public Boolean createMsgTemplate(JSONObject template) {
return null;
}
@Override
public Boolean sendDingTalkLinkMsg(MsgBody msg) {
return null;
}
@Override
public String createDingTalkWorkRecord(MsgBody msg) {
return null;
}
@Override
public Boolean finishDingTalkWorkRecord(String msgId) {
return null;
}
}
......@@ -3,16 +3,26 @@ TARGET=PSSYSTEM
</#ibiztemplate>
package ${pub.getPKGCodeName()}.util.client;
import ${pub.getPKGCodeName()}.util.domain.MsgBody;
import com.alibaba.fastjson.JSONObject;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.*;
@FeignClient(value = "${r'${ibiz.ref.service.notify:ibznotify-api}'}",fallback = IBZNotifyFallback.class)
@FeignClient(value = "${r'${ibiz.ref.service.notify:ibznotify-api}'}",contextId = "notify",fallback = IBZNotifyFallback.class)
public interface IBZNotifyFeignClient
{
@RequestMapping(method = RequestMethod.POST,value = "/SendMsg")
Boolean SendMsg(@RequestBody JSONObject msg);
@RequestMapping(method = RequestMethod.POST,value = "/notify/sendmsg")
Boolean sendMsg(@RequestBody MsgBody msg);
@RequestMapping(method = RequestMethod.POST,value = "/createMsgTemplate")
@RequestMapping(method = RequestMethod.POST,value = "/notify/createmsgtempl")
Boolean createMsgTemplate(@RequestBody JSONObject template);
@RequestMapping(method = RequestMethod.POST,value = "/notify/dingtalk/sendlinkmsg")
Boolean sendDingTalkLinkMsg(@RequestBody MsgBody msg);
@RequestMapping(method = RequestMethod.POST,value = "/notify/dingtalk/createworkrecord")
String createDingTalkWorkRecord(@RequestBody MsgBody msg);
@RequestMapping(method = RequestMethod.POST,value = "/notify/dingtalk/finishworkrecord/{msgid}")
Boolean finishDingTalkWorkRecord(@PathVariable("msgid") String msgId);
}
......@@ -10,7 +10,7 @@ import org.springframework.web.bind.annotation.PathVariable;
import java.util.Map;
import java.util.Set;
@FeignClient(value = "${r'${ibiz.ref.service.ou:ibzou-api}'}",fallback = IBZOUFallback.class)
@FeignClient(value = "${r'${ibiz.ref.service.ou:ibzou-api}'}",contextId = "ou",fallback = IBZOUFallback.class)
public interface IBZOUFeignClient
{
/**
......@@ -18,7 +18,7 @@ public interface IBZOUFeignClient
* @param userId
* @return
*/
@GetMapping("/ibzemployees/{userId}/oumaps")
@GetMapping("/sysemployees/{userId}/oumaps")
Map<String, Set<String>> getOUMapsByUserId(@PathVariable("userId") String userId);
}
<#ibiztemplate>
TARGET=PSSYSTEM
</#ibiztemplate>
package ${pub.getPKGCodeName()}.util.client;
import ${pub.getPKGCodeName()}.util.domain.PayTrade;
import com.alibaba.fastjson.JSONObject;
import org.springframework.stereotype.Component;
@Component
public class IBZPayFallback implements IBZPayFeignClient {
@Override
public JSONObject preCreate(PayTrade trade) {
return null;
}
@Override
public JSONObject query(PayTrade trade) {
return null;
}
@Override
public JSONObject cancel(PayTrade trade) {
return null;
}
@Override
public String pagePay(PayTrade trade) {
return null;
}
}
<#ibiztemplate>
TARGET=PSSYSTEM
</#ibiztemplate>
package ${pub.getPKGCodeName()}.util.client;
import ${pub.getPKGCodeName()}.util.domain.PayTrade;
import com.alibaba.fastjson.JSONObject;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
@FeignClient(value = "${r'${ibiz.ref.service.pay:ibzpay-api}'}",contextId = "pay",fallback = IBZPayFallback.class)
public interface IBZPayFeignClient
{
@RequestMapping(method = RequestMethod.POST,value = "/pay/trade/precreate")
JSONObject preCreate(@RequestBody PayTrade trade);
@RequestMapping(method = RequestMethod.POST,value = "/pay/trade/query")
JSONObject query(@RequestBody PayTrade trade);
@RequestMapping(method = RequestMethod.POST,value = "/pay/trade/cancel")
JSONObject cancel(@RequestBody PayTrade trade);
@RequestMapping(method = RequestMethod.POST,value = "/pay/trade/pagepay")
String pagePay(@RequestBody PayTrade trade);
}
......@@ -10,7 +10,7 @@ import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.*;
import com.alibaba.fastjson.JSONObject;
@FeignClient(value = "${r'${ibiz.ref.service.uaa:ibzuaa-api}'}",fallback = IBZUAAFallback.class)
@FeignClient(value = "${r'${ibiz.ref.service.uaa:ibzuaa-api}'}",contextId = "uaa",fallback = IBZUAAFallback.class)
public interface IBZUAAFeignClient
{
/**
......
......@@ -4,6 +4,7 @@ TARGET=PSSYSTEM
package ${pub.getPKGCodeName()}.util.client;
import org.springframework.stereotype.Component;
import com.alibaba.fastjson.JSONObject;
import java.util.*;
@Component
......@@ -23,4 +24,9 @@ public class IBZWFFallback implements IBZWFFeignClient {
public Boolean deployBpmnFile(List<Map<String, Object>> bpmnfiles) {
return null;
}
@Override
public JSONObject wfstart(String system, String appname, String entity, String businessKey, JSONObject instance) {
return null;
}
}
......@@ -5,9 +5,10 @@ package ${pub.getPKGCodeName()}.util.client;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.*;
import com.alibaba.fastjson.JSONObject;
import java.util.*;
@FeignClient(value = "${r'${ibiz.ref.service.wf:ibzwf-api}'}",fallback = IBZWFFallback.class)
@FeignClient(value = "${r'${ibiz.ref.service.wf:ibzwf-api}'}",contextId = "wf",fallback = IBZWFFallback.class)
public interface IBZWFFeignClient
{
@RequestMapping(method = RequestMethod.GET, value = "/{system}-app-{appname}/{entity}/process-definitions/{processDefinitionKey}/usertasks/{taskDefinitionKey}/tasks")
......@@ -21,4 +22,9 @@ public interface IBZWFFeignClient
@RequestMapping(method = RequestMethod.POST, value = "/deploybpmn")
Boolean deployBpmnFile(@RequestBody List<Map<String,Object>> bpmnfiles);
@RequestMapping(method = RequestMethod.POST, value = "/{system}-app-{appname}/{entity}/{businessKey}/process-instances")
JSONObject wfstart(@PathVariable("system") String system, @PathVariable("appname") String appname,
@PathVariable("entity") String entity,
@PathVariable("businessKey") String businessKey, @RequestBody JSONObject instance);
}
......@@ -12,7 +12,9 @@ import com.fasterxml.jackson.annotation.JsonIgnore;
import org.springframework.cglib.beans.BeanMap;
import org.springframework.data.annotation.Transient;
import org.springframework.util.AlternativeJdkIdGenerator;
import org.springframework.util.ObjectUtils;
import java.io.Serializable;
import java.lang.reflect.Field;
import org.springframework.util.StringUtils;
import java.util.*;
......@@ -99,4 +101,32 @@ public class EntityBase implements Serializable {
this.extensionparams.put(field.toLowerCase(),value);
}
/**
* 复制当前对象数据到目标对象
* @param targetEntity 目标数据对象
* @param bIncEmpty 是否包括空值
* @param <T>
* @return
*/
public <T> T copyTo(T targetEntity, boolean bIncEmpty){
if(targetEntity instanceof EntityBase){
EntityBase target= (EntityBase) targetEntity;
Hashtable<String, Field> sourceFields=DEFieldCacheMap.getFieldMap(this.getClass());
for(String field : sourceFields.keySet()){
Object value=this.get(field);
if( !ObjectUtils.isEmpty(value) || ObjectUtils.isEmpty(value) && getFocusNull().contains(field) && bIncEmpty ){
target.set(field,value);
}
}
}
return targetEntity;
}
/**
* 重置当前数据对象属性值
* @param field
*/
public void reset(String field){
}
}
\ No newline at end of file
......@@ -3,6 +3,8 @@ TARGET=PSSYSTEM
</#ibiztemplate>
package ${pub.getPKGCodeName()}.util.domain;
import org.springframework.util.StringUtils;
public class EntityClient extends EntityBase {
@Override
......@@ -18,5 +20,14 @@ public class EntityClient extends EntityBase {
}
}
@Override
public void reset(String field) {
if(!StringUtils.isEmpty(field)){
String resetField=field.toLowerCase();
this.set(resetField,null);
this.getFocusNull().remove(resetField);
getExtensionparams().remove(resetField+"dirtyflag");
}
}
}
......@@ -4,6 +4,7 @@ TARGET=PSSYSTEM
package ${pub.getPKGCodeName()}.util.domain;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import org.springframework.util.StringUtils;
public class EntityMP extends EntityBase {
......@@ -27,5 +28,14 @@ public class EntityMP extends EntityBase {
this.getFocusNull().remove(field.toLowerCase());
}
@Override
public void reset(String field){
if(!StringUtils.isEmpty(field)){
String resetField=field.toLowerCase();
this.set(resetField,null);
getFocusNull().remove(resetField);
}
}
}
<#ibiztemplate>
TARGET=PSSYSTEM
</#ibiztemplate>
package ${pub.getPKGCodeName()}.util.domain;
import com.alibaba.fastjson.annotation.JSONField;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import java.io.Serializable;
/**
* 消息对象
*/
@Data
public class MsgBody{
/**
* 接收用户
*/
@JSONField(name = "to_users")
@JsonProperty("to_users")
private String toUsers;
/**
* 标题
*/
@JSONField(name = "subject")
@JsonProperty("subject")
private String subject;
/**
* 内容
*/
@JSONField(name = "content")
@JsonProperty("content")
private String content;
/**
* 类型
*/
@JSONField(name = "msg_type")
@JsonProperty("msg_type")
private Integer msgType;
/**
* 模板标识
*/
@JSONField(name = "template_id")
@JsonProperty("template_id")
private String templateId;
/**
* 模板参数
*/
@JSONField(name = "template_params")
@JsonProperty("template_params")
private String templateParams;
/**
* 消息链接
*/
@JSONField(name = "msg_link")
@JsonProperty("msg_link")
private String msgLink;
/**
* 消息链接(pc
*/
@JSONField(name = "msg_link_pc")
@JsonProperty("msg_link_pc")
private String msgLinkPc;
}
<#ibiztemplate>
TARGET=PSSYSTEM
</#ibiztemplate>
package ${pub.getPKGCodeName()}.util.domain;
import com.alibaba.fastjson.annotation.JSONField;
import com.baomidou.mybatisplus.annotation.TableField;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
/**
* 实体[支付交易]
*/
@Data
public class PayTrade{
/**
* 订单标题
*/
@TableField(value = "subject")
@JSONField(name = "subject")
@JsonProperty("subject")
private String subject;
/**
* 订单金额
*/
@JSONField(name = "total_amount")
@JsonProperty("total_amount")
private String totalAmount;
/**
* 订单号
*/
@JSONField(name = "out_trade_no")
@JsonProperty("out_trade_no")
private String outTradeNo;
/**
* rt开放平台配置标识(OpenAccessIdAppId)
*/
@JSONField(name = "access_id")
@JsonProperty("access_id")
private String accessId;
}
......@@ -152,6 +152,7 @@ public class SearchContextBase implements ISearchContext{
* 获取用户上下文
* @return
*/
@JsonIgnore
public Map<String,Object> getSessioncontext() {
return AuthenticationUser.getAuthenticationUser().getSessionParams();
}
......
......@@ -23,6 +23,7 @@ TARGET=PSSYSTEM
package ${pub.getPKGCodeName()}.util.job;
import ${pub.getPKGCodeName()}.util.client.IBZUAAFeignClient;
import ${pub.getPKGCodeName()}.util.client.IBZLiteFeignClient;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.JSONArray;
import lombok.extern.slf4j.Slf4j;
......@@ -68,6 +69,10 @@ public class PermissionSyncJob implements ApplicationRunner {
private ${pub.getPKGCodeName()}.util.client.IBZNotifyFeignClient notifyFeignClient;
</#if>
@Autowired
@Lazy
IBZLiteFeignClient liteFeignClient;
@Override
public void run(ApplicationArguments args) {
try {
......@@ -89,6 +94,19 @@ public class PermissionSyncJob implements ApplicationRunner {
log.error(String.format("向[UAA]同步系统资源失败,请检查[UAA]服务是否正常! [%s]",ex));
}
try {
InputStream sysModel= this.getClass().getResourceAsStream("/sysmodel/${sys.codeName}.json"); //获取当前系统所有实体资源能力
String strSysModel = IOUtils.toString(sysModel,"UTF-8");
if(liteFeignClient.syncSysModel(JSONObject.parseObject(strSysModel))){
log.info("向[lite]同步系统模型成功");
}else{
log.error("向[lite]同步系统模型失败");
}
}
catch (Exception ex) {
log.error(String.format("向[lite]同步系统模型失败,请检查[lite]服务是否正常! [%s]",ex));
}
<#if hasWF>
try{
List<Map<String,Object>> bpmnfiles=new ArrayList();
......
......@@ -21,59 +21,174 @@ import com.alibaba.fastjson.JSONObject;
@JsonIgnoreProperties(ignoreUnknown = true)
public class AuthenticationUser implements UserDetails
{
public AuthenticationUser()
{
}
public AuthenticationUser(){}
/**
* 用戶标识
*/
private String userid;
/**
* 用户全局名
*/
private String username;
/**
* 用户姓名
*/
private String personname;
private String usercode;
/**
* 登录名
*/
private String loginname;
/**
* 用户工号
*/
private String usercode;
/**
* 登录密码
*/
private String password;
/**
* 区属
*/
private String domain;
/**
* 部门标识
*/
private String mdeptid;
/**
* 部门编码
*/
private String mdeptcode;
/**
* 部门名称
*/
private String mdeptname;
/**
* 业务编码
*/
private String bcode;
/**
* 岗位标识
*/
private String postid;
/**
* 岗位代码
*/
private String postcode;
/**
* 岗位名称
*/
private String postname;
/**
* 单位标识
*/
private String orgid;
/**
* 单位编码
*/
private String orgcode;
/**
* 单位名称
*/
private String orgname;
/**
* 昵称别名
*/
private String nickname;
/**
* 邮箱
*/
private String email;
/**
* 社交账号
*/
private String avatar;
/**
* 电话
*/
private String phone;
private String reserver;
/**
* 照片
*/
private String usericon;
/**
* 性别
*/
private String sex;
/**
* 出生日期
*/
private Timestamp birthday;
/**
* 证件号码
*/
private String certcode;
/**
* 地址
*/
private String addr;
/**
* 主题
*/
private String theme;
/**
* 字号
*/
private String fontsize;
/**
* 语言
*/
private String lang;
/**
* 备注
*/
private String memo;
/**
* 保留字段
*/
private String reserver;
/**
* 用户上下文参数
*/
private Map <String,Object> sessionParams;
/**
* 用户权限资源
*/
@JsonIgnore
private Collection<GrantedAuthority> authorities;
/**
* 是否为超级管理员
*/
private int superuser;
/**
* 用户权限资源
*/
private JSONObject permissionList;
private String orglevel;//单位级别
private String deptlevel;//部门级别
/**
* 用户上下文参数
*/
@JsonIgnore
private Map<String,Object> userSessionParam;//用户自定义session
private Map<String, Set<String>> orgInfo;//上下级组织信息
private Map<String,Object> userSessionParam;
/**
* 当前用户上下级组织信息
*/
private Map<String, Set<String>> orgInfo;
/**
* 上级组织
*/
private String porg;
/**
* 下级组织
*/
private String sorg;
/**
* 上级部门
*/
private String pdept;
/**
* 下级部门
*/
private String sdept;
@JsonIgnore
@Override
public boolean isAccountNonExpired() {
......
......@@ -13,6 +13,8 @@ import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.web.authentication.WebAuthenticationDetailsSource;
import org.springframework.stereotype.Component;
import org.springframework.util.AntPathMatcher;
import org.springframework.util.PathMatcher;
import org.springframework.web.filter.OncePerRequestFilter;
import org.springframework.beans.factory.annotation.Qualifier;
......@@ -21,6 +23,10 @@ import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
@Slf4j
@Component
......@@ -29,6 +35,8 @@ public class AuthorizationTokenFilter extends OncePerRequestFilter {
private final UserDetailsService userDetailsService;
private final AuthTokenUtil authTokenUtil;
private final String tokenHeader;
private Set<String> excludesPattern = new HashSet<String>();
private PathMatcher pathMatcher = new AntPathMatcher();
public AuthorizationTokenFilter(AuthenticationUserService userDetailsService, AuthTokenUtil authTokenUtil, @Value(${r'"${ibiz.jwt.header:Authorization}"'}) String tokenHeader) {
this.userDetailsService = userDetailsService;
......@@ -38,7 +46,11 @@ public class AuthorizationTokenFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws ServletException, IOException {
if (isExclusion(request.getRequestURI())) {
chain.doFilter(request, response);
return;
}
final String requestHeader = request.getHeader(this.tokenHeader);
String username = null;
......@@ -53,20 +65,38 @@ public class AuthorizationTokenFilter extends OncePerRequestFilter {
}
if (username != null && SecurityContextHolder.getContext().getAuthentication() == null) {
// It is not compelling necessary to load the use details from the database. You could also store the information
// in the token and read it from it. It's up to you ;)
UserDetails userDetails = this.userDetailsService.loadUserByUsername(username);
// For simple validation it is completely sufficient to just check the token integrity. You don't have to call
// the database compellingly. Again it's up to you ;)
if (authTokenUtil.validateToken(authToken, userDetails)) {
UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities());
authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
// log.info("authorizated user '{}', setting security context", username);
SecurityContextHolder.getContext().setAuthentication(authentication);
}
}
chain.doFilter(request, response);
}
public void setExcludesPattern(String excludesPattern) {
this.excludesPattern = new HashSet(Arrays.asList(excludesPattern.split("\\s*,\\s*")));
}
public void addExcludePattern(String excludePattern) {
excludesPattern.add(excludePattern);
}
private boolean isExclusion(String requestURI) {
if (this.excludesPattern == null) {
return false;
} else {
Iterator excludeIterator = this.excludesPattern.iterator();
String pattern;
do {
if (!excludeIterator.hasNext()) {
return false;
}
pattern = (String) excludeIterator.next();
} while (!pathMatcher.match(pattern, requestURI));
return true;
}
}
}
......@@ -273,6 +273,11 @@ ibiz:
</#if>
enablePermissionValid: ${enableDataAcc}
cacheLevel: L1 #(L1)一级本地caffeine缓存;(L2)caffeine缓存+Redis缓存
<#if sys.getSaaSMode()==2>
saas:
column: SRFDCID
sys-tables: databasechangelog,databasechangeloglock<#list sys.getAllPSDataEntities() as entity><#if entity.getSaaSMode()==0>,${entity.getTableName()}</#if></#list>
</#if>
### jobs
jobs:
......
Markdown 格式
0% or
您添加了 0 到此讨论。请谨慎行事。
先完成此消息的编辑!
想要评论请 注册