展示效果:
步驟:
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;
}