فهرست منبع

add: 添加部门管理模块以及系统用户和部门的映射关系

zqbao 11 ماه پیش
والد
کامیت
15c73bfc69

+ 209 - 0
controllers/sys_department.go

@@ -1,9 +1,13 @@
 package controllers
 
 import (
+	"encoding/json"
 	"eta/eta_mini_crm/models"
+	"eta/eta_mini_crm/models/request"
 	"eta/eta_mini_crm/models/response"
 	"eta/eta_mini_crm/services"
+
+	"github.com/beego/beego/v2/client/orm"
 )
 
 type SysDepartmentController struct {
@@ -35,3 +39,208 @@ func (this *SysDepartmentController) List() {
 	br.Msg = "获取成功"
 	br.Data = resp
 }
+
+// @Title 新增部门
+// @Description 新增部门接口
+// @Param	request	body system.SysDepartmentAddReq true "type json string"
+// @Success 200 新增成功
+// @router /add [post]
+func (this *SysDepartmentController) Add() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	var req request.SysDepartmentAddReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	if len(req.SysDepartmentNames) <= 0 {
+		br.Msg = "部门名称不能为空"
+		return
+	}
+	for _, dep := range req.SysDepartmentNames {
+		count, err := models.GetSysDepartmentCountByParentId(req.SysDepartmentId, dep)
+		if err != nil {
+			br.Msg = "获取数据失败"
+			br.ErrMsg = "获取数据失败,Err:" + err.Error()
+			return
+		}
+		if count <= 0 {
+			sysDepartment := &models.SysDepartment{}
+			sysDepartment.SysDepartmentName = dep
+			sysDepartment.Level = req.Level
+			sysDepartment.ParentId = req.SysDepartmentId
+			err = sysDepartment.Add()
+			if err != nil {
+				br.Msg = "新增失败"
+				br.ErrMsg = "新增失败,Err:" + err.Error()
+				return
+			}
+		}
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "新增成功"
+}
+
+// @Title 编辑部门
+// @Description 编辑部门接口
+// @Param	request	body request.SysDepartmentEditReq true "type json string"
+// @Success 200 编辑成功
+// @router /edit [post]
+func (this *SysDepartmentController) Edit() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	var req request.SysDepartmentEditReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	if req.SysDepartmentId <= 0 {
+		br.Msg = "参数错误"
+		br.ErrMsg = "参数错误,SysDepartmentId 小于等于0 "
+		return
+	}
+	if req.SysDepartmentName == "" {
+		br.Msg = "名称不能为空"
+		return
+	}
+	count, err := models.GetSysDepartmentCountById(req.SysDepartmentId)
+	if err != nil && err != orm.ErrNoRows {
+		br.Msg = "获取数据失败"
+		br.ErrMsg = "获取数据失败,Err:" + err.Error()
+		return
+	}
+	if count <= 0 {
+		br.Msg = "分组不存在,请刷新重试"
+		return
+	}
+	count, err = models.GetSysDepartmentCountByName(req.SysDepartmentName)
+	if err != nil && err != orm.ErrNoRows {
+		br.Msg = "获取数据失败"
+		br.ErrMsg = "获取数据失败,Err:" + err.Error()
+		return
+	}
+	if count > 0 {
+		br.Msg = "名称已存在,请重新输入"
+		return
+	}
+	sysDepartment := &models.SysDepartment{}
+	sysDepartment.SysDepartmentId = req.SysDepartmentId
+	sysDepartment.SysDepartmentName = req.SysDepartmentName
+	err = sysDepartment.Update([]string{"sys_department_name"})
+	if err != nil {
+		br.Msg = "编辑失败,系统错误"
+		br.Msg = "编辑失败,系统错误,Err:" + err.Error()
+		return
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "编辑成功"
+}
+
+// @Title 删除分组
+// @Description 删除分组接口
+// @Param	request	body request.SysDepartmentDeleteReq true "type json string"
+// @Success 200 删除成功
+// @router /delete [post]
+func (this *SysDepartmentController) Delete() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	var req request.SysDepartmentDeleteReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	if req.SysDepartmentId <= 0 {
+		br.Msg = "参数错误"
+		br.ErrMsg = "参数错误,SysDepartmentId 小于等于0 "
+		return
+	}
+	if req.Level <= 0 {
+		br.Msg = "参数错误"
+		br.ErrMsg = "参数错误,Level 小于等于0 "
+		return
+	}
+	err = services.DeleteSysDepartmentById(req.SysDepartmentId, req.Level)
+	if err != nil {
+		br.Msg = "删除失败"
+		br.ErrMsg = "删除失败,系统异常,Err:" + err.Error()
+		return
+	}
+
+	br.Ret = 200
+	br.Msg = "删除成功"
+	br.Success = true
+}
+
+// SetSort
+// @Title 分组排序
+// @Description  分组排序
+// @Param	request	body request.SysDepartmentSortReq true "type json string"
+// @Success 200 修改成功
+// @router /set_sort [post]
+func (this *SysDepartmentController) SetSort() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
+		}
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	var req request.SysDepartmentSortReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	// 一级排序
+	if len(req.DepartmentIds1) > 0 {
+		err = models.UpdateDepartmentSortByIds(req.DepartmentIds1)
+		if err != nil {
+			br.Msg = "操作失败"
+			br.ErrMsg = "批量更新部门排序失败, Err: " + err.Error()
+			return
+		}
+	}
+	// 二级级排序
+	if len(req.DepartmentIds2) > 0 {
+		err = models.UpdateDepartmentSortByIds(req.DepartmentIds2)
+		if err != nil {
+			br.Msg = "操作失败"
+			br.ErrMsg = "批量更新部门排序失败, Err: " + err.Error()
+			return
+		}
+	}
+	// 三级级排序
+	if len(req.DepartmentIds3) > 0 {
+		err = models.UpdateDepartmentSortByIds(req.DepartmentIds3)
+		if err != nil {
+			br.Msg = "操作失败"
+			br.ErrMsg = "批量更新部门排序失败, Err: " + err.Error()
+			return
+		}
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "操作成功"
+}

+ 177 - 0
controllers/sys_role.go

@@ -1,10 +1,14 @@
 package controllers
 
 import (
+	"encoding/json"
 	"eta/eta_mini_crm/models"
+	"eta/eta_mini_crm/models/request"
 	"eta/eta_mini_crm/models/response"
 	"eta/eta_mini_crm/utils"
+	"time"
 
+	"github.com/beego/beego/v2/client/orm"
 	"github.com/rdlucklib/rdluck_tools/paging"
 )
 
@@ -58,3 +62,176 @@ func (this *SysRoleController) List() {
 	br.Msg = "获取成功"
 	br.Data = resp
 }
+
+// @Title 删除角色
+// @Description 删除角色接口
+// @Param	request	body system.SysRoleDeleteReq true "type json string"
+// @Success 200 删除成功
+// @router /delete [post]
+func (this *SysRoleController) Delete() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	var req request.SysRoleDeleteReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	if req.SysRoleId <= 0 {
+		br.Msg = "参数错误"
+		br.ErrMsg = "参数错误,GroupId 小于等于0 "
+		return
+	}
+
+	role, err := models.GetSysRoleById(req.SysRoleId)
+	if err != nil {
+		if err == orm.ErrNoRows {
+			br.Msg = "角色不存在, 请刷新页面"
+			return
+		}
+		br.Msg = "删除失败"
+		br.ErrMsg = "获取角色信息失败, Err: " + err.Error()
+		return
+	}
+	if role.SysRoleName == "admin" {
+		br.Msg = "admin角色不可删除"
+		return
+	}
+	count, err := models.GetSysUserCountByRoleId(req.SysRoleId)
+	if err != nil {
+		br.Msg = "删除失败"
+		br.ErrMsg = "获取用户数量失败,Err: " + err.Error()
+		return
+	}
+	if count > 0 {
+		br.Msg = "角色绑定用户,不可删除"
+		return
+	}
+	err = models.DeleteSysRoleById(req.SysRoleId)
+	if err != nil {
+		br.Msg = "删除失败"
+		br.Msg = "删除角色失败,系统错误,Err: " + err.Error()
+		return
+	}
+
+	br.Msg = "删除成功"
+	br.Ret = 200
+	br.Success = true
+}
+
+// @Title 新增角色
+// @Description 新增角色接口
+// @Param	request	body request.SysRoleAddReq true "type json string"
+// @Success 200 新增成功
+// @router /add [post]
+func (this *SysRoleController) Add() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	var req request.SysRoleAddReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+
+	if req.SysRoleName == "" {
+		br.Msg = "角色名称不能为空"
+		return
+	}
+	count, err := models.GetSysRoleCountByRoleName(req.SysRoleName)
+	if err != nil {
+		br.Msg = "新增角色失败"
+		br.ErrMsg = "新增角色失败,系统异常,Err:" + err.Error()
+		return
+	}
+	if count > 0 {
+		br.Msg = "角色已存在,请重新输入"
+		return
+	}
+	sysRole := &models.SysRole{}
+	sysRole.SysRoleName = req.SysRoleName
+	sysRole.CreateTime = time.Now()
+	sysRole.ModifyTime = time.Now()
+	err = sysRole.Add()
+	if err != nil {
+		br.Msg = "新增角色失败"
+		br.ErrMsg = "新增角色失败,系统异常,Err:" + err.Error()
+		return
+	}
+
+	br.Ret = 200
+	br.Msg = "新增角色成功"
+	br.Success = true
+}
+
+// @Title 新增角色
+// @Description 新增角色接口
+// @Param	request	body request.SysRoleAddReq true "type json string"
+// @Success 200 新增成功
+// @router /edit [post]
+func (this *SysRoleController) Edit() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+
+	var req request.SysRoleEditReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	if req.SysRoleId <= 0 {
+		br.Msg = "参数错误"
+		br.ErrMsg = "参数错误,GroupId 小于等于0 "
+		return
+	}
+	if req.SysRoleName == "" {
+		br.Msg = "分组名称不能为空"
+		return
+	}
+
+	sysRole, err := models.GetSysRoleById(req.SysRoleId)
+	if err != nil {
+		if err == orm.ErrNoRows {
+			br.Msg = "角色不存在,请刷新页面"
+			return
+		}
+		br.Msg = "操作失败"
+		br.ErrMsg = "获取角色失败, Err:" + err.Error()
+		return
+	}
+	if sysRole.SysRoleName == "admin" {
+		br.Msg = "admin角色不可编辑"
+		return
+	}
+	count, err := models.GetSysRoleCountByRoleName(req.SysRoleName)
+	if count > 0 {
+		br.Msg = "名称已存在,请重新输入"
+		return
+	}
+	if err != nil && err != orm.ErrNoRows {
+		br.Msg = "操作失败"
+		br.ErrMsg = "获取重名角色失败,Err:" + err.Error()
+		return
+	}
+	err = models.UpdateSysUserRoleByRoleId(req.SysRoleId, req.SysRoleName)
+	if err != nil {
+		br.Msg = "编辑失败"
+		br.ErrMsg = "编辑角色失败,Err:" + err.Error()
+		return
+	}
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "编辑成功"
+}

+ 111 - 10
controllers/sys_user.go

@@ -73,11 +73,11 @@ func (this *SysUserController) Add() {
 			return
 		}
 	}
-	if req.DepartmentId <= 0 {
+	if req.SysDepartmentId <= 0 {
 		br.Msg = "请选择部门"
 		return
 	}
-	_, err = models.GetSysDepartmentById(req.DepartmentId)
+	_, err = models.GetSysDepartmentById(req.SysDepartmentId)
 	if err != nil {
 		if err == orm.ErrNoRows {
 			br.Msg = "所选部门不存在"
@@ -88,7 +88,7 @@ func (this *SysUserController) Add() {
 		return
 	}
 
-	_, err = models.GetSysRoleById(req.RoleId)
+	_, err = models.GetSysRoleById(req.SysRoleId)
 	if err != nil {
 		if err == orm.ErrNoRows {
 			br.Msg = "所选角色不存在"
@@ -133,14 +133,21 @@ func (this *SysUserController) Add() {
 	sysUser.AreaCode = req.AreaCode
 	sysUser.Phone = req.Phone
 	sysUser.Email = req.Email
-	sysUser.SysDepartmentId = req.DepartmentId
-	sysUser.SysRoleId = req.RoleId
+	sysUser.SysDepartmentId = req.SysDepartmentId
+	sysUser.SysRoleId = req.SysRoleId
 	sysUser.Province = req.Province
 	sysUser.City = req.City
 	sysUser.IsEnabled = req.IsEnabled
 	sysUser.CreateTime = time.Now()
 	sysUser.ModifyTime = time.Now()
-	err = sysUser.Save()
+
+	depPathIds, err := services.GetSysDepartmentPathIdsById(req.SysDepartmentId)
+	if err != nil {
+		br.Msg = "编辑角色失败"
+		br.ErrMsg = "获得部门路径失败,Err:" + err.Error()
+		return
+	}
+	err = models.SaveSysUser(sysUser, depPathIds)
 	if err != nil {
 		br.Msg = "用户添加失败"
 		br.ErrMsg = "用户添加失败,Err:" + err.Error()
@@ -218,7 +225,7 @@ func (this *SysUserController) Edit() {
 		br.ErrMsg = fmt.Sprintf("参数错误,sysUserId<%d>", req.SysUserId)
 		return
 	}
-	if req.RoleId <= 0 {
+	if req.SysRoleId <= 0 {
 		br.Msg = "请选择角色"
 		br.ErrMsg = "角色ID小于等于0"
 		return
@@ -266,7 +273,7 @@ func (this *SysUserController) Edit() {
 	}
 
 	var roleName string
-	roleItem, err := models.GetSysRoleById(req.RoleId)
+	roleItem, err := models.GetSysRoleById(req.SysRoleId)
 	if err != nil {
 		if err == orm.ErrNoRows {
 			br.Msg = "角色不存在,请重新选择"
@@ -286,7 +293,7 @@ func (this *SysUserController) Edit() {
 	sysUser.AreaCode = req.AreaCode
 	sysUser.Phone = req.Phone
 	sysUser.Email = req.Email
-	sysUser.SysRoleId = req.RoleId
+	sysUser.SysRoleId = req.SysRoleId
 	sysUser.SysRoleName = roleName
 	sysUser.Province = req.Province
 	sysUser.City = req.City
@@ -359,10 +366,40 @@ func (this *SysUserController) List() {
 		br.ErrMsg = "获取失败,Err:" + err.Error()
 		return
 	}
+	sysUserList := make([]models.SysUserView, len(list))
+	for i, user := range list {
+		sysUserList[i].SysUserId = user.SysUserId
+		sysUserList[i].SysUserName = user.SysUserName
+		sysUserList[i].SysRealName = user.SysRealName
+		sysUserList[i].Email = user.Email
+		sysUserList[i].Phone = user.Phone
+		sysUserList[i].AreaCode = user.AreaCode
+		sysUserList[i].SysRoleId = user.SysRoleId
+		sysUserList[i].SysRoleName = user.SysRoleName
+		sysUserList[i].SysDepartmentId = user.SysDepartmentId
+		var path string
+		if user.SysDepartmentName1 != "" {
+			path = user.SysDepartmentName1
+		}
+		if user.SysDepartmentName2 != "" {
+			path += "/" + user.SysDepartmentName2
+		}
+		if user.SysDepartmentName3 != "" {
+			path += "/" + user.SysDepartmentName3
+		}
+		sysUserList[i].SysDepartmentName = path
+		sysUserList[i].SysRoleId = user.SysRoleId
+		sysUserList[i].Province = user.Province
+		sysUserList[i].City = user.City
+		sysUserList[i].IsEnabled = user.IsEnabled
+		sysUserList[i].CreateTime = user.CreateTime
+		sysUserList[i].ModifyTime = user.ModifyTime
+	}
+
 	page := paging.GetPaging(currentIndex, pageSize, total)
 
 	resp := new(response.SysUserListResp)
-	resp.List = list
+	resp.List = sysUserList
 	resp.Paging = page
 	br.Ret = 200
 	br.Success = true
@@ -490,3 +527,67 @@ func (this *SysUserController) EditEnabled() {
 	br.IsAddLog = true
 	br.Msg = "操作成功"
 }
+
+// MoveToDepartment
+// @Title 移动分组
+// @Description 移动分组
+// @Param	request	body system.SysUserMoveReq true "type json string"
+// @Success 200 编辑成功
+// @router /moveToDepartment [post]
+func (this *SysUserController) MoveToDepartment() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+
+	var req request.MoveToDepartmentReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+
+	count, err := models.GetSysUserCountById(req.SysUserId)
+	if err != nil {
+		br.Msg = "移动分组失败,系统错误"
+		br.ErrMsg = "移动分组失败,系统错误,Err:" + err.Error()
+		return
+	}
+	if count <= 0 {
+		br.Msg = "用户已被删除, 请刷新页面"
+		return
+	}
+	count, err = models.GetSysDepartmentCountById(req.SysDepartmentId)
+	if err != nil {
+		br.Msg = "移动分组失败,系统错误"
+		br.ErrMsg = "移动分组失败,系统错误,Err:" + err.Error()
+		return
+	}
+	if count <= 0 {
+		br.Msg = "分组已被删除, 请刷新页面"
+		return
+	}
+	depPathIds, err := services.GetSysDepartmentPathIdsById(req.SysDepartmentId)
+	if err != nil {
+		br.Msg = "移动分组失败,系统错误"
+		br.ErrMsg = "获得分组路径失败,系统错误,Err:" + err.Error()
+		return
+	}
+	userDepMapping := &models.SysUserDepartmentMapping{}
+	userDepMapping.SysUserId = req.SysUserId
+	userDepMapping.SysDepartmentId1 = depPathIds[0]
+	userDepMapping.SysDepartmentId2 = depPathIds[1]
+	userDepMapping.SysDepartmentId3 = depPathIds[2]
+	err = userDepMapping.Save()
+	if err != nil {
+		br.Msg = "移动分组失败,系统错误"
+		br.ErrMsg = "移动分组失败,系统错误,Err:" + err.Error()
+		return
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "移动分组成功"
+}

+ 1 - 0
models/db.go

@@ -33,5 +33,6 @@ func init() {
 		new(SysDepartment),
 		new(SysMenu),
 		new(SysRoleMenuMapping),
+		new(SysUserDepartmentMapping),
 	)
 }

+ 23 - 0
models/request/sys_department.go

@@ -0,0 +1,23 @@
+package request
+
+type SysDepartmentAddReq struct {
+	SysDepartmentId    int      `description:"部门id"`
+	SysDepartmentNames []string `description:"部门名称"`
+	Level              int      `description:"目录等级"`
+}
+
+type SysDepartmentEditReq struct {
+	SysDepartmentId   int    `description:"部门ID"`
+	SysDepartmentName string `description:"部门名称"`
+}
+
+type SysDepartmentDeleteReq struct {
+	SysDepartmentId int `description:"部门ID"`
+	Level           int `description:"目录层级"`
+}
+
+type SysDepartmentSortReq struct {
+	DepartmentIds1 []int `description:"移动后的一级ID排序"`
+	DepartmentIds2 []int `description:"移动后的二级ID排序"`
+	DepartmentIds3 []int `description:"移动后的三级ID排序"`
+}

+ 14 - 0
models/request/sys_role.go

@@ -0,0 +1,14 @@
+package request
+
+type SysRoleDeleteReq struct {
+	SysRoleId int `description:"角色ID"`
+}
+
+type SysRoleAddReq struct {
+	SysRoleName string `description:"角色名称"`
+}
+
+type SysRoleEditReq struct {
+	SysRoleId   int    `description:"角色ID"`
+	SysRoleName string `description:"角色名称"`
+}

+ 17 - 12
models/request/sys_user.go

@@ -1,18 +1,18 @@
 package request
 
 type SysUserInfoReq struct {
-	SysUserId    int    `description:"id"`
-	SysUserName  string `description:"账号"`
-	Password     string `description:"密码"`
-	RealName     string `description:"姓名"`
-	Phone        string `description:"手机号"`
-	AreaCode     string `description:"区号"`
-	DepartmentId int    `description:"部门id"`
-	Email        string `description:"邮箱"`
-	RoleId       int    `description:"角色id"`
-	Province     string `description:"省"`
-	City         string `description:"市"`
-	IsEnabled    bool   `description:"是否启用"`
+	SysUserId       int    `description:"id"`
+	SysUserName     string `description:"账号"`
+	Password        string `description:"密码"`
+	RealName        string `description:"姓名"`
+	Phone           string `description:"手机号"`
+	AreaCode        string `description:"区号"`
+	SysDepartmentId int    `description:"部门id"`
+	Email           string `description:"邮箱"`
+	SysRoleId       int    `description:"角色id"`
+	Province        string `description:"省"`
+	City            string `description:"市"`
+	IsEnabled       bool   `description:"是否启用"`
 }
 
 type ResetPasswordReq struct {
@@ -25,3 +25,8 @@ type SysUserEditEnabledReq struct {
 	SysUserId int  `description:"用户id"`
 	IsEnabled bool `description:"是否启用"`
 }
+
+type MoveToDepartmentReq struct {
+	SysUserId       int `description:"用户id"`
+	SysDepartmentId int `description:"部门id"`
+}

+ 1 - 1
models/response/sys_user.go

@@ -7,6 +7,6 @@ import (
 )
 
 type SysUserListResp struct {
-	List   []*models.SysUser
+	List   []models.SysUserView
 	Paging *paging.PagingItem `description:"分页数据"`
 }

+ 95 - 1
models/sys_department.go

@@ -1,17 +1,33 @@
 package models
 
 import (
+	"context"
+	"eta/eta_mini_crm/utils"
+	"fmt"
+
 	"github.com/beego/beego/v2/client/orm"
 )
 
 type SysDepartment struct {
-	SysDepartmentId   int    `description:"部门id"`
+	SysDepartmentId   int    `orm:"pk" description:"部门id"`
 	SysDepartmentName string `description:"部门名称"`
 	Sort              int    `description:"排序"`
 	Level             int    `description:"层级"`
 	ParentId          int    `description:"父目录id"`
 }
 
+func (s *SysDepartment) Add() (err error) {
+	o := orm.NewOrmUsingDB("master")
+	_, err = o.Insert(s)
+	return
+}
+
+func (s *SysDepartment) Update(cols []string) (err error) {
+	o := orm.NewOrmUsingDB("master")
+	_, err = o.Update(s, cols...)
+	return
+}
+
 type SysDepartmentList struct {
 	SysDepartmentId   int                  `description:"部门id"`
 	SysDepartmentName string               `description:"部门名称"`
@@ -20,6 +36,56 @@ type SysDepartmentList struct {
 	ParentId          int                  `description:"父目录id"`
 }
 
+func DeleteSysDepartmentById(sysDepartmentIds []string, level int) (err error) {
+	o := orm.NewOrmUsingDB("master")
+	err = o.DoTx(func(ctx context.Context, txOrm orm.TxOrmer) error {
+		sql := `DELETE FROM sys_department WHERE sys_department_id IN (?) `
+		_, e := txOrm.QueryTable(&SysDepartment{}).
+			Filter("sys_department_id__in", sysDepartmentIds).
+			Delete()
+		if e != nil {
+			return e
+		}
+		if level == 1 {
+			sql = `DELETE FROM sys_user_department_mapping WHERE sys_department_id1=?`
+			_, e = txOrm.Raw(sql, sysDepartmentIds[0]).Exec()
+			if e != nil {
+				return e
+			}
+		} else {
+			sql = `UPDATE sys_user_department_mapping SET `
+			for i := level; i <= utils.MaxDepartmentLevel; i++ {
+				sql += fmt.Sprintf("sys_department_id%d=0 ", i)
+				if i != utils.MaxDepartmentLevel {
+					sql += ","
+				}
+			}
+			sql += fmt.Sprintf("WHERE sys_department_id%d=?", level)
+			_, e = txOrm.Raw(sql, sysDepartmentIds[0]).Exec()
+			if e != nil {
+				return e
+			}
+		}
+		return nil
+	})
+	return
+}
+
+func UpdateDepartmentSortByIds(sysDepartmentIds []int) (err error) {
+	o := orm.NewOrmUsingDB("master")
+	err = o.DoTx(func(ctx context.Context, txOrm orm.TxOrmer) error {
+		sql := `UPDATE sys_department SET sort=? WHERE sys_department_id=?`
+		for i, depId := range sysDepartmentIds {
+			_, e := txOrm.Raw(sql, i+1, depId).Exec()
+			if e != nil {
+				return e
+			}
+		}
+		return nil
+	})
+	return
+}
+
 func GetSysDepartmentById(sysDepartmentId int) (item *SysDepartment, err error) {
 	o := orm.NewOrmUsingDB("master")
 	sql := `SELECT * FROM sys_department WHERE sys_department_id=? `
@@ -27,6 +93,27 @@ func GetSysDepartmentById(sysDepartmentId int) (item *SysDepartment, err error)
 	return
 }
 
+func GetSysDepartmentCountById(sysDepartmentId int) (count int, err error) {
+	o := orm.NewOrmUsingDB("master")
+	sql := `SELECT COUNT(1) AS count FROM sys_department WHERE sys_department_id=?`
+	err = o.Raw(sql, sysDepartmentId).QueryRow(&count)
+	return
+}
+
+func GetSysDepartmentCountByParentId(parentId int, sysDepartmentName string) (count int, err error) {
+	o := orm.NewOrmUsingDB("master")
+	sql := `SELECT COUNT(1) AS count FROM sys_department WHERE parent_id=? AND sys_department_name=?`
+	err = o.Raw(sql, parentId, sysDepartmentName).QueryRow(&count)
+	return
+}
+
+func GetSysDepartmentCountByName(sysDepartmentName string) (count int, err error) {
+	o := orm.NewOrmUsingDB("master")
+	sql := `SELECT COUNT(1) AS count FROM sys_department WHERE sys_department_name=?`
+	err = o.Raw(sql, sysDepartmentName).QueryRow(&count)
+	return
+}
+
 func GetSysDepartmentListByLevel(level int) (items []*SysDepartmentList, err error) {
 	o := orm.NewOrmUsingDB("master")
 	sql := `SELECT * FROM sys_department WHERE level=? ORDER BY sort`
@@ -47,3 +134,10 @@ func GetChildSysDepartmentListById(sysDepartmentId int) (items []*SysDepartmentL
 	_, err = o.Raw(sql, sysDepartmentId).QueryRows(&items)
 	return
 }
+
+func GetChildSysDepartmentListByIds(sysDepartmentIds string) (items []*SysDepartmentList, err error) {
+	o := orm.NewOrmUsingDB("master")
+	sql := `SELECT * FROM sys_department WHERE parent_id in (?) `
+	_, err = o.Raw(sql, sysDepartmentIds).QueryRows(&items)
+	return
+}

+ 36 - 3
models/sys_role.go

@@ -1,21 +1,54 @@
 package models
 
 import (
+	"context"
 	"time"
 
 	"github.com/beego/beego/v2/client/orm"
 )
 
 type SysRole struct {
-	SysRoleId   int       `description:"角色id"`
+	SysRoleId   int       `orm:"pk" description:"角色id"`
 	SysRoleName string    `description:"姓名"`
 	CreateTime  time.Time `description:"创建时间"`
 	ModifyTime  time.Time `description:"更新时间"`
 }
 
-func (s *SysRole) Save() (err error) {
+func (s *SysRole) Add() (err error) {
 	o := orm.NewOrmUsingDB("master")
-	_, err = o.InsertOrUpdate(s)
+	_, err = o.Insert(s)
+	return
+}
+
+func DeleteSysRoleById(roleId int) (err error) {
+	sql := `DELETE FROM sys_role WHERE sys_role_id=? `
+	o := orm.NewOrmUsingDB("master")
+	_, err = o.Raw(sql, roleId).Exec()
+	return
+}
+
+func GetSysRoleCountByRoleName(roleName string) (count int, err error) {
+	sql := `SELECT COUNT(1) AS count FROM sys_role WHERE sys_role_name=? `
+	o := orm.NewOrmUsingDB("master")
+	err = o.Raw(sql, roleName).QueryRow(&count)
+	return
+}
+
+func UpdateSysUserRoleByRoleId(roleId int, roleName string) (err error) {
+	o := orm.NewOrmUsingDB("master")
+	err = o.DoTx(func(ctx context.Context, txOrm orm.TxOrmer) error {
+		role := &SysRole{}
+		role.SysRoleId = roleId
+		role.SysRoleName = roleName
+		role.ModifyTime = time.Now()
+		_, e := txOrm.Update(role, "sys_role_id", "sys_role_name", "modify_time")
+		if e != nil {
+			return e
+		}
+		sql := `UPDATE sys_user SET sys_role_name=? WHERE sys_role_id=?`
+		_, e = txOrm.Raw(sql, roleName, roleId).Exec()
+		return e
+	})
 	return
 }
 

+ 1 - 1
models/sys_session.go

@@ -31,7 +31,7 @@ func GetSysSessionByToken(token string) (item *SysSession, err error) {
 
 // ExpiredSysSessionBySysUserId 过期掉用户token
 func ExpiredSysSessionBySysUserId(sysUserId int) (err error) {
-	sql := `UPDATE sys_session SET expired_time = NOW()  WHERE sys_user_id=? `
+	sql := `UPDATE sys_session SET expired_time = NOW()  WHERE sys_user_id=? AND expired_time > NOW()`
 	o := orm.NewOrmUsingDB("master")
 	_, err = o.Raw(sql, sysUserId).Exec()
 	return

+ 88 - 3
models/sys_user.go

@@ -1,12 +1,31 @@
 package models
 
 import (
+	"context"
 	"time"
 
 	"github.com/beego/beego/v2/client/orm"
 )
 
 type SysUser struct {
+	SysUserId       int       `orm:"pk" description:"系统用户id"`
+	SysUserName     string    `description:"账号"`
+	SysRealName     string    `description:"姓名"`
+	Password        string    `description:"密码"`
+	Email           string    `description:"邮箱"`
+	Phone           string    `description:"手机号"`
+	AreaCode        string    `description:"手机区号"`
+	SysRoleId       int       `description:"角色id"`
+	SysRoleName     string    `description:"角色名称"`
+	SysDepartmentId int       `description:"所属部门id"`
+	Province        string    `description:"省"`
+	City            string    `description:"市"`
+	IsEnabled       bool      `description:"是否启用"`
+	CreateTime      time.Time `description:"创建时间"`
+	ModifyTime      time.Time `description:"更新时间"`
+}
+
+type SysUserView struct {
 	SysUserId         int       `orm:"pk" description:"系统用户id"`
 	SysUserName       string    `description:"账号"`
 	SysRealName       string    `description:"姓名"`
@@ -25,6 +44,27 @@ type SysUser struct {
 	ModifyTime        time.Time `description:"更新时间"`
 }
 
+type SysUserMapping struct {
+	SysUserId          int       `orm:"pk" description:"系统用户id"`
+	SysUserName        string    `description:"账号"`
+	SysRealName        string    `description:"姓名"`
+	Password           string    `description:"密码"`
+	Email              string    `description:"邮箱"`
+	Phone              string    `description:"手机号"`
+	AreaCode           string    `description:"手机区号"`
+	SysRoleId          int       `description:"角色id"`
+	SysRoleName        string    `description:"角色名称"`
+	SysDepartmentId    int       `description:"所属部门id"`
+	SysDepartmentName1 string    `description:"所属部门一级"`
+	SysDepartmentName2 string    `description:"所属部门二级路径"`
+	SysDepartmentName3 string    `description:"所属部门三级路径"`
+	Province           string    `description:"省"`
+	City               string    `description:"市"`
+	IsEnabled          bool      `description:"是否启用"`
+	CreateTime         time.Time `description:"创建时间"`
+	ModifyTime         time.Time `description:"更新时间"`
+}
+
 func (s *SysUser) Save() (err error) {
 	o := orm.NewOrmUsingDB("master")
 	_, err = o.InsertOrUpdate(s, "sys_user_id")
@@ -37,6 +77,27 @@ func (s *SysUser) Update(cols []string) (err error) {
 	return
 }
 
+func SaveSysUser(sysUser *SysUser, sysDepartmendPathIds []int) (err error) {
+	o := orm.NewOrmUsingDB("master")
+	err = o.DoTx(func(ctx context.Context, txOrm orm.TxOrmer) error {
+		insertId, e := txOrm.InsertOrUpdate(sysUser)
+		if e != nil {
+			return e
+		}
+		userDepMapping := &SysUserDepartmentMapping{}
+		userDepMapping.SysUserId = int(insertId)
+		userDepMapping.SysDepartmentId1 = sysDepartmendPathIds[0]
+		userDepMapping.SysDepartmentId2 = sysDepartmendPathIds[1]
+		userDepMapping.SysDepartmentId3 = sysDepartmendPathIds[2]
+		_, e = txOrm.InsertOrUpdate(userDepMapping)
+		if e != nil {
+			return e
+		}
+		return nil
+	})
+	return
+}
+
 func GetSysUserBySysUserName(sysUserName string) (item *SysUser, err error) {
 	sql := `SELECT * FROM sys_user WHERE sys_user_name=?`
 	o := orm.NewOrmUsingDB("master")
@@ -51,6 +112,13 @@ func GetSysUserById(sysUserId int) (item *SysUser, err error) {
 	return
 }
 
+func GetSysUserCountById(sysUserId int) (count int, err error) {
+	sql := `SELECT COUNT(1) AS count FROM sys_user WHERE sys_user_id=?`
+	o := orm.NewOrmUsingDB("master")
+	err = o.Raw(sql, sysUserId).QueryRow(&count)
+	return
+}
+
 func GetSysUserCountBySysUserName(sysUserName string) (count int, err error) {
 	sql := `SELECT COUNT(1) AS count FROM sys_user WHERE sys_user_name=?`
 	o := orm.NewOrmUsingDB("master")
@@ -68,12 +136,29 @@ func GetSysUserCount(condition string, pars []interface{}) (count int, err error
 	return
 }
 
-func GetSysUserList(condition string, pars []interface{}, startSize, pageSize int) (items []*SysUser, err error) {
-	sql := `SELECT * FROM sys_user WHERE 1=1`
+func GetSysUserCountByRoleId(roleId int) (count int, err error) {
+	sql := `SELECT COUNT(1) AS count FROM sys_user WHERE sys_role_id=?`
+	o := orm.NewOrmUsingDB("master")
+	err = o.Raw(sql, roleId).QueryRow(&count)
+	return
+}
+
+func GetSysUserList(condition string, pars []interface{}, startSize, pageSize int) (items []*SysUserMapping, err error) {
+	sql := `SELECT u.*,d1.sys_department_name sys_department_name1, d2.sys_department_name sys_department_name2, d3.sys_department_name sys_department_name3
+	FROM sys_user u
+	LEFT JOIN sys_user_department_mapping AS ud
+	ON u.sys_user_id = ud.sys_user_id
+	LEFT JOIN sys_department AS d1
+	ON ud.sys_department_id1 = d1.sys_department_id
+	LEFT JOIN sys_department AS d2
+	ON ud.sys_department_id2 = d2.sys_department_id
+	LEFT JOIN sys_department AS d3
+	ON ud.sys_department_id3 = d3.sys_department_id
+	WHERE 1=1 `
 	if condition != "" {
 		sql += condition
 	}
-	sql += `ORDER BY modify_time DESC LIMIT ?,?`
+	sql += `ORDER BY u.is_enabled, u.modify_time DESC LIMIT ?,?`
 	o := orm.NewOrmUsingDB("master")
 	_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
 	return

+ 41 - 0
models/sys_user_department_mapping.go

@@ -0,0 +1,41 @@
+package models
+
+import (
+	"context"
+
+	"github.com/beego/beego/v2/client/orm"
+)
+
+type SysUserDepartmentMapping struct {
+	SysUserId        int `orm:"pk" description:"系统用户id"`
+	SysDepartmentId1 int `description:"一级部门id"`
+	SysDepartmentId2 int `description:"二级部门id"`
+	SysDepartmentId3 int `description:"三级部门id"`
+}
+
+func (s *SysUserDepartmentMapping) Save() (err error) {
+	o := orm.NewOrmUsingDB("master")
+	err = o.DoTx(func(ctx context.Context, txOrm orm.TxOrmer) error {
+		sql := `UPDATE sys_user SET sys_department_id=? WHERE sys_user_id=? `
+		var depId int
+		if s.SysDepartmentId1 != 0 {
+			depId = s.SysDepartmentId1
+		}
+		if s.SysDepartmentId2 != 0 {
+			depId = s.SysDepartmentId2
+		}
+		if s.SysDepartmentId3 != 0 {
+			depId = s.SysDepartmentId3
+		}
+		_, e := txOrm.Raw(sql, depId, s.SysUserId).Exec()
+		if e != nil {
+			return e
+		}
+		_, e = txOrm.InsertOrUpdate(s)
+		if e != nil {
+			return e
+		}
+		return nil
+	})
+	return
+}

+ 72 - 0
routers/commentsRouter.go

@@ -7,6 +7,33 @@ import (
 
 func init() {
 
+    beego.GlobalControllerRouter["eta/eta_mini_crm/controllers:SysDepartmentController"] = append(beego.GlobalControllerRouter["eta/eta_mini_crm/controllers:SysDepartmentController"],
+        beego.ControllerComments{
+            Method: "Add",
+            Router: `/add`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_mini_crm/controllers:SysDepartmentController"] = append(beego.GlobalControllerRouter["eta/eta_mini_crm/controllers:SysDepartmentController"],
+        beego.ControllerComments{
+            Method: "Delete",
+            Router: `/delete`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_mini_crm/controllers:SysDepartmentController"] = append(beego.GlobalControllerRouter["eta/eta_mini_crm/controllers:SysDepartmentController"],
+        beego.ControllerComments{
+            Method: "Edit",
+            Router: `/edit`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["eta/eta_mini_crm/controllers:SysDepartmentController"] = append(beego.GlobalControllerRouter["eta/eta_mini_crm/controllers:SysDepartmentController"],
         beego.ControllerComments{
             Method: "List",
@@ -16,6 +43,42 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["eta/eta_mini_crm/controllers:SysDepartmentController"] = append(beego.GlobalControllerRouter["eta/eta_mini_crm/controllers:SysDepartmentController"],
+        beego.ControllerComments{
+            Method: "SetSort",
+            Router: `/set_sort`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_mini_crm/controllers:SysRoleController"] = append(beego.GlobalControllerRouter["eta/eta_mini_crm/controllers:SysRoleController"],
+        beego.ControllerComments{
+            Method: "Add",
+            Router: `/add`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_mini_crm/controllers:SysRoleController"] = append(beego.GlobalControllerRouter["eta/eta_mini_crm/controllers:SysRoleController"],
+        beego.ControllerComments{
+            Method: "Delete",
+            Router: `/delete`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_mini_crm/controllers:SysRoleController"] = append(beego.GlobalControllerRouter["eta/eta_mini_crm/controllers:SysRoleController"],
+        beego.ControllerComments{
+            Method: "Edit",
+            Router: `/edit`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["eta/eta_mini_crm/controllers:SysRoleController"] = append(beego.GlobalControllerRouter["eta/eta_mini_crm/controllers:SysRoleController"],
         beego.ControllerComments{
             Method: "List",
@@ -70,6 +133,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["eta/eta_mini_crm/controllers:SysUserController"] = append(beego.GlobalControllerRouter["eta/eta_mini_crm/controllers:SysUserController"],
+        beego.ControllerComments{
+            Method: "MoveToDepartment",
+            Router: `/moveToDepartment`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["eta/eta_mini_crm/controllers:SysUserController"] = append(beego.GlobalControllerRouter["eta/eta_mini_crm/controllers:SysUserController"],
         beego.ControllerComments{
             Method: "ResetPass",

+ 46 - 3
services/sys_department.go

@@ -2,6 +2,8 @@ package services
 
 import (
 	"eta/eta_mini_crm/models"
+	"strconv"
+	"strings"
 )
 
 func GetSysDepartmentPathById(sysDepartmentId int) (path string, err error) {
@@ -11,13 +13,13 @@ func GetSysDepartmentPathById(sysDepartmentId int) (path string, err error) {
 	}
 
 	path = sysDepartment.SysDepartmentName
-	curSysDepartmentId := sysDepartmentId
-	for curLevel := sysDepartment.Level; curLevel >= 1; curLevel-- {
+	curSysDepartmentId := sysDepartment.ParentId
+	for curLevel := sysDepartment.Level - 1; curLevel >= 1; curLevel-- {
 		nextSysDepartment, er := models.GetSysDepartmentListByParentId(curSysDepartmentId)
 		if er != nil {
 			return
 		}
-		curSysDepartmentId = nextSysDepartment.SysDepartmentId
+		curSysDepartmentId = nextSysDepartment.ParentId
 		path = nextSysDepartment.SysDepartmentName + "/" + path
 	}
 	return
@@ -43,5 +45,46 @@ func GetSysDepartmentList() ([]*models.SysDepartmentList, error) {
 		}
 	}
 	return departmentList, nil
+}
+
+func DeleteSysDepartmentById(sysDepartmentId, level int) (err error) {
+	sysDepartmentIds := make([]string, 0)
+	sysDepartmentIds = append(sysDepartmentIds, strconv.Itoa(sysDepartmentId))
+	var curIds = sysDepartmentIds
+	var curStringIds string
+	for i := level; i < 3; i++ {
+		curStringIds = strings.Join(curIds, ",")
+		sysDepartments, er := models.GetChildSysDepartmentListByIds(curStringIds)
+
+		if er != nil {
+			return er
+		}
+		curIds = make([]string, 0)
+		for _, dep := range sysDepartments {
+			sysDepartmentIds = append(sysDepartmentIds, strconv.Itoa(dep.SysDepartmentId))
+			curIds = append(curIds, strconv.Itoa(dep.SysDepartmentId))
+		}
+	}
+	err = models.DeleteSysDepartmentById(sysDepartmentIds, level)
+	return
+}
 
+func GetSysDepartmentPathIdsById(sysDepartmentId int) (pathIds []int, err error) {
+	sysDepartment, err := models.GetSysDepartmentById(sysDepartmentId)
+	if err != nil {
+		return
+	}
+
+	pathIds = make([]int, 3)
+	pathIds[sysDepartment.Level-1] = sysDepartmentId
+	curSysDepartmentId := sysDepartment.ParentId
+	for curLevel := sysDepartment.Level - 1; curLevel >= 1; curLevel-- {
+		upSysDepartment, er := models.GetSysDepartmentListByParentId(curSysDepartmentId)
+		if er != nil {
+			return
+		}
+		curSysDepartmentId = upSysDepartment.ParentId
+		pathIds[curLevel-1] = upSysDepartment.SysDepartmentId
+	}
+	return
 }

+ 1 - 0
utils/constants.go

@@ -6,6 +6,7 @@ const (
 )
 
 const PageSize20 = 20
+const MaxDepartmentLevel = 3
 
 // 手机号,电子邮箱正则
 const (