此文档适用于 2.2.0.0版本以上

模板说明

流水位

每个模板只支持包含一个流水位规则

重置规则

重置规则主要分为四种,分别为:

兼容旧版本数据,旧版本按照日期规则重置

  1. 不重置
  2. 按年重置
    必须包含年,其中可以为YYYY、YYYYMM、YYYYMMDD
  3. 按月重置
    必须包含年月,其中可以为YYYY,MM组合、YYYYMM、YYYYMMDD
  4. 按日重置
    必须包含年月日,其中可以为YYYY,MM,DD组合、YYYYMM,DD组合、YYYYMMDD

总长度

目前模板总长度限制在30位

是否漏号

  1. 允许漏号(存在跳位的情况)
    每次获取都是新的流水位,不需要等待上一位流水位被确认和使用。
    比如:A获取了001,B不必等待A确认即可获取到002,C同样不需要等待即可获取到003。这三者谁先确认均不影响对方
  2. 不允许漏号(每一位都要求被用到,需做好重试机制)
    严格按照流水位顺序一位位获取并使用,只要当前流水位未被确认使用,下次获取仍然是当前流水位。
    比如: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   作者:伍润源