feat(serial-number): 添加乐观锁支持及初始化报价代码接口

- 在AdminBaseSerialNumber实体中添加@Version注解实现乐观锁
- 在MybatisPlus配置中加入OptimisticLockerInnerInterceptor支持乐观锁插件
- 修正AdminBaseSerialNumberServiceImpl中序列号生成逻辑,避免逻辑遗漏
- TestController新增接口initAdminUserQuotationCode,批量初始化内部用户报价代码字段
- 新增日志记录生成的报价代码,确保数据初始化过程可追踪
- 引入相关服务依赖,完善测试控制器注入与调用逻辑
This commit is contained in:
曹鹏飞 2026-05-13 10:07:34 +08:00
parent 9cceef75bb
commit b8ca2a9905
4 changed files with 42 additions and 6 deletions

View File

@ -5,13 +5,14 @@ import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import com.nflg.mobilebroken.common.pojo.ApiResult; import com.nflg.mobilebroken.common.pojo.ApiResult;
import com.nflg.mobilebroken.common.util.VUtils; import com.nflg.mobilebroken.common.util.VUtils;
import com.nflg.mobilebroken.repository.entity.AdminUser;
import com.nflg.mobilebroken.repository.entity.ProductModel; import com.nflg.mobilebroken.repository.entity.ProductModel;
import com.nflg.mobilebroken.repository.entity.TBaseArea; import com.nflg.mobilebroken.repository.entity.TBaseArea;
import com.nflg.mobilebroken.repository.entity.TBaseCustomer; import com.nflg.mobilebroken.repository.entity.TBaseCustomer;
import com.nflg.mobilebroken.repository.service.IProductModelService; import com.nflg.mobilebroken.repository.service.*;
import com.nflg.mobilebroken.repository.service.ITBaseAreaService; import lombok.extern.slf4j.Slf4j;
import com.nflg.mobilebroken.repository.service.ITBaseCustomerService;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
@ -26,6 +27,7 @@ import java.util.stream.Collectors;
/** /**
* 测试 * 测试
*/ */
@Slf4j
@RestController @RestController
@RequestMapping("/test") @RequestMapping("/test")
public class TestController extends ControllerBase { public class TestController extends ControllerBase {
@ -39,6 +41,12 @@ public class TestController extends ControllerBase {
@Resource @Resource
ITBaseAreaService areaService; ITBaseAreaService areaService;
@Resource
private IAdminUserService adminUserService;
@Resource
private IAdminBaseSerialNumberService serialNumberService;
/** /**
* 初始化机型表的BatchNumber字段数据 * 初始化机型表的BatchNumber字段数据
*/ */
@ -121,4 +129,25 @@ public class TestController extends ControllerBase {
return ApiResult.success(); return ApiResult.success();
} }
/**
* 初始化内部用户报价代码字段数据
*/
@PostMapping("initAdminUserQuotationCode")
public ApiResult<Void> initAdminUserQuotationCode(){
List<AdminUser> adminUsers=adminUserService.lambdaQuery()
.isNull(AdminUser::getQuotationCode)
.orderByAsc(AdminUser::getId)
.list();
if (CollectionUtil.isNotEmpty(adminUsers)) {
adminUsers.forEach(adminUser -> {
String quotationCode = serialNumberService.generateSerialNumber(0, "NF", "", false, 6);
log.info("生成报价代码【{}】:{}", adminUser.getUserName(), quotationCode);
adminUser.setQuotationCode(quotationCode);
});
adminUserService.updateBatchById(adminUsers);
return ApiResult.success();
}
return ApiResult.success();
}
} }

View File

@ -4,6 +4,8 @@ import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable; import java.io.Serializable;
import com.baomidou.mybatisplus.annotation.Version;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
import lombok.experimental.Accessors; import lombok.experimental.Accessors;
@ -45,6 +47,7 @@ public class AdminBaseSerialNumber implements Serializable {
/** /**
* 乐观锁版本号 * 乐观锁版本号
*/ */
@Version
private Integer version; private Integer version;
/** /**

View File

@ -1,5 +1,6 @@
package com.nflg.mobilebroken.repository.service.impl; package com.nflg.mobilebroken.repository.service.impl;
import cn.hutool.core.util.StrUtil;
import com.nflg.mobilebroken.repository.entity.AdminBaseSerialNumber; import com.nflg.mobilebroken.repository.entity.AdminBaseSerialNumber;
import com.nflg.mobilebroken.repository.mapper.AdminBaseSerialNumberMapper; import com.nflg.mobilebroken.repository.mapper.AdminBaseSerialNumberMapper;
import com.nflg.mobilebroken.repository.service.IAdminBaseSerialNumberService; import com.nflg.mobilebroken.repository.service.IAdminBaseSerialNumberService;
@ -14,9 +15,8 @@ import java.util.Objects;
/** /**
* <p> * <p>
* 服务实现类 * 服务实现类
* </p> * </p>
*
* @author 代码生成器生成 * @author 代码生成器生成
* @since 2026 * @since 2026
*/ */
@ -34,7 +34,7 @@ public class AdminBaseSerialNumberServiceImpl extends ServiceImpl<AdminBaseSeria
public String generateSerialNumber(Integer businessType, String prefixNumber, String specialNumber, public String generateSerialNumber(Integer businessType, String prefixNumber, String specialNumber,
boolean hasTimeStr, Integer serialLength) { boolean hasTimeStr, Integer serialLength) {
String currentDate = ""; String currentDate = "";
String serialNo ; String serialNo;
AdminBaseSerialNumber serialNumber = this.lambdaQuery() AdminBaseSerialNumber serialNumber = this.lambdaQuery()
.eq(AdminBaseSerialNumber::getBusinessType, businessType) .eq(AdminBaseSerialNumber::getBusinessType, businessType)
.one(); .one();
@ -59,6 +59,8 @@ public class AdminBaseSerialNumberServiceImpl extends ServiceImpl<AdminBaseSeria
if (serialNumber.getCurrentDateStr().equals(currentDate)) { if (serialNumber.getCurrentDateStr().equals(currentDate)) {
startSerial = serialNumber.getMaxSerial() + 1; startSerial = serialNumber.getMaxSerial() + 1;
} }
} else {
startSerial = serialNumber.getMaxSerial() + 1;
} }
serialNumber.setSerialLength(serialLength); serialNumber.setSerialLength(serialLength);
serialNumber.setMaxSerial(startSerial); serialNumber.setMaxSerial(startSerial);

View File

@ -4,6 +4,7 @@ import com.alibaba.druid.pool.DruidDataSource;
import com.baomidou.mybatisplus.annotation.DbType; import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.core.MybatisConfiguration; import com.baomidou.mybatisplus.core.MybatisConfiguration;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean; import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
import com.nflg.mobilebroken.starter.handler.UTCLocalDateTimeTypeHandler; import com.nflg.mobilebroken.starter.handler.UTCLocalDateTimeTypeHandler;
@ -104,6 +105,7 @@ public class MysqlDataSourceConfig {
@Bean @Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() { public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor; return interceptor;
} }