1、图表设计器
数据可视化能加载到的接口,方法上需要加 category = FunctionCategoryEnum.QUERY_PAGE
@Model.model(ExpensesIncome.MODEL_MODEL)
@Component
@Slf4j
public class ExpensesIncomeAction {
@Function.Advanced(type = FunctionTypeEnum.QUERY,category = FunctionCategoryEnum.QUERY_PAGE)
@Function.fun(FunctionConstants.queryPage)
@Function(openLevel = {FunctionOpenEnum.API})
public Pagination<ExpensesIncome> queryPage(Pagination<ExpensesIncome> page, IWrapper<ExpensesIncome> queryWrapper) {
page = new ExpensesIncome().queryPage(page, queryWrapper);
if (page!=null && CollectionUtils.isNotEmpty(page.getContent())) {
page.getContent().forEach(a->{
if (a.getBudgetInCome()!=null && a.getBudgetInCome().compareTo(new BigDecimal("0.0"))!=0) {
if (a.getRetailAmount()!=null) {
a.setInComeRate(a.getRetailAmount().divide(a.getBudgetInCome(),2));
}
}
});
}
return page;
}
}
2、事务支持
1)对于单个系统(InJvm)/模型内部采用强事务的方式。比如:在库存转移时,库存日志和库存数量的变化在一个事务中,保证两个表的数据同时成功或者失败。
2)强事务管理采用编码式,Oinone事务管理兼容Spring的事务管理方式;有注解的方式和代码块的方式。
a) 使用注解的方式:
@Override
@Transactional
public void awardOut(AwardBookOutEmpRecordDetail detail) {
List<OutEmpRecordSubjectDetail> subjectDetails = detail.getSubjectDetails();
……
}
重要说明
基于注解的事务,Bean和加注解的方法必须能被Spring切面到。
b) 使用编码方式:
//组装数据/获取数据/校验
Tx.build(new TxConfig()).executeWithoutResult(status -> {
// 1、保存部门数据
deliDepartmentService.createOrUpdateBatch(departments);
//2、如果父进行了下级关联设置,处理下级关联设置的逻辑
for (DeliDepartment department : departments) {
doDepartSubLink(department);
}
});
…………
3)对于分布式事务采用最终数据一致性,借助【可靠消息】或者【Job】的方式来实现。
3、平台工具类使用
3.1 FetchUtil
pro.shushi.pamirs.core.common.FetchUtil,重点关注
# 根据Id查询列表
pro.shushi.pamirs.core.common.FetchUtil#fetchMapByIds
# 根据Id查询,返回Map
pro.shushi.pamirs.core.common.FetchUtil#fetchListByIds
# 根据Codes查询列表
pro.shushi.pamirs.core.common.FetchUtil#fetchMapByCodes
# 根据Code查询,返回Map
pro.shushi.pamirs.core.common.FetchUtil#fetchListByCodes
# 根据Entity查询
pro.shushi.pamirs.core.common.FetchUtil#fetchOne
其他更多方法参考这个类的源代码
3.2 ListUtils
pro.shushi.pamirs.meta.common.util.ListUtils
# 把输入的List,按给定的长度进行分组
pro.shushi.pamirs.meta.common.util.ListUtils#fixedGrouping
# 从给定的List中返回特定字段的数组,忽略Null并去重
pro.shushi.pamirs.meta.common.util.ListUtils#transform
4、枚举获取
根据枚举的name获取value
Integer value = ArchivesConfigTypeEnum.getValueByName(ArchivesConfigTypeEnum.class,“status1”);
根据枚举的name获取枚举项
ArchivesConfigTypeEnum typeEnum = TtypeEnum.getEnum(ArchivesConfigTypeEnum.class, “status1”);
5、Map类型的数据怎么定义,即ttype 为map的字段写法
@Field(displayName = "上下文", store = NullableBoolEnum.TRUE, serialize = JSON)
@Field.Advanced(columnDefinition = "TEXT")
private Map<String, Object> context;
6、后端获取前端请求中的variables
PamirsRequestVariables requestVariables = PamirsSession.getRequestVariables();
7、为什么有时候调用服务走远程了
1、假设:
A模型(modelA)所在的模块(ModuleA)
B模型(modelB)所在的模块(ModuleB)
部署方式决定调用方式:
1)部署方式1:
ModuleA 和 ModuleB 部署在一个jvm中,此时:
modelA的服务/页面去调用 modelB,因为部署在一起,直接走inJvm
2、部署方式2:
ModuleA 和 ModuleB 部署在不同的jvm中;
modelA的服务/页面去调用 modelB,则会走远程(RPC);此时需要:
a)ModuleB 需要开启dubbo服务,且ModuleA 和 ModuleB注册中心相同
b)ModuleB 对应的方法需要暴露dubbo接口,自定义service需要增加@Function注解
8、流程拒绝和回退调用自定义函数
1)、工作流撤销的自定义函数
@Function
public XXX recall(String data) {
return new XXX();
}
2)、撤销回退调用的自定义函数
调用入口:
pro/shushi/pamirs/workflow/app/core/service/operator/ApprovalFallbackOperatorService.java:181
@Function
public XXX fallBack(String data) {
return new XXX();
}
3)、工作流拒绝之后回调钩子
@Function
public XXX reject((String data) {
return new XXX();
}
9、启动后访问页面报枚举项不存在
现象:枚举项不存在, model:base.ViewAction, name:target,value:ROUTER
pro.shushi.pamirs.meta.common.exception.PamirsException: 枚举项不存在, model:base.ViewAction, name:target,value:ROUTER
at pro.shushi.pamirs.meta.common.exception.PamirsException$Builder.errThrow(PamirsException.java:173) ~[pamirs-meta-common-4.6.6.jar:na]
at pro.shushi.pamirs.framework.orm.converter.entity.handler.EnumNamedHandler.lambda$dealEnum$4(EnumNamedHandler.java:149) ~[pamirs-framework-orm-4.6.8.jar:na]
at pro.shushi.pamirs.framework.orm.converter.multi.MultiValueStrategy.submit(MultiValueStrategy.java:59) ~[pamirs-framework-orm-4.6.8.jar:na]
at pro.shushi.pamirs.framework.orm.converter.multi.MultiValueStrategy.submit(MultiValueStrategy.java:23) ~[pamirs-framework-orm-4.6.8.jar:na]
at pro.shushi.pamirs.framework.orm.converter.entity.handler.EnumNamedHandler.dealEnum(EnumNamedHandler.java:86) ~[pamirs-framework-orm-4.6.8.jar:na]
at pro.shushi.pamirs.framework.orm.converter.entity.handler.EnumNamedHandler.stringify(EnumNamedHandler.java:66) ~[pamirs-framework-orm-4.6.8.jar:na]
at pro.shushi.pamirs.framework.orm.converter.entity.handler.EnumHandler.stringify(EnumHandler.java:57) ~[pamirs-framework-orm-4.6.8.jar:na]
at pro.shushi.pamirs.framework.orm.client.converter.entity.ClientEnumConverter.out(ClientEnumConverter.java:30) ~[pamirs-framework-orm-client-4.6.8.jar:na]
at pro.shushi.pamirs.framework.orm.client.converter.processor.ClientTypeProcessor.lambda$out$6(ClientTypeProcessor.java:71) ~[pamirs-framework-orm-client-4.6.8.jar:na]
at pro.shushi.pamirs.meta.common.enmu.BaseEnum.switchConsume(BaseEnum.java:717) ~[pamirs-meta-common-4.6.6.jar:na]
at pro.shushi.pamirs.meta.common.enmu.BaseEnum.switch0(BaseEnum.java:697) ~[pamirs-meta-common-4.6.6.jar:na]
at pro.shushi.pamirs.meta.common.enmu.BaseEnum.switches(BaseEnum.java:638) ~[pamirs-meta-common-4.6.6.jar:na]
问题原因:
Oinone重写了GraphQL的枚举转换类,报错是没有加载到这个自定义类
解决方法
在boot工程的pom的最前面引用如下的jar,重新发布即可
<dependency>
<groupId>pro.shushi.pamirs</groupId>
<artifactId>a</artifactId>
</dependency>
10、配置日志文件
现在启动输出到out.log应该是启动脚本中定向输出了(>>)
不定向输出,采用自己配置的方式,与标准的SpringBoot工程配置日志一样
两种方式(都是Spring提供的方式):
1、bootstrap.yml 里面可以按profiles指定logback的配置文件,例如:
logging:
config: classpath:logback-pre.xml
具体文件名和文件输入在logback里面进行配置,跟通用的logback配置一致
2、resources的根目录,直接配置 logback-spring.xml, 启动会自动加载
11、自定义controller如何获取用户信息
private PamirsUser fetchUserByRequest() {
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
String sessionId = CookieUtil.getValue(request, pro.shushi.pamirs.framework.common.utils.CookieUtil.USER_SESSION_ID);
PamirsUserDTO pamirsUserDTO = UserCache.get(sessionId);
if (pamirsUserDTO!=null) {
// 根据用户ID获取完整的用户信息
return UserInfoCache.queryUserById(pamirsUserDTO.getUserId());
} else {
throw PamirsException.construct(BaseExpEnumerate.BASE_USER_NOT_LOGIN_ERROR).errThrow();
}
}
12、查询设置不排序
查询的page和Wrapper可设置setSortable(Boolean.FALSE),来实现查询不需要排序的场景
示例1:page中设置不排序
page.setSortable(Boolean.FALSE);
page = new PetShop().queryPage(page, queryWrapper);
示例2:Wrapper中设置不排序
IWrapper wrapper = Pops.lambdaQuery()
.from(PetShop.MODEL_MODEL).setBatchSize(-1).setSortable(Boolean.FALSE);
List petShops4 = new PetShop().queryList(wrapper);
持续补充中。。。。。
Oinone社区 作者:shao原创文章,如若转载,请注明出处:https://doc.oinone.top/dai-ma-shi-jian/5613.html
访问Oinone官网:https://www.oinone.top获取数式Oinone低代码应用平台体验