需求:某个公司的外协员工在新增的时候需要自动生成工号,规则为W+五位数字,例如W00001,W00002,以此类推,数据库用的pg数据库,我本来想着查询出所有外协员工的数据,然后order by拿到最新一条的数据然后拿到最新的那一条记录,获取到这一条的工号加一赋值给新的数据。
但是这样的问题就是用户表数据量很大,查询时间不够完美。而且依赖新增时间进行搜索就会有问题,因为会出现同时创建的记录这样就会出现问题。
所以我们可以使用pg的序列来实现这个需求,我们新增一个序列,让他从1开始,到9999999999结束,这样就可以对上我们的需求。

然后再通过JdbcTemplate来获取当前序列的值(一定要先注入JdbcTemplate)
java
@Autowired
private JdbcTemplate jdbcTemplate;
if (createReqVO.getPersonType().equals("1")){
// 外协员工:w + 5 位数字,不足补零
int nextVal = jdbcTemplate.queryForObject(
"SELECT nextval('outsourcing_user_sn')", Integer.class);
user.setUserSn("W" + String.format("%05d", nextVal));
}
这样的话就可以获取到当前序列的值了,再通过"W" + String.format("%05d", nextVal)拼接成W+五位数字我们就大功告成啦!
展示一下我的全部新增代码,以供参考:
java
@Override
@Transactional(rollbackFor = Exception.class)
@LogRecord(type = SYSTEM_USER_TYPE, subType = SYSTEM_USER_CREATE_SUB_TYPE, bizNo = "{{#user.id}}",
success = SYSTEM_USER_CREATE_SUCCESS)
public Long createUser(UserSaveReqVO createReqVO) {
// 1.1 校验账户配合
tenantService.handleTenantInfo(tenant -> {
long count = userMapper.selectCount();
if (count >= tenant.getAccountCount()) {
throw exception(USER_COUNT_MAX, tenant.getAccountCount());
}
});
// 1.2 校验正确性
validateUserForCreateOrUpdate(null, createReqVO.getUsername(), createReqVO.getUserSn(),
createReqVO.getMobile(), createReqVO.getEmail(), createReqVO.getDeptId(), createReqVO.getPostIds());
// 2.1 插入用户
AdminUserDO user = BeanUtils.toBean(createReqVO, AdminUserDO.class);
user.setStatus(CommonStatusEnum.ENABLE.getStatus()); // 默认开启
if (createReqVO.getPassword() != null) {
user.setPassword(encodePassword(createReqVO.getPassword())); // 加密密码
}
if (createReqVO.getPersonType().equals("1")){
// 外协员工:w + 5 位数字,不足补零
int nextVal = jdbcTemplate.queryForObject(
"SELECT nextval('outsourcing_user_sn')", Integer.class);
user.setUserSn("W" + String.format("%05d", nextVal));
}
userMapper.insert(user);
if (createReqVO.getImagePath() != null) {
FaceImageDO faceImageDO = new FaceImageDO();
faceImageDO.setPersonId(user.getId());
faceImageDO.setImage(createReqVO.getImagePath());
faceImageMapper.insert(faceImageDO);
}
// 2.2 插入关联岗位
if (CollectionUtil.isNotEmpty(user.getPostIds())) {
userPostMapper.insertBatch(convertList(user.getPostIds(),
postId -> new UserPostDO().setUserId(user.getId()).setPostId(postId)));
}
// 3. 记录操作日志上下文
LogRecordContext.putVariable("user", user);
return user.getId();
}