WiiCITMS/process/hr/staff.go

428 lines
12 KiB
Go
Raw Normal View History

2025-11-07 14:14:34 +08:00
package hr
import (
"WiiCITMS/models/hr"
"WiiGenerates/WiiCITMS/generates/v1/go/types"
"WiiGoLibrary/apply/middle/process/v1"
"WiiGoLibrary/framework/db/v1/utils/mssql/unique"
"WiiGoLibrary/framework/hub/v1/dblib"
"fmt"
)
// CreateStaffWithOrganizationRequest 创建员工并指定所属组织请求参数
type CreateStaffWithOrganizationRequest struct {
StaffName string `json:"staffName"` // 员工姓名
Affiliated string `json:"affiliated"` // 所属组织ID
StaffType int `json:"staffType"` // 员工类型0-正式员工1-实习员工2-外包员工
AffiliatedType int `json:"affiliatedType"` // 隶属关系类型0-主部门1-兼职部门
Account string `json:"account"` // 账号(可选)
UserGuid string `json:"userGuid"` // SSO平台用户ID可选
}
// BindStaffRequest 绑定SSO用户到员工请求参数
type BindStaffRequest struct {
StaffGuid string `json:"staffGuid"` // 员工GUID
Account string `json:"account"` // 账号
UserGuid string `json:"userGuid"` // SSO平台用户GUID
}
// QueryStaffRequest 查询员工请求参数
type QueryStaffRequest struct {
StaffName string `json:"staffName"` // 员工姓名(模糊匹配)
Account string `json:"account"` // 账号(精确匹配)
UserGuid string `json:"userGuid"` // SSO平台用户ID
OrganizationGuid string `json:"organizationGuid"` // 所属组织ID
StaffType int `json:"staffType"` // 员工类型
Limit int `json:"limit"` // 分页参数,每页数量
Offset int `json:"offset"` // 分页参数,偏移量
}
// StaffDetailDTO 员工详细信息DTO
type StaffDetailDTO struct {
StaffGuid string `json:"staffGuid"` // 员工GUID
StaffName string `json:"staffName"` // 员工姓名
JobID int64 `json:"jobId"` // 工号
Account string `json:"account"` // 账号
UserGuid string `json:"userGuid"` // SSO平台用户ID
StaffType int `json:"staffType"` // 员工类型
MainOrganization string `json:"mainOrganization"` // 主部门
Positions []PositionInfo `json:"positions"` // 岗位信息
}
// PositionInfo 岗位信息
type PositionInfo struct {
PositionGuid unique.UUID `json:"positionGuid"` // 岗位GUID
PositionName string `json:"positionName"` // 岗位名称
OrganizationGuid unique.UUID `json:"organizationGuid"` // 所属组织GUID
OrganizationName string `json:"organizationName"` // 所属组织名称
IsLeader bool `json:"isLeader"` // 是否是组织负责人
IsMainPosition bool `json:"isMainPosition"` // 是否是主岗位
}
// CreateStaffWithOrganization 创建员工并指定所属组织
func CreateStaffWithOrganization(params CreateStaffWithOrganizationRequest) (*hr.StaffModel, *process.Process) {
tx := dblib.DBIns.DB.Begin()
// 创建员工
staff := hr.StaffInstance()
staff.StaffName = params.StaffName
staff.RecordType = int16(params.StaffType)
// 如果提供了账号和用户ID则绑定用户
if params.Account != "" {
staff.Account = params.Account
}
if params.UserGuid != "" {
userGuid, err := unique.FromString(params.UserGuid)
if err == nil {
staff.UserGuid = userGuid
}
}
// 创建员工记录
r := tx.Create(staff)
if r.Error != nil {
tx.Rollback()
return nil, process.FailError(types.CreateStaffError, r.Error)
}
// 检查组织是否有效
organizationData := &hr.OrganizationModel{}
r = tx.Model(&hr.OrganizationModel{}).Where("RecordGuid = ? AND (RecordStatus & 524288) = 0", params.Affiliated).First(organizationData)
if r.Error != nil {
tx.Rollback()
return nil, process.FailError(types.InvalidOrganizationError, r.Error)
}
// 创建员工与组织关联关系
staff2Organization := hr.Staff2OrganizationInstance()
staff2Organization.ObjectGuid = staff.RecordGuid // 员工GUID
staff2Organization.TargetGuid = organizationData.RecordGuid // 组织GUID
staff2Organization.RecordType = int16(params.AffiliatedType) // 隶属关系类型
r = tx.Create(staff2Organization)
if r.Error != nil {
tx.Rollback()
return nil, process.FailError(types.CreateStaffError, r.Error)
}
tx.Commit()
return staff, process.Success(200)
}
// BindStaff 绑定SSO用户到员工
func BindStaff(params BindStaffRequest) (*hr.StaffModel, *process.Process) {
// 验证员工ID
staffGuid, err := unique.FromString(params.StaffGuid)
if err != nil {
return nil, process.FailError(types.InvalidParamError, err)
}
// 查询员工
staff := &hr.StaffModel{}
r := dblib.DBIns.DB.Where("RecordGuid = ? AND (RecordStatus & 524288) = 0", staffGuid).First(staff)
if r.Error != nil {
return nil, process.FailError(types.StaffNotFoundError, r.Error)
}
// 检查账号是否已被使用
if params.Account != "" {
var count int64
r = dblib.DBIns.DB.Model(&hr.StaffModel{}).
Where("Account = ? AND RecordGuid != ? AND (RecordStatus & 524288) = 0", params.Account, staffGuid).
Count(&count)
if r.Error != nil {
return nil, process.FailError(types.QueryStaffError, r.Error)
}
if count > 0 {
return nil, process.FailError(types.DuplicateAccountError, fmt.Errorf("账号已被使用"))
}
// 更新账号
staff.Account = params.Account
}
// 检查UserGuid是否已被使用
if params.UserGuid != "" {
userGuid, err := unique.FromString(params.UserGuid)
if err != nil {
return nil, process.FailError(types.InvalidParamError, err)
}
var count int64
r = dblib.DBIns.DB.Model(&hr.StaffModel{}).
Where("UserGuid = ? AND RecordGuid != ? AND (RecordStatus & 524288) = 0", userGuid, staffGuid).
Count(&count)
if r.Error != nil {
return nil, process.FailError(types.QueryStaffError, r.Error)
}
if count > 0 {
return nil, process.FailError(types.DuplicateUserGuidError, fmt.Errorf("用户ID已被绑定"))
}
// 更新UserGuid
staff.UserGuid = userGuid
}
// 保存更新
r = dblib.DBIns.DB.Save(staff)
if r.Error != nil {
return nil, process.FailError(types.UpdateStaffError, r.Error)
}
return staff, process.Success(200)
}
// UnbindStaff 解除员工与SSO用户的绑定
func UnbindStaff(staffGuid string) (*hr.StaffModel, *process.Process) {
// 验证员工ID
guid, err := unique.FromString(staffGuid)
if err != nil {
return nil, process.FailError(types.InvalidParamError, err)
}
// 查询员工
staff := &hr.StaffModel{}
r := dblib.DBIns.DB.Where("RecordGuid = ? AND (RecordStatus & 524288) = 0", guid).First(staff)
if r.Error != nil {
return nil, process.FailError(types.StaffNotFoundError, r.Error)
}
// 解除绑定
staff.UserGuid = unique.NilUUID
staff.Account = ""
// 保存更新
r = dblib.DBIns.DB.Save(staff)
if r.Error != nil {
return nil, process.FailError(types.UpdateStaffError, r.Error)
}
return staff, process.Success(200)
}
// GetStaff 获取员工详情
func GetStaff(staffGuid string) (*StaffDetailDTO, *process.Process) {
// 验证员工ID
guid, err := unique.FromString(staffGuid)
if err != nil {
return nil, process.FailError(types.InvalidParamError, err)
}
// 查询员工基本信息
staff := &hr.StaffModel{}
r := dblib.DBIns.DB.Where("RecordGuid = ? AND (RecordStatus & 524288) = 0", guid).First(staff)
if r.Error != nil {
return nil, process.FailError(types.StaffNotFoundError, r.Error)
}
// 构建员工详情DTO
result := &StaffDetailDTO{
StaffGuid: staff.RecordGuid.String(),
StaffName: staff.StaffName,
JobID: staff.JobID,
Account: staff.Account,
UserGuid: staff.UserGuid.String(),
StaffType: int(staff.RecordType),
Positions: []PositionInfo{},
}
// 查询员工所在的组织
rows, err := dblib.DBIns.DB.Raw(`
SELECT
o.RecordGuid as OrgGuid,
o.OrganizationName,
p.RecordGuid as PosGuid,
p.PositionName,
so.IsLeader,
so.RecordType as RelType
FROM
`+hr.Staff2OrganizationTable+` so
JOIN
`+hr.OrganizationTable+` o ON so.TargetGuid = o.RecordGuid
LEFT JOIN
`+hr.PositionTable+` p ON so.PositionGuid = p.RecordGuid
WHERE
so.ObjectGuid = ?
AND (so.RecordStatus & 524288) = 0
AND (o.RecordStatus & 524288) = 0
`, guid).Rows()
if err == nil {
defer rows.Close()
// 处理查询结果
for rows.Next() {
var position PositionInfo
var orgGuid unique.UUID
var posGuid unique.UUID
var isLeader bool
var relType int16
err := rows.Scan(
&orgGuid,
&position.OrganizationName,
&posGuid,
&position.PositionName,
&isLeader,
&relType,
)
if err != nil {
continue
}
position.OrganizationGuid = orgGuid
position.PositionGuid = posGuid
position.IsLeader = isLeader
position.IsMainPosition = (relType == 0) // 0表示主岗位
// 设置主部门
if position.IsMainPosition {
result.MainOrganization = position.OrganizationName
}
result.Positions = append(result.Positions, position)
}
}
return result, process.Success(200)
}
// QueryStaffs 查询员工列表
func QueryStaffs(params QueryStaffRequest) ([]*StaffDetailDTO, *process.Process) {
result := make([]*StaffDetailDTO, 0)
// 构建查询条件
db := dblib.DBIns.DB.Model(&hr.StaffModel{}).Where("(RecordStatus & 524288) = 0")
// 按员工姓名模糊查询
if params.StaffName != "" {
db = db.Where("UserName LIKE ?", "%"+params.StaffName+"%")
}
// 按账号精确查询
if params.Account != "" {
db = db.Where("Account = ?", params.Account)
}
// 按用户ID查询
if params.UserGuid != "" {
userGuid, err := unique.FromString(params.UserGuid)
if err == nil {
db = db.Where("UserGuid = ?", userGuid)
}
}
// 按员工类型查询
if params.StaffType > 0 {
db = db.Where("RecordType = ?", params.StaffType)
}
// 查询特定组织的员工
var staffGuids []string
if params.OrganizationGuid != "" {
orgGuid, err := unique.FromString(params.OrganizationGuid)
if err == nil {
// 查询组织下的员工ID
rows, err := dblib.DBIns.DB.Raw(`
SELECT
so.ObjectGuid
FROM
`+hr.Staff2OrganizationTable+` so
WHERE
so.TargetGuid = ?
AND (so.RecordStatus & 524288) = 0
`, orgGuid).Rows()
if err == nil {
defer rows.Close()
// 处理查询结果
for rows.Next() {
var guidObj unique.UUID
err := rows.Scan(&guidObj)
if err == nil {
staffGuids = append(staffGuids, guidObj.String())
}
}
if len(staffGuids) > 0 {
db = db.Where("RecordGuid IN ?", staffGuids)
} else {
// 如果没有找到员工,返回空结果
return result, process.Success(200)
}
}
}
}
// 分页查询
limit := params.Limit
if limit <= 0 {
limit = 20 // 默认每页20条
}
offset := params.Offset
if offset < 0 {
offset = 0
}
// 查询员工列表
staffs := make([]*hr.StaffModel, 0)
r := db.Limit(limit).Offset(offset).Find(&staffs)
if r.Error != nil {
return result, process.FailError(types.QueryStaffError, r.Error)
}
// 转换为DetailDTO
for _, staff := range staffs {
detail, proc := GetStaff(staff.RecordGuid.String())
if !proc.IsError() && detail != nil {
result = append(result, detail)
}
}
return result, process.Success(200)
}
// GetStaffByUserGuid 根据UserGuid获取员工
func GetStaffByUserGuid(userGuid string) (*StaffDetailDTO, *process.Process) {
// 验证用户ID
guid, err := unique.FromString(userGuid)
if err != nil {
return nil, process.FailError(types.InvalidParamError, err)
}
// 查询员工
staff := &hr.StaffModel{}
r := dblib.DBIns.DB.Where("UserGuid = ? AND (RecordStatus & 524288) = 0", guid).First(staff)
if r.Error != nil {
return nil, process.FailError(types.StaffNotFoundError, r.Error)
}
// 获取详细信息
return GetStaff(staff.RecordGuid.String())
}
// GetStaffByAccount 根据账号获取员工
func GetStaffByAccount(account string) (*StaffDetailDTO, *process.Process) {
if account == "" {
return nil, process.FailError(types.InvalidParamError, fmt.Errorf("账号不能为空"))
}
// 查询员工
staff := &hr.StaffModel{}
r := dblib.DBIns.DB.Where("Account = ? AND (RecordStatus & 524288) = 0", account).First(staff)
if r.Error != nil {
return nil, process.FailError(types.StaffNotFoundError, r.Error)
}
// 获取详细信息
return GetStaff(staff.RecordGuid.String())
}