CREATE TABLE `t_order_no` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增长id',
`order_type` varchar(20) DEFAULT NULL COMMENT '业务单号类型',
`description` varchar(100) DEFAULT NULL COMMENT '业务单号类型描述',
`prefix` varchar(20) DEFAULT NULL COMMENT '单据号前缀',
`data_type` varchar(20) DEFAULT NULL COMMENT '日期格式',
`length` int(11) DEFAULT NULL COMMENT '流水号长度',
`init_val` int(11) DEFAULT NULL COMMENT '流水号初始值',
`step_val` int(11) DEFAULT NULL COMMENT '流水号递增值',
`last_date` date DEFAULT NULL COMMENT '最后生成单号的日期',
`last_number` int(11) DEFAULT NULL COMMENT '最后生成单号的流水号',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='单号生成规则表(前缀+ 日期+ 流水号)'
/**
* @ClassName: OrderNo
* @description: 单号生成规则类
* @author: wangjie
* @time: 2020-07-07 16:14
*/
public class OrderNo {
/**
* 编码中没有日期
*/
public final static String HAS_NO_DATATYPE = "EMPTY";
public int id; //ID
public String orderType; //业务单号类型
public String description; // 业务单号类型描述
public String prefix; //前缀字符
/**
* 日期格式
* "yyyyMMdd"生成当前日期年月日 20200708
* "empty" 前缀和流水号之间没有字符串
*/
public String dataType; //日期格式
public int length; //流水号长度
public int initVal; //流水号初始值
public int stepVal; //流水号递增值
public Date lastDate; //最后生成单号的日期
public int lastNumber; //最后生成单号的流水号
}
OrderNoMapper :
<select id="selectLockOneByOrderType" resultType="OrderNo ">
select
id as id,
order_type as orderType,
description as description,
prefix as prefix,
data_type as dataType,
`length` as length,
init_val as initVal,
step_val as stepVal,
last_date as lastDate,
last_number as lastNumber
from
t_order_no
where order_type = #{orderType}
</select>
<update id="updateOrderNo">
UPDATE t_order_no
SET last_date=now() , last_number=#{lastNumber}
WHERE id=#{id};
</update>
/**
* @ClassName: OrderNoService
* @description: 单据号生成工具
* @author: wangjie
* @time: 2020-07-08 7:58
*/
public class OrderNoUtil {
@Service
public class OrderNoService {
@Autowired
OrderNoMapper orderNoMapper;
public String getOrderNo(String orderType) {
// 1.获取单号生成规则
OrderNoPo orderNo = orderNoMapper.selectLockOneByOrderType(orderType);
System.out.println(orderNo);
//定义单号字符串
StringBuffer orderNoStr = new StringBuffer();
// 单号添加前缀
orderNoStr.append(orderNo.getPrefix());
// 2.获取日期格式
if (!orderNo.getDataType().equals(OrderNoPo.HAS_NO_DATATYPE)) {
// 单号中添加时间码
orderNoStr.append(LocalDateTime.now().format(DateTimeFormatter.ofPattern(orderNo.getDataType())));
// 如果跨天,流水号重置为0
DateTimeFormatter df1 = DateTimeFormatter.ofPattern("yyyyMMdd");
// Date 转 LocalDate
LocalDate lastDate = orderNo.getLastDate().toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
// 上次生成单号的日期和当前日期不是同一天, 序列号归零
if (ChronoUnit.DAYS.between(LocalDate.now(), lastDate) != 0l) {
orderNo.setLastNumber(0);
}
}
// 3. 获取流水码
orderNo.setLastNumber(orderNo.getLastNumber() + orderNo.getStepVal());
// 按流水码长度获取 数字格式字符串 长度为2 格式为"00"
String numberFormatStr = String.join("", Collections.nCopies(orderNo.getLength(), "0"));
// 生成数字格式化对象
DecimalFormat format = new DecimalFormat(numberFormatStr);
// 单据号中添加流水码
orderNoStr.append(format.format(orderNo.getLastNumber()));
orderNoMapper.updateOrderNo(orderNo);
return orderNoStr.toString();
}
}
网友评论