package org.jeecg.modules.system.service.impl; import cn.hutool.core.collection.CollectionUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import org.apache.commons.lang3.StringUtils; import org.jeecg.common.constant.CommonConstant; import org.jeecg.common.exception.JeecgBootException; import org.jeecg.modules.system.entity.SysBusinessCodeRule; import org.jeecg.modules.system.entity.SysBusinessCodeSeq; import org.jeecg.modules.system.mapper.SysBusinessCodeRuleMapper; import org.jeecg.modules.system.service.ISysBusinessCodeRuleService; import org.jeecg.modules.system.service.ISysBusinessCodeSeqService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.util.List; /** * @Description: 业务编码规则 * @Author: jeecg-boot * @Date: 2025-03-17 * @Version: V1.0 */ @Service public class SysBusinessCodeRuleServiceImpl extends ServiceImpl implements ISysBusinessCodeRuleService { @Resource private SysBusinessCodeRuleMapper businessCodeRuleMapper; @Autowired private ISysBusinessCodeSeqService businessCodeSeqService; @Override @Transactional(rollbackFor = Exception.class) public synchronized String generateBusinessCodeSeq(String businessCode) { //查询生成规则 LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(SysBusinessCodeRule::getBusinessCode, businessCode); queryWrapper.eq(SysBusinessCodeRule::getDelFlag, CommonConstant.DEL_FLAG_0); List list = businessCodeRuleMapper.selectList(queryWrapper); if (CollectionUtil.isEmpty(list)) { throw new JeecgBootException("未查询到配置的业务编码生成规则,请联系管理员检查!"); } if (list.size() > 1) { throw new JeecgBootException("查询到多个配置的业务编码生成规则,请联系管理员检查!"); } SysBusinessCodeRule businessCodeRule = list.get(0); String prefix = businessCodeRule.getPrefix(); String yearFormat = businessCodeRule.getYearFormat() == null ? "" : businessCodeRule.getYearFormat().trim(); String monthFormat = businessCodeRule.getMonthFormat() == null ? "" : businessCodeRule.getMonthFormat().trim(); String dayFormat = businessCodeRule.getDayFormat() == null ? "" : businessCodeRule.getDayFormat().trim(); Integer seqLength = businessCodeRule.getSeqLength(); String formatter = yearFormat + "-" + monthFormat + "-" + dayFormat; //转换当前日期对应的生成序列 String[] currentDate = LocalDate.now().format(DateTimeFormatter.ofPattern(formatter)).split("-"); int i = 0; if (StringUtils.isNotBlank(yearFormat)) { yearFormat = currentDate[i]; i++; }else { yearFormat = null; } if (StringUtils.isNotBlank(monthFormat)) { monthFormat = currentDate[i]; i++; }else { monthFormat = null; } if (StringUtils.isNotBlank(dayFormat)) { dayFormat = currentDate[i]; }else { dayFormat = null; } //查询生成序列 SysBusinessCodeSeq sysBusinessCodeSeq = businessCodeSeqService.queryByParams(businessCodeRule.getId(), prefix, yearFormat, monthFormat, dayFormat); if(sysBusinessCodeSeq == null){ //新增生成序列 sysBusinessCodeSeq = new SysBusinessCodeSeq(); sysBusinessCodeSeq.setRuleId(businessCodeRule.getId()); sysBusinessCodeSeq.setPrefix(prefix); sysBusinessCodeSeq.setCurrentYear(yearFormat); sysBusinessCodeSeq.setCurrentMonth(monthFormat); sysBusinessCodeSeq.setCurrentDay(dayFormat); sysBusinessCodeSeq.setCurrentSeq(1); businessCodeSeqService.save(sysBusinessCodeSeq); }else { //更新生成序列 sysBusinessCodeSeq.setCurrentSeq(sysBusinessCodeSeq.getCurrentSeq() + 1); businessCodeSeqService.updateById(sysBusinessCodeSeq); } //返回生成的序列 return appendPrefix(prefix, yearFormat, monthFormat, dayFormat, seqLength, sysBusinessCodeSeq.getCurrentSeq()); } /** * 拼接业务流水号 * @param prefix 前缀 * @param yearFormat 年份 * @param monthFormat 月份 * @param dayFormat 天 * @param seqLength 序号长度 * @param currentSeq 当前序号 * @return */ private String appendPrefix(String prefix, String yearFormat, String monthFormat, String dayFormat, Integer seqLength, Integer currentSeq) { StringBuilder sb = new StringBuilder(); if(StringUtils.isNotBlank(prefix)){ sb.append(prefix); } if(StringUtils.isNotBlank(yearFormat)){ sb.append(yearFormat); } if(StringUtils.isNotBlank(monthFormat)){ sb.append(monthFormat); } if(StringUtils.isNotBlank(dayFormat)){ sb.append(dayFormat); } sb.append(StringUtils.leftPad(currentSeq.toString(), seqLength, '0')); return sb.toString(); } }