业务场景:
新项目中合同编号都要用到流水号(字母前缀+年月+三位流水号),项目中诸多模块都要用到这个流水号,需要提取公共方法。业务流水有限三位流水号足够,达到三位流水号999,变为1000。
实体类属性:
// 流水号
private String serialNumber;
// 查询字段名
private String fieldName;
// 表名
private String tableName;
// 首字母
private String firstNumber;
// 流水号长度
private int numberLength;
sql语句:
因为不同模块的表名和流水号字段不一致,采用动态查询
<select id="selectMaxSerialnumberEntity" parameterType="com.ciip.webmgr.utils.serialnumber.entity.SerialnumberEntity" resultType="java.lang.String">
<![CDATA[
SELECT
MAX(${fieldName}) AS serialNumber
FROM
${tableName}
WHERE
${fieldName} LIKE CONCAT(#{firstNumber},'%')
]]>
</select>
service:
/**
* 添加对象 3位流水号
* @param fieldName 字段名
* @param tableName 表名
* @param firstNumber 流水号字母前缀
* @param numberLength 字母长度
* @return Serialnumber 最大流水号
*/
public String getMaxSerialnumber(String fieldName,String tableName,String firstNumber,int numberLength) {
Calendar cal = Calendar.getInstance();
int year = cal.get(Calendar.YEAR);
int month = cal.get(Calendar.MONTH )+1;
//规范月份格式10月份之前的月份都采用01 02等格式
String newmonth = String.format("%02d", month);
//根据字母前缀+年月 查询
String Serialnumber = firstNumber+year+newmonth;
SerialnumberEntity serialnumberEntity = new SerialnumberEntity();
serialnumberEntity.setFieldName(fieldName);
serialnumberEntity.setTableName(tableName);
serialnumberEntity.setFirstNumber(Serialnumber);
String MaxSerialnumber = serialnumberDAO.getMaxSerialnumber(serialnumberEntity);
if(StringUtils.isNotBlank(MaxSerialnumber)) {
if(MaxSerialnumber.length()==numberLength) {
int tempid = Integer.valueOf(MaxSerialnumber.substring(MaxSerialnumber.length()-3, MaxSerialnumber.length()));
Serialnumber = Serialnumber+String.format("%03d", tempid + 1);
}else {
int tempid = Integer.valueOf(MaxSerialnumber.substring(MaxSerialnumber.length()-4, MaxSerialnumber.length()));
Serialnumber = Serialnumber+String.format("%04d", tempid + 1);
}
}else {
Serialnumber = Serialnumber+"001";
}
return Serialnumber;
}