此文档适用于 2.2.0.0版本以上
模板说明
流水位
每个模板只支持包含一个流水位规则
重置规则
重置规则主要分为四种,分别为:
兼容旧版本数据,旧版本按照日期规则重置
- 不重置
- 按年重置
必须包含年,其中可以为YYYY、YYYYMM、YYYYMMDD - 按月重置
必须包含年月,其中可以为YYYY,MM组合、YYYYMM、YYYYMMDD - 按日重置
必须包含年月日,其中可以为YYYY,MM,DD组合、YYYYMM,DD组合、YYYYMMDD
总长度
目前模板总长度限制在30位
是否漏号
- 允许漏号(存在跳位的情况)
每次获取都是新的流水位,不需要等待上一位流水位被确认和使用。
比如:A获取了001,B不必等待A确认即可获取到002,C同样不需要等待即可获取到003。这三者谁先确认均不影响对方 - 不允许漏号(每一位都要求被用到,需做好重试机制)
严格按照流水位顺序一位位获取并使用,只要当前流水位未被确认使用,下次获取仍然是当前流水位。
比如:A获取了001,但未确认使用,B此时来获取仍然取到的是001,只有当A或B其中一人确认使用了001,下次获取才会变为002
开发中心
新增
这里的模板编号,在后续接入会用到,可提前复制好
控制台
主要分为默认配置和园区配置
前端接入
如果使用前端获取流水号,则后端不需要调用获取流水号接口,只需做确认和刷新操作
后端接入
依赖
<dependency>
<groupId>cn.flyrise</groupId>
<artifactId>pai-common-sn</artifactId>
</dependency>
数据表
此表仅为示例,非实际业务数据表
CREATE TABLE `sn_test` (
`id` VARCHAR(19) NOT NULL,
`name` VARCHAR(50) NULL DEFAULT NULL,
`contract_num` VARCHAR(30) NOT NULL,
`ent_id` VARCHAR(50) NOT NULL,
PRIMARY KEY (`id`) USING BTREE,
UNIQUE INDEX `idx_contract_num` (`contract_num`,`ent_id`) USING BTREE
)ENGINE=InnoDB;
需满足以下两个条件:
1.单独一个字段存储流水号
2.建立唯一索引(非必须,根据实际业务定)
业务接入
1.注入service
@Resource
private SnService snService;
2.保存和确认
- 插入业务库后,调用confirm方法,确认使用该流水号
- 如果数据库存在唯一索引,则需要在catch中捕获且调用刷新方法,避免一直取不到最新的流水号
- 刷新时需传入当前业务表的表名和字段名
- 不允许漏号场景下获取和确认流水号动作需自行做好错误重试机制(必须支持事务回滚)
如果园区id传null,则取默认模板,如果不为空则取园区模板
调用示例:
try {
sn = FeignUtil.get(obtainSn(tempName, entId, parkId));
snTask.execute(sn);
//业务代码执行 插入sn
FeignUtil.call(confirm(tempName, entId, parkId, sn));
} catch (DuplicateKeyException e) {
if (sn != null) {
refresh(tableName, snFieldName, orgFieldName, entId, parkId, tempName, sn);
}
throw e;
}
或者
SnExecuteDTO dto = SnExecuteDTO.builder()
.entId("1767726454286475265")
.parkId("1727847219006144514")
.orgFieldName("tenant_id")
.snFieldName("sn")
.tableName("sn_test")
.tempName("test_reset").build();
snService.execute(sn -> {
SnTestPO po = new SnTestPO();
po.setId(IdUtils.snowFlakeId());
po.setName("test");
po.setSn(sn);
po.setTenantId("1767726454286475265");
snTestMapper.insert(po);
}, dto);
业务导入数据
业务库最大流水号会发生变化,请导入成功后主动调用一次refresh方法,避免后续业务新增触发唯一索引异常(重号)
注意:数据落库后才去刷新!!!
//导入数据列表中最大的流水号
snService.refresh(tableName, fieldName, entId, null, tempName, snStr);
//如果无法提供snStr(必须确保当前流水号和当前设置的规则一致)
snService.refresh(tableName, fieldName, entId, null, tempName, null);
文档更新时间: 2024-10-09 15:56 作者:伍润源