Ver código fonte

新增用户等级

hsun 3 semanas atrás
pai
commit
b31c314f99

+ 54 - 3
controllers/company.go

@@ -79,6 +79,10 @@ func (this *CompanyController) Add() {
 		br.Msg = "请选择营业部"
 		return
 	}
+	if req.UserLevelId <= 0 {
+		br.Msg = "请选择用户等级"
+		return
+	}
 	sellerItem, e := models.GetSysUserById(req.SellerId)
 	if e != nil {
 		if e.Error() == utils.ErrNoRow() {
@@ -89,6 +93,17 @@ func (this *CompanyController) Add() {
 		br.ErrMsg = fmt.Sprintf("获取营业部销售失败, %v", e)
 		return
 	}
+	levelOb := new(models.UserLevel)
+	levelItem, e := levelOb.GetItemById(req.UserLevelId)
+	if e != nil {
+		if e.Error() == utils.ErrNoRow() {
+			br.Msg = "所选用户等级不存在,请刷新页面"
+			return
+		}
+		br.Msg = "操作失败"
+		br.ErrMsg = fmt.Sprintf("获取用户等级失败, %v", e)
+		return
+	}
 
 	// 校验社会统一信用码是否存在
 	companyOb := new(models.Company)
@@ -123,6 +138,8 @@ func (this *CompanyController) Add() {
 	companyOb.AuthStatus = models.AuthStatusOpen
 	companyOb.CreateTime = time.Now().Local()
 	companyOb.ModifyTime = time.Now().Local()
+	companyOb.UserLevelId = req.UserLevelId
+	companyOb.UserLevelName = levelItem.LevelName
 	if e := companyOb.Create(); e != nil {
 		br.Msg = "操作失败"
 		br.ErrMsg = fmt.Sprintf("新增机构失败, %v", e)
@@ -213,6 +230,10 @@ func (this *CompanyController) Edit() {
 		br.Msg = "请选择营业部"
 		return
 	}
+	if req.UserLevelId <= 0 {
+		br.Msg = "请选择用户等级"
+		return
+	}
 	companyOb := new(models.Company)
 	companyItem, e := companyOb.GetItemById(req.CompanyId)
 	if e != nil {
@@ -224,6 +245,7 @@ func (this *CompanyController) Edit() {
 		br.ErrMsg = fmt.Sprintf("获取机构失败, %v", e)
 		return
 	}
+
 	// 操作权限校验
 	if sysUser.SysRoleId != utils.AdminRoleId {
 		if sysUser.SysUserId != companyItem.SysUserId && sysUser.SysUserId != companyItem.SellerId {
@@ -242,6 +264,17 @@ func (this *CompanyController) Edit() {
 		br.ErrMsg = fmt.Sprintf("获取营业部销售失败, %v", e)
 		return
 	}
+	levelOb := new(models.UserLevel)
+	levelItem, e := levelOb.GetItemById(req.UserLevelId)
+	if e != nil {
+		if e.Error() == utils.ErrNoRow() {
+			br.Msg = "所选用户等级不存在,请刷新页面"
+			return
+		}
+		br.Msg = "操作失败"
+		br.ErrMsg = fmt.Sprintf("获取用户等级失败, %v", e)
+		return
+	}
 
 	// 校验社会统一信用码是否存在
 	{
@@ -261,10 +294,13 @@ func (this *CompanyController) Edit() {
 	}
 
 	// 更新机构
-	var updateName bool
+	var updateName, updateLevel bool
 	if companyItem.CompanyName != req.CompanyName {
 		updateName = true
 	}
+	if companyItem.UserLevelId != req.UserLevelId {
+		updateLevel = true
+	}
 	companyItem.CompanyName = req.CompanyName
 	companyItem.CreditCode = req.CreditCode
 	companyItem.ProvinceId = req.ProvinceId
@@ -276,8 +312,10 @@ func (this *CompanyController) Edit() {
 	companyItem.SellerId = req.SellerId
 	companyItem.SellerName = sellerItem.SysRealName
 	companyItem.ModifyTime = time.Now().Local()
+	companyItem.UserLevelId = levelItem.UserLevelId
+	companyItem.UserLevelName = levelItem.LevelName
 	updateCols := []string{
-		companyOb.Cols().CompanyName, companyOb.Cols().CreditCode, companyOb.Cols().ProvinceId, companyOb.Cols().Province, companyOb.Cols().CityId, companyOb.Cols().City, companyOb.Cols().Address, companyOb.Cols().Industry, companyOb.Cols().SellerId, companyOb.Cols().SellerName, companyOb.Cols().ModifyTime,
+		companyOb.Cols().CompanyName, companyOb.Cols().CreditCode, companyOb.Cols().ProvinceId, companyOb.Cols().Province, companyOb.Cols().CityId, companyOb.Cols().City, companyOb.Cols().Address, companyOb.Cols().Industry, companyOb.Cols().SellerId, companyOb.Cols().SellerName, companyOb.Cols().ModifyTime, companyOb.Cols().UserLevelId, companyOb.Cols().UserLevelName,
 	}
 	if e := companyItem.Update(updateCols); e != nil {
 		br.Msg = "操作失败"
@@ -286,14 +324,21 @@ func (this *CompanyController) Edit() {
 	}
 
 	// 更新冗余字段
+	userOb := new(models.Users)
 	if updateName {
-		userOb := new(models.Users)
 		if e = userOb.UpdateCompanyNameById(req.CompanyId, req.CompanyName); e != nil {
 			br.Msg = "操作失败"
 			br.ErrMsg = fmt.Sprintf("更新用户表机构名称失败, CompanyId: %d, CompanyName: %s, ErrMsg: %v", req.CompanyId, req.CompanyName, e)
 			return
 		}
 	}
+	if updateLevel {
+		if e = userOb.UpdateUserLevelNameByCompanyId(req.CompanyId, companyItem.UserLevelId, companyItem.UserLevelName); e != nil {
+			br.Msg = "操作失败"
+			br.ErrMsg = fmt.Sprintf("更新用户表等级失败, CompanyId: %d, UserLevelId: %d, UserLevelName: %s, ErrMsg: %v", req.CompanyId, companyItem.UserLevelId, companyItem.UserLevelName, e)
+			return
+		}
+	}
 
 	// 操作记录
 	go func() {
@@ -676,6 +721,12 @@ func (this *CompanyController) PageList() {
 			cond += fmt.Sprintf(` AND (%s BETWEEN ? AND ?)`, companyOb.Cols().CreateTime)
 			pars = append(pars, fmt.Sprintf("%s 00:00:00", params.StartTime), fmt.Sprintf("%s 23:59:59", params.EndTime))
 		}
+
+		// 用户等级
+		if params.UserLevelId > 0 {
+			cond += fmt.Sprintf(` AND %s = ?`, companyOb.Cols().UserLevelId)
+			pars = append(pars, params.UserLevelId)
+		}
 	}
 
 	// 分页

+ 538 - 0
controllers/user_level.go

@@ -0,0 +1,538 @@
+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"
+	"fmt"
+	"github.com/rdlucklib/rdluck_tools/paging"
+	"strings"
+	"time"
+)
+
+// UserLevelController 用户等级
+type UserLevelController struct {
+	BaseAuthController
+}
+
+// Add
+// @Title 新增用户等级
+// @Description 新增用户等级
+// @Param	request	body request.UserLevelAddReq true "type json string"
+// @Success 200 Ret=200 操作成功
+// @router /level/add [post]
+func (this *UserLevelController) Add() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
+		}
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+	var req request.UserLevelAddReq
+	if e := json.Unmarshal(this.Ctx.Input.RequestBody, &req); e != nil {
+		br.Msg = "参数解析异常"
+		br.ErrMsg = fmt.Sprintf("参数解析异常, %v", e)
+		return
+	}
+	if req.LevelRank <= 0 {
+		br.Msg = "请输入正确的等级"
+		return
+	}
+	req.LevelName = strings.TrimSpace(req.LevelName)
+	if req.LevelName == "" {
+		br.Msg = "请输入等级名称"
+		return
+	}
+	if len(req.ClassifyIds) == 0 {
+		br.Msg = "请选择阅读权限"
+		return
+	}
+
+	// 校验等级名称是否重复
+	levelOb := new(models.UserLevel)
+	//{
+	//	cond := fmt.Sprintf(` AND %s = ?`, levelOb.Cols().LevelName)
+	//	pars := make([]interface{}, 0)
+	//	pars = append(pars, req.LevelName)
+	//	exist, e := levelOb.GetItemByCondition(cond, pars, "")
+	//	if e != nil && e.Error() != utils.ErrNoRow() {
+	//		br.Msg = "操作失败"
+	//		br.ErrMsg = fmt.Sprintf("获取同名用户等级失败, %v", e)
+	//		return
+	//	}
+	//	if exist != nil && exist.UserLevelId > 0 {
+	//		br.Msg = "等级名称已存在"
+	//		return
+	//	}
+	//}
+
+	levelOb.LevelRank = req.LevelRank
+	levelOb.LevelName = req.LevelName
+	levelOb.State = req.State
+	levelOb.SysUserId = sysUser.SysUserId
+	levelOb.SysUserRealName = sysUser.SysRealName
+	levelOb.CreateTime = time.Now().Local()
+	levelOb.ModifyTime = time.Now().Local()
+	if e := levelOb.Create(); e != nil {
+		br.Msg = "操作失败"
+		br.ErrMsg = fmt.Sprintf("新增用户等级失败, %v", e)
+		return
+	}
+	mappings := make([]*models.UserLevelMapping, 0)
+	classifyIds := make([]int, 0)
+	for _, v := range req.ClassifyIds {
+		m := new(models.UserLevelMapping)
+		m.ClassifyId = v
+		m.UserLevelId = levelOb.UserLevelId
+		m.CreateTime = time.Now().Local()
+		mappings = append(mappings, m)
+		classifyIds = append(classifyIds, m.ClassifyId)
+	}
+	mappingOb := new(models.UserLevelMapping)
+	if e := mappingOb.CreateMulti(mappings); e != nil {
+		br.Msg = "操作失败"
+		br.ErrMsg = fmt.Sprintf("新增用户等级权限失败, %v", e)
+		return
+	}
+	resp := levelOb.Format2Item()
+	resp.ClassifyIds = classifyIds
+
+	br.Data = resp
+	br.Ret = 200
+	br.Msg = "操作成功"
+	br.Success = true
+}
+
+// Edit
+// @Title 编辑用户等级
+// @Description 编辑用户等级
+// @Param	request	body request.UserLevelEditReq true "type json string"
+// @Success 200 Ret=200 操作成功
+// @router /level/edit [post]
+func (this *UserLevelController) Edit() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
+		}
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+	var req request.UserLevelEditReq
+	if e := json.Unmarshal(this.Ctx.Input.RequestBody, &req); e != nil {
+		br.Msg = "参数解析异常"
+		br.ErrMsg = fmt.Sprintf("参数解析异常, %v", e)
+		return
+	}
+	if req.UserLevelId <= 0 {
+		br.Msg = "参数有误"
+		return
+	}
+	if req.LevelRank <= 0 {
+		br.Msg = "请输入正确的等级"
+		return
+	}
+	req.LevelName = strings.TrimSpace(req.LevelName)
+	if req.LevelName == "" {
+		br.Msg = "请输入等级名称"
+		return
+	}
+	if len(req.ClassifyIds) == 0 {
+		br.Msg = "请选择阅读权限"
+		return
+	}
+
+	// 校验是否已删除
+	levelOb := new(models.UserLevel)
+	levelItem, e := levelOb.GetItemById(req.UserLevelId)
+	if e != nil {
+		if e.Error() == utils.ErrNoRow() {
+			br.Msg = "等级不存在,请刷新页面"
+			return
+		}
+		br.Msg = "操作失败"
+		br.ErrMsg = fmt.Sprintf("获取用户等级失败, %v", e)
+		return
+	}
+	originName := levelItem.LevelName
+
+	// 校验等级名称是否重复
+	//{
+	//	cond := fmt.Sprintf(` AND %s <> ? AND %s = ?`, levelOb.Cols().PrimaryId, levelOb.Cols().LevelName)
+	//	pars := make([]interface{}, 0)
+	//	pars = append(pars, req.UserLevelId, req.LevelName)
+	//	exist, e := levelOb.GetItemByCondition(cond, pars, "")
+	//	if e != nil && e.Error() != utils.ErrNoRow() {
+	//		br.Msg = "操作失败"
+	//		br.ErrMsg = fmt.Sprintf("获取同名用户等级失败, %v", e)
+	//		return
+	//	}
+	//	if exist != nil && exist.UserLevelId > 0 {
+	//		br.Msg = "等级名称已存在"
+	//		return
+	//	}
+	//}
+
+	updateCols := []string{levelOb.Cols().LevelRank, levelOb.Cols().LevelName, levelOb.Cols().State, levelOb.Cols().ModifyTime}
+	levelItem.LevelRank = req.LevelRank
+	levelItem.LevelName = req.LevelName
+	levelItem.State = req.State
+	levelItem.ModifyTime = time.Now().Local()
+	if e := levelItem.Update(updateCols); e != nil {
+		br.Msg = "操作失败"
+		br.ErrMsg = fmt.Sprintf("更新用户等级失败, %v", e)
+		return
+	}
+
+	// 移除并新增权限
+	mappingOb := new(models.UserLevelMapping)
+	cond := fmt.Sprintf(`%s = ?`, mappingOb.Cols().UserLevelId)
+	pars := make([]interface{}, 0)
+	pars = append(pars, levelItem.UserLevelId)
+	if e = mappingOb.RemoveByCondition(cond, pars); e != nil {
+		br.Msg = "操作失败"
+		br.ErrMsg = fmt.Sprintf("移除用户等级权限失败, %v", e)
+		return
+	}
+	mappings := make([]*models.UserLevelMapping, 0)
+	classifyIds := make([]int, 0)
+	for _, v := range req.ClassifyIds {
+		m := new(models.UserLevelMapping)
+		m.ClassifyId = v
+		m.UserLevelId = levelItem.UserLevelId
+		m.CreateTime = time.Now().Local()
+		mappings = append(mappings, m)
+		classifyIds = append(classifyIds, m.ClassifyId)
+	}
+	if e = mappingOb.CreateMulti(mappings); e != nil {
+		br.Msg = "操作失败"
+		br.ErrMsg = fmt.Sprintf("新增用户等级权限失败, %v", e)
+		return
+	}
+
+	// 如果名称有更改,更新冗余字段
+	if originName != req.LevelName {
+		go func() {
+			usersOb := new(models.Users)
+			if e = usersOb.UpdateUserLevelName(req.UserLevelId, req.LevelName); e != nil {
+				utils.FileLog.Info("更新users表用户等级名称失败, %v", e)
+			}
+			companyOb := new(models.Company)
+			if e = companyOb.UpdateUserLevelName(req.UserLevelId, req.LevelName); e != nil {
+				utils.FileLog.Info("更新company表用户等级名称失败, %v", e)
+			}
+		}()
+	}
+	resp := levelItem.Format2Item()
+	resp.ClassifyIds = classifyIds
+
+	br.Data = resp
+	br.Ret = 200
+	br.Msg = "操作成功"
+	br.Success = true
+}
+
+// Remove
+// @Title 删除用户等级
+// @Description 删除用户等级
+// @Param	request	body request.UserLevelRemoveReq true "type json string"
+// @Success 200 Ret=200 操作成功
+// @router /level/remove [post]
+func (this *UserLevelController) Remove() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
+		}
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+	var req request.UserLevelRemoveReq
+	if e := json.Unmarshal(this.Ctx.Input.RequestBody, &req); e != nil {
+		br.Msg = "参数解析异常"
+		br.ErrMsg = fmt.Sprintf("参数解析异常, %v", e)
+		return
+	}
+	if req.UserLevelId <= 0 {
+		br.Msg = "参数有误"
+		br.ErrMsg = fmt.Sprintf("用户等级ID参数有误, UserId: %d", req.UserLevelId)
+		return
+	}
+
+	levelOb := new(models.UserLevel)
+	levelItem, e := levelOb.GetItemById(req.UserLevelId)
+	if e != nil {
+		if e.Error() == utils.ErrNoRow() {
+			br.Msg = "等级不存在,请刷新页面"
+			return
+		}
+		br.Msg = "操作失败"
+		br.ErrMsg = fmt.Sprintf("获取用户等级失败, %v", e)
+		return
+	}
+
+	// 是否关联用户/机构
+	usersOb := new(models.Users)
+	cond := fmt.Sprintf(` AND %s = ?`, usersOb.Cols().UserLevelId)
+	pars := make([]interface{}, 0)
+	pars = append(pars, req.UserLevelId)
+	count, e := usersOb.GetCountByCondition(cond, pars)
+	if e != nil {
+		br.Msg = "操作失败"
+		br.ErrMsg = fmt.Sprintf("获取等级关联用户失败, %v", e)
+		return
+	}
+	if count > 0 {
+		br.Msg = "该等级已关联用户,删除失败"
+		return
+	}
+	companyOb := new(models.Company)
+	count, e = companyOb.GetCountByCondition(cond, pars)
+	if e != nil {
+		br.Msg = "操作失败"
+		br.ErrMsg = fmt.Sprintf("获取等级关联机构失败, %v", e)
+		return
+	}
+	if count > 0 {
+		br.Msg = "该等级已关联用户,删除失败"
+		return
+	}
+
+	// 删除用户等级和权限
+	if e = levelItem.Remove(); e != nil {
+		br.Msg = "操作失败"
+		br.ErrMsg = fmt.Sprintf("删除用户等级失败, %v", e)
+		return
+	}
+	mappingOb := new(models.UserLevelMapping)
+	cond = fmt.Sprintf(`%s = ?`, mappingOb.Cols().UserLevelId)
+	pars = make([]interface{}, 0)
+	pars = append(pars, levelItem.UserLevelId)
+	if e = mappingOb.RemoveByCondition(cond, pars); e != nil {
+		br.Msg = "操作失败"
+		br.ErrMsg = fmt.Sprintf("移除用户等级权限失败, %v", e)
+		return
+	}
+
+	br.Ret = 200
+	br.Msg = "操作成功"
+	br.Success = true
+}
+
+// Detail
+// @Title 用户等级详情
+// @Description 用户等级详情
+// @Param   UserLevelId  query  int  true  "用户等级ID"
+// @Success 200 {object} models.UserLevelItem
+// @router /level/detail [get]
+func (this *UserLevelController) Detail() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
+		}
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+	userLevelId, _ := this.GetInt("UserLevelId")
+	if userLevelId <= 0 {
+		br.Msg = "参数有误"
+		br.ErrMsg = fmt.Sprintf("参数有误, %d", userLevelId)
+		return
+	}
+
+	levelOb := new(models.UserLevel)
+	levelItem, e := levelOb.GetItemById(userLevelId)
+	if e != nil {
+		if e.Error() == utils.ErrNoRow() {
+			br.Msg = "等级不存在,请刷新页面"
+			return
+		}
+		br.Msg = "获取失败"
+		br.ErrMsg = fmt.Sprintf("获取用户等级失败, %v", e)
+		return
+	}
+	resp := levelItem.Format2Item()
+
+	// 关联权限
+	mappingOb := new(models.UserLevelMapping)
+	cond := fmt.Sprintf(` AND %s = ?`, mappingOb.Cols().UserLevelId)
+	pars := make([]interface{}, 0)
+	pars = append(pars, levelItem.UserLevelId)
+	mappings, e := mappingOb.GetItemsByCondition(cond, pars, []string{}, "")
+	if e != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = fmt.Sprintf("获取用户等级关联权限失败, %v", e)
+		return
+	}
+	for _, v := range mappings {
+		resp.ClassifyIds = append(resp.ClassifyIds, v.ClassifyId)
+	}
+
+	br.Data = resp
+	br.Ret = 200
+	br.Msg = "获取成功"
+	br.Success = true
+}
+
+// PageList
+// @Title 用户等级列表-分页
+// @Description 用户等级列表-分页
+// @Param	request	body request.UserLevelListForm true "type json string"
+// @Success 200 {object} response.UserLevelPageListResp
+// @router /level/page_list [get]
+func (this *UserLevelController) PageList() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
+		}
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+	params := new(request.UserLevelListForm)
+	if e := this.ParseForm(params); e != nil {
+		br.Msg = "参数解析异常"
+		br.ErrMsg = fmt.Sprintf("参数解析异常, %v", e)
+		return
+	}
+	resp := new(response.UserLevelPageListResp)
+
+	// 分页
+	var startSize int
+	if params.PageSize <= 0 {
+		params.PageSize = utils.PageSize20
+	}
+	if params.CurrentIndex <= 0 {
+		params.CurrentIndex = 1
+	}
+	startSize = utils.StartIndex(params.CurrentIndex, params.PageSize)
+
+	// 查询列表
+	levelOb := new(models.UserLevel)
+	cond := ``
+	pars := make([]interface{}, 0)
+	if params.OnlyEnabled {
+		cond += fmt.Sprintf(` AND %s = ?`, levelOb.Cols().State)
+		pars = append(pars, models.UserLevelEnabled)
+	}
+	total, e := levelOb.GetCountByCondition(cond, pars)
+	if e != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = fmt.Sprintf("获取用户等级列表总数失败, %v", e)
+		return
+	}
+	orderRule := fmt.Sprintf(`%s ASC, %s DESC`, levelOb.Cols().LevelRank, levelOb.Cols().CreateTime)
+	list, e := levelOb.GetPageItemsByCondition(cond, pars, []string{}, orderRule, startSize, params.PageSize)
+	if e != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = fmt.Sprintf("获取用户等级列表失败, %v", e)
+		return
+	}
+	respList := make([]*models.UserLevelItem, 0)
+	for _, v := range list {
+		respList = append(respList, v.Format2Item())
+	}
+
+	page := paging.GetPaging(params.CurrentIndex, params.PageSize, total)
+	resp.Paging = page
+	resp.List = respList
+	br.Data = resp
+	br.Ret = 200
+	br.Msg = "获取成功"
+	br.Success = true
+}
+
+// List
+// @Title 用户等级列表
+// @Description 用户等级列表
+// @Param	request	body request.UserLevelListForm true "type json string"
+// @Success 200 {object} response.UserLevelPageListResp
+// @router /level/list [get]
+func (this *UserLevelController) List() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
+		}
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+	params := new(request.UserLevelListForm)
+	if e := this.ParseForm(params); e != nil {
+		br.Msg = "参数解析异常"
+		br.ErrMsg = fmt.Sprintf("参数解析异常, %v", e)
+		return
+	}
+	resp := make([]*models.UserLevelItem, 0)
+
+	// 查询列表
+	levelOb := new(models.UserLevel)
+	cond := ``
+	pars := make([]interface{}, 0)
+	if params.OnlyEnabled {
+		cond += fmt.Sprintf(` AND %s = ?`, levelOb.Cols().State)
+		pars = append(pars, models.UserLevelEnabled)
+	}
+	orderRule := fmt.Sprintf(`%s ASC, %s DESC`, levelOb.Cols().LevelRank, levelOb.Cols().CreateTime)
+	list, e := levelOb.GetItemsByCondition(cond, pars, []string{}, orderRule)
+	if e != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = fmt.Sprintf("获取用户等级列表失败, %v", e)
+		return
+	}
+	for _, v := range list {
+		resp = append(resp, v.Format2Item())
+	}
+
+	br.Data = resp
+	br.Ret = 200
+	br.Msg = "获取成功"
+	br.Success = true
+}

+ 68 - 10
controllers/users.go

@@ -67,12 +67,13 @@ func (this *UsersController) Add() {
 	}
 	// 销售如果是空的那么创建人即为销售
 	var (
-		sellerId                int
-		sellerName, companyName string
+		sellerId, userLevelId                  int
+		sellerName, companyName, userLevelName string
 	)
 	if req.SellerId > 0 {
 		sellerId = req.SellerId
 	}
+	userLevelId = req.UserLevelId
 	if req.CompanyId > 0 {
 		companyOb := new(models.Company)
 		companyItem, e := companyOb.GetItemById(req.CompanyId)
@@ -90,6 +91,8 @@ func (this *UsersController) Add() {
 		if sellerId <= 0 {
 			sellerId = companyItem.SellerId
 		}
+		// 继承机构的权限等级
+		userLevelId = companyItem.UserLevelId
 	}
 	if sellerId > 0 {
 		sellerItem, e := models.GetSysUserById(sellerId)
@@ -104,6 +107,20 @@ func (this *UsersController) Add() {
 		}
 		sellerName = sellerItem.SysRealName
 	}
+	if userLevelId > 0 {
+		levelOb := new(models.UserLevel)
+		levelItem, e := levelOb.GetItemById(userLevelId)
+		if e != nil {
+			if e.Error() == utils.ErrNoRow() {
+				br.Msg = "所选用户等级不存在,请刷新页面"
+				return
+			}
+			br.Msg = "操作失败"
+			br.ErrMsg = fmt.Sprintf("获取用户等级失败, %v", e)
+			return
+		}
+		userLevelName = levelItem.LevelName
+	}
 
 	// 校验手机号是否存在
 	usersOb := new(models.Users)
@@ -136,6 +153,8 @@ func (this *UsersController) Add() {
 	usersOb.AuthStatus = models.AuthStatusOpen
 	usersOb.CreateTime = time.Now().Local()
 	usersOb.ModifyTime = time.Now().Local()
+	usersOb.UserLevelId = userLevelId
+	usersOb.UserLevelName = userLevelName
 	if e := usersOb.Create(); e != nil {
 		br.Msg = "操作失败"
 		br.ErrMsg = fmt.Sprintf("新增用户失败, %v", e)
@@ -214,6 +233,8 @@ func (this *UsersController) Edit() {
 	}
 	// 销售如果是空的那么创建人即为销售
 	var sellerName, companyName string
+	var userLevelId int
+	var userLevelName string
 	if req.SellerId <= 0 {
 		req.SellerId = sysUser.SysUserId
 		sellerName = sysUser.SysRealName
@@ -231,6 +252,7 @@ func (this *UsersController) Edit() {
 		}
 		sellerName = sellerItem.SysRealName
 	}
+	userLevelId = req.UserLevelId
 	if req.CompanyId > 0 {
 		companyOb := new(models.Company)
 		companyItem, e := companyOb.GetItemById(req.CompanyId)
@@ -244,7 +266,23 @@ func (this *UsersController) Edit() {
 			return
 		}
 		companyName = companyItem.CompanyName
+		userLevelId = companyItem.UserLevelId
 	}
+	if userLevelId > 0 {
+		levelOb := new(models.UserLevel)
+		levelItem, e := levelOb.GetItemById(userLevelId)
+		if e != nil {
+			if e.Error() == utils.ErrNoRow() {
+				br.Msg = "所选用户等级不存在,请刷新页面"
+				return
+			}
+			br.Msg = "操作失败"
+			br.ErrMsg = fmt.Sprintf("获取用户等级失败, %v", e)
+			return
+		}
+		userLevelName = levelItem.LevelName
+	}
+
 	usersOb := new(models.Users)
 	userItem, e := usersOb.GetItemById(req.UserId)
 	if e != nil {
@@ -274,10 +312,12 @@ func (this *UsersController) Edit() {
 		}
 	}
 
-	updateCols := []string{usersOb.Cols().RealName, usersOb.Cols().Mobile, usersOb.Cols().AreaCode}
+	updateCols := []string{usersOb.Cols().RealName, usersOb.Cols().Mobile, usersOb.Cols().AreaCode, usersOb.Cols().UserLevelId, usersOb.Cols().UserLevelName}
 	userItem.RealName = req.RealName
 	userItem.Mobile = req.Mobile
 	userItem.AreaCode = req.AreaCode
+	userItem.UserLevelId = userLevelId
+	userItem.UserLevelName = userLevelName
 	if req.SellerId > 0 {
 		userItem.SellerId = req.SellerId
 		userItem.SellerName = sellerName
@@ -469,7 +509,12 @@ func (this *UsersController) Move() {
 	userItem.AuthStatus = companyItem.AuthStatus
 	userItem.Status = models.UserStatusFormal
 	userItem.ModifyTime = time.Now().Local()
-	updateCols := []string{usersOb.Cols().CompanyId, usersOb.Cols().CompanyName, usersOb.Cols().AuthStatus, usersOb.Cols().Status, usersOb.Cols().ModifyTime}
+	userItem.UserLevelId = companyItem.UserLevelId
+	userItem.UserLevelName = companyItem.UserLevelName
+	updateCols := []string{
+		usersOb.Cols().CompanyId, usersOb.Cols().CompanyName, usersOb.Cols().AuthStatus, usersOb.Cols().Status,
+		usersOb.Cols().ModifyTime, usersOb.Cols().UserLevelId, usersOb.Cols().UserLevelName,
+	}
 	if req.RealName != "" {
 		userItem.RealName = req.RealName
 		updateCols = append(updateCols, usersOb.Cols().RealName)
@@ -635,11 +680,13 @@ func (this *UsersController) TransFormal() {
 
 	// 用户类型
 	var (
-		companyId   int
-		companyName string
-		authStatus  int
-		sellerId    int
-		sellerName  string
+		companyId     int
+		companyName   string
+		authStatus    int
+		sellerId      int
+		sellerName    string
+		userLevelId   int
+		userLevelName string
 	)
 	switch req.UserType {
 	case models.UserTypePerson:
@@ -682,6 +729,8 @@ func (this *UsersController) TransFormal() {
 		authStatus = companyItem.AuthStatus
 		sellerId = companyItem.SellerId
 		sellerName = companyItem.SellerName
+		userLevelId = companyItem.UserLevelId
+		userLevelName = companyItem.UserLevelName
 	default:
 		br.Msg = "客户类型有误"
 		br.ErrMsg = fmt.Sprintf("客户类型有误, UserType: %d", req.UserType)
@@ -699,9 +748,12 @@ func (this *UsersController) TransFormal() {
 	userItem.Status = models.UserStatusFormal
 	userItem.AuthStatus = authStatus
 	userItem.ModifyTime = time.Now().Local()
+	userItem.UserLevelId = userLevelId
+	userItem.UserLevelName = userLevelName
 	updateCols := []string{
 		usersOb.Cols().RealName, usersOb.Cols().SellerId, usersOb.Cols().SellerName, usersOb.Cols().CompanyId, usersOb.Cols().CompanyName,
 		usersOb.Cols().SysUserId, usersOb.Cols().SysUserRealName, usersOb.Cols().Status, usersOb.Cols().AuthStatus, usersOb.Cols().ModifyTime,
+		usersOb.Cols().UserLevelId, usersOb.Cols().UserLevelName,
 	}
 	if e := userItem.Update(updateCols); e != nil {
 		br.Msg = "操作失败"
@@ -815,7 +867,7 @@ func (this *UsersController) PageList() {
 
 	// 筛选项
 	{
-		// 机构,默认为个人
+		// 机构筛选,默认为个人
 		cond += fmt.Sprintf(` AND %s = ?`, usersOb.Cols().CompanyId)
 		pars = append(pars, params.CompanyId)
 
@@ -880,6 +932,12 @@ func (this *UsersController) PageList() {
 			cond += fmt.Sprintf(` AND (%s BETWEEN ? AND ?)`, usersOb.Cols().CreateTime)
 			pars = append(pars, fmt.Sprintf("%s 00:00:00", params.StartTime), fmt.Sprintf("%s 23:59:59", params.EndTime))
 		}
+
+		// 用户等级
+		if params.UserLevelId > 0 {
+			cond += fmt.Sprintf(` AND %s = ?`, usersOb.Cols().UserLevelId)
+			pars = append(pars, params.UserLevelId)
+		}
 	}
 
 	// 分页

+ 31 - 14
models/company.go

@@ -27,6 +27,8 @@ type Company struct {
 	IsDeleted       int       `description:"删除状态:0-正常;1-已删除"`
 	CreateTime      time.Time `description:"创建时间"`
 	ModifyTime      time.Time `description:"更新时间"`
+	UserLevelId     int       `description:"用户等级ID"`
+	UserLevelName   string    `description:"用户等级名称"`
 }
 
 func (m *Company) TableName() string {
@@ -51,6 +53,8 @@ type CompanyCols struct {
 	IsDeleted       string
 	CreateTime      string
 	ModifyTime      string
+	UserLevelId     string
+	UserLevelName   string
 }
 
 func (m *Company) Cols() CompanyCols {
@@ -72,6 +76,8 @@ func (m *Company) Cols() CompanyCols {
 		IsDeleted:       "is_deleted",
 		CreateTime:      "create_time",
 		ModifyTime:      "modify_time",
+		UserLevelId:     "user_level_id",
+		UserLevelName:   "user_level_name",
 	}
 }
 
@@ -184,20 +190,22 @@ func (m *Company) GetPageItemsByCondition(condition string, pars []interface{},
 
 // CompanyItem 机构信息
 type CompanyItem struct {
-	CompanyId   int    `description:"机构ID"`
-	CompanyName string `description:"机构名称"`
-	CreditCode  string `description:"社会统一信用码"`
-	ProvinceId  int    `description:"省ID"`
-	Province    string `description:"省"`
-	CityId      int    `description:"市ID"`
-	City        string `description:"市"`
-	Address     string `description:"详细地址"`
-	Industry    string `description:"行业"`
-	AuthStatus  int    `description:"权限状态:0-关闭;1-开启"`
-	SellerId    int    `description:"销售ID"`
-	SellerName  string `description:"销售名称"`
-	CreateTime  string `description:"创建时间"`
-	ModifyTime  string `description:"更新时间"`
+	CompanyId     int    `description:"机构ID"`
+	CompanyName   string `description:"机构名称"`
+	CreditCode    string `description:"社会统一信用码"`
+	ProvinceId    int    `description:"省ID"`
+	Province      string `description:"省"`
+	CityId        int    `description:"市ID"`
+	City          string `description:"市"`
+	Address       string `description:"详细地址"`
+	Industry      string `description:"行业"`
+	AuthStatus    int    `description:"权限状态:0-关闭;1-开启"`
+	SellerId      int    `description:"销售ID"`
+	SellerName    string `description:"销售名称"`
+	CreateTime    string `description:"创建时间"`
+	ModifyTime    string `description:"更新时间"`
+	UserLevelId   int    `description:"用户等级ID"`
+	UserLevelName string `description:"用户等级名称"`
 }
 
 func (m *Company) Format2Item() (item *CompanyItem) {
@@ -216,6 +224,8 @@ func (m *Company) Format2Item() (item *CompanyItem) {
 	item.SellerName = m.SellerName
 	item.CreateTime = utils.TimeTransferString(utils.FormatDateTime, m.CreateTime)
 	item.ModifyTime = utils.TimeTransferString(utils.FormatDateTime, m.ModifyTime)
+	item.UserLevelId = m.UserLevelId
+	item.UserLevelName = m.UserLevelName
 	return
 }
 
@@ -284,3 +294,10 @@ func (m *Company) ChangeCompanyAndUsersAuth(companyId, statusChange int) (err er
 	}
 	return
 }
+
+func (m *Company) UpdateUserLevelName(levelId int, levelName string) (err error) {
+	o := orm.NewOrm()
+	sql := fmt.Sprintf(`UPDATE %s SET %s = ? WHERE %s = ?`, m.TableName(), m.Cols().UserLevelName, m.Cols().UserLevelId)
+	_, err = o.Raw(sql, levelName, levelId).Exec()
+	return
+}

+ 4 - 0
models/constants.go

@@ -17,3 +17,7 @@ const (
 	UserStatusTrial  = 1 // 用户状态-试用
 	UserStatusFormal = 2 // 用户状态-正式
 )
+
+const (
+	UserLevelEnabled = 1 // 用户等级状态-启用
+)

+ 2 - 0
models/db.go

@@ -40,5 +40,7 @@ func init() {
 		new(Users),
 		new(UserRecord),
 		new(UserReadRecord),
+		new(UserLevel),
+		new(UserLevelMapping),
 	)
 }

+ 2 - 0
models/request/company.go

@@ -10,6 +10,7 @@ type CompanyAddReq struct {
 	Address     string `description:"详细地址"`
 	Industry    string `description:"行业"`
 	SellerId    int    `description:"销售(营业部)ID"`
+	UserLevelId int    `description:"用户等级ID"`
 }
 
 type CompanyEditReq struct {
@@ -34,4 +35,5 @@ type CompanyListForm struct {
 	EndTime      string `form:"EndTime" description:"创建时间区间-结束时间"`
 	SortField    int    `form:"SortField" description:"排序字段: 0-默认; 1-创建时间"`
 	SortRule     int    `form:"SortRule" description:"排序方式: 0-默认; 1-正序; 2-倒序"`
+	UserLevelId  int    `form:"UserLevelId" description:"用户等级ID"`
 }

+ 23 - 0
models/request/user_level.go

@@ -0,0 +1,23 @@
+package request
+
+type UserLevelAddReq struct {
+	LevelRank   int    `description:"等级编号"`
+	LevelName   string `description:"等级名称"`
+	State       int    `description:"状态:0-禁用;1-启用"`
+	ClassifyIds []int  `description:"分类IDs"`
+}
+
+type UserLevelEditReq struct {
+	UserLevelId int `description:"用户等级ID"`
+	UserLevelAddReq
+}
+
+type UserLevelRemoveReq struct {
+	UserLevelId int `description:"用户等级ID"`
+}
+
+type UserLevelListForm struct {
+	PageSize     int  `form:"PageSize" description:"每页数据量"`
+	CurrentIndex int  `form:"CurrentIndex" description:"页码"`
+	OnlyEnabled  bool `form:"OnlyEnabled" description:"仅启用"`
+}

+ 7 - 5
models/request/users.go

@@ -1,11 +1,12 @@
 package request
 
 type UsersAddReq struct {
-	RealName  string `description:"姓名"`
-	Mobile    string `description:"手机号"`
-	AreaCode  string `description:"区号"`
-	CompanyId int    `description:"机构ID"`
-	SellerId  int    `description:"销售(营业部)ID"`
+	RealName    string `description:"姓名"`
+	Mobile      string `description:"手机号"`
+	AreaCode    string `description:"区号"`
+	CompanyId   int    `description:"机构ID"`
+	SellerId    int    `description:"销售(营业部)ID"`
+	UserLevelId int    `description:"用户等级ID"`
 }
 
 type UsersEditReq struct {
@@ -46,4 +47,5 @@ type UsersListForm struct {
 	UserStatus   int    `form:"UserStatus" description:"用户类型:1-试用用户;2-正式用户"`
 	SortField    int    `form:"SortField" description:"排序字段: 0-默认; 1-创建时间; 2-注册时间; 3-最近一次阅读时间; 4-阅读统计"`
 	SortRule     int    `form:"SortRule" description:"排序方式: 0-默认(倒序); 1-正序; 2-倒序"`
+	UserLevelId  int    `form:"UserLevelId" description:"用户等级ID"`
 }

+ 11 - 0
models/response/user_level.go

@@ -0,0 +1,11 @@
+package response
+
+import (
+	"eta/eta_mini_crm/models"
+	"github.com/rdlucklib/rdluck_tools/paging"
+)
+
+type UserLevelPageListResp struct {
+	Paging *paging.PagingItem
+	List   []*models.UserLevelItem `description:"用户等级列表"`
+}

+ 182 - 0
models/user_level.go

@@ -0,0 +1,182 @@
+package models
+
+import (
+	"eta/eta_mini_crm/utils"
+	"fmt"
+	"github.com/beego/beego/v2/client/orm"
+	"strings"
+	"time"
+)
+
+// UserLevel 用户等级表
+type UserLevel struct {
+	UserLevelId     int       `orm:"column(user_level_id);pk"`
+	LevelRank       int       `description:"等级编号"`
+	LevelName       string    `description:"等级名称"`
+	State           int       `description:"状态:0-禁用;1-启用"`
+	SysUserId       int       `description:"创建人ID"`
+	SysUserRealName string    `description:"创建人姓名"`
+	CreateTime      time.Time `description:"创建时间"`
+	ModifyTime      time.Time `description:"修改时间"`
+}
+
+func (m *UserLevel) TableName() string {
+	return "user_level"
+}
+
+type UserLevelCols struct {
+	PrimaryId       string
+	LevelRank       string
+	LevelName       string
+	State           string
+	SysUserId       string
+	SysUserRealName string
+	CreateTime      string
+	ModifyTime      string
+}
+
+func (m *UserLevel) Cols() UserLevelCols {
+	return UserLevelCols{
+		PrimaryId:       "user_level_id",
+		LevelRank:       "level_rank",
+		LevelName:       "level_name",
+		State:           "state",
+		SysUserId:       "sys_user_id",
+		SysUserRealName: "sys_user_real_name",
+		CreateTime:      "create_time",
+		ModifyTime:      "modify_time",
+	}
+}
+
+func (m *UserLevel) Create() (err error) {
+	o := orm.NewOrm()
+	id, err := o.Insert(m)
+	if err != nil {
+		return
+	}
+	m.UserLevelId = int(id)
+	return
+}
+
+func (m *UserLevel) CreateMulti(items []*UserLevel) (err error) {
+	if len(items) == 0 {
+		return
+	}
+	o := orm.NewOrm()
+	_, err = o.InsertMulti(len(items), items)
+	return
+}
+
+func (m *UserLevel) Update(cols []string) (err error) {
+	o := orm.NewOrm()
+	_, err = o.Update(m, cols...)
+	return
+}
+
+func (m *UserLevel) Remove() (err error) {
+	o := orm.NewOrm()
+	sql := fmt.Sprintf(`DELETE FROM %s WHERE %s = ? LIMIT 1`, m.TableName(), m.Cols().PrimaryId)
+	_, err = o.Raw(sql, m.UserLevelId).Exec()
+	return
+}
+
+func (m *UserLevel) MultiRemove(ids []int) (err error) {
+	if len(ids) == 0 {
+		return
+	}
+	o := orm.NewOrm()
+	sql := fmt.Sprintf(`DELETE FROM %s WHERE %s IN (%s)`, m.TableName(), m.Cols().PrimaryId, utils.GetOrmInReplace(len(ids)))
+	_, err = o.Raw(sql, ids).Exec()
+	return
+}
+
+func (m *UserLevel) RemoveByCondition(condition string, pars []interface{}) (err error) {
+	if condition == "" {
+		return
+	}
+	o := orm.NewOrm()
+	sql := fmt.Sprintf(`DELETE FROM %s WHERE %s`, m.TableName(), condition)
+	_, err = o.Raw(sql, pars).Exec()
+	return
+}
+
+func (m *UserLevel) GetItemById(id int) (item *UserLevel, err error) {
+	o := orm.NewOrm()
+	sql := fmt.Sprintf(`SELECT * FROM %s WHERE 1=1 AND %s = ? LIMIT 1`, m.TableName(), m.Cols().PrimaryId)
+	err = o.Raw(sql, id).QueryRow(&item)
+	return
+}
+
+func (m *UserLevel) GetItemByCondition(condition string, pars []interface{}, orderRule string) (item *UserLevel, err error) {
+	o := orm.NewOrm()
+	order := ``
+	if orderRule != "" {
+		order = ` ORDER BY ` + orderRule
+	}
+	sql := fmt.Sprintf(`SELECT * FROM %s WHERE 1=1 %s %s LIMIT 1`, m.TableName(), condition, order)
+	err = o.Raw(sql, pars).QueryRow(&item)
+	return
+}
+
+func (m *UserLevel) GetCountByCondition(condition string, pars []interface{}) (count int, err error) {
+	o := orm.NewOrm()
+	sql := fmt.Sprintf(`SELECT COUNT(1) FROM %s WHERE 1=1 %s`, m.TableName(), condition)
+	err = o.Raw(sql, pars).QueryRow(&count)
+	return
+}
+
+func (m *UserLevel) GetItemsByCondition(condition string, pars []interface{}, fieldArr []string, orderRule string) (items []*UserLevel, err error) {
+	o := orm.NewOrm()
+	fields := strings.Join(fieldArr, ",")
+	if len(fieldArr) == 0 {
+		fields = `*`
+	}
+	order := fmt.Sprintf(`ORDER BY %s DESC`, m.Cols().CreateTime)
+	if orderRule != "" {
+		order = ` ORDER BY ` + orderRule
+	}
+	sql := fmt.Sprintf(`SELECT %s FROM %s WHERE 1=1 %s %s`, fields, m.TableName(), condition, order)
+	_, err = o.Raw(sql, pars).QueryRows(&items)
+	return
+}
+
+func (m *UserLevel) GetPageItemsByCondition(condition string, pars []interface{}, fieldArr []string, orderRule string, startSize, pageSize int) (items []*UserLevel, err error) {
+	o := orm.NewOrm()
+	fields := strings.Join(fieldArr, ",")
+	if len(fieldArr) == 0 {
+		fields = `*`
+	}
+	order := fmt.Sprintf(`ORDER BY %s DESC`, m.Cols().CreateTime)
+	if orderRule != "" {
+		order = ` ORDER BY ` + orderRule
+	}
+	sql := fmt.Sprintf(`SELECT %s FROM %s WHERE 1=1 %s %s LIMIT ?,?`, fields, m.TableName(), condition, order)
+	_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
+	return
+}
+
+type UserLevelItem struct {
+	UserLevelId     int    `description:"等级ID"`
+	LevelRank       int    `description:"等级编号"`
+	LevelName       string `description:"等级名称"`
+	State           int    `description:"状态:0-禁用;1-启用"`
+	SysUserId       int    `description:"创建人ID"`
+	SysUserRealName string `description:"创建人姓名"`
+	CreateTime      string `description:"创建时间"`
+	ModifyTime      string `description:"修改时间"`
+	ClassifyIds     []int  `description:"关联分类ID"`
+}
+
+func (m *UserLevel) Format2Item() (item *UserLevelItem) {
+	item = new(UserLevelItem)
+	item.UserLevelId = m.UserLevelId
+	item.LevelRank = m.LevelRank
+	item.LevelName = m.LevelName
+	item.State = m.State
+	item.SysUserId = m.SysUserId
+	item.SysUserRealName = m.SysUserRealName
+	item.CreateTime = utils.TimeTransferString(utils.FormatDateTime, m.CreateTime)
+	item.ModifyTime = utils.TimeTransferString(utils.FormatDateTime, m.ModifyTime)
+	item.ClassifyIds = make([]int, 0)
+	return
+}

+ 144 - 0
models/user_level_mapping.go

@@ -0,0 +1,144 @@
+package models
+
+import (
+	"eta/eta_mini_crm/utils"
+	"fmt"
+	"github.com/beego/beego/v2/client/orm"
+	"strings"
+	"time"
+)
+
+// UserLevelMapping 用户等级分类关联表
+type UserLevelMapping struct {
+	Id          int       `orm:"column(id);pk"`
+	UserLevelId int       `description:"用户等级ID"`
+	ClassifyId  int       `description:"分类ID"`
+	CreateTime  time.Time `description:"创建时间"`
+}
+
+func (m *UserLevelMapping) TableName() string {
+	return "user_level_mapping"
+}
+
+type UserLevelMappingCols struct {
+	PrimaryId   string
+	UserLevelId string
+	ClassifyId  string
+	CreateTime  string
+}
+
+func (m *UserLevelMapping) Cols() UserLevelMappingCols {
+	return UserLevelMappingCols{
+		PrimaryId:   "id",
+		UserLevelId: "user_level_id",
+		ClassifyId:  "classify_id",
+		CreateTime:  "create_time",
+	}
+}
+
+func (m *UserLevelMapping) Create() (err error) {
+	o := orm.NewOrm()
+	id, err := o.Insert(m)
+	if err != nil {
+		return
+	}
+	m.Id = int(id)
+	return
+}
+
+func (m *UserLevelMapping) CreateMulti(items []*UserLevelMapping) (err error) {
+	if len(items) == 0 {
+		return
+	}
+	o := orm.NewOrm()
+	_, err = o.InsertMulti(len(items), items)
+	return
+}
+
+func (m *UserLevelMapping) Update(cols []string) (err error) {
+	o := orm.NewOrm()
+	_, err = o.Update(m, cols...)
+	return
+}
+
+func (m *UserLevelMapping) Remove() (err error) {
+	o := orm.NewOrm()
+	sql := fmt.Sprintf(`DELETE FROM %s WHERE %s = ? LIMIT 1`, m.TableName(), m.Cols().PrimaryId)
+	_, err = o.Raw(sql, m.Id).Exec()
+	return
+}
+
+func (m *UserLevelMapping) MultiRemove(ids []int) (err error) {
+	if len(ids) == 0 {
+		return
+	}
+	o := orm.NewOrm()
+	sql := fmt.Sprintf(`DELETE FROM %s WHERE %s IN (%s)`, m.TableName(), m.Cols().PrimaryId, utils.GetOrmInReplace(len(ids)))
+	_, err = o.Raw(sql, ids).Exec()
+	return
+}
+
+func (m *UserLevelMapping) RemoveByCondition(condition string, pars []interface{}) (err error) {
+	if condition == "" {
+		return
+	}
+	o := orm.NewOrm()
+	sql := fmt.Sprintf(`DELETE FROM %s WHERE %s`, m.TableName(), condition)
+	_, err = o.Raw(sql, pars).Exec()
+	return
+}
+
+func (m *UserLevelMapping) GetItemById(id int) (item *UserLevelMapping, err error) {
+	o := orm.NewOrm()
+	sql := fmt.Sprintf(`SELECT * FROM %s WHERE 1=1 AND %s = ? LIMIT 1`, m.TableName(), m.Cols().PrimaryId)
+	err = o.Raw(sql, id).QueryRow(&item)
+	return
+}
+
+func (m *UserLevelMapping) GetItemByCondition(condition string, pars []interface{}, orderRule string) (item *UserLevelMapping, err error) {
+	o := orm.NewOrm()
+	order := ``
+	if orderRule != "" {
+		order = ` ORDER BY ` + orderRule
+	}
+	sql := fmt.Sprintf(`SELECT * FROM %s WHERE 1=1 %s %s LIMIT 1`, m.TableName(), condition, order)
+	err = o.Raw(sql, pars).QueryRow(&item)
+	return
+}
+
+func (m *UserLevelMapping) GetCountByCondition(condition string, pars []interface{}) (count int, err error) {
+	o := orm.NewOrm()
+	sql := fmt.Sprintf(`SELECT COUNT(1) FROM %s WHERE 1=1 %s`, m.TableName(), condition)
+	err = o.Raw(sql, pars).QueryRow(&count)
+	return
+}
+
+func (m *UserLevelMapping) GetItemsByCondition(condition string, pars []interface{}, fieldArr []string, orderRule string) (items []*UserLevelMapping, err error) {
+	o := orm.NewOrm()
+	fields := strings.Join(fieldArr, ",")
+	if len(fieldArr) == 0 {
+		fields = `*`
+	}
+	order := fmt.Sprintf(`ORDER BY %s DESC`, m.Cols().CreateTime)
+	if orderRule != "" {
+		order = ` ORDER BY ` + orderRule
+	}
+	sql := fmt.Sprintf(`SELECT %s FROM %s WHERE 1=1 %s %s`, fields, m.TableName(), condition, order)
+	_, err = o.Raw(sql, pars).QueryRows(&items)
+	return
+}
+
+func (m *UserLevelMapping) GetPageItemsByCondition(condition string, pars []interface{}, fieldArr []string, orderRule string, startSize, pageSize int) (items []*UserLevelMapping, err error) {
+	o := orm.NewOrm()
+	fields := strings.Join(fieldArr, ",")
+	if len(fieldArr) == 0 {
+		fields = `*`
+	}
+	order := fmt.Sprintf(`ORDER BY %s DESC`, m.Cols().CreateTime)
+	if orderRule != "" {
+		order = ` ORDER BY ` + orderRule
+	}
+	sql := fmt.Sprintf(`SELECT %s FROM %s WHERE 1=1 %s %s LIMIT ?,?`, fields, m.TableName(), condition, order)
+	_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
+	return
+}

+ 43 - 19
models/users.go

@@ -32,6 +32,8 @@ type Users struct {
 	IsDeleted       int       `description:"删除状态:0-正常;1-已删除"`
 	CreateTime      time.Time `description:"创建时间"`
 	ModifyTime      time.Time `description:"修改时间"`
+	UserLevelId     int       `description:"用户等级ID"`
+	UserLevelName   string    `description:"用户等级名称"`
 }
 
 func (m *Users) TableName() string {
@@ -60,6 +62,8 @@ type UsersCols struct {
 	IsDeleted       string
 	CreateTime      string
 	ModifyTime      string
+	UserLevelId     string
+	UserLevelName   string
 }
 
 func (m *Users) Cols() UsersCols {
@@ -85,6 +89,8 @@ func (m *Users) Cols() UsersCols {
 		IsDeleted:       "is_deleted",
 		CreateTime:      "create_time",
 		ModifyTime:      "modify_time",
+		UserLevelId:     "user_level_id",
+		UserLevelName:   "user_level_name",
 	}
 }
 
@@ -197,25 +203,27 @@ func (m *Users) GetPageItemsByCondition(condition string, pars []interface{}, fi
 
 // UsersItem 用户信息
 type UsersItem struct {
-	UserId       int    `description:"用户ID"`
-	RealName     string `description:"用户姓名"`
-	Mobile       string `description:"手机号"`
-	MobileHidden string `description:"手机号(隐藏中间四位)"`
-	AreaCode     string `description:"区号"`
-	SellerId     int    `description:"销售ID"`
-	SellerName   string `description:"销售名称"`
-	CompanyId    int    `description:"所属机构ID"`
-	CompanyName  string `description:"所属机构名称"`
-	Status       int    `description:"用户类型:1-试用用户;2-正式用户"`
-	AuthStatus   int    `description:"权限状态:0-关闭;1-开启"`
-	IsRegistered int    `description:"注册状态:0-未注册;1-已注册"`
-	RegisterTime string `description:"注册时间"`
-	Subscribe    int    `description:"是否关注公众号:0-未关注;1-已关注"`
-	LastReadTime string `description:"最后一次阅读时间"`
-	ReadTimes    int    `description:"阅读次数"`
-	TrialExpired bool   `description:"试用到期:true-已到期"`
-	CreateTime   string `description:"创建时间"`
-	ModifyTime   string `description:"修改时间"`
+	UserId        int    `description:"用户ID"`
+	RealName      string `description:"用户姓名"`
+	Mobile        string `description:"手机号"`
+	MobileHidden  string `description:"手机号(隐藏中间四位)"`
+	AreaCode      string `description:"区号"`
+	SellerId      int    `description:"销售ID"`
+	SellerName    string `description:"销售名称"`
+	CompanyId     int    `description:"所属机构ID"`
+	CompanyName   string `description:"所属机构名称"`
+	Status        int    `description:"用户类型:1-试用用户;2-正式用户"`
+	AuthStatus    int    `description:"权限状态:0-关闭;1-开启"`
+	IsRegistered  int    `description:"注册状态:0-未注册;1-已注册"`
+	RegisterTime  string `description:"注册时间"`
+	Subscribe     int    `description:"是否关注公众号:0-未关注;1-已关注"`
+	LastReadTime  string `description:"最后一次阅读时间"`
+	ReadTimes     int    `description:"阅读次数"`
+	TrialExpired  bool   `description:"试用到期:true-已到期"`
+	CreateTime    string `description:"创建时间"`
+	ModifyTime    string `description:"修改时间"`
+	UserLevelId   int    `description:"用户等级ID"`
+	UserLevelName string `description:"用户等级名称"`
 }
 
 func (m *Users) Format2Item() (item *UsersItem) {
@@ -245,6 +253,8 @@ func (m *Users) Format2Item() (item *UsersItem) {
 	}
 	item.CreateTime = utils.TimeTransferString(utils.FormatDateTime, m.CreateTime)
 	item.ModifyTime = utils.TimeTransferString(utils.FormatDateTime, m.ModifyTime)
+	item.UserLevelId = m.UserLevelId
+	item.UserLevelName = m.UserLevelName
 	return
 }
 
@@ -296,3 +306,17 @@ func (m *Users) RemoveUsersAndUserRecord(userId int) (err error) {
 	}
 	return
 }
+
+func (m *Users) UpdateUserLevelName(levelId int, levelName string) (err error) {
+	o := orm.NewOrm()
+	sql := fmt.Sprintf(`UPDATE %s SET %s = ? WHERE %s = ?`, m.TableName(), m.Cols().UserLevelName, m.Cols().UserLevelId)
+	_, err = o.Raw(sql, levelName, levelId).Exec()
+	return
+}
+
+func (m *Users) UpdateUserLevelNameByCompanyId(companyId, levelId int, levelName string) (err error) {
+	o := orm.NewOrm()
+	sql := fmt.Sprintf(`UPDATE %s SET %s = ?, %s = ? WHERE %s = ?`, m.TableName(), m.Cols().UserLevelId, m.Cols().UserLevelName, m.Cols().CompanyId)
+	_, err = o.Raw(sql, levelId, levelName, companyId).Exec()
+	return
+}

+ 54 - 0
routers/commentsRouter.go

@@ -313,6 +313,60 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["eta/eta_mini_crm/controllers:UserLevelController"] = append(beego.GlobalControllerRouter["eta/eta_mini_crm/controllers:UserLevelController"],
+        beego.ControllerComments{
+            Method: "Add",
+            Router: `/level/add`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_mini_crm/controllers:UserLevelController"] = append(beego.GlobalControllerRouter["eta/eta_mini_crm/controllers:UserLevelController"],
+        beego.ControllerComments{
+            Method: "Detail",
+            Router: `/level/detail`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_mini_crm/controllers:UserLevelController"] = append(beego.GlobalControllerRouter["eta/eta_mini_crm/controllers:UserLevelController"],
+        beego.ControllerComments{
+            Method: "Edit",
+            Router: `/level/edit`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_mini_crm/controllers:UserLevelController"] = append(beego.GlobalControllerRouter["eta/eta_mini_crm/controllers:UserLevelController"],
+        beego.ControllerComments{
+            Method: "List",
+            Router: `/level/list`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_mini_crm/controllers:UserLevelController"] = append(beego.GlobalControllerRouter["eta/eta_mini_crm/controllers:UserLevelController"],
+        beego.ControllerComments{
+            Method: "PageList",
+            Router: `/level/page_list`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_mini_crm/controllers:UserLevelController"] = append(beego.GlobalControllerRouter["eta/eta_mini_crm/controllers:UserLevelController"],
+        beego.ControllerComments{
+            Method: "Remove",
+            Router: `/level/remove`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["eta/eta_mini_crm/controllers:UserLoginController"] = append(beego.GlobalControllerRouter["eta/eta_mini_crm/controllers:UserLoginController"],
         beego.ControllerComments{
             Method: "AreaCodeList",

+ 1 - 0
routers/router.go

@@ -45,6 +45,7 @@ func init() {
 		beego.NSNamespace("/users",
 			beego.NSInclude(
 				&controllers.UsersController{},
+				&controllers.UserLevelController{},
 			),
 		),
 		beego.NSNamespace("/company",