思想:
第一级别:先查询数据库中最大的编码,如果不存在则设置第一个编号的格式 例如:101 ,如果存在则最大编码加一 这只是同一级别的编号
第二级别:也是先查询数据库中最大的编码(此时的编码是第二级别的最大编码)如果最大编码不存在则先看传来的父id符不符合要求(因为第一级是没有父id或自定义的id列如:1,第二级后的级别都是有父id的)如果传来的父id是不是默认的则证明是第二级别的第一个编码,只需在查询的编码后加"01"即可,如果查到了,那就最大编码加一
代码如下:
- ServuceImpl层(重点看这个 别的无所谓)
public class DeptServiceImpl extends BaseServiceImpl<Dept, DeptMapper> implements DeptService{
private final String DEFAULT_PARENT_ID="1";//部门默认pid
@Override
public int save(Dept mapOrEntiry) {
//先看看前台传来的pid(父id)是不是空
String pid=mapOrEntiry.getPid();
//自定义字符串工具包 单纯的看看pid是不是空
if(StringUtils.isBlank(pid)){
pid=DEFAULT_PARENT_ID;
mapOrEntiry.setPid(pid);
}
String maxCode=null;
//查询最大编码
String code= mapper.queryMaxCode(mapOrEntiry.getEuid(),pid);
if(null==code){
//如果不存在
//如果父id是默认的1
if(DEFAULT_PARENT_ID.equals(pid)){
maxCode="101";
}else{
//如果pid不是默认值 查询部门id为pid的编码
code=mapper.queryCodeById(mapOrEntiry.getPid());
//新编码是当前编码code的第一个子编码
maxCode=code+"01";
}
}else{
//如果存在 假如是101
maxCode=getNextCode(code);
}
mapOrEntiry.setDeptno(maxCode);
return mapper.save(mapOrEntiry);
}
/**
* 获取当前编码+1后的新编码
* @param code
* @return
*/
String getNextCode(String code){
int len=code.length();
String num=code.substring(len-2);
int newNum=Integer.parseInt(num)+1;
String newCode=code.substring(0,len-2)+String.format("%02d",newNum);
return newCode;
}
}
- Mapper层
mapper.queryCodeById(mapOrEntiry.getPid())的sql语句
<select id="queryMaxCode" parameterType="string" resultType="string">
select max(d.deptno) deptno
from s_dept d
where d.euid = #{euid}
and d.pid = #{pid}
</select>
mapper.save(mapOrEntiry)的sql语句
<insert id="save" parameterType="dept">
insert into s_dept(id, name, deptno, pid, sorts, note, euid)
values (uuid(), #{name}, #{deptno}, #{pid}, #{sorts}, #{note}, #{euid})
</insert>
- javabean层
@Data
public class Dept {
@NotBlank(message = "部门id不能为空!",groups = {Modify.class})
String id;
@NotBlank(message = "部门名称不能为空!",groups = {Save.class,Modify.class})
String name;
String pid;
int sorts;
String note;
String deptno;
@NotBlank(message = "企业用户id不能为空!",groups = {Save.class})
String euid;
}