package repository import ( "fmt" "strings" "time" "be.ems/src/framework/datasource" "be.ems/src/framework/logger" "be.ems/src/framework/utils/crypto" "be.ems/src/framework/utils/parse" "be.ems/src/framework/utils/repo" "be.ems/src/modules/system/model" ) // 实例化数据层 SysUserImpl 结构体 var NewSysUserImpl = &SysUserImpl{ selectSql: `select u.user_id, u.dept_id, u.tenant_id, u.user_name, u.nick_name, u.user_type, u.user_source, u.email, u.avatar, u.phonenumber, u.password, u.sex, u.status, u.del_flag, u.login_ip, u.login_date, u.create_by, u.create_time, u.remark, d.dept_id, d.parent_id, d.ancestors, d.dept_name, d.order_num, d.leader, d.status as dept_status, t.tenant_id, t.parent_id, t.ancestors, t.tenant_name, t.order_num, t.tenancy_type, t.tenancy_key, t.status as tenant_status, r.role_id, r.role_name, r.role_key, r.role_sort, r.data_scope, r.status as role_status from sys_user u left join sys_dept d on u.dept_id = d.dept_id left join sys_tenant t on u.tenant_id = t.tenant_id left join sys_user_role ur on u.user_id = ur.user_id left join sys_role r on r.role_id = ur.role_id `, sysUserMap: map[string]string{ "user_id": "UserID", "dept_id": "DeptID", "tenant_id": "TenantID", "user_name": "UserName", "nick_name": "NickName", "user_type": "UserType", "user_source": "UserSource", "email": "Email", "phonenumber": "PhoneNumber", "sex": "Sex", "avatar": "Avatar", "password": "Password", "status": "Status", "del_flag": "DelFlag", "login_ip": "LoginIP", "login_date": "LoginDate", "create_by": "CreateBy", "create_time": "CreateTime", "update_by": "UpdateBy", "update_time": "UpdateTime", "remark": "Remark", }, sysDeptMap: map[string]string{ "dept_id": "DeptID", "parent_id": "ParentID", "dept_name": "DeptName", "ancestors": "Ancestors", "order_num": "OrderNum", "leader": "Leader", "dept_status": "Status", }, sysTenantMap: map[string]string{ "tenant_id": "TenantID", "parent_id": "ParentID", "tenant_name": "TenantName", "ancestors": "Ancestors", "order_num": "OrderNum", "tenancy_type": "TenancyType", "tenancy_key": "TenancyKey", "tenant_status": "Status", }, sysRoleMap: map[string]string{ "role_id": "RoleID", "role_name": "RoleName", "role_key": "RoleKey", "role_sort": "RoleSort", "data_scope": "DataScope", "role_status": "Status", }, } // SysUserImpl 用户表 数据层处理 type SysUserImpl struct { // 查询视图对象SQL selectSql string // 用户信息实体映射 sysUserMap map[string]string // 用户部门实体映射 一对一 sysDeptMap map[string]string // 用户租户实体映射 一对一 sysTenantMap map[string]string // 用户角色实体映射 一对多 sysRoleMap map[string]string } // convertResultRows 将结果记录转实体结果组 func (r *SysUserImpl) convertResultRows(rows []map[string]any) []model.SysUser { arr := make([]model.SysUser, 0) for _, row := range rows { sysUser := model.SysUser{} sysDept := model.SysDept{} sysTenant := model.SysTenant{} sysRole := model.SysRole{} sysUser.Roles = []model.SysRole{} for key, value := range row { if keyMapper, ok := r.sysUserMap[key]; ok { repo.SetFieldValue(&sysUser, keyMapper, value) } if keyMapper, ok := r.sysDeptMap[key]; ok { repo.SetFieldValue(&sysDept, keyMapper, value) } if keyMapper, ok := r.sysTenantMap[key]; ok { repo.SetFieldValue(&sysTenant, keyMapper, value) } if keyMapper, ok := r.sysRoleMap[key]; ok { repo.SetFieldValue(&sysRole, keyMapper, value) } } sysUser.Dept = sysDept sysUser.Tenant = sysTenant if sysRole.RoleKey != "" { sysUser.Roles = append(sysUser.Roles, sysRole) } one := true for i, a := range arr { if a.UserID == sysUser.UserID { arrUser := &arr[i] arrUser.Roles = append(arrUser.Roles, sysUser.Roles...) one = false break } } if one { arr = append(arr, sysUser) } } return arr } // SelectUserPage 根据条件分页查询用户列表 func (r *SysUserImpl) SelectUserPage(query map[string]any, dataScopeSQL string) map[string]any { selectUserTotalSql := `select count(distinct u.user_id) as 'total' from sys_user u left join sys_dept d on u.dept_id = d.dept_id left join sys_tenant t on u.tenant_id = t.tenant_id left join sys_user_role ur on u.user_id = ur.user_id left join sys_role r on r.role_id = ur.role_id ` // 查询条件拼接 var conditions []string var params []any if v, ok := query["userId"]; ok && v != "" { conditions = append(conditions, "u.user_id = ?") params = append(params, v) } if v, ok := query["userName"]; ok && v != "" { conditions = append(conditions, "u.user_name like concat(?, '%')") params = append(params, v) } if v, ok := query["status"]; ok && v != "" { conditions = append(conditions, "u.status = ?") params = append(params, v) } if v, ok := query["phonenumber"]; ok && v != "" { conditions = append(conditions, "u.phonenumber like concat(?, '%')") params = append(params, v) } if v, ok := query["userType"]; ok && v != "" { conditions = append(conditions, "u.user_type = ?") params = append(params, v) } if v, ok := query["userSource"]; ok && v != "" { conditions = append(conditions, "u.user_source = ?") params = append(params, v) } beginTime, ok := query["beginTime"] if !ok { beginTime, ok = query["params[beginTime]"] } if ok && beginTime != "" { conditions = append(conditions, "u.login_date >= ?") params = append(params, parse.Number(beginTime.(string))) } endTime, ok := query["endTime"] if !ok { endTime, ok = query["params[endTime]"] } if ok && endTime != "" { conditions = append(conditions, "u.login_date <= ?") params = append(params, parse.Number(endTime.(string))) } if v, ok := query["deptId"]; ok && v != "" { conditions = append(conditions, "(u.dept_id = ? or u.dept_id in ( select t.dept_id from sys_dept t where find_in_set(?, t.ancestors) ))") params = append(params, v) params = append(params, v) } if v, ok := query["tenantId"]; ok && v != "" { conditions = append(conditions, "(u.tenant_id = ? or u.tenant_id in ( select tt.tenant_id from sys_tenant tt where find_in_set(?, tt.ancestors) ))") params = append(params, v) params = append(params, v) } // 构建查询条件语句 whereSql := " where u.del_flag = '0' and u.user_id != '1' " if len(conditions) > 0 { whereSql += " and " + strings.Join(conditions, " and ") } // 查询结果 result := map[string]any{ "total": 0, "rows": []model.SysUser{}, } // 查询数量 长度为0直接返回 totalSql := selectUserTotalSql + whereSql + dataScopeSQL totalRows, err := datasource.RawDB("", totalSql, params) if err != nil { logger.Errorf("total err => %v", err) return result } total := parse.Number(totalRows[0]["total"]) if total == 0 { return result } else { result["total"] = total } // 分页 pageNum, pageSize := repo.PageNumSize(query["pageNum"], query["pageSize"]) pageSql := " limit ?,? " params = append(params, pageNum*pageSize) params = append(params, pageSize) // 查询数据 querySql := r.selectSql + whereSql + dataScopeSQL + pageSql results, err := datasource.RawDB("", querySql, params) if err != nil { logger.Errorf("query err => %v", err) return result } // 转换实体 result["rows"] = r.convertResultRows(results) return result } // SelectAllocatedPage 根据条件分页查询分配用户角色列表 func (r *SysUserImpl) SelectAllocatedPage(query map[string]any, dataScopeSQL string) map[string]any { // 查询条件拼接 var conditions []string var params []any if v, ok := query["userName"]; ok && v != "" { conditions = append(conditions, "u.user_name like concat(?, '%')") params = append(params, v) } if v, ok := query["phonenumber"]; ok && v != "" { conditions = append(conditions, "u.phonenumber like concat(?, '%')") params = append(params, v) } if v, ok := query["status"]; ok && v != "" { conditions = append(conditions, "u.status = ?") params = append(params, v) } // 分配角色用户 if allocated, ok := query["allocated"]; ok && allocated != "" { if roleId, ok := query["roleId"]; ok && roleId != "" { if parse.Boolean(allocated) { conditions = append(conditions, "r.role_id = ?") params = append(params, roleId) } else { conditions = append(conditions, `(r.role_id != ? or r.role_id IS NULL) and u.user_id not in ( select u.user_id from sys_user u inner join sys_user_role ur on u.user_id = ur.user_id and ur.role_id = ? )`) params = append(params, roleId) params = append(params, roleId) } } } // 构建查询条件语句 whereSql := " where u.del_flag = '0' and u.user_id != '1' " if len(conditions) > 0 { whereSql += " and " + strings.Join(conditions, " and ") } // 查询结果 result := map[string]any{ "total": 0, "rows": []model.SysUser{}, } // 查询数量 长度为0直接返回 totalSql := `select count(distinct u.user_id) as 'total' from sys_user u left join sys_dept d on u.dept_id = d.dept_id left join sys_tenant t on u.tenant_id = t.tenant_id left join sys_user_role ur on u.user_id = ur.user_id left join sys_role r on r.role_id = ur.role_id ` totalRows, err := datasource.RawDB("", totalSql+whereSql+dataScopeSQL, params) if err != nil { logger.Errorf("total err => %v", err) return result } total := parse.Number(totalRows[0]["total"]) if total == 0 { return result } else { result["total"] = total } // 分页 pageNum, pageSize := repo.PageNumSize(query["pageNum"], query["pageSize"]) pageSql := " limit ?,? " params = append(params, pageNum*pageSize) params = append(params, pageSize) // 查询数据 querySql := `select distinct u.user_id, u.dept_id, u.tenant_id, u.user_name, u.nick_name, u.email, u.phonenumber, u.status, u.create_time, d.dept_name, t.tenant_name from sys_user u left join sys_dept d on u.dept_id = d.dept_id left join sys_tenant t on u.tenant_id = t.tenant_id left join sys_user_role ur on u.user_id = ur.user_id left join sys_role r on r.role_id = ur.role_id` querySql = querySql + whereSql + dataScopeSQL + pageSql results, err := datasource.RawDB("", querySql, params) if err != nil { logger.Errorf("query err => %v", err) } // 转换实体 result["rows"] = r.convertResultRows(results) return result } // SelectUserList 根据条件查询用户列表 func (r *SysUserImpl) SelectUserList(sysUser model.SysUser, dataScopeSQL string) []model.SysUser { selectUserSql := `select u.user_id, u.dept_id, u.tenant_id, u.nick_name, u.user_name, u.email, u.avatar, u.phonenumber, u.sex, u.status, u.del_flag, u.login_ip, u.login_date, u.create_by, u.create_time, u.remark, d.dept_name, d.leader t.tenant_name, t.tenancy_type, t.tenancy_key from sys_user u left join sys_dept d on u.dept_id = d.dept_id left join sys_tenant t on u.tenant_id = t.tenant_id and t.status = 1` // 查询条件拼接 var conditions []string var params []any if sysUser.UserID != "" { conditions = append(conditions, "u.user_id = ?") params = append(params, sysUser.UserID) } if sysUser.UserName != "" { conditions = append(conditions, "u.user_name like concat(?, '%')") params = append(params, sysUser.UserName) } if sysUser.Status != "" { conditions = append(conditions, "u.status = ?") params = append(params, sysUser.Status) } if sysUser.PhoneNumber != "" { conditions = append(conditions, "u.phonenumber like concat(?, '%')") params = append(params, sysUser.PhoneNumber) } // 构建查询条件语句 whereSql := " where u.del_flag = '0' " if len(conditions) > 0 { whereSql += " and " + strings.Join(conditions, " and ") } // 查询数据 querySql := selectUserSql + whereSql + dataScopeSQL rows, err := datasource.RawDB("", querySql, params) if err != nil { logger.Errorf("query err => %v", err) return []model.SysUser{} } return r.convertResultRows(rows) } // SelectUserByIds 通过用户ID查询用户 func (r *SysUserImpl) SelectUserByIds(userIds []string) []model.SysUser { placeholder := repo.KeyPlaceholderByQuery(len(userIds)) querySql := r.selectSql + " where u.del_flag = '0' and u.user_id in (" + placeholder + ")" parameters := repo.ConvertIdsSlice(userIds) results, err := datasource.RawDB("", querySql, parameters) if err != nil { logger.Errorf("query err => %v", err) return []model.SysUser{} } // 转换实体 return r.convertResultRows(results) } // SelectByUserName 通过登录账号查询信息 func (r *SysUserImpl) SelectByUserName(userName, userType, userSource string) model.SysUser { item := model.SysUser{} if userName == "" { return item } if userType == "" { userType = "System" } if userSource == "" { userSource = "#" } querySql := r.selectSql + " where u.del_flag = '0' and u.user_name = ? and u.user_type = ? and u.user_source = ?" results, err := datasource.RawDB("", querySql, []any{userName, userType, userSource}) if err != nil { logger.Errorf("query err => %v", err) return model.SysUser{} } // 转换实体 rows := r.convertResultRows(results) if len(rows) > 0 { return rows[0] } return item } // SelectUserByUserName 通过用户登录账号查询用户 func (r *SysUserImpl) SelectUserByUserName(userName string) model.SysUser { querySql := r.selectSql + " where u.del_flag = '0' and u.user_name = ?" results, err := datasource.RawDB("", querySql, []any{userName}) if err != nil { logger.Errorf("query err => %v", err) return model.SysUser{} } // 转换实体 rows := r.convertResultRows(results) if len(rows) > 0 { return rows[0] } return model.SysUser{} } // InsertUser 新增用户信息 func (r *SysUserImpl) InsertUser(sysUser model.SysUser) string { // 参数拼接 params := make(map[string]any) if sysUser.UserID != "" { params["user_id"] = sysUser.UserID } if sysUser.DeptID != "" { params["dept_id"] = sysUser.DeptID } if sysUser.TenantID != "" { params["tenant_id"] = sysUser.TenantID } if sysUser.UserName != "" { params["user_name"] = sysUser.UserName } if sysUser.NickName != "" { params["nick_name"] = sysUser.NickName } if sysUser.UserType != "" { params["user_type"] = sysUser.UserType } if sysUser.UserSource != "" { params["user_source"] = sysUser.UserSource } if sysUser.Avatar != "" { params["avatar"] = sysUser.Avatar } if sysUser.Email != "" { params["email"] = sysUser.Email } if sysUser.PhoneNumber != "" { params["phonenumber"] = sysUser.PhoneNumber } if sysUser.Sex != "" { params["sex"] = sysUser.Sex } if sysUser.Password != "" { password := crypto.BcryptHash(sysUser.Password) params["password"] = password } if sysUser.Status != "" { params["status"] = sysUser.Status } if sysUser.Remark != "" { params["remark"] = sysUser.Remark } if sysUser.CreateBy != "" { params["create_by"] = sysUser.CreateBy params["create_time"] = time.Now().UnixMilli() } // 构建执行语句 keys, placeholder, values := repo.KeyPlaceholderValueByInsert(params) sql := "insert into sys_user (" + strings.Join(keys, ",") + ")values(" + placeholder + ")" db := datasource.DefaultDB() // 开启事务 tx := db.Begin() // 执行插入 err := tx.Exec(sql, values...).Error if err != nil { logger.Errorf("insert row : %v", err.Error()) tx.Rollback() return "" } // 获取生成的自增 ID var insertedID string err = tx.Raw("select last_insert_id()").Row().Scan(&insertedID) if err != nil { logger.Errorf("insert last id : %v", err.Error()) tx.Rollback() return "" } // 提交事务 tx.Commit() return insertedID } // UpdateUser 修改用户信息 func (r *SysUserImpl) UpdateUser(sysUser model.SysUser) int64 { // 参数拼接 params := make(map[string]any) if sysUser.DeptID != "" { params["dept_id"] = sysUser.DeptID } if sysUser.TenantID != "" { params["tenant_id"] = sysUser.TenantID } if sysUser.UserName != "" { params["user_name"] = sysUser.UserName } if sysUser.NickName != "" { params["nick_name"] = sysUser.NickName } if sysUser.UserType != "" { params["user_type"] = sysUser.UserType } if sysUser.UserSource != "" { params["user_source"] = sysUser.UserSource } if sysUser.Avatar != "" { params["avatar"] = sysUser.Avatar } params["email"] = sysUser.Email params["phonenumber"] = sysUser.PhoneNumber params["sex"] = sysUser.Sex if sysUser.Password != "" { password := crypto.BcryptHash(sysUser.Password) params["password"] = password } if sysUser.Status != "" { params["status"] = sysUser.Status } params["remark"] = sysUser.Remark if sysUser.UpdateBy != "" { params["update_by"] = sysUser.UpdateBy params["update_time"] = time.Now().UnixMilli() } if sysUser.LoginIP != "" { params["login_ip"] = sysUser.LoginIP } if sysUser.LoginDate > 0 { params["login_date"] = sysUser.LoginDate } // 构建执行语句 keys, values := repo.KeyValueByUpdate(params) sql := "update sys_user set " + strings.Join(keys, ",") + " where user_id = ?" // 执行更新 values = append(values, sysUser.UserID) rows, err := datasource.ExecDB("", sql, values) if err != nil { logger.Errorf("update row : %v", err.Error()) return 0 } return rows } // DeleteUserByIds 批量删除用户信息 func (r *SysUserImpl) DeleteUserByIds(userIds []string) int64 { placeholder := repo.KeyPlaceholderByQuery(len(userIds)) username := "CASE WHEN user_name = '' THEN user_name WHEN LENGTH(user_name) >= 36 THEN CONCAT('del_', SUBSTRING(user_name, 5, 36)) ELSE CONCAT('del_', user_name) END" email := "CASE WHEN email = '' THEN email WHEN LENGTH(email) >= 64 THEN CONCAT('del_', SUBSTRING(email, 5, 64)) ELSE CONCAT('del_', email) END" phonenumber := "CASE WHEN phonenumber = '' THEN phonenumber WHEN LENGTH(phonenumber) >= 16 THEN CONCAT('del_', SUBSTRING(phonenumber, 5, 16)) ELSE CONCAT('del_', phonenumber) END" sql := fmt.Sprintf("update sys_user set del_flag = '1', user_name = %s, email = %s, phonenumber = %s where user_id in (%s)", username, email, phonenumber, placeholder) parameters := repo.ConvertIdsSlice(userIds) results, err := datasource.ExecDB("", sql, parameters) if err != nil { logger.Errorf("update err => %v", err) return 0 } return results } // CheckUniqueUser 校验用户信息是否唯一 func (r *SysUserImpl) CheckUniqueUser(sysUser model.SysUser) string { // 查询条件拼接 var conditions []string var params []any if sysUser.UserName != "" { conditions = append(conditions, "user_name = ?") params = append(params, sysUser.UserName) } if sysUser.PhoneNumber != "" { conditions = append(conditions, "phonenumber = ?") params = append(params, sysUser.PhoneNumber) } if sysUser.Email != "" { conditions = append(conditions, "email = ?") params = append(params, sysUser.Email) } if sysUser.UserType != "" { conditions = append(conditions, "user_type = ?") params = append(params, sysUser.UserType) } if sysUser.UserSource != "" { conditions = append(conditions, "user_source = ?") params = append(params, sysUser.UserSource) } // 构建查询条件语句 whereSql := "" if len(conditions) > 0 { whereSql += " where " + strings.Join(conditions, " and ") } else { return "" } // 查询数据 querySql := "select user_id as 'str' from sys_user " + whereSql + " limit 1" results, err := datasource.RawDB("", querySql, params) if err != nil { logger.Errorf("query err %v", err) } if len(results) > 0 { return fmt.Sprint(results[0]["str"]) } return "" }