展示效果:
步骤:
1.在数据库中建张表(最大值,字符前缀)
sys_assets资产表
sys_assets_code 自动生成编码表:下图
2.mapper中的dao层
/** * 资产编码 数据层 * * @author ruoyi */ public interface SysAssetsCodeMapper { /** * 不存在时insert * prefix * @return */ public int insertAssetsCode(String prefix); /** * 根据字符前缀查询 * @param prefix * @return */ public SysAssetsCode selectByPrefix(String prefix);
3.mapper.xml文件SQL语句
注:第一个SQL(存在时更新,不存在是添加。具体访问:):https://www.cnblogs.com/liaojie970/p/6824773.html
<!-- 不存在时insert --> <insert id="insertAssetsCode" parameterType="java.lang.String"> INSERT INTO sys_assets_code (prefix,maxinx) VALUES (#{prefix},1) ON DUPLICATE KEY UPDATE prefix = #{prefix} ,maxinx = maxinx+1 </insert> <!-- 根据字符前缀查询 --> <select id="selectByPrefix" parameterType="java.lang.String" resultMap="SysAssetsCodeResult"> select t.prefix,t.maxinx from sys_assets_code t where t.prefix = #{prefix} </select>
4.封装方法(参数拼接)
public interface ISysAssetsCodeService { /** * 自动生成编码 * @param preFixe 字符 * @param numCode 最大数值(几位) * @return */ public String getCode(String preFixe,int numCode); }
5.封装方法(字符拼接)
@Service
public class SysAssetsCodeService implements ISysAssetsCodeService {
private Lock lock = new ReentrantLock();
@Autowired
private SysAssetsCodeMapper codeMapper;
@Override
@Transactional
public String getCode(String preFixe,int numCode) {
try {
lock.lock();
int result = codeMapper.insertAssetsCode(preFixe);
SysAssetsCode sysAssetsCode = codeMapper.selectByPrefix(preFixe);
if(sysAssetsCode != null && result > 0 ){
//判断【字符前缀】不为空 && 添加时记录数大于0 【进行String.format 拼接】
return String.format("%s%"+numCode+"d", preFixe,sysAssetsCode.getMaxinx()).replace(" ", "0");
}else{
throw new RuntimeException("获取编码失败");
}
} finally {
lock.unlock();
}
}
}
6.Controller控制层
/**
* 根据资产编号获取详细信息
*/
@PreAuthorize("@ss.hasPermi('system:assets:query')")
@GetMapping(value ={"/", "/{id}"})
public AjaxResult getInfo(@PathVariable(value = "id", required = false) Long id)
{
AjaxResult ajax = AjaxResult.success();
SysAssets assets = null;
if(StringUtils.isNotNull(id)){
assets = assetsService.selectAssetsById(id);
}else{
assets = new SysAssets();
//setCodeId属性 “YFCX”可自定义看需求;“5” 代表5位数
assets.setCodeId(codeService.getCode("YFCX",5));
}
ajax.put(AjaxResult.DATA_TAG,assets);
return ajax;
}