HR管理系统
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

554 lines
14 KiB

package personnelapi
import (
"hr_server/models"
"hr_server/models/hrmodels"
"hr_server/models/workgroup"
"hr_server/overall"
"hr_server/overall/overallhandle"
"sort"
"strconv"
"strings"
"github.com/gin-gonic/gin"
)
/*
*
@ 作者: 秦东
@ 时间: 2024-05-24 13:55:03
@ 功能: 根据行政组织ID获取当前行政组织人员及子行政组织
@ 参数
#
@ 返回值
#
@ 方法原型
#
*/
func (s *StaffApi) GainSunOrgAndUser(c *gin.Context) {
var requestData overallhandle.ConstId
err := c.ShouldBindJSON(&requestData)
if err != nil {
requestData.Id = "313"
}
if requestData.Id == "" {
requestData.Id = "313"
}
var sendInfo OrgGainPeopel
orgIdInt, _ := strconv.ParseInt(requestData.Id, 10, 64)
synPro.Add(1)
go sendInfo.GainAllFatherOrg(orgIdInt)
synPro.Add(1)
go sendInfo.GainOrgPeopel(orgIdInt)
synPro.Add(1)
go sendInfo.GainOrgSunOrgList(orgIdInt)
synPro.Wait()
var sendData SendOrgGainPeopel
sendData.OrgList = sendInfo.OrgList
sendData.OrgUserList = append(sendData.OrgUserList, sendInfo.SunOrgList...)
sendData.OrgUserList = append(sendData.OrgUserList, sendInfo.UserList...)
overallhandle.Result(0, sendData, c)
}
/*
*
@ 作者: 秦东
@ 时间: 2024-05-24 14:33:28
@ 功能: 获取当前行政组织直接子级行政组织
@ 参数
#
@ 返回值
#
@ 方法原型
#
*/
func (o *OrgGainPeopel) GainOrgSunOrgList(orgId int64) {
defer synPro.Done()
var orgList []models.AdministrativeOrganization
overall.CONSTANT_DB_HR.Model(&models.AdministrativeOrganization{}).Select("`id`,`name`").Where("`state` = 1 AND `superior` = ?", orgId).Find(&orgList)
if len(orgList) > 0 {
for _, v := range orgList {
var user UserOrgRole
user.Id = strconv.FormatInt(v.Id, 10)
user.Title = v.Name
user.Img = ""
user.IsPick = 2
user.Types = 2
o.SunOrgList = append(o.SunOrgList, user)
}
}
}
/*
*
@ 作者: 秦东
@ 时间: 2024-05-24 14:23:46
@ 功能: 获取当前行政组织下得人员信息
@ 参数
#
@ 返回值
#
@ 方法原型
#
*/
func (o *OrgGainPeopel) GainOrgPeopel(orgId int64) {
defer synPro.Done()
var prople []models.PersonArchives
err := overall.CONSTANT_DB_HR.Model(&models.PersonArchives{}).Select("`key`,`number`,`name`,`icon`,`admin_org`,`icon_photo`").Where("`admin_org` = ? AND `emp_type` BETWEEN ? AND ? ", orgId, 1, 10).Find(&prople).Error
if err == nil && len(prople) > 0 {
for _, v := range prople {
var user UserOrgRole
user.Id = strconv.FormatInt(v.Key, 10)
user.Title = v.Name
user.Img = v.Icon
if v.IconPhoto != "" {
user.Img = v.IconPhoto
}
user.IsPick = 2
user.Types = 1
o.UserList = append(o.UserList, user)
}
}
}
/*
*
@ 作者: 秦东
@ 时间: 2024-05-24 14:04:20
@ 功能: 获取所有父级行政组织
@ 参数
#orgId 行政组织ID
@ 返回值
#
@ 方法原型
#
*/
func (o *OrgGainPeopel) GainAllFatherOrg(orgId int64) {
defer synPro.Done()
var sunAry overallhandle.AllSunList[int64]
sunAry.GetAllParentOrg(orgId, 2)
sunAry.SunList = append(sunAry.SunList, orgId)
if len(sunAry.SunList) > 0 {
var orgList []hrmodels.OrgCont
err := overall.CONSTANT_DB_HR.Model(&hrmodels.OrgCont{}).Select("`id`,`name`,`level`").Where("`id` IN ?", sunAry.SunList).Find(&orgList).Error
if err == nil {
sort.Slice(orgList, func(i, j int) bool {
return orgList[i].Level < orgList[j].Level
})
for _, v := range orgList {
var orgInfo OrgCrumb
orgInfo.Id = strconv.FormatInt(v.Id, 10)
orgInfo.Title = v.Name
o.OrgList = append(o.OrgList, orgInfo)
}
}
}
}
/*
*
@ 作者: 秦东
@ 时间: 2024-05-27 08:33:09
@ 功能: 搜索行政组织及人员
@ 参数
#
@ 返回值
#
@ 方法原型
#
*/
func (s *StaffApi) SearchOrgUser(c *gin.Context) {
var requestData overallhandle.NameOverall
err := c.ShouldBindJSON(&requestData)
var sendData SendOrgGainPeopel
if err != nil {
overallhandle.Result(0, sendData, c)
return
}
if requestData.Name == "" {
overallhandle.Result(0, sendData, c)
return
}
var sendInfo OrgGainPeopel
synPro.Add(1)
go sendInfo.SearchOrgCont(requestData.Name)
synPro.Add(1)
go sendInfo.SearchPeopleCont(requestData.Name)
synPro.Wait()
sendData.OrgUserList = append(sendData.OrgUserList, sendInfo.SunOrgList...)
sendData.OrgUserList = append(sendData.OrgUserList, sendInfo.UserList...)
overallhandle.Result(0, sendData, c)
}
/*
*
@ 作者: 秦东
@ 时间: 2024-05-27 08:51:49
@ 功能: 搜索人员
@ 参数
#
@ 返回值
#
@ 方法原型
#
*/
func (o *OrgGainPeopel) SearchPeopleCont(name string) {
defer synPro.Done()
var prople []models.PersonArchives
err := overall.CONSTANT_DB_HR.Model(&models.PersonArchives{}).Select("`key`,`number`,`name`,`icon`,`admin_org`,`icon_photo`").Where("(`name` Like ? OR `number` Like ?) AND `emp_type` BETWEEN ? AND ? ", "%"+name+"%", "%"+name+"%", 1, 10).Find(&prople).Error
if err == nil && len(prople) > 0 {
for _, v := range prople {
var user UserOrgRole
user.Id = strconv.FormatInt(v.Key, 10)
user.Title = v.Name
user.Img = v.Icon
if v.IconPhoto != "" {
user.Img = v.IconPhoto
}
user.IsPick = 2
user.Types = 1
o.UserList = append(o.UserList, user)
}
}
}
/*
*
@ 作者: 秦东
@ 时间: 2024-05-27 08:40:51
@ 功能: 搜索行政组织名称
@ 参数
#name 行政组织名称
@ 返回值
#
@ 方法原型
#
*/
func (o *OrgGainPeopel) SearchOrgCont(name string) {
defer synPro.Done()
var orgList []hrmodels.OrgCont
overall.CONSTANT_DB_HR.Model(&hrmodels.OrgCont{}).Select("`id`,`name`").Where("`state` = 1 AND level > 3 AND `name` LIKE ?", "%"+name+"%").Find(&orgList)
if len(orgList) > 0 {
for _, v := range orgList {
var user UserOrgRole
user.Id = strconv.FormatInt(v.Id, 10)
user.Title = v.Name
user.Img = ""
user.IsPick = 2
user.Types = 2
o.SunOrgList = append(o.SunOrgList, user)
}
}
}
/*
*
@ 作者: 秦东
@ 时间: 2025-04-03 10:36:25
@ 功能: 人员列表
@ 参数
#
@ 返回值
#
@ 方法原型
#
*/
func (s *StaffApi) PeopleList(c *gin.Context) {
var requestData peopleList
c.ShouldBindJSON(&requestData)
if requestData.Page < 0 {
requestData.Page = 1
}
if requestData.PageSize < 0 {
requestData.PageSize = 10
}
gormDb := overall.CONSTANT_DB_HR.Model(&models.PersonArchives{}).Select("`id`").Where("`number` NOT LIKE ?", "%W%")
if requestData.Number != "" { //工号
gormDb = gormDb.Where("number LIKE ?", "%"+requestData.Number+"%")
}
if requestData.Name != "" { //姓名
gormDb = gormDb.Where("name LIKE ?", "%"+requestData.Name+"%")
}
if requestData.HireClass != 0 { //雇佣类型
gormDb = gormDb.Where("hire_class = ?", requestData.HireClass)
}
if requestData.Company != 0 { //所在公司
gormDb = gormDb.Where("company = ?", requestData.Company)
}
if requestData.Position != 0 { //职位
gormDb = gormDb.Where("position = ?", requestData.Position)
}
if len(requestData.EmpType) > 0 { //用工关系
gormDb = gormDb.Where("emp_type IN ?", requestData.EmpType)
}
if requestData.Role != "" { //角色
gormDb = gormDb.Where("FIND_IN_SET(?,`role`)", requestData.Role)
}
var banZu []workgroup.TeamsRules
var ruleTypeId int64
var ruleTypeName string
//查询行政组织
if requestData.AdminOrg != 0 {
var sunAry overallhandle.AllSunList[int64]
sunAry.GetAllSunOrg(requestData.AdminOrg)
sunAry.SunList = append(sunAry.SunList, requestData.AdminOrg) //获取本行政组织及子行政组织
gormDb = gormDb.Where("admin_org IN ?", sunAry.SunList) //获取本组织下的数据
if requestData.Days != "" { //判断有无日期
menuCont, _, err := CureeRunRules(requestData.AdminOrg) //确定当前行政组织用哪一个轮询规则
if err != nil {
overallhandle.Result(200, err, c, "此行政组织还未设定班组轮询规则!")
return
}
banZu, err = menuCont.CountOrgTeamsIsDay(requestData.Days) //获取轮询班组
if err == nil {
var dayTeamsId []int64 //获取当天有人员上班的班组
for _, v := range banZu {
if v.CycleWorkTime != 0 && !overallhandle.IsInTrue(v.TeamsId, dayTeamsId) {
dayTeamsId = append(dayTeamsId, v.TeamsId)
}
ruleTypeId = v.RuleTypeId
ruleTypeName = v.RuleTypeName
}
//判断是否按班组查询
if requestData.Teamid != 0 {
if overallhandle.IsInTrue(requestData.Teamid, dayTeamsId) {
gormDb = gormDb.Where("teamid = ?", requestData.Teamid)
} else {
overallhandle.Result(200, err, c, "当天此行政组织内的此班组处于休息状态!")
return
}
} else {
if len(dayTeamsId) > 0 {
gormDb = gormDb.Where("teamid IN ?", dayTeamsId)
}
}
} else {
if requestData.Teamid != 0 {
gormDb = gormDb.Where("teamid = ?", requestData.Teamid)
}
}
} else {
if requestData.Teamid != 0 {
gormDb = gormDb.Where("teamid = ?", requestData.Teamid)
}
}
} else {
if requestData.Teamid != 0 { //班组
gormDb = gormDb.Where("teamid = ?", requestData.Teamid)
}
}
//查询共多少数据
var total int64
totalErr := gormDb.Count(&total).Error
if totalErr != nil {
total = 0
}
var idAry []int64
gormDbs := overallhandle.PageTurningSettings(gormDb, requestData.Page, requestData.PageSize)
err := gormDbs.Find(&idAry).Error
var positionAry []peopleManOutList
if err != nil || len(idAry) < 1 {
overallhandle.ResultList(0, requestData.Page, requestData.PageSize, total, int64(len(positionAry)), positionAry, c)
return
}
var manContList []models.ManCont
err = overall.CONSTANT_DB_HR.Where("`id` IN ?", idAry).Find(&manContList).Error
if err != nil || len(manContList) < 1 {
overallhandle.ResultList(0, requestData.Page, requestData.PageSize, total, int64(len(positionAry)), positionAry, c)
return
}
// fmt.Printf("banzu--->%v\n\n\n", banZu)
// return
//计算人员属性
var guoDuMan []models.ManCont
var peopelList ManTableList
for i, v := range manContList {
if (i+1)%50 == 0 {
synPro.Add(1)
go peopelList.SnycChundSub(guoDuMan, requestData.AdminOrg, requestData.Days)
guoDuMan = []models.ManCont{}
} else {
guoDuMan = append(guoDuMan, v)
}
}
if len(guoDuMan) > 0 {
synPro.Add(1)
go peopelList.SnycChundSub(guoDuMan, requestData.AdminOrg, requestData.Days)
guoDuMan = []models.ManCont{}
}
synPro.Wait()
positionAry = peopelList.List
sendExpand := overallhandle.MapOut()
var sendRuleInfo DaysTeamsRuler
if len(banZu) > 0 {
sendRuleInfo.RuleTypeId = strconv.FormatInt(ruleTypeId, 10)
sendRuleInfo.RuleTypeName = ruleTypeName
// var workTimePer []workgroup.WorkingTimePeriod
// overall.CONSTANT_DB_HR.Where("`type_id` = ?", ruleTypeId).Find(&workTimePer)
// var teamRuleMap []DaysTeamsRulerInfo
// if len(workTimePer) > 0 {
// for _, v := range workTimePer {
// for _, bv := range banZu {
// if v.Id == bv.CycleWorkTime {
// var teamRuleInfo DaysTeamsRulerInfo
// teamRuleInfo.TeamsId = strconv.FormatInt(bv.TeamsId, 10) //生产班组ID
// teamRuleInfo.TeamsName = bv.TeamsName //生产班组名称
// teamRuleInfo.RuleId = strconv.FormatInt(v.Id, 10) //规则ID
// teamRuleInfo.RuleName = v.Name //规则名称
// teamRuleInfo.StartTime = v.StartTime //开始时间
// teamRuleInfo.EndTime = v.EndTime //结束时间
// teamRuleMap = append(teamRuleMap, teamRuleInfo)
// }
// }
// }
// }
var teamRuleMap []DaysTeamsRulerInfo
for _, bv := range banZu {
ruleSetUp := GetRuleSetup(bv.CycleWorkTime)
var teamRuleInfo DaysTeamsRulerInfo
teamRuleInfo.TeamsId = strconv.FormatInt(bv.TeamsId, 10) //生产班组ID
teamRuleInfo.TeamsName = bv.TeamsName //生产班组名称
teamRuleInfo.RuleId = strconv.FormatInt(ruleSetUp.Id, 10) //规则ID
teamRuleInfo.RuleName = ruleSetUp.Name //规则名称
teamRuleInfo.StartTime = ruleSetUp.StartTime //开始时间
teamRuleInfo.EndTime = ruleSetUp.EndTime //结束时间
teamRuleInfo.List = CurrentTreamPeopel(bv.TeamsId, positionAry)
teamRuleMap = append(teamRuleMap, teamRuleInfo)
}
sort.Slice(teamRuleMap, func(i, j int) bool {
return teamRuleMap[i].StartTime < teamRuleMap[j].StartTime
})
sendRuleInfo.List = teamRuleMap
}
sendExpand["ruler"] = sendRuleInfo
overallhandle.ResultList(0, requestData.Page, requestData.PageSize, total, int64(len(positionAry)), positionAry, c, sendExpand)
}
/*
*
@ 作者: 秦东
@ 时间: 2025-04-03 14:15:29
@ 功能: 协程处理事务
*/
func (m *ManTableList) SnycChundSub(list []models.ManCont, orgId int64, days string) {
defer synPro.Done()
for _, v := range list {
//计算调班人员数据
if days != "" {
v = Shiftdjustment(days, v)
// fmt.Printf("\n\n\n\n结果:%v\n\n\n\n", v)
}
var staffInfo peopleManOutList
staffInfo.ManCont = v
var getSpur models.Position
getWhe := overallhandle.MapOut()
if v.Position != 0 {
getWhe["id"] = v.Position
getSpur.GetCont(getWhe, "name", "person_in_charge")
}
staffInfo.PositionName = getSpur.Name
staffInfo.KeyStr = strconv.FormatInt(v.Key, 10)
//公司
if v.Company != 0 {
staffInfo.CompanyName = OrgContOut(v.Company)
}
//主部门
if v.MainDeparment != 0 {
staffInfo.MainDeparmentName = OrgContOut(v.MainDeparment)
}
//二级著部门
if v.SunMainDeparment != 0 {
staffInfo.SunMainDeparmentName = OrgContOut(v.SunMainDeparment)
}
var orgContTypeCont models.OrgContType
orgContTypeCont.GetCont(map[string]interface{}{"`id`": v.AdminOrg}, "`name`", "`level`")
if orgContTypeCont.Level >= 6 {
staffInfo.WorkPostName = orgContTypeCont.Name
}
staffInfo.PersonInCharge = 2
if v.PersonInCharge == 1 {
orgResList := strings.Split(v.ResponsibleDepartment, ",")
if len(orgResList) > 0 {
orgIdStr := strconv.FormatInt(orgId, 10)
if overallhandle.IsInTrue[string](orgIdStr, orgResList) == true {
staffInfo.PersonInCharge = 1
}
}
}
sendMap, _ := GetUesrOffice(v.Key)
staffInfo.OfficeList = sendMap
m.List = append(m.List, staffInfo)
}
}
// 获取当前班组的人员
func CurrentTreamPeopel(teamsId int64, manList []peopleManOutList) (teamsManList []string) {
for _, v := range manList {
if v.TeamId == teamsId {
teamsManList = append(teamsManList, v.Number)
}
}
return
}
// 获取规则设定
func GetRuleSetup(id int64) (periodInfo workgroup.WorkingTimePeriod) {
overall.CONSTANT_DB_HR.Where("`id` = ?", id).First(&periodInfo)
return
}
// 输出行政组织信息
func OrgContOut(orgId int64) string {
var getSpurDepart models.AdministrativeOrganization
getWheDepart := overallhandle.MapOut()
getWheDepart["id"] = orgId
getSpurDepart.GetCont(getWheDepart, "name")
return getSpurDepart.Name
}