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

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

Dev

查看合并请求 !26
# **iBiz4j Spring R7 Template ChangeLog** # **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] ## [v2020.08.31]
- 消息集成:适配RT消息接口,通过钉钉、微信消息及短信等方式发送工作流待办消息 - 消息集成:适配RT消息接口,通过钉钉、微信消息及短信等方式发送工作流待办消息
- 数据导入:批量数据采用异步方式进行导入,避免因数据量过大导致前端请求超时问题 - 数据导入:批量数据采用异步方式进行导入,避免因数据量过大导致前端请求超时问题
......
...@@ -81,6 +81,10 @@ zuul: ...@@ -81,6 +81,10 @@ zuul:
path: /dictionarys/**/Ibzou** path: /dictionarys/**/Ibzou**
serviceId: ${r'${ibiz.ref.service.ou:ibzou-api}'} serviceId: ${r'${ibiz.ref.service.ou:ibzou-api}'}
stripPrefix: false stripPrefix: false
ou:
path: /ibzdepartments/**
serviceId: ${r'${ibiz.ref.service.ou:ibzou-api}'}
stripPrefix: false
uaadict: uaadict:
path: /dictionarys/**/SysOperator path: /dictionarys/**/SysOperator
serviceId: ${r'${ibiz.ref.service.uaa:ibzuaa-api}'} serviceId: ${r'${ibiz.ref.service.uaa:ibzuaa-api}'}
...@@ -93,6 +97,18 @@ zuul: ...@@ -93,6 +97,18 @@ zuul:
path: /net-disk/** path: /net-disk/**
serviceId: ${r'${ibiz.ref.service.disk:ibzdisk-api}'} serviceId: ${r'${ibiz.ref.service.disk:ibzdisk-api}'}
stripPrefix: false 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>
</#if> </#if>
<#comment>通过设置该参数,避免Zuul转发请求时丢失Authorization请求头信息</#comment> <#comment>通过设置该参数,避免Zuul转发请求时丢失Authorization请求头信息</#comment>
......
...@@ -55,6 +55,9 @@ public class DevBootSecurityConfig extends WebSecurityConfigurerAdapter { ...@@ -55,6 +55,9 @@ public class DevBootSecurityConfig extends WebSecurityConfigurerAdapter {
@Value("${r'${ibiz.file.previewpath:ibizutil/preview}"'}) @Value("${r'${ibiz.file.previewpath:ibizutil/preview}"'})
private String previewpath; private String previewpath;
@Value("${r'${ibiz.auth.excludesPattern:}"'})
private String[] excludesPattern;
@Autowired @Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
...@@ -116,8 +119,15 @@ public class DevBootSecurityConfig extends WebSecurityConfigurerAdapter { ...@@ -116,8 +119,15 @@ public class DevBootSecurityConfig extends WebSecurityConfigurerAdapter {
// 文件操作 // 文件操作
.antMatchers("/"+downloadpath+"/**").permitAll() .antMatchers("/"+downloadpath+"/**").permitAll()
.antMatchers("/"+uploadpath).permitAll() .antMatchers("/"+uploadpath).permitAll()
.antMatchers("/"+previewpath+"/**").permitAll() .antMatchers("/"+previewpath+"/**").permitAll();
.anyRequest().authenticated()
for (String excludePattern : excludesPattern) {
authenticationTokenFilter.addExcludePattern(excludePattern);
httpSecurity.authorizeRequests().antMatchers(excludePattern).permitAll();
}
httpSecurity.authorizeRequests().anyRequest().authenticated()
// 防止iframe 造成跨域 // 防止iframe 造成跨域
.and().headers().frameOptions().disable(); .and().headers().frameOptions().disable();
httpSecurity httpSecurity
......
...@@ -91,6 +91,10 @@ zuul: ...@@ -91,6 +91,10 @@ zuul:
path: /dictionarys/**/Ibzou** path: /dictionarys/**/Ibzou**
serviceId: ${r'${ibiz.ref.service.ou:ibzou-api}'} serviceId: ${r'${ibiz.ref.service.ou:ibzou-api}'}
stripPrefix: false stripPrefix: false
ou:
path: /ibzdepartments/**
serviceId: ${r'${ibiz.ref.service.ou:ibzou-api}'}
stripPrefix: false
uaadict: uaadict:
path: /dictionarys/**/SysOperator path: /dictionarys/**/SysOperator
serviceId: ${r'${ibiz.ref.service.uaa:ibzuaa-api}'} serviceId: ${r'${ibiz.ref.service.uaa:ibzuaa-api}'}
...@@ -103,6 +107,18 @@ zuul: ...@@ -103,6 +107,18 @@ zuul:
path: /net-disk/** path: /net-disk/**
serviceId: ${r'${ibiz.ref.service.disk:ibzdisk-api}'} serviceId: ${r'${ibiz.ref.service.disk:ibzdisk-api}'}
stripPrefix: false 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>
</#if> </#if>
<#comment>通过设置该参数,避免Zuul转发请求时丢失Authorization请求头信息</#comment> <#comment>通过设置该参数,避免Zuul转发请求时丢失Authorization请求头信息</#comment>
......
...@@ -46,17 +46,17 @@ public class ${item.codeName}Fallback implements ${item.codeName}FeignClient{ ...@@ -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>); --> <#-- ${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'> <#if apiMethod.getCodeName()?lower_case == 'get'>
<#--@RequestMapping(method = RequestMethod.<#if apiMethod.getRequestMethod()??>${apiMethod.getRequestMethod()}<#else>POST</#if>, value = "${fullpath}/{${item.getKeyDEField().getCodeName()?lower_case}}")--> <#--@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; return null;
} }
<#elseif apiMethod.getCodeName()?lower_case == 'remove'> <#elseif apiMethod.getCodeName()?lower_case == 'remove'>
<#--@RequestMapping(method = RequestMethod.<#if apiMethod.getRequestMethod()??>${apiMethod.getRequestMethod()}<#else>POST</#if>, value = "${fullpath}/{${item.getKeyDEField().getCodeName()?lower_case}}")--> <#--@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; return false;
} }
<#--@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}/${apiMethod.getCodeName()?lower_case}")-->
public Boolean removeBatch(Collection<${srfjavatype(refDE.getKeyDEField().stdDataType)}> idList){ public Boolean removeBatch(Collection<${srfr7javatype(refDE.getKeyDEField().stdDataType)}> idList){
return false; return false;
} }
<#elseif apiMethod.getCodeName()?lower_case == 'create'> <#elseif apiMethod.getCodeName()?lower_case == 'create'>
...@@ -79,7 +79,7 @@ public class ${item.codeName}Fallback implements ${item.codeName}FeignClient{ ...@@ -79,7 +79,7 @@ public class ${item.codeName}Fallback implements ${item.codeName}FeignClient{
} }
<#elseif apiMethod.getCodeName()?lower_case == 'update'> <#elseif apiMethod.getCodeName()?lower_case == 'update'>
<#--@RequestMapping(method = RequestMethod.<#if apiMethod.getRequestMethod()??>${apiMethod.getRequestMethod()}<#else>POST</#if>, value = "${fullpath}/{${item.getKeyDEField().getCodeName()?lower_case}}")--> <#--@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; return null;
} }
<#--@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}/${apiMethod.getCodeName()?lower_case}")-->
...@@ -104,7 +104,7 @@ public class ${item.codeName}Fallback implements ${item.codeName}FeignClient{ ...@@ -104,7 +104,7 @@ public class ${item.codeName}Fallback implements ${item.codeName}FeignClient{
<#elseif apiMethod.getCodeName()?lower_case == 'savebatch'> <#elseif apiMethod.getCodeName()?lower_case == 'savebatch'>
<#else> <#else>
<#--@RequestMapping(method = RequestMethod.<#if apiMethod.getRequestMethod()??>${apiMethod.getRequestMethod()}<#else>POST</#if>, value = "${fullpath}/{${item.getKeyDEField().getCodeName()?lower_case}}/${apiMethod.getCodeName()?lower_case}")--> <#--@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; return null;
} }
</#if> </#if>
......
...@@ -49,14 +49,14 @@ public interface ${item.codeName}FeignClient { ...@@ -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>); --> <#-- ${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'> <#if apiMethod.getCodeName()?lower_case == 'get'>
@RequestMapping(method = RequestMethod.<#if apiMethod.getRequestMethod()??>${apiMethod.getRequestMethod()}<#else>POST</#if>, value = "${fullpath}/{${refDE.getKeyDEField().getCodeName()?lower_case}}") @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'> <#elseif apiMethod.getCodeName()?lower_case == 'remove'>
@RequestMapping(method = RequestMethod.<#if apiMethod.getRequestMethod()??>${apiMethod.getRequestMethod()}<#else>POST</#if>, value = "${fullpath}/{${refDE.getKeyDEField().getCodeName()?lower_case}}") @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}") @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'> <#elseif apiMethod.getCodeName()?lower_case == 'create'>
@RequestMapping(method = RequestMethod.<#if apiMethod.getRequestMethod()??>${apiMethod.getRequestMethod()}<#else>POST</#if>, value = "${fullpath}") @RequestMapping(method = RequestMethod.<#if apiMethod.getRequestMethod()??>${apiMethod.getRequestMethod()}<#else>POST</#if>, value = "${fullpath}")
...@@ -69,7 +69,7 @@ public interface ${item.codeName}FeignClient { ...@@ -69,7 +69,7 @@ public interface ${item.codeName}FeignClient {
@RequestMapping(method = RequestMethod.<#if apiMethod.getRequestMethod()??>${apiMethod.getRequestMethod()}<#else>POST</#if>, value = "${fullpath}/save") @RequestMapping(method = RequestMethod.<#if apiMethod.getRequestMethod()??>${apiMethod.getRequestMethod()}<#else>POST</#if>, value = "${fullpath}/save")
Boolean save(@RequestBody ${refDE.codeName} ${refDE.codeName?lower_case}); 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)}); Boolean saveBatch(@RequestBody List<${refDE.codeName}> ${srfpluralize(refDE.getCodeName()?lower_case)});
<#elseif apiMethod.getCodeName()?lower_case == 'getdraft'> <#elseif apiMethod.getCodeName()?lower_case == 'getdraft'>
...@@ -82,7 +82,7 @@ public interface ${item.codeName}FeignClient { ...@@ -82,7 +82,7 @@ public interface ${item.codeName}FeignClient {
<#elseif apiMethod.getCodeName()?lower_case == 'update'> <#elseif apiMethod.getCodeName()?lower_case == 'update'>
@RequestMapping(method = RequestMethod.<#if apiMethod.getRequestMethod()??>${apiMethod.getRequestMethod()}<#else>POST</#if>, value = "${fullpath}/{${refDE.getKeyDEField().getCodeName()?lower_case}}") @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") @RequestMapping(method = RequestMethod.PUT, value = "${fullpath}/batch")
Boolean updateBatch(@RequestBody List<${refDE.codeName}> ${srfpluralize(refDE.getCodeName()?lower_case)}); Boolean updateBatch(@RequestBody List<${refDE.codeName}> ${srfpluralize(refDE.getCodeName()?lower_case)});
...@@ -93,7 +93,7 @@ public interface ${item.codeName}FeignClient { ...@@ -93,7 +93,7 @@ public interface ${item.codeName}FeignClient {
<#elseif apiMethod.getCodeName()?lower_case == 'savebatch'> <#elseif apiMethod.getCodeName()?lower_case == 'savebatch'>
<#else> <#else>
@RequestMapping(method = RequestMethod.<#if apiMethod.getRequestMethod()??>${apiMethod.getRequestMethod()}<#else>POST</#if>, value = "${fullpath}/{${refDE.getKeyDEField().getCodeName()?lower_case}}/${apiMethod.getCodeName()?lower_case}") @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> </#if>
<#elseif apiMethod.getActionType()=='SELECT'><#comment>简单查询</#comment> <#elseif apiMethod.getActionType()=='SELECT'><#comment>简单查询</#comment>
......
...@@ -47,7 +47,7 @@ public class ${item.codeName}SearchContext extends QueryWrapperContext<${item.co ...@@ -47,7 +47,7 @@ public class ${item.codeName}SearchContext extends QueryWrapperContext<${item.co
@JsonFormat(pattern="HH:mm", timezone="GMT+8") @JsonFormat(pattern="HH:mm", timezone="GMT+8")
@JSONField(format="HH:mm") @JSONField(format="HH:mm")
</#if> </#if>
<#assign formItemDataType=srfjavatype(formitem.getPSDEField().stdDataType)> <#assign formItemDataType=srfr7javatype(formitem.getPSDEField().stdDataType)>
<#comment>in条件通过String接,通过split拆后再进行查询</#comment> <#comment>in条件通过String接,通过split拆后再进行查询</#comment>
<#if formitem.getValueOp() == "IN"> <#if formitem.getValueOp() == "IN">
<#assign formItemDataType="String"> <#assign formItemDataType="String">
...@@ -156,7 +156,7 @@ public class ${item.codeName}SearchContext extends QueryBuildContext { ...@@ -156,7 +156,7 @@ public class ${item.codeName}SearchContext extends QueryBuildContext {
@JsonFormat(pattern="HH:mm", timezone="GMT+8") @JsonFormat(pattern="HH:mm", timezone="GMT+8")
@JSONField(format="HH:mm") @JSONField(format="HH:mm")
</#if> </#if>
<#assign formItemDataType=srfjavatype(formitem.getPSDEField().stdDataType)> <#assign formItemDataType=srfr7javatype(formitem.getPSDEField().stdDataType)>
<#comment>in条件通过String接,通过split拆后再进行查询</#comment> <#comment>in条件通过String接,通过split拆后再进行查询</#comment>
<#if formitem.getValueOp() == "IN"> <#if formitem.getValueOp() == "IN">
<#assign formItemDataType="String"> <#assign formItemDataType="String">
...@@ -252,7 +252,7 @@ public class ${item.codeName}SearchContext extends SearchContextBase { ...@@ -252,7 +252,7 @@ public class ${item.codeName}SearchContext extends SearchContextBase {
@JsonFormat(pattern="HH:mm", timezone="GMT+8") @JsonFormat(pattern="HH:mm", timezone="GMT+8")
@JSONField(format="HH:mm") @JSONField(format="HH:mm")
</#if> </#if>
<#assign formItemDataType=srfjavatype(formitem.getPSDEField().stdDataType)> <#assign formItemDataType=srfr7javatype(formitem.getPSDEField().stdDataType)>
<#comment>in条件通过String接,通过split拆后再进行查询</#comment> <#comment>in条件通过String接,通过split拆后再进行查询</#comment>
<#if formitem.getValueOp() == "IN"> <#if formitem.getValueOp() == "IN">
<#assign formItemDataType="String"> <#assign formItemDataType="String">
...@@ -289,7 +289,7 @@ public class ${item.codeName}SearchContext extends SearchContextBase { ...@@ -289,7 +289,7 @@ public class ${item.codeName}SearchContext extends SearchContextBase {
@JsonFormat(pattern="HH:mm", timezone="GMT+8") @JsonFormat(pattern="HH:mm", timezone="GMT+8")
@JSONField(format="HH:mm") @JSONField(format="HH:mm")
</#if> </#if>
<#assign formItemDataType=srfjavatype(formitem.getPSDEField().stdDataType)> <#assign formItemDataType=srfr7javatype(formitem.getPSDEField().stdDataType)>
<#comment>in条件通过String接,通过split拆后再进行查询</#comment> <#comment>in条件通过String接,通过split拆后再进行查询</#comment>
<#if formitem.getValueOp() == "IN"> <#if formitem.getValueOp() == "IN">
<#assign formItemDataType="String"> <#assign formItemDataType="String">
......
...@@ -118,7 +118,7 @@ public interface I${item.codeName}Service{ ...@@ -118,7 +118,7 @@ public interface I${item.codeName}Service{
<#elseif deaction.getActionType()=='DELOGIC'> <#elseif deaction.getActionType()=='DELOGIC'>
${item.codeName} ${srfmethodname(deaction.getCodeName())}(${item.codeName} et) ; ${item.codeName} ${srfmethodname(deaction.getCodeName())}(${item.codeName} et) ;
<#elseif deaction.codeName?lower_case == 'get'> <#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"> <#elseif deaction.codeName?lower_case == "create">
boolean create(${item.codeName} et) ; boolean create(${item.codeName} et) ;
<#if item.isEnableEntityCache()==true> <#if item.isEnableEntityCache()==true>
...@@ -132,11 +132,11 @@ public interface I${item.codeName}Service{ ...@@ -132,11 +132,11 @@ public interface I${item.codeName}Service{
</#if> </#if>
void updateBatch(List<${item.codeName}> list) ; void updateBatch(List<${item.codeName}> list) ;
<#elseif deaction.codeName?lower_case == "remove"> <#elseif deaction.codeName?lower_case == "remove">
boolean remove(${srfjavatype(keyfield.stdDataType)} key) ; boolean remove(${srfr7javatype(keyfield.stdDataType)} key) ;
<#if item.isEnableEntityCache()==true> <#if item.isEnableEntityCache()==true>
@CacheEvict(value="${item.codeName?lower_case}",allEntries=true) @CacheEvict(value="${item.codeName?lower_case}",allEntries=true)
</#if> </#if>
void removeBatch(Collection<${srfjavatype(keyfield.stdDataType)}> idList) ; void removeBatch(Collection<${srfr7javatype(keyfield.stdDataType)}> idList) ;
<#elseif deaction.codeName?lower_case == "save"> <#elseif deaction.codeName?lower_case == "save">
boolean save(${item.codeName} et) ; boolean save(${item.codeName} et) ;
<#if item.isEnableEntityCache()==true> <#if item.isEnableEntityCache()==true>
...@@ -176,11 +176,11 @@ public interface I${item.codeName}Service{ ...@@ -176,11 +176,11 @@ public interface I${item.codeName}Service{
<#if de.getDefaultPSDEDataSet()??> <#if de.getDefaultPSDEDataSet()??>
<#assign deDefaultDataSet=de.getDefaultPSDEDataSet()> <#assign deDefaultDataSet=de.getDefaultPSDEDataSet()>
<#if deDefaultDataSet.getPSDEDataQueries()??> <#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> <#if item.isEnableEntityCache()==true>
@CacheEvict(value="${item.codeName?lower_case}",allEntries=true) @CacheEvict(value="${item.codeName?lower_case}",allEntries=true)
</#if> </#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()> <#assign nested=MinorPSDER.isNestedRS()>
<#if nested == false && MinorPSDER.getMinorPSDataEntity().getAllPSDEServiceAPIs()??> <#if nested == false && MinorPSDER.getMinorPSDataEntity().getAllPSDEServiceAPIs()??>
<#list MinorPSDER.getMinorPSDataEntity().getAllPSDEServiceAPIs() as api> <#list MinorPSDER.getMinorPSDataEntity().getAllPSDEServiceAPIs() as api>
...@@ -193,7 +193,7 @@ public interface I${item.codeName}Service{ ...@@ -193,7 +193,7 @@ public interface I${item.codeName}Service{
<#if item.isEnableEntityCache()==true> <#if item.isEnableEntityCache()==true>
@CacheEvict(value="${item.codeName?lower_case}",allEntries=true) @CacheEvict(value="${item.codeName?lower_case}",allEntries=true)
</#if> </#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> </#if>
</#if> </#if>
...@@ -220,7 +220,7 @@ public interface I${item.codeName}Service{ ...@@ -220,7 +220,7 @@ public interface I${item.codeName}Service{
<#elseif deaction.getActionType()=='DELOGIC'> <#elseif deaction.getActionType()=='DELOGIC'>
boolean test${srfmethodname(deaction.getCodeName())?cap_first}(${item.getCodeName()} et); boolean test${srfmethodname(deaction.getCodeName())?cap_first}(${item.getCodeName()} et);
<#elseif deaction.getCodeName()?lower_case == 'get'> <#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 == "createbatch">
<#elseif deaction.getCodeName()?lower_case == "updatebatch"> <#elseif deaction.getCodeName()?lower_case == "updatebatch">
<#elseif deaction.getCodeName()?lower_case == "removebatch"> <#elseif deaction.getCodeName()?lower_case == "removebatch">
...@@ -237,8 +237,8 @@ public interface I${item.codeName}Service{ ...@@ -237,8 +237,8 @@ public interface I${item.codeName}Service{
boolean testSaveBatch(Collection<${item.getCodeName()}> list); boolean testSaveBatch(Collection<${item.getCodeName()}> list);
boolean testSaveBatch(List<${item.getCodeName()}> list); boolean testSaveBatch(List<${item.getCodeName()}> list);
<#elseif deaction.getCodeName()?lower_case == "remove"> <#elseif deaction.getCodeName()?lower_case == "remove">
boolean testRemove(${srfjavatype(keyfield.stdDataType)} key); boolean testRemove(${srfr7javatype(keyfield.stdDataType)} key);
boolean testRemoveBatch(Collection<${srfjavatype(keyfield.stdDataType)}> idList); boolean testRemoveBatch(Collection<${srfr7javatype(keyfield.stdDataType)}> idList);
<#elseif deaction.getCodeName()?lower_case == "getdraft"> <#elseif deaction.getCodeName()?lower_case == "getdraft">
boolean testGetDraft(${item.getCodeName()} et); boolean testGetDraft(${item.getCodeName()} et);
......
<#ibiztemplate> <#ibiztemplate>
TARGET=PSDELOGIC TARGET=PSDELOGIC
</#ibiztemplate> </#ibiztemplate>
<#if item.isEnableBackend()>
package ${pub.getPKGCodeName()}.core.${item.getPSDataEntity().getPSSystemModule().getCodeName()?lower_case}.service.logic; package ${pub.getPKGCodeName()}.core.${item.getPSDataEntity().getPSSystemModule().getCodeName()?lower_case}.service.logic;
import java.sql.Timestamp; import java.sql.Timestamp;
...@@ -19,3 +20,4 @@ public interface I${de.codeName}${item.codeName}Logic { ...@@ -19,3 +20,4 @@ public interface I${de.codeName}${item.codeName}Logic {
void execute(${de.codeName} et) ; void execute(${de.codeName} et) ;
} }
</#if>
\ No newline at end of file
<#ibiztemplate> <#ibiztemplate>
TARGET=PSDELOGIC TARGET=PSDELOGIC
</#ibiztemplate> </#ibiztemplate>
<#if item.isEnableBackend()>
<#assign startWF=false>
package ${pub.getPKGCodeName()}.core.${item.getPSDataEntity().getPSSystemModule().getCodeName()?lower_case}.service.logic.impl; package ${pub.getPKGCodeName()}.core.${item.getPSDataEntity().getPSSystemModule().getCodeName()?lower_case}.service.logic.impl;
import java.sql.Timestamp; import java.sql.Timestamp;
...@@ -44,6 +46,14 @@ public class ${de.codeName}${item.codeName}LogicImpl implements I${de.codeName}$ ...@@ -44,6 +46,14 @@ public class ${de.codeName}${item.codeName}LogicImpl implements I${de.codeName}$
</#if> </#if>
</#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> </#list>
</#if> </#if>
...@@ -91,6 +101,10 @@ public class ${de.codeName}${item.codeName}LogicImpl implements I${de.codeName}$ ...@@ -91,6 +101,10 @@ public class ${de.codeName}${item.codeName}LogicImpl implements I${de.codeName}$
<#comment>插入当前实体的defaultService对象,供自定义查询使用</#comment> <#comment>插入当前实体的defaultService对象,供自定义查询使用</#comment>
kieSession.setGlobal("iBzSys${de.codeName?lower_case?cap_first}DefaultService",iBzSysDefaultService);<#comment>将逻辑中引用到的service存储到global</#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()); 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> 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){ }catch(Exception e){
...@@ -103,3 +117,4 @@ public class ${de.codeName}${item.codeName}LogicImpl implements I${de.codeName}$ ...@@ -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 { ...@@ -88,7 +88,7 @@ public class ${item.codeName}ExService extends ${item.codeName}ServiceImpl {
<#elseif deaction.getCodeName()?lower_case == 'get'> <#elseif deaction.getCodeName()?lower_case == 'get'>
@Override @Override
public boolean testGet(${srfjavatype(keyfield.stdDataType)} key) { public boolean testGet(${srfr7javatype(keyfield.stdDataType)} key) {
return super.testGet(key); return super.testGet(key);
} }
...@@ -141,12 +141,12 @@ public class ${item.codeName}ExService extends ${item.codeName}ServiceImpl { ...@@ -141,12 +141,12 @@ public class ${item.codeName}ExService extends ${item.codeName}ServiceImpl {
<#elseif deaction.getCodeName()?lower_case == "remove"> <#elseif deaction.getCodeName()?lower_case == "remove">
@Override @Override
public boolean testRemove(${srfjavatype(keyfield.stdDataType)} key) { public boolean testRemove(${srfr7javatype(keyfield.stdDataType)} key) {
return super.testRemove(key); return super.testRemove(key);
} }
@Override @Override
public boolean testRemoveBatch(Collection<${srfjavatype(keyfield.stdDataType)}> idList) { public boolean testRemoveBatch(Collection<${srfr7javatype(keyfield.stdDataType)}> idList) {
return super.testRemoveBatch(idList); return super.testRemoveBatch(idList);
} }
......
...@@ -16,6 +16,12 @@ import org.springframework.context.annotation.Bean; ...@@ -16,6 +16,12 @@ import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.mybatis.spring.annotation.MapperScan; import org.mybatis.spring.annotation.MapperScan;
import java.util.Properties; 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全局配置类 * mybatis全局配置类
...@@ -46,12 +52,24 @@ public class MybatisConfiguration { ...@@ -46,12 +52,24 @@ public class MybatisConfiguration {
* @return * @return
*/ */
@Bean @Bean
public PaginationInterceptor paginationInterceptor() { public PaginationInterceptor paginationInterceptor(<#if sys.getSaaSMode()==2>SaaSTenantHandler saaSTenantHandler</#if>) {
PaginationInterceptor paginationInterceptor = new PaginationInterceptor(); PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
// 设置请求的页面大于最大页后操作, true调回到首页,false 继续请求 默认false // 设置请求的页面大于最大页后操作, true调回到首页,false 继续请求 默认false
// paginationInterceptor.setOverflow(false); // paginationInterceptor.setOverflow(false);
// 设置最大单页限制数量,默认 500 条,-1 不受限制 // 设置最大单页限制数量,默认 500 条,-1 不受限制
paginationInterceptor.setLimit(-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 // 开启 count join 优化,只针对部分 left join
paginationInterceptor.setCountSqlParser(new JsqlParserCountOptimize(true)); paginationInterceptor.setCountSqlParser(new JsqlParserCountOptimize(true));
return paginationInterceptor; 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 ...@@ -33,7 +33,7 @@ TARGET=PSSYSTEM
<#list de.getAllPSDEFields() as defield> <#list de.getAllPSDEFields() as defield>
<#if defield.isPhisicalDEField()==true><#comment>物理属性</#comment> <#if defield.isPhisicalDEField()==true><#comment>物理属性</#comment>
<#assign dataType="${srfdatatype(defield.getStdDataType())}"> <#assign dataType="${srfdatatype(defield.getStdDataType())}">
<#assign javaType="${srfjavatype(defield.stdDataType)}"> <#assign javaType="${srfr7javatype(defield.stdDataType)}">
<#comment>varchar需要设置字段长度,若不设置,则liquibase比较时会自动填充,最终恢复到生产库会报错</#comment> <#comment>varchar需要设置字段长度,若不设置,则liquibase比较时会自动填充,最终恢复到生产库会报错</#comment>
<#if javaType=='String'> <#if javaType=='String'>
<#if defield.getLength()?? && defield.getLength()?c!='-1'> <#if defield.getLength()?? && defield.getLength()?c!='-1'>
......
...@@ -45,7 +45,9 @@ TARGET=PSDATAENTITY ...@@ -45,7 +45,9 @@ TARGET=PSDATAENTITY
<!--通过mybatis将查询结果注入到entity中,通过配置autoMapping="true"由mybatis自动处理映射关系 --> <!--通过mybatis将查询结果注入到entity中,通过配置autoMapping="true"由mybatis自动处理映射关系 -->
<resultMap id="${de.codeName}ResultMap" type="${pub.getPKGCodeName()}.core.${de.getPSSystemModule().codeName?lower_case}.domain.${de.codeName}" autoMapping="true"> <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>外键值字段映射:由于需要将一个数据库列注入到2个domian属性中(主关系实体对象),由于已经手动将列映射给主关系对象,所以autoMapping将不会自动注入外键id,需要再次声明映射关系</#comment>
<#comment>属性名称与代码名称不一致时,强制进行映射</#comment> <#comment>属性名称与代码名称不一致时,强制进行映射</#comment>
<#list item.getPSDEFields() as defield> <#list item.getPSDEFields() as defield>
...@@ -225,16 +227,28 @@ TARGET=PSDATAENTITY ...@@ -225,16 +227,28 @@ TARGET=PSDATAENTITY
<#if hasIgnoreNullValueCond> <#if hasIgnoreNullValueCond>
<![CDATA[ ${contextParamConvert(srfjavasqlcode(dedqcode.getQueryCode()))} ]]> <![CDATA[ ${contextParamConvert(srfjavasqlcode(dedqcode.getQueryCode()))} ]]>
<#if dedqcode.getPSDEDataQueryCodeConds()??> <#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> <#list dedqcode.getPSDEDataQueryCodeConds() as dedqfieldcond>
<#if (dedqfieldcond_index==0)> WHERE </#if> <#if (dedqfieldcond_index>0)> AND </#if>${checkNullContextParamConvert(srfjavasqlcode(dedqfieldcond.getCustomCond()))} <#if (dedqfieldcond_index==0)> WHERE </#if> <#if (dedqfieldcond_index>0)> AND </#if>${checkNullContextParamConvert(srfjavasqlcode(dedqfieldcond.getCustomCond()))}
</#list> </#list>
</#if>
</#if> </#if>
<#else> <#else>
<![CDATA[ ${contextParamConvert(srfjavasqlcode(dedqcode.getQueryCode()))} <![CDATA[ ${contextParamConvert(srfjavasqlcode(dedqcode.getQueryCode()))}
<#if dedqcode.getPSDEDataQueryCodeConds()??> <#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> <#list dedqcode.getPSDEDataQueryCodeConds() as dedqfieldcond>
<#if (dedqfieldcond_index==0)> WHERE </#if> <#if (dedqfieldcond_index>0)> AND </#if>${contextParamConvert(srfjavasqlcode(dedqfieldcond.getCustomCond()))} <#if (dedqfieldcond_index==0)> WHERE </#if> <#if (dedqfieldcond_index>0)> AND </#if>${contextParamConvert(srfjavasqlcode(dedqfieldcond.getCustomCond()))}
</#list> </#list>
</#if>
</#if>]]> </#if>]]>
</#if> </#if>
</sql> </sql>
...@@ -258,6 +272,9 @@ TARGET=PSDATAENTITY ...@@ -258,6 +272,9 @@ TARGET=PSDATAENTITY
<#list params as param> <#list params as param>
<#assign resultParam=resultParam?replace(param,param?lower_case,'i')> <#assign resultParam=resultParam?replace(param,param?lower_case,'i')>
</#list> </#list>
<#if sys.getSaaSMode()==1 && item.getSaaSMode()==1>
<#assign resultParam=resultParam?replace("AND t11.SRFDCID = '__SRFSAASDCID__'","")>
</#if>
<#return resultParam> <#return resultParam>
</#function> </#function>
......
<#ibiztemplate> <#ibiztemplate>
TARGET=PSDELOGIC TARGET=PSDELOGIC
</#ibiztemplate> </#ibiztemplate>
<#if item.isEnableBackend()>
package ${pub.getPKGCodeName()}.${de.getPSSystemModule().codeName?lower_case}.logic.${de.codeName?lower_case}logic.${item.getCodeName()?lower_case}; 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 logicName=(de.codeName+item.codeName)?lower_case>
<#assign delogic=item> <#assign delogic=item>
<#assign defaultLogicParam=""> <#assign defaultLogicParam="">
...@@ -11,6 +21,9 @@ package ${pub.getPKGCodeName()}.${de.getPSSystemModule().codeName?lower_case}.lo ...@@ -11,6 +21,9 @@ package ${pub.getPKGCodeName()}.${de.getPSSystemModule().codeName?lower_case}.lo
import java.util.Map; import java.util.Map;
import java.util.HashMap; import java.util.HashMap;
import com.alibaba.fastjson.JSONObject; 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> <#list delogic.getPSDELogicParams() as logicParam>
<#if logicParam.isDefault()==true> <#if logicParam.isDefault()==true>
<#assign defaultLogicParam=logicParam><#comment>获取处理逻辑中默认逻辑参数</#comment> <#assign defaultLogicParam=logicParam><#comment>获取处理逻辑中默认逻辑参数</#comment>
...@@ -23,6 +36,10 @@ global java.util.Map ${logicName+logicParam.codeName?lower_case}; ...@@ -23,6 +36,10 @@ global java.util.Map ${logicName+logicParam.codeName?lower_case};
</#if> </#if>
</#list> </#list>
</#if> </#if>
<#comment>插入wfclient</#comment>
<#if startWF>
global ${pub.getPKGCodeName()}.util.client.IBZWFFeignClient wfClient;
</#if>
<#comment>插入处理逻辑中所用到的service对象</#comment> <#comment>插入处理逻辑中所用到的service对象</#comment>
<#if delogic.getPSDELogicNodes?? && delogic.getPSDELogicNodes()??> <#if delogic.getPSDELogicNodes?? && delogic.getPSDELogicNodes()??>
<#list delogic.getPSDELogicNodes() as deLogicNode> <#list delogic.getPSDELogicNodes() as deLogicNode>
...@@ -38,6 +55,7 @@ global ${pub.getPKGCodeName()}.core.${de.getPSSystemModule().codeName?lower_case ...@@ -38,6 +55,7 @@ global ${pub.getPKGCodeName()}.core.${de.getPSSystemModule().codeName?lower_case
global ${pub.getPKGCodeName()}.util.security.AuthenticationUser curuser; global ${pub.getPKGCodeName()}.util.security.AuthenticationUser curuser;
</#if> </#if>
no-loop no-loop
<#if delogic.getPSDELogicNodes?? && delogic.getPSDELogicNodes()??> <#if delogic.getPSDELogicNodes?? && delogic.getPSDELogicNodes()??>
<#list delogic.getPSDELogicNodes() as deLogicNode> <#list delogic.getPSDELogicNodes() as deLogicNode>
...@@ -161,7 +179,28 @@ ruleflow-group "${logicName+deLogicNode.getCodeName()?lower_case}" ...@@ -161,7 +179,28 @@ ruleflow-group "${logicName+deLogicNode.getCodeName()?lower_case}"
} }
</#if> </#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> </#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()??> <#if delogic.getPSDELogicParams?? && delogic.getPSDELogicParams()??>
<#list delogic.getPSDELogicParams() as logicParam> <#list delogic.getPSDELogicParams() as logicParam>
update(${logicName+logicParam.codeName?lower_case});//更新fact中变量值 update(${logicName+logicParam.codeName?lower_case});//更新fact中变量值
...@@ -171,6 +210,7 @@ ruleflow-group "${logicName+deLogicNode.getCodeName()?lower_case}" ...@@ -171,6 +210,7 @@ ruleflow-group "${logicName+deLogicNode.getCodeName()?lower_case}"
end end
</#list> </#list>
</#if> </#if>
</#if>
<#macro getCallSQL2 deLogicNode > <#macro getCallSQL2 deLogicNode >
Map param =new HashMap(); Map param =new HashMap();
......
<#ibiztemplate> <#ibiztemplate>
TARGET=PSDELOGIC TARGET=PSDELOGIC
</#ibiztemplate> </#ibiztemplate>
<#if item.isEnableBackend()>
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <?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"> <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}"> <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 ...@@ -24,24 +25,25 @@ TARGET=PSDELOGIC
<#if item.getPSDELogicNodes?? && item.getPSDELogicNodes()??> <#if item.getPSDELogicNodes?? && item.getPSDELogicNodes()??>
<#list item.getPSDELogicNodes() as logicNode> <#list item.getPSDELogicNodes() as logicNode>
<#if logicNode.getLogicNodeType()=='BEGIN'> <#if logicNode.getLogicNodeType()=='BEGIN'>
<startEvent id="${logicNode.getId()}" isInterrupting="true"/> <startEvent id="${logicNode.getCodeName()?lower_case}" isInterrupting="true"/>
<#else> <#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>
<#if !(logicNode.getPSDELogicLinks()??)><#comment>是否为流程最后一个处理节点,若为最后一个处理节点则生成End节点</#comment> <#if !(logicNode.getPSDELogicLinks()??)><#comment>是否为流程最后一个处理节点,若为最后一个处理节点则生成End节点</#comment>
<endEvent id="${logicNode.getId()}_End" name="End"/> <endEvent id="${logicNode.getCodeName()?lower_case}_end" name="end"/>
<sequenceFlow id="${logicNode.getId()}_End_Line" sourceRef="${logicNode.getId()}" targetRef="${logicNode.getId()}_End"/><#comment>生成流程最后一个处理节点与End节点之间的连线</#comment> <sequenceFlow id="${logicNode.getCodeName()?lower_case}_end_line" sourceRef="${logicNode.getCodeName()?lower_case}" targetRef="${logicNode.getCodeName()?lower_case}_end"/><#comment>生成流程最后一个处理节点与End节点之间的连线</#comment>
</#if> </#if>
</#list> </#list>
</#if> </#if>
<#comment>绘制节点连线</#comment> <#comment>绘制节点连线</#comment>
<#if item.getPSDELogicLinks?? && item.getPSDELogicLinks()??> <#if item.getPSDELogicLinks?? && item.getPSDELogicLinks()??>
<#list item.getPSDELogicLinks() as LogicLink> <#list item.getPSDELogicLinks() as LogicLink>
<#assign sourceNodeid=LogicLink.getSrcPSDELogicNode().getId()> <#assign sourceNodeId=LogicLink.getSrcPSDELogicNode().getCodeName()?lower_case>
<#if LogicLink.getPSDELogicLinkGroupCond?? && LogicLink.getPSDELogicLinkGroupCond()??><#comment>判断连接线含有条件,若有条件,则将源节点指向网关</#comment> <#if LogicLink.getPSDELogicLinkGroupCond?? && LogicLink.getPSDELogicLinkGroupCond()??><#comment>判断连接线含有条件,若有条件,则将源节点指向网关</#comment>
<#assign sourceNodeid="gateway-"+LogicLink.getSrcPSDELogicNode().getId()> <#assign sourceNodeId=("gateway-"+LogicLink.getSrcPSDELogicNode().getCodeName())?lower_case>
</#if> </#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> <#if LogicLink.getPSDELogicLinkGroupCond?? && LogicLink.getPSDELogicLinkGroupCond()??><#comment>连接线含有条件</#comment>
<conditionExpression language="http://www.jboss.org/drools/rule" ><![CDATA[ <conditionExpression language="http://www.jboss.org/drools/rule" ><![CDATA[
<#comment>准备逻辑参数</#comment> <#comment>准备逻辑参数</#comment>
...@@ -70,23 +72,25 @@ TARGET=PSDELOGIC ...@@ -70,23 +72,25 @@ TARGET=PSDELOGIC
<#if item.getPSDELogicLinks?? && item.getPSDELogicLinks()??> <#if item.getPSDELogicLinks?? && item.getPSDELogicLinks()??>
<#list item.getPSDELogicLinks() as LogicLink> <#list item.getPSDELogicLinks() as LogicLink>
<#if LogicLink.getPSDELogicLinkGroupCond?? && LogicLink.getPSDELogicLinkGroupCond()??><#comment>连接线含有条件</#comment> <#if LogicLink.getPSDELogicLinkGroupCond?? && LogicLink.getPSDELogicLinkGroupCond()??><#comment>连接线含有条件</#comment>
<#assign gatewayid="gateway-"+LogicLink.getSrcPSDELogicNode().getId()> <#assign gatewayId="gateway-"+LogicLink.getSrcPSDELogicNode().getCodeName()?lower_case>
<#if !P.exists("gateway",gatewayid)> <#if !P.exists("gateway",gatewayId)>
<#comment>绘制网关</#comment> <#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> <#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> </#if>
<#comment>绘制网关默认结束节点</#comment> <#comment>绘制网关默认结束节点</#comment>
<#if !P.exists("gateway-end",gatewayid)> <#if !P.exists("gateway-end",gatewayId)>
<sequenceFlow id="${gatewayid}_End_Line" sourceRef="${gatewayid}" targetRef="${gatewayid}_End"/><#comment>生成流程最后一个处理节点与End节点之间的连线</#comment> <sequenceFlow id="${gatewayId}_end_line" sourceRef="${gatewayId}" targetRef="${gatewayId}_end"/><#comment>生成流程最后一个处理节点与End节点之间的连线</#comment>
<endEvent id="${gatewayid}_End" name="End"/> <endEvent id="${gatewayId}_end" name="end"/>
</#if> </#if>
</#if> </#if>
</#list> </#list>
</#if> </#if>
</process> </process>
</definitions> </definitions>
</#if>
<#comment>获取组合条件表达式</#comment> <#comment>获取组合条件表达式</#comment>
<#function getGroupCond LogicLinkCond> <#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 ...@@ -57,6 +57,9 @@ public class ${item.codeName}SecurityConfig extends WebSecurityConfigurerAdapter
@Value("${r'${ibiz.file.previewpath:ibizutil/preview}"'}) @Value("${r'${ibiz.file.previewpath:ibizutil/preview}"'})
private String previewpath; private String previewpath;
@Value("${r'${ibiz.auth.excludesPattern:}"'})
private String[] excludesPattern;
@Autowired @Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
...@@ -121,9 +124,15 @@ public class ${item.codeName}SecurityConfig extends WebSecurityConfigurerAdapter ...@@ -121,9 +124,15 @@ public class ${item.codeName}SecurityConfig extends WebSecurityConfigurerAdapter
// 文件操作 // 文件操作
.antMatchers("/"+downloadpath+"/**").permitAll() .antMatchers("/"+downloadpath+"/**").permitAll()
.antMatchers("/"+uploadpath).permitAll() .antMatchers("/"+uploadpath).permitAll()
.antMatchers("/"+previewpath+"/**").permitAll() .antMatchers("/"+previewpath+"/**").permitAll();
// 所有请求都需要认证
.anyRequest().authenticated() for (String excludePattern : excludesPattern) {
authenticationTokenFilter.addExcludePattern(excludePattern);
httpSecurity.authorizeRequests().antMatchers(excludePattern).permitAll();
}
// 所有请求都需要认证
httpSecurity.authorizeRequests().anyRequest().authenticated()
// 防止iframe 造成跨域 // 防止iframe 造成跨域
.and().headers().frameOptions().disable(); .and().headers().frameOptions().disable();
......
...@@ -24,6 +24,9 @@ import com.fasterxml.jackson.annotation.JsonIgnore; ...@@ -24,6 +24,9 @@ import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonFormat;
import com.alibaba.fastjson.annotation.JSONField; 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.DTOBase;
import ${pub.getPKGCodeName()}.util.domain.DTOClient; import ${pub.getPKGCodeName()}.util.domain.DTOClient;
import lombok.Data; import lombok.Data;
...@@ -44,6 +47,7 @@ public class ${item.getCodeName()}DTO extends ${dtoBase} implements Serializable ...@@ -44,6 +47,7 @@ public class ${item.getCodeName()}DTO extends ${dtoBase} implements Serializable
<#assign prvateCodeName = srfcaseformat(apifield.getCodeName(),'l_u2lC') > <#assign prvateCodeName = srfcaseformat(apifield.getCodeName(),'l_u2lC') >
<#assign publicCodeName = prvateCodeName?cap_first > <#assign publicCodeName = prvateCodeName?cap_first >
<#assign jsonfield = apifield.getCodeName()?lower_case > <#assign jsonfield = apifield.getCodeName()?lower_case >
<#assign defield=(apifield.getPSDEField())!"">
<#if defDataType!='ONE2MANYDATA'> <#if defDataType!='ONE2MANYDATA'>
/** /**
* 属性 [${apifield.getName()}] * 属性 [${apifield.getName()}]
...@@ -56,13 +60,14 @@ public class ${item.getCodeName()}DTO extends ${dtoBase} implements Serializable ...@@ -56,13 +60,14 @@ public class ${item.getCodeName()}DTO extends ${dtoBase} implements Serializable
@JsonFormat(pattern="yyyy-MM-dd", locale = "zh" , timezone="GMT+8") @JsonFormat(pattern="yyyy-MM-dd", locale = "zh" , timezone="GMT+8")
@JSONField(name = "${jsonfield}" , format="yyyy-MM-dd") @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")> <#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") @JsonFormat(pattern="HH:mm:ss", locale = "zh" , timezone="GMT+8")
@JSONField(name = "${jsonfield}" , format="HH:mm") @JSONField(name = "${jsonfield}" , format="HH:mm:ss")
<#else> <#else>
@JSONField(name = "${jsonfield}") @JSONField(name = "${jsonfield}")
</#if> </#if>
@JsonProperty("${jsonfield}") @JsonProperty("${jsonfield}")
private ${srfjavatype(apifield.getStdDataType())} ${prvateCodeName}; <@valueRule defield />
private ${srfr7javatype(apifield.getStdDataType())} ${prvateCodeName};
</#if> </#if>
</#list> </#list>
...@@ -81,7 +86,7 @@ public class ${item.getCodeName()}DTO extends ${dtoBase} implements Serializable ...@@ -81,7 +86,7 @@ public class ${item.getCodeName()}DTO extends ${dtoBase} implements Serializable
/** /**
* 设置 [${apifield.getName()}] * 设置 [${apifield.getName()}]
*/ */
public void set${publicCodeName}(${srfjavatype(apifield.getStdDataType())} ${prvateCodeName}){ public void set${publicCodeName}(${srfr7javatype(apifield.getStdDataType())} ${prvateCodeName}){
this.${prvateCodeName} = ${prvateCodeName} ; this.${prvateCodeName} = ${prvateCodeName} ;
this.modify("${columnname}",${prvateCodeName}); this.modify("${columnname}",${prvateCodeName});
} }
...@@ -112,4 +117,39 @@ public class ${item.getCodeName()}DTO extends ${dtoBase} implements Serializable ...@@ -112,4 +117,39 @@ public class ${item.getCodeName()}DTO extends ${dtoBase} implements Serializable
</#if> </#if>
} }
</#if> </#if>
\ No newline at end of file
<#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 ...@@ -216,7 +216,7 @@ public class DEFieldDefaultValueAspect
private void fillPreFieldValue(String fieldname , DEPredefinedFieldType preFieldType ,EntityBase et , String actionName,String logicValue ,AuthenticationUser curUser) throws Exception { private void fillPreFieldValue(String fieldname , DEPredefinedFieldType preFieldType ,EntityBase et , String actionName,String logicValue ,AuthenticationUser curUser) throws Exception {
Object fieldValue = et.get(fieldname); Object fieldValue = et.get(fieldname);
//为预置属性进行赋值 //为预置属性进行赋值
if( actionName.equalsIgnoreCase("create")|| if( actionName.toLowerCase().startsWith("create") ||
preFieldType== DEPredefinedFieldType.UPDATEDATE|| preFieldType== DEPredefinedFieldType.UPDATEMAN|| preFieldType== DEPredefinedFieldType.UPDATEDATE|| preFieldType== DEPredefinedFieldType.UPDATEMAN||
preFieldType== DEPredefinedFieldType.UPDATEMANNAME){ preFieldType== DEPredefinedFieldType.UPDATEMANNAME){
......
...@@ -21,6 +21,9 @@ import org.springframework.stereotype.Component; ...@@ -21,6 +21,9 @@ import org.springframework.stereotype.Component;
import org.springframework.util.ObjectUtils; import org.springframework.util.ObjectUtils;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map; import java.util.Map;
/** /**
...@@ -112,7 +115,8 @@ public class VersionCheckAspect ...@@ -112,7 +115,8 @@ public class VersionCheckAspect
*/ */
@SneakyThrows @SneakyThrows
private Object getDBVersion(VersionCheck versionCheck,Object service,Object id){ 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(); String versionField=versionCheck.versionfield();
if(!ObjectUtils.isEmpty(service)){ if(!ObjectUtils.isEmpty(service)){
EvaluationContext oldContext = new StandardEvaluationContext(); EvaluationContext oldContext = new StandardEvaluationContext();
...@@ -120,7 +124,12 @@ public class VersionCheckAspect ...@@ -120,7 +124,12 @@ public class VersionCheckAspect
oldContext.setVariable("id",id); oldContext.setVariable("id",id);
Expression oldExp = parser.parseExpression("#service.get(#id)"); Expression oldExp = parser.parseExpression("#service.get(#id)");
EntityBase oldEntity =oldExp.getValue(oldContext, EntityBase.class); 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; 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 ...@@ -3,7 +3,7 @@ TARGET=PSSYSTEM
</#ibiztemplate> </#ibiztemplate>
package ${pub.getPKGCodeName()}.util.client; package ${pub.getPKGCodeName()}.util.client;
import com.alibaba.fastjson.JSONArray; import ${pub.getPKGCodeName()}.util.domain.MsgBody;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
...@@ -11,7 +11,7 @@ import org.springframework.stereotype.Component; ...@@ -11,7 +11,7 @@ import org.springframework.stereotype.Component;
public class IBZNotifyFallback implements IBZNotifyFeignClient { public class IBZNotifyFallback implements IBZNotifyFeignClient {
@Override @Override
public Boolean SendMsg(JSONObject msg) { public Boolean sendMsg(MsgBody msg) {
return null; return null;
} }
...@@ -19,4 +19,19 @@ public class IBZNotifyFallback implements IBZNotifyFeignClient { ...@@ -19,4 +19,19 @@ public class IBZNotifyFallback implements IBZNotifyFeignClient {
public Boolean createMsgTemplate(JSONObject template) { public Boolean createMsgTemplate(JSONObject template) {
return null; 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 ...@@ -3,16 +3,26 @@ TARGET=PSSYSTEM
</#ibiztemplate> </#ibiztemplate>
package ${pub.getPKGCodeName()}.util.client; package ${pub.getPKGCodeName()}.util.client;
import ${pub.getPKGCodeName()}.util.domain.MsgBody;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import org.springframework.cloud.openfeign.FeignClient; import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.*; 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 public interface IBZNotifyFeignClient
{ {
@RequestMapping(method = RequestMethod.POST,value = "/SendMsg") @RequestMapping(method = RequestMethod.POST,value = "/notify/sendmsg")
Boolean SendMsg(@RequestBody JSONObject msg); Boolean sendMsg(@RequestBody MsgBody msg);
@RequestMapping(method = RequestMethod.POST,value = "/createMsgTemplate") @RequestMapping(method = RequestMethod.POST,value = "/notify/createmsgtempl")
Boolean createMsgTemplate(@RequestBody JSONObject template); 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; ...@@ -10,7 +10,7 @@ import org.springframework.web.bind.annotation.PathVariable;
import java.util.Map; import java.util.Map;
import java.util.Set; 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 public interface IBZOUFeignClient
{ {
/** /**
...@@ -18,7 +18,7 @@ public interface IBZOUFeignClient ...@@ -18,7 +18,7 @@ public interface IBZOUFeignClient
* @param userId * @param userId
* @return * @return
*/ */
@GetMapping("/ibzemployees/{userId}/oumaps") @GetMapping("/sysemployees/{userId}/oumaps")
Map<String, Set<String>> getOUMapsByUserId(@PathVariable("userId") String userId); 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; ...@@ -10,7 +10,7 @@ import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import com.alibaba.fastjson.JSONObject; 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 public interface IBZUAAFeignClient
{ {
/** /**
......
...@@ -4,6 +4,7 @@ TARGET=PSSYSTEM ...@@ -4,6 +4,7 @@ TARGET=PSSYSTEM
package ${pub.getPKGCodeName()}.util.client; package ${pub.getPKGCodeName()}.util.client;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import com.alibaba.fastjson.JSONObject;
import java.util.*; import java.util.*;
@Component @Component
...@@ -23,4 +24,9 @@ public class IBZWFFallback implements IBZWFFeignClient { ...@@ -23,4 +24,9 @@ public class IBZWFFallback implements IBZWFFeignClient {
public Boolean deployBpmnFile(List<Map<String, Object>> bpmnfiles) { public Boolean deployBpmnFile(List<Map<String, Object>> bpmnfiles) {
return null; 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; ...@@ -5,9 +5,10 @@ package ${pub.getPKGCodeName()}.util.client;
import org.springframework.cloud.openfeign.FeignClient; import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import com.alibaba.fastjson.JSONObject;
import java.util.*; 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 public interface IBZWFFeignClient
{ {
@RequestMapping(method = RequestMethod.GET, value = "/{system}-app-{appname}/{entity}/process-definitions/{processDefinitionKey}/usertasks/{taskDefinitionKey}/tasks") @RequestMapping(method = RequestMethod.GET, value = "/{system}-app-{appname}/{entity}/process-definitions/{processDefinitionKey}/usertasks/{taskDefinitionKey}/tasks")
...@@ -21,4 +22,9 @@ public interface IBZWFFeignClient ...@@ -21,4 +22,9 @@ public interface IBZWFFeignClient
@RequestMapping(method = RequestMethod.POST, value = "/deploybpmn") @RequestMapping(method = RequestMethod.POST, value = "/deploybpmn")
Boolean deployBpmnFile(@RequestBody List<Map<String,Object>> bpmnfiles); 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; ...@@ -12,7 +12,9 @@ import com.fasterxml.jackson.annotation.JsonIgnore;
import org.springframework.cglib.beans.BeanMap; import org.springframework.cglib.beans.BeanMap;
import org.springframework.data.annotation.Transient; import org.springframework.data.annotation.Transient;
import org.springframework.util.AlternativeJdkIdGenerator; import org.springframework.util.AlternativeJdkIdGenerator;
import org.springframework.util.ObjectUtils;
import java.io.Serializable; import java.io.Serializable;
import java.lang.reflect.Field;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
import java.util.*; import java.util.*;
...@@ -99,4 +101,32 @@ public class EntityBase implements Serializable { ...@@ -99,4 +101,32 @@ public class EntityBase implements Serializable {
this.extensionparams.put(field.toLowerCase(),value); 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 ...@@ -3,6 +3,8 @@ TARGET=PSSYSTEM
</#ibiztemplate> </#ibiztemplate>
package ${pub.getPKGCodeName()}.util.domain; package ${pub.getPKGCodeName()}.util.domain;
import org.springframework.util.StringUtils;
public class EntityClient extends EntityBase { public class EntityClient extends EntityBase {
@Override @Override
...@@ -18,5 +20,14 @@ public class EntityClient extends EntityBase { ...@@ -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 ...@@ -4,6 +4,7 @@ TARGET=PSSYSTEM
package ${pub.getPKGCodeName()}.util.domain; package ${pub.getPKGCodeName()}.util.domain;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import org.springframework.util.StringUtils;
public class EntityMP extends EntityBase { public class EntityMP extends EntityBase {
...@@ -27,5 +28,14 @@ public class EntityMP extends EntityBase { ...@@ -27,5 +28,14 @@ public class EntityMP extends EntityBase {
this.getFocusNull().remove(field.toLowerCase()); 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{ ...@@ -152,6 +152,7 @@ public class SearchContextBase implements ISearchContext{
* 获取用户上下文 * 获取用户上下文
* @return * @return
*/ */
@JsonIgnore
public Map<String,Object> getSessioncontext() { public Map<String,Object> getSessioncontext() {
return AuthenticationUser.getAuthenticationUser().getSessionParams(); return AuthenticationUser.getAuthenticationUser().getSessionParams();
} }
......
...@@ -23,6 +23,7 @@ TARGET=PSSYSTEM ...@@ -23,6 +23,7 @@ TARGET=PSSYSTEM
package ${pub.getPKGCodeName()}.util.job; package ${pub.getPKGCodeName()}.util.job;
import ${pub.getPKGCodeName()}.util.client.IBZUAAFeignClient; import ${pub.getPKGCodeName()}.util.client.IBZUAAFeignClient;
import ${pub.getPKGCodeName()}.util.client.IBZLiteFeignClient;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONArray;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
...@@ -68,6 +69,10 @@ public class PermissionSyncJob implements ApplicationRunner { ...@@ -68,6 +69,10 @@ public class PermissionSyncJob implements ApplicationRunner {
private ${pub.getPKGCodeName()}.util.client.IBZNotifyFeignClient notifyFeignClient; private ${pub.getPKGCodeName()}.util.client.IBZNotifyFeignClient notifyFeignClient;
</#if> </#if>
@Autowired
@Lazy
IBZLiteFeignClient liteFeignClient;
@Override @Override
public void run(ApplicationArguments args) { public void run(ApplicationArguments args) {
try { try {
...@@ -89,6 +94,19 @@ public class PermissionSyncJob implements ApplicationRunner { ...@@ -89,6 +94,19 @@ public class PermissionSyncJob implements ApplicationRunner {
log.error(String.format("向[UAA]同步系统资源失败,请检查[UAA]服务是否正常! [%s]",ex)); 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> <#if hasWF>
try{ try{
List<Map<String,Object>> bpmnfiles=new ArrayList(); List<Map<String,Object>> bpmnfiles=new ArrayList();
......
...@@ -21,59 +21,174 @@ import com.alibaba.fastjson.JSONObject; ...@@ -21,59 +21,174 @@ import com.alibaba.fastjson.JSONObject;
@JsonIgnoreProperties(ignoreUnknown = true) @JsonIgnoreProperties(ignoreUnknown = true)
public class AuthenticationUser implements UserDetails public class AuthenticationUser implements UserDetails
{ {
public AuthenticationUser() public AuthenticationUser(){}
{ /**
* 用戶标识
} */
private String userid; private String userid;
/**
* 用户全局名
*/
private String username; private String username;
/**
* 用户姓名
*/
private String personname; private String personname;
private String usercode; /**
* 登录名
*/
private String loginname; private String loginname;
/**
* 用户工号
*/
private String usercode;
/**
* 登录密码
*/
private String password; private String password;
/**
* 区属
*/
private String domain; private String domain;
/**
* 部门标识
*/
private String mdeptid; private String mdeptid;
/**
* 部门编码
*/
private String mdeptcode; private String mdeptcode;
/**
* 部门名称
*/
private String mdeptname; private String mdeptname;
/**
* 业务编码
*/
private String bcode; private String bcode;
/**
* 岗位标识
*/
private String postid; private String postid;
/**
* 岗位代码
*/
private String postcode; private String postcode;
/**
* 岗位名称
*/
private String postname; private String postname;
/**
* 单位标识
*/
private String orgid; private String orgid;
/**
* 单位编码
*/
private String orgcode; private String orgcode;
/**
* 单位名称
*/
private String orgname; private String orgname;
/**
* 昵称别名
*/
private String nickname; private String nickname;
/**
* 邮箱
*/
private String email; private String email;
/**
* 社交账号
*/
private String avatar; private String avatar;
/**
* 电话
*/
private String phone; private String phone;
private String reserver; /**
* 照片
*/
private String usericon; private String usericon;
/**
* 性别
*/
private String sex; private String sex;
/**
* 出生日期
*/
private Timestamp birthday; private Timestamp birthday;
/**
* 证件号码
*/
private String certcode; private String certcode;
/**
* 地址
*/
private String addr; private String addr;
/**
* 主题
*/
private String theme; private String theme;
/**
* 字号
*/
private String fontsize; private String fontsize;
/**
* 语言
*/
private String lang; private String lang;
/**
* 备注
*/
private String memo; private String memo;
/**
* 保留字段
*/
private String reserver;
/**
* 用户上下文参数
*/
private Map <String,Object> sessionParams; private Map <String,Object> sessionParams;
/**
* 用户权限资源
*/
@JsonIgnore @JsonIgnore
private Collection<GrantedAuthority> authorities; private Collection<GrantedAuthority> authorities;
/**
* 是否为超级管理员
*/
private int superuser; private int superuser;
/**
* 用户权限资源
*/
private JSONObject permissionList; private JSONObject permissionList;
private String orglevel;//单位级别 /**
private String deptlevel;//部门级别 * 用户上下文参数
*/
@JsonIgnore @JsonIgnore
private Map<String,Object> userSessionParam;//用户自定义session private Map<String,Object> userSessionParam;
private Map<String, Set<String>> orgInfo;//上下级组织信息 /**
* 当前用户上下级组织信息
*/
private Map<String, Set<String>> orgInfo;
/**
* 上级组织
*/
private String porg; private String porg;
/**
* 下级组织
*/
private String sorg; private String sorg;
/**
* 上级部门
*/
private String pdept; private String pdept;
/**
* 下级部门
*/
private String sdept; private String sdept;
@JsonIgnore @JsonIgnore
@Override @Override
public boolean isAccountNonExpired() { public boolean isAccountNonExpired() {
......
...@@ -13,6 +13,8 @@ import org.springframework.security.core.userdetails.UserDetails; ...@@ -13,6 +13,8 @@ import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.web.authentication.WebAuthenticationDetailsSource; import org.springframework.security.web.authentication.WebAuthenticationDetailsSource;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.util.AntPathMatcher;
import org.springframework.util.PathMatcher;
import org.springframework.web.filter.OncePerRequestFilter; import org.springframework.web.filter.OncePerRequestFilter;
import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Qualifier;
...@@ -21,6 +23,10 @@ import javax.servlet.ServletException; ...@@ -21,6 +23,10 @@ import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import java.io.IOException; import java.io.IOException;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
@Slf4j @Slf4j
@Component @Component
...@@ -29,6 +35,8 @@ public class AuthorizationTokenFilter extends OncePerRequestFilter { ...@@ -29,6 +35,8 @@ public class AuthorizationTokenFilter extends OncePerRequestFilter {
private final UserDetailsService userDetailsService; private final UserDetailsService userDetailsService;
private final AuthTokenUtil authTokenUtil; private final AuthTokenUtil authTokenUtil;
private final String tokenHeader; 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) { public AuthorizationTokenFilter(AuthenticationUserService userDetailsService, AuthTokenUtil authTokenUtil, @Value(${r'"${ibiz.jwt.header:Authorization}"'}) String tokenHeader) {
this.userDetailsService = userDetailsService; this.userDetailsService = userDetailsService;
...@@ -38,7 +46,11 @@ public class AuthorizationTokenFilter extends OncePerRequestFilter { ...@@ -38,7 +46,11 @@ public class AuthorizationTokenFilter extends OncePerRequestFilter {
@Override @Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws ServletException, IOException { 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); final String requestHeader = request.getHeader(this.tokenHeader);
String username = null; String username = null;
...@@ -53,20 +65,38 @@ public class AuthorizationTokenFilter extends OncePerRequestFilter { ...@@ -53,20 +65,38 @@ public class AuthorizationTokenFilter extends OncePerRequestFilter {
} }
if (username != null && SecurityContextHolder.getContext().getAuthentication() == null) { 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); 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)) { if (authTokenUtil.validateToken(authToken, userDetails)) {
UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities()); UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities());
authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(request)); authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
// log.info("authorizated user '{}', setting security context", username);
SecurityContextHolder.getContext().setAuthentication(authentication); SecurityContextHolder.getContext().setAuthentication(authentication);
} }
} }
chain.doFilter(request, response); 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: ...@@ -273,6 +273,11 @@ ibiz:
</#if> </#if>
enablePermissionValid: ${enableDataAcc} enablePermissionValid: ${enableDataAcc}
cacheLevel: L1 #(L1)一级本地caffeine缓存;(L2)caffeine缓存+Redis缓存 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
jobs: jobs:
......
Markdown 格式
0% or
您添加了 0 到此讨论。请谨慎行事。
先完成此消息的编辑!
想要评论请 注册