学习如何对组织架构的管理
简介
最近讨论到一个公司的组织架构的话题,一个大型公司对组织架构的规划是非常重视的,那么在互联网时代很多工作都搬到了线上来完成,那么我在想怎么把组织管理这个需求搬到线上管理呢?
经过了一段时间的学习,先了解什么是组织架构,一个组织架构的划分实际转为数据的时候应该是很么样的结构。
我们可以先看一下一个简单的组织架构图先了解一下。
结构非常清晰,从上往下每个层级会有那些部门都很清楚,对应到数据结构上,就是一个比较经典的树结构了。那么对于树结构在代码中的思维都是循环递归去处理,可是在数据库的存储中来说,没有存储树结构的方式,可以用一个字段来关联每个层级之间的关系。
1、设计数据库表
简介
我使用的是 MySQL 数据库,看上面的组织结构图可以大致有:
- 组织结构名称
- 组织结构编码
- 组织结构的描述
- 父结构的id
那么我们在数据库表设计上,增加了:
- 每条数据的主键id
- 每条数据的创建时间
- 每条数据的更新时间
- 每条数据的删除标识
数据库表就算建好了,接下来就开始写接口来对数据进行增删改查。
2、编写CRUD接口
简介
我使用的 Java 来写数据库的 CRUD 接口,用的是 springboot 2.7,搭配 mybatis-plus 来操作数据库。
2.1、Java 项目准备
a、项目依赖:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
<!-- mybatis-plus -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.0</version>
</dependency>
<!-- mysql -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.10</version>
</dependency>
</dependencies>
b、项目配置:
server.port=8088
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.password=123456
spring.datasource.username=root
spring.datasource.url=jdbc:mysql://localhost:3306/tree_test?characterEncoding=utf-8&useSSL=false&serverTimezone=UTC
c、对应数据库表结构的类 Organize
package com.xx.springbootWebSocket.model;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
import java.util.Date;
@Data
public class Organize {
@TableId(type= IdType.ASSIGN_UUID)
private String id;
private String name;
private String code;
private String descInfo;
private String parentId;
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime;
@TableField(fill = FieldFill.INSERT)
private Date createTime;
private int isDelete;
}
d、对应查询参数的类 OrganizeParmaOV
package com.xx.springbootWebSocket.model;
import lombok.Data;
@Data
public class OrganizeParmaOV {
private String id;
private String name;
private String code;
private String desc;
private String parentId;
}
e、查询组织架构的树结构类 OrganizeAllList
package com.xx.springbootWebSocket.model;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
@Data
public class OrganizeAllList {
private String id;
private String name;
private String code;
private String desc;
private String parentId;
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date createTime;
private Object children;
}
2.2、编写新增接口
// Controller
// 添加组织架构
@PostMapping("/addOrganize")
public ResponseVO addOrganize(@RequestBody OrganizeParmaOV organizeParmaOV){
return organizeService.addOrganize(organizeParmaOV);
}
// Services
// 添加
public ResponseVO addOrganize( OrganizeParmaOV paramOrganize){
// 实例化组织架构类
Organize organize = new Organize();
organize.setIsDelete(0);
organize.setName(paramOrganize.getName());
organize.setCode(paramOrganize.getCode());
organize.setDescInfo(paramOrganize.getDesc());
organize.setParentId(paramOrganize.getParentId() != null && !Objects.equals(paramOrganize.getParentId(), "") ? paramOrganize.getParentId() : "-1");
// 添加到数据库
int insert = organizeMapper.insert(organize);
// 实例化返回类
ResponseVO responseVO = getResponse(true, "添加成功", 200);
if( insert != 1 ){
responseVO.setMessage("添加失败");
responseVO.setData(false);
responseVO.setStatus(1);
}
return responseVO;
}
前端调用:
save() {
const data = {
...this.formData,
};
fetch( `http://localhost:8088/addOrganize`,
{
method: "post",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify(data),
}
)
.then((response) => {
return response.json();
})
.then((res) => {
if (res.data) {
this.$message({
type: "success",
message: res.message || "操作成功",
});
this.getList();
this.handleClose();
}
});
},
2.3、编写编辑接口
// Controller
// 编辑组织架构
@PutMapping("/editOrganize")
public ResponseVO editOrganize(@RequestBody OrganizeParmaOV organizeParmaOV){
return organizeService.editOrganize(organizeParmaOV);
}
// Services
// 编辑
public ResponseVO editOrganize( OrganizeParmaOV paramOrganize){
// 使用默认的wrapper
UpdateWrapper<Organize> organizeUpdateWrapper = new UpdateWrapper<>();
// 指定数据
organizeUpdateWrapper.eq("id", paramOrganize.getId());
// 修改字段以及值
organizeUpdateWrapper.set("name", paramOrganize.getName());
organizeUpdateWrapper.set("code", paramOrganize.getCode());
organizeUpdateWrapper.set("desc_info", paramOrganize.getDesc());
// 添加到数据库
int update = organizeMapper.update(null, organizeUpdateWrapper);
// 实例化返回类
ResponseVO responseVO = getResponse(true, "更新成功", 200);
if( update != 1 ){
responseVO.setMessage("更新失败");
responseVO.setData(false);
responseVO.setStatus(1);
}
return responseVO;
}
前端调用:
editItme() {
const data = {
...this.formData,
};
fetch( `http://localhost:8088/editOrganize`,
{
method: "put",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify(data),
}
)
.then((response) => {
return response.json();
})
.then((res) => {
if (res.data) {
this.$message({
type: "success",
message: res.message || "操作成功",
});
this.getList();
this.handleClose();
}
});
},
2.4、编写删除接口
// Controller
// 删除组织架构
@DeleteMapping("/deleteOrganize")
public ResponseVO deleteOrganize(String id){
if(id == null){
ResponseVO responseVO = new ResponseVO();
responseVO.setData(false);
responseVO.setStatus(1);
responseVO.setMessage("Required request parameter id");
return responseVO;
}
return organizeService.deleteOrganize(id);
}
// Services
// 删除
public ResponseVO deleteOrganize(String id){
// 实例化返回类
ResponseVO responseVO = getResponse(false, "id params is required", 1);
if( id == null ){
return responseVO;
}
HashMap<String, Object> stringObjectHashMap = new HashMap<>();
stringObjectHashMap.put("parent_id", id);
List<Organize> organizes = organizeMapper.selectByMap(stringObjectHashMap);
if( organizes.size() > 0 ){
responseVO.setMessage("当前项还存在下级,请删除所有下级再删除。");
return responseVO;
}
int i = organizeMapper.deleteById(id);
if( i != 1 ){
responseVO.setMessage("删除失败");
responseVO.setData(false);
responseVO.setStatus(1);
}else{
responseVO.setMessage("删除成功");
responseVO.setData(true);
responseVO.setStatus(200);
}
return responseVO;
}
前端调用:
editItem(item) {
fetch(`http://localhost:8088/deleteOrganize?id=${item.id}`, {
method: "delete",
})
.then((response) => {
return response.json();
})
.then((res) => {
if (res.data) {
this.$message({
type: "success",
message: "删除成功!",
});
this.getList();
} else {
this.$message.error(res.message);
}
});
},
2.5、编写获取全部列表接口
// Controller
// 获取全部
@GetMapping("/getAll")
public ResponseVO getAl(){
return organizeService.allOrganize();
}
// Services
// 查询所有
public ResponseVO allOrganize(){
// 实例化返回类
ResponseVO responseVO = getResponse(true, "添加成功", 200);
// 查询所以一级
HashMap<String, Object> hashMap = new HashMap<String, Object>();
hashMap.put("parent_id", "-1");
List<Organize> organizes = organizeMapper.selectByMap(hashMap);
if( organizes.size() == 0 ){
return getResponse(new Array[] {
}, "获取成功", 200);
}
responseVO.setData(getList("-1"));
return responseVO;
}
public List<OrganizeAllList> getList(String id){
// 查询所以一级
HashMap<String, Object> hashMap = new HashMap<String, Object>();
hashMap.put("parent_id", id);
List<Organize> organizes = organizeMapper.selectByMap(hashMap);
if( organizes.size() == 0 ){
return new ArrayList<>();
}
ArrayList<OrganizeAllList> organizeAllLists = new ArrayList<>();
for(Organize item : organizes ){
OrganizeAllList organizeAllList = new OrganizeAllList();
organizeAllList.setName(item.getName());
organizeAllList.setCode(item.getCode());
organizeAllList.setDesc(item.getDescInfo());
organizeAllList.setParentId(item.getParentId());
organizeAllList.setId(item.getId());
organizeAllList.setCreateTime(item.getCreateTime());
List<OrganizeAllList> list = getList(item.getId());
organizeAllList.setChildren(list.size() == 0 ? null : list);
organizeAllLists.add(organizeAllList);
}
return organizeAllLists;
}
前端调用:
getList() {
fetch("http://localhost:8088/getAll")
.then((response) => {
return response.json();
})
.then((res) => {
this.tableData = res.data || [];
this.refresh = false;
});
}
结尾
以上就是对组织架构管理搬到线上管理的实现过程啦,还有很多可以优化的地方,第一次写 Java 项目很多不熟悉,写的不够好,各位大佬多多指导。
感谢各位看官耐心看完,前后端源码有感兴趣的朋友可以留言私聊呀。