diff --git a/api/version1/personnelapi/__debug_bin.exe b/api/version1/personnelapi/__debug_bin.exe deleted file mode 100644 index 57f02fa..0000000 Binary files a/api/version1/personnelapi/__debug_bin.exe and /dev/null differ diff --git a/api/version1/personnelapi/controll.go b/api/version1/personnelapi/controll.go index ff89225..0c5c21d 100644 --- a/api/version1/personnelapi/controll.go +++ b/api/version1/personnelapi/controll.go @@ -210,7 +210,7 @@ func assignTypeToInt(name string) int { /* 变动类型 -(1:预入职;2:雇佣入职;3:转正;4:晋升;5:降级;6:职等调整;7:调动调入;8:跨公司调动调入;9:借调;10:平调;11:兼职;12:预离职;13:离职;14:退休;15:返聘;16:员工初始化;) +(1:预入职;2:雇佣入职;3:转正;4:晋升;5:降级;6:职等调整;7:调动调入;8:跨公司调动调入;9:借调;10:平调;11:兼职;12:预离职;13:离职;14:退休;15:返聘;16:员工初始化;17、新入职;) */ func changeTypeToInt(emp string) int { switch emp { @@ -222,8 +222,12 @@ func changeTypeToInt(emp string) int { return 3 case "晋升": return 4 + case "升职": + return 4 case "降级": return 5 + case "降职": + return 5 case "职等调整": return 6 case "调动调入": @@ -266,6 +270,8 @@ func changeTypeToInt(emp string) int { return 24 case "实习结束": return 25 + case "新入职": + return 26 default: return 1 } @@ -279,9 +285,9 @@ func changeTypeToStr(emp int) string { case 3: return "转正" case 4: - return "晋升" + return "升职" case 5: - return "降级" + return "降职" case 6: return "职等调整" case 7: @@ -322,6 +328,8 @@ func changeTypeToStr(emp int) string { return "合同到期" case 25: return "实习结束" + case 26: + return "新入职" default: return "预入职" } @@ -423,3 +431,101 @@ func EmptypeToStr(emp int) string { return "临时工" } } + +//雇佣类型(1:社会招聘;2:校园招聘;3:内部推荐) +func JoinJobChanel(hir string) int { + switch hir { + case "校园招聘": + return 2 + case "内部推荐": + return 3 + default: + return 1 + } +} + +// 学历类型 +func EducationTypeStr(level string) int { + switch level { + case "全日制统招": + return 1 + case "成人高考": + return 2 + case "自学考试": + return 3 + case "开放大学": + return 4 + case "网络教育": + return 5 + case "函授": + return 6 + default: + return 0 + } +} + +// 职位变动类型 +func PositionChangeTypeStr(level string) int { + switch level { + case "平调": + return 2 + case "降职": + return 3 + case "升职": + return 4 + default: + return 1 + } +} + +// 奖惩级别 +func RewPunLevelStr(level string) int { + switch level { + case "部门级": + return 1 + case "公司级": + return 2 + case "县级": + return 3 + case "市级": + return 4 + case "省级": + return 5 + case "国家级": + return 6 + default: + return 0 + } +} +func RewPunLevelClassStr(emp string) int { + switch emp { + case "年终评优": + return 1 + case "表扬": + return 2 + case "嘉奖": + return 3 + case "记功": + return 4 + case "记大功": + return 5 + case "特别奖励": + return 6 + case "批评": + return 7 + case "警告": + return 8 + case "记过": + return 9 + case "记大过": + return 10 + case "降级": + return 11 + case "留用察看": + return 12 + case "开除": + return 13 + default: + return 0 + } +} diff --git a/api/version1/personnelapi/kingdeeempty.go b/api/version1/personnelapi/kingdeeempty.go index e72108f..6c9b631 100644 --- a/api/version1/personnelapi/kingdeeempty.go +++ b/api/version1/personnelapi/kingdeeempty.go @@ -1,6 +1,7 @@ package personnelapi import ( + "hr_server/models" "hr_server/models/hrmodels" "hr_server/overall" "hr_server/overall/overallhandle" @@ -171,3 +172,25 @@ func EmployeeOnboardingAndResignation(userKey int64, changetype, starttime strin } } + +/* +* +@ 作者: 秦东 +@ 时间: 2024-01-26 10:18:34 +@ 功能: 当员工入职时间为空时从集团经历中获取最早入职时间 +@ 参数 + + # + +@ 返回值 + + # + +@ 方法原型 + + # +*/ +func GetInsetCommpyTime(userKey int64) (workTime int64) { + overall.CONSTANT_DB_HR.Model(&models.InsideWorkHistory{}).Select("COALESCE(MIN(start_time), 0) AS beginTime").Where("`key` = ?", userKey).Find(&workTime) + return +} diff --git a/api/version1/personnelapi/kingdeenew.go b/api/version1/personnelapi/kingdeenew.go index 82136a8..05539fd 100644 --- a/api/version1/personnelapi/kingdeenew.go +++ b/api/version1/personnelapi/kingdeenew.go @@ -35,31 +35,31 @@ func (s *StaffApi) NewKingdee(c *gin.Context) { overallhandle.WriteLog("i", "KingDee对接数据!", saveKingDee) // kingdeeErr := overall.CONSTANT_DB_HR.Create(&saveKingDee).Error // overallhandle.WriteLog("w", "KingDee写入数据库状态!", kingdeeErr) - if requestData.Number != "200019" && requestData.Number != "200008" { - var manContent models.PersonArchives - manErr := manContent.GetCont(map[string]interface{}{"`number`": requestData.Number}) - if manErr == nil { - //已经存在!进行变动操作 - manErr = eidtAddManContJinDie(manContent, requestData) - overallhandle.WriteLog("i", "已经存在!进行变动操作!", saveKingDee) - } else { - //不存在!进行新增操作 - var oldSchool models.WorkMan - oldSchool.GetCont(map[string]interface{}{"wm_number": requestData.Number}) - manErr = newAddManContJinDie(oldSchool, requestData) - overallhandle.WriteLog("i", "不存在!进行新增操作!", manErr, saveKingDee) - } - if manErr != nil { - overallhandle.Result(104, manErr, c) - overallhandle.WriteLog("e", "数据处理失败!", manErr, saveKingDee) - return - } - overallhandle.WriteLog("t", "执行行人员信息对接对照结束!") - overallhandle.Result(0, manErr, c) + // if requestData.Number != "200019" && requestData.Number != "200008" { + var manContent models.PersonArchives + manErr := manContent.GetCont(map[string]interface{}{"`number`": requestData.Number}) + if manErr == nil { + //已经存在!进行变动操作 + manErr = eidtAddManContJinDie(manContent, requestData) + overallhandle.WriteLog("i", "已经存在!进行变动操作!", saveKingDee) } else { - overallhandle.WriteLog("t", "特殊人员信息对接对照结束!") - overallhandle.Result(0, nil, c) + //不存在!进行新增操作 + var oldSchool models.WorkMan + oldSchool.GetCont(map[string]interface{}{"wm_number": requestData.Number}) + manErr = newAddManContJinDie(oldSchool, requestData) + overallhandle.WriteLog("i", "不存在!进行新增操作!", manErr, saveKingDee) + } + if manErr != nil { + overallhandle.Result(104, manErr, c) + overallhandle.WriteLog("e", "数据处理失败!", manErr, saveKingDee) + return } + overallhandle.WriteLog("t", "执行行人员信息对接对照结束!") + overallhandle.Result(0, manErr, c) + // } else { + // overallhandle.WriteLog("t", "特殊人员信息对接对照结束!") + // overallhandle.Result(0, nil, c) + // } } @@ -82,7 +82,7 @@ func (s *StaffApi) NewKingdee(c *gin.Context) { # */ func eidtAddManContJinDie(perArcInfo models.PersonArchives, manCont addKingdeePersonneles) error { - fmt.Printf("编辑--->%v\n", manCont) + // fmt.Printf("编辑--->%v\n", manCont) eidtManCont := overallhandle.MapOut() if manCont.Name != "" && manCont.Name != perArcInfo.Name { @@ -279,28 +279,29 @@ func eidtAddManContJinDie(perArcInfo models.PersonArchives, manCont addKingdeePe } } - - //编辑人员附属信息 - synPro.Add(1) - go editManAuxiliaryDataNew(perArcInfo.Key, manCont) - //编辑紧急联系人信息 - synPro.Add(1) - go emergencyContactPersonNew(perArcInfo.Key, manCont) - //编辑员工家属信息 - synPro.Add(1) - go eidtFamilyMembersNew(perArcInfo.Key, manCont.Number, manCont.MemberOfFamily) - //编辑员工教育经历 - synPro.Add(1) - go educatExperKingdeeNew(perArcInfo.Key, manCont) - //编辑工作履历 - synPro.Add(1) - go editWorkHistoryMan(perArcInfo.Key, manCont.Number, manCont.WorkHistoryList) - //编辑集团内工作履历 - synPro.Add(1) - // go editInsideWorkHistoryMan(perArcInfo.Key, manCont.InsideWorkHistory) - // go editInsideWorkHistoryManNew(perArcInfo.Key, manCont.InsideWorkHistory) - go EditWithinGroupWorkLog(perArcInfo.Key, manCont.InsideWorkHistory) - synPro.Wait() + if perArcInfo.IsLock != 1 { + //编辑人员附属信息 + synPro.Add(1) + go editManAuxiliaryDataNew(perArcInfo.Key, manCont) + //编辑紧急联系人信息 + synPro.Add(1) + go emergencyContactPersonNew(perArcInfo.Key, manCont) + //编辑员工家属信息 + synPro.Add(1) + go eidtFamilyMembersNew(perArcInfo.Key, manCont.Number, manCont.MemberOfFamily) + //编辑员工教育经历 + synPro.Add(1) + go educatExperKingdeeNew(perArcInfo.Key, manCont) + //编辑工作履历 + synPro.Add(1) + go editWorkHistoryMan(perArcInfo.Key, manCont.Number, manCont.WorkHistoryList) + //编辑集团内工作履历 + synPro.Add(1) + // go editInsideWorkHistoryMan(perArcInfo.Key, manCont.InsideWorkHistory) + // go editInsideWorkHistoryManNew(perArcInfo.Key, manCont.InsideWorkHistory) + go EditWithinGroupWorkLog(perArcInfo.Key, manCont.InsideWorkHistory) + synPro.Wait() + } return nil } @@ -515,7 +516,7 @@ func editManAuxiliaryDataNew(manKeyNum int64, manCont addKingdeePersonneles) { defer synPro.Done() var manInfo models.PersonnelContent manErr := manInfo.GetCont(map[string]interface{}{"`key`": manKeyNum}) - fmt.Printf("editManAuxilia--------------------->%v\n", manErr) + // fmt.Printf("editManAuxilia--------------------->%v\n", manErr) if manErr == nil { saveData := overallhandle.MapOut() @@ -690,6 +691,8 @@ func editManAuxiliaryDataNew(manKeyNum int64, manCont addKingdeePersonneles) { if entryData != manInfo.Entrydate { saveData["entrydate"] = entryData } + } else { + saveData["entrydate"] = GetInsetCommpyTime(manKeyNum) } if manCont.ProbationPeriod != "" { @@ -733,9 +736,9 @@ func editManAuxiliaryDataNew(manKeyNum int64, manCont addKingdeePersonneles) { saveData["`time`"] = time.Now().Unix() manInfo.EiteCont(map[string]interface{}{"`key`": manInfo.Key}, saveData) } - fmt.Printf("editManAuxilia-----------1---------->%v\n", saveData) + // fmt.Printf("editManAuxilia-----------1---------->%v\n", saveData) } else { - fmt.Printf("editManAuxilia----------2----------->%v\n", manErr) + // fmt.Printf("editManAuxilia----------2----------->%v\n", manErr) manInfo.Key = manKeyNum manInfo.Number = manCont.Number manInfo.Passportno = manCont.Passportno @@ -838,6 +841,8 @@ func editManAuxiliaryDataNew(manKeyNum int64, manCont addKingdeePersonneles) { if entryDataErr == false { entryData, _ = overallhandle.DateToTimeStamp(fmt.Sprintf("%v 00:00:00", manCont.EntryDate)) } + } else { + entryData = GetInsetCommpyTime(manKeyNum) } manInfo.Entrydate = entryData probPeriod, _ := overallhandle.StringToInt(manCont.ProbationPeriod) diff --git a/api/version1/personnelapi/staffarchives.go b/api/version1/personnelapi/staffarchives.go index cad6838..42a0140 100644 --- a/api/version1/personnelapi/staffarchives.go +++ b/api/version1/personnelapi/staffarchives.go @@ -405,7 +405,7 @@ func getXueWeiClass(id int) string { func getWorkHistoryList(key int64) (workHisList []workHistoryAry) { defer synPro.Done() var workHisContList []models.WorkHistory - workHisContListErr := overall.CONSTANT_DB_HR.Where("`state` = 1 AND `key` = ?", key).Find(&workHisContList).Error + workHisContListErr := overall.CONSTANT_DB_HR.Where("`state` = 1 AND `key` = ?", key).Order("entry_time desc").Find(&workHisContList).Error if workHisContListErr == nil { for _, v := range workHisContList { var workCont workHistoryAry @@ -419,9 +419,12 @@ func getWorkHistoryList(key int64) (workHisList []workHistoryAry) { workCont.LeaveDate = overallhandle.UnixTimeToDay(v.Leavedate, 14) //离职日期 } - workCont.Witness = v.Witness //证明人 - workCont.WitnessTel = v.WitnessTel //证明人电话 - workCont.Remarks = v.Remarks //备注 + workCont.Witness = v.Witness //证明人 + workCont.WitnessTel = v.WitnessTel //证明人电话 + workCont.Remarks = v.Remarks //备注 + workCont.WorkCont = v.WorkCont // + workCont.SuperiorPosition = v.SuperiorPosition // + workCont.MinionNumber = strconv.Itoa(v.MinionNumber) // workHisList = append(workHisList, workCont) } } @@ -1308,7 +1311,7 @@ func (s *StaffApi) EditWorkHistoryState(c *gin.Context) { func getGroupWorkHistoryList(key int64) (workHisList []insideHistory) { defer synPro.Done() var workHisContList []models.InsideWorkHistory - workHisContListErr := overall.CONSTANT_DB_HR.Where("`state` IN ? AND `key` = ?", []int{1, 2}, key).Find(&workHisContList).Error + workHisContListErr := overall.CONSTANT_DB_HR.Where("`state` IN ? AND `key` = ?", []int{1, 2}, key).Order("start_time desc").Find(&workHisContList).Error if workHisContListErr == nil { for _, v := range workHisContList { var workCont insideHistory @@ -1330,24 +1333,66 @@ func getGroupWorkHistoryList(key int64) (workHisList []insideHistory) { workCont.WorkshopSection = workshopsetdsas.Name //二级部门或车间 var positCont models.Position - positCont.GetCont(map[string]interface{}{"`id`": v.Position}, "`name`") - workCont.Position = positCont.Name //职务 + if v.Position != 0 { + positCont.GetCont(map[string]interface{}{"`id`": v.Position}, "`name`", "`superior`") + workCont.Position = positCont.Name //职务 + } - workCont.GradePositions = v.GradePositions //职务 + workCont.GradePositions = v.GradePositions //职等 if v.StartTime != 0 { workCont.StartTime = overallhandle.UnixTimeToDay(v.StartTime, 14) //开始日期 } if v.EndTime != 0 { workCont.EndTime = overallhandle.UnixTimeToDay(v.EndTime, 14) //结束日期 + } else { + workCont.EndTime = "至今" } workCont.ChangeType = v.ChangeType // + workCont.WorkCont = v.WorkCont + if positCont.Superior != 0 { + var positContSuper models.Position + positContSuper.GetCont(map[string]interface{}{"`id`": positCont.Superior}, "`name`") + workCont.SuperiorPosition = positContSuper.Name + } + //获取 + var mySunAllPost GainAllId + mySunAllPost.GetAllContId(v.Position) + if len(mySunAllPost.Id) > 0 { + var allPeople int64 + overall.CONSTANT_DB_HR.Model(&models.PersonArchives{}).Where("`position` IN ? AND emp_type < 11", mySunAllPost.Id).Count(&allPeople) + if allPeople == 0 { + workCont.MinionNumber = "" + } else { + workCont.MinionNumber = strconv.FormatInt(allPeople, 10) + } + + } workHisList = append(workHisList, workCont) } } return } +// 获取所有下属职务 +func (g *GainAllId) GetAllContId(id int64) { + if id != 0 { + var postIdList []int64 + err := overall.CONSTANT_DB_HR.Model(&models.Position{}).Select("`id`").Where("`state` = 1 AND `superior` = ?", id).Find(&postIdList) + if err == nil { + + for _, v := range postIdList { + if v != 0 { + if !overallhandle.IsInTrue[int64](v, g.Id) { + g.Id = append(g.Id, v) + } + g.GetAllContId(v) + } + } + } + } +} + // 添加工作履历 func (s *StaffApi) AddInsideHistory(c *gin.Context) { var requestData eidtInsideHistoryWork diff --git a/api/version1/personnelapi/type.go b/api/version1/personnelapi/type.go index 73449b4..029f2c8 100644 --- a/api/version1/personnelapi/type.go +++ b/api/version1/personnelapi/type.go @@ -10,6 +10,7 @@ import ( // 协程 var synPro = sync.WaitGroup{} +var synPros = sync.WaitGroup{} // 人员API type StaffApi struct{} @@ -342,21 +343,26 @@ type DoubleWorkerInFo struct { type educatExp struct { educationalExperience - AcademicDegreeId int `json:"academicdegreeid"` //学位(0:无;1:学士;2:硕士;3:博士) - LevelId int `json:"levelid"` //学历类型(1:普通;2:第一学历;3:最高学历) - Id string `json:"id"` + AcademicDegreeId int `json:"academicdegreeid"` //学位(0:无;1:学士;2:硕士;3:博士) + LevelId int `json:"levelid"` //学历类型(1:普通;2:第一学历;3:最高学历) + Id string `json:"id"` + EducationName string `json:"educationName"` //'学历(1:初中及以下;2:中专;3:高中;4:中技;5:高技;6:函数专科;7:大学专科;8:函数本科;9:大学本科;10:硕士研究生;11:博士研究生;12:专家、教授)' + EducationTypeName string `json:"educationTypeName"` } // 工作履历 type workHistoryAry struct { - Company string `json:"company"` //公司 - Department string `json:"department"` //部门 - Position string `json:"position"` //职务 - EntryTime string `json:"entrytime"` //入职时间 - LeaveDate string `json:"leavedate"` //离职日期 - Witness string `json:"witness"` //证明人 - WitnessTel string `json:"witnesstel"` //证明人电话 - Remarks string `json:"remarks"` //备注 + Company string `json:"company"` //公司 + Department string `json:"department"` //部门 + Position string `json:"position"` //职务 + EntryTime string `json:"entrytime"` //入职时间 + LeaveDate string `json:"leavedate"` //离职日期 + Witness string `json:"witness"` //证明人 + WitnessTel string `json:"witnesstel"` //证明人电话 + Remarks string `json:"remarks"` //备注 + WorkCont string `json:"workcont"` //工作内容 + SuperiorPosition string `json:"superior_position"` //上级职务 + MinionNumber string `json:"minion_number"` //下属人数 } // 判断是否需要编辑工作履历 @@ -458,16 +464,19 @@ type editWorkHistory struct { // 集团内部工作履历 type insideHistory struct { - Group string `json:"group"` //集团 - Company string `json:"company"` //公司 - Department string `json:"department"` //部室 - Workshop string `json:"workshop"` //二级部门或车间 - WorkshopSection string `json:"workshopsection"` //工段 - Position string `json:"position"` //职位 - GradePositions int64 `json:"gradepositions"` //职等 - StartTime string `json:"starttime"` //开始日期 - EndTime string `json:"endtime"` //结束日期 - ChangeType int `json:"changetype"` //变动类型(1:预入职;2:雇佣入职;3:转正;4:晋升;5:降级;6:职等调整;7:调动调入;8:跨公司调动调入;9:借调;10:平调;11:兼职;12:预离职;13:离职;14:退休;15:返聘;16:员工初始化;) + Group string `json:"group"` //集团 + Company string `json:"company"` //公司 + Department string `json:"department"` //部室 + Workshop string `json:"workshop"` //二级部门或车间 + WorkshopSection string `json:"workshopsection"` //工段 + Position string `json:"position"` //职位 + GradePositions int64 `json:"gradepositions"` //职等 + StartTime string `json:"starttime"` //开始日期 + EndTime string `json:"endtime"` //结束日期 + ChangeType int `json:"changetype"` //变动类型(1:预入职;2:雇佣入职;3:转正;4:晋升;5:降级;6:职等调整;7:调动调入;8:跨公司调动调入;9:借调;10:平调;11:兼职;12:预离职;13:离职;14:退休;15:返聘;16:员工初始化;) + WorkCont string `json:"workcont"` //工作内容 + SuperiorPosition string `json:"superior_position"` //上级职务 + MinionNumber string `json:"minion_number"` //下属人数 } // 编辑集团工作履历 @@ -629,3 +638,16 @@ type EducStruCont struct { Education string `json:"education"` Percentage float64 `json:"percentage"` } + +// 获取所有值ID +type GainAllId struct { + Id []int64 +} + +// 分组数据解析 +type GroupParsingData struct { + UserNum string `json:"usernum"` + UserKey int64 `json:"userKey"` + IsOk bool `json:"isOk"` + Msg []string `json:"msg"` +} diff --git a/api/version1/personnelapi/types.go b/api/version1/personnelapi/types.go index 480ff0b..f1e9d7d 100644 --- a/api/version1/personnelapi/types.go +++ b/api/version1/personnelapi/types.go @@ -241,3 +241,28 @@ type judgeMainPost struct { // OrgId string `json:"orgid"` //行政组织 // PostId string `json:"postid"` //岗位 } + +//性格色彩试题格式 +type TestPageColor struct { + TestNumber string `json:"testnumber"` //题号 + CheckedVal string `json:"checkedval"` //选项 +} + +//性格色彩结果 +type TestPageColorVal struct { + Strval int `json:"strval"` //题号 + Name string `json:"name"` //选项 + Setval int `json:"setval"` //选项 +} + +//性格结果 +type TestPageColorResult struct { + TestNumber []string `json:"testnumber"` //题号 + CheckedVal []int `json:"checkedval"` //选项 +} + +type ExcelInfo struct { + TypeName string `json:"typeName"` + ProductMasterTitle string `json:"ProductMasterTitle"` + ProductSlaveTitle string `json:"ProductSlaveTitle"` +} diff --git a/api/version1/personnelapi/uploadfile.go b/api/version1/personnelapi/uploadfile.go new file mode 100644 index 0000000..c7d2d2f --- /dev/null +++ b/api/version1/personnelapi/uploadfile.go @@ -0,0 +1,1887 @@ +package personnelapi + +import ( + "encoding/json" + "fmt" + "hr_server/models" + "hr_server/overall" + "hr_server/overall/overallhandle" + "path" + "strconv" + "strings" + "time" + + "github.com/360EntSecGroup-Skylar/excelize" + "github.com/gin-gonic/gin" +) + +/* +* +@ 作者: 秦东 +@ 时间: 2024-01-29 08:25:02 +@ 功能: 解析上传的人员信息表格 +@ 参数 + + # + +@ 返回值 + + # + +@ 方法原型 + + # +*/ +func (s *StaffApi) UploadUserFiles(c *gin.Context) { + fileInfo, fileHeader, fileErr := c.Request.FormFile("file") + // fmt.Printf("fileInfo:%v\n", fileInfo) + // fmt.Printf("fileHeader:%v\n", fileHeader) + // fmt.Printf("fileErr:%v\n", fileErr) + if fileErr != nil { + overallhandle.Result(1, fileErr, c) + return + } + tageExt := path.Ext(fileHeader.Filename) + fmt.Printf("tageExt:%v\n", tageExt) + fileType := overallhandle.JudgeUpFileType(tageExt) + if fileType != 5 { + overallhandle.Result(1, fileType, c, "您上传的不是电子表格!请上传正确的文件!") + return + } + + xlsx, err := excelize.OpenReader(fileInfo) + if err != nil { + overallhandle.Result(2, err, c) + return + } + var userInfoData GroupParsingData + //解析excel的数据 + // lxProducts, listAry, lxRrr := ReadExcel(xlsx) + list := userInfoData.ReadExcel(xlsx) + // if lxRrr != nil { + // Logger.Error("read excel error:[%s]", lxRrr.Error()) + // baseReturn(c, 0, "解析excel文件失败") + // return + // } + // fmt.Printf("lxRrr:%v\n", lxRrr) + // fmt.Printf("lxProducts:%v\n", lxProducts) + // lxService := LxProductService{} + // errCode := lxService.ExportLxProduct(lxProducts) + // baseReturn(c, errCode, len(lxProducts)) + sendData := overallhandle.MapOut() + sendData["list"] = list + sendData["listAry"] = userInfoData.Msg + overallhandle.Result(0, sendData, c) +} + +// ReadExcel .读取excel 转成切片 +func (g *GroupParsingData) ReadExcel(xlsx *excelize.File) (list []interface{}) { + rows := xlsx.GetRows(xlsx.GetSheetName(xlsx.GetActiveSheetIndex())) + isDateYear := time.Now().Year() + //获取绩效年度 + meritsYear := make(map[int]int) + if rows[1][289] != "" { + yearAry := strings.Split(rows[1][289], "年") + if len(yearAry) > 0 { + + yearVal, _ := strconv.Atoi(yearAry[0]) + meritsYear[0] = yearVal + } + } else { + meritsYear[0] = isDateYear - 3 + } + if rows[1][290] != "" { + yearAry := strings.Split(rows[1][290], "年") + if len(yearAry) > 0 { + yearVal, _ := strconv.Atoi(yearAry[0]) + meritsYear[1] = yearVal + } + } else { + meritsYear[1] = isDateYear - 2 + } + if rows[1][291] != "" { + yearAry := strings.Split(rows[1][291], "年") + if len(yearAry) > 0 { + yearVal, _ := strconv.Atoi(yearAry[0]) + meritsYear[2] = yearVal + } + } else { + meritsYear[2] = isDateYear - 1 + } + //获取奖惩年度 + rewPunYears := make(map[int]int) + if rows[2][299] != "" { + jcYearAry := strings.Split(rows[2][299], "奖惩") + if len(jcYearAry) > 0 { + + jcYearVal, _ := strconv.Atoi(jcYearAry[0]) + rewPunYears[0] = jcYearVal + } + } else { + rewPunYears[0] = isDateYear - 3 + } + if rows[2][304] != "" { + jcYearAry := strings.Split(rows[2][304], "奖惩") + if len(jcYearAry) > 0 { + + jcYearVal, _ := strconv.Atoi(jcYearAry[0]) + rewPunYears[1] = jcYearVal + } + } else { + rewPunYears[1] = isDateYear - 2 + } + if rows[2][309] != "" { + jcYearAry := strings.Split(rows[2][309], "奖惩") + if len(jcYearAry) > 0 { + + jcYearVal, _ := strconv.Atoi(jcYearAry[0]) + rewPunYears[2] = jcYearVal + } + } else { + rewPunYears[2] = isDateYear - 1 + } + jiBuQi := 1 + var upMap []interface{} + + for i, row := range rows { + if i < 4 { + continue + } + //判断工号是否已经存在 + // shijian := overallhandle.ExcelDateToDate(row[11]) + // fmt.Println("%v出生日期:%v\n", row[2], shijian.Unix()) + // manMap := overallhandle.MapOutint() + newList := make(map[int]string) + // var data ExcelInfo + for k, v := range row { + // manMap[k] = v + newList[k] = v + // // 第一列是展示位名称 + // if k == 0 { + // data.TypeName = v + // } + // // 第二列是产品主标题 + // if k == 289 { + // data.ProductMasterTitle = v + // } + // // 第三列是产品副标题 + // if k == 290 { + // data.ProductSlaveTitle = v + // } + } + // LxProducts = append(LxProducts, data) + upMap = append(upMap, newList) + list = append(list, newList) + if len(upMap) != 0 && len(upMap)%100 == 0 { + synPro.Add(1) + go g.GroupParsingDataInfo(upMap, meritsYear, rewPunYears) + jiBuQi++ + // fmt.Printf("总数:%v\n", len(upMap)) + var upNewMap []interface{} + upMap = upNewMap + } + + } + + if len(upMap) > 0 { + jiBuQi++ + synPro.Add(1) + go g.GroupParsingDataInfo(upMap, meritsYear, rewPunYears) + } + synPro.Wait() + return +} + +/* +* +@ 作者: 秦东 +@ 时间: 2024-01-30 08:10:16 +@ 功能: 分组数据解析 +@ 参数 + + #info //人员信息 + #meritsYear 绩效年度 + #rewPunYearsmap 奖惩年度 + +@ 返回值 + + # + +@ 方法原型 + + # +*/ +func (g *GroupParsingData) GroupParsingDataInfo(list []interface{}, meritsYear, rewPunYearsmap map[int]int) { + defer synPro.Done() + // fmt.Printf("时间段:%v\n%v\n", meritsYear, rewPunYearsmap) + for _, v := range list { + if val, ok := v.(map[int]string); ok { + // fmt.Printf("分成的段:%v\n%v\n", ok, val[1]) + g.IsOk = false + g.UserNum = val[1] + if val[1] != "" { + var myCont models.PersonArchives + err := myCont.GetCont(map[string]interface{}{"`number`": val[1]}, "`key`") + if err != nil { + g.IsOk = true + } else { + g.UserKey = myCont.Key + } + g.ProcessMainTable(val, meritsYear, rewPunYearsmap) + } else { + g.Msg = append(g.Msg, fmt.Sprintf("序号:%v--->%v:没有工号", val[0], val[2])) + } + } + } +} + +/* +* +@ 作者: 秦东 +@ 时间: 2024-01-30 13:03:11 +@ 功能: 主表数据处理 +@ 参数 + + #info //人员信息 + #meritsYear 绩效年度 + #rewPunYearsmap 奖惩年度 + +@ 返回值 + + # + +@ 方法原型 + + # +*/ +func (g *GroupParsingData) ProcessMainTable(info map[int]string, meritsYear, rewPunYearsmap map[int]int) { + fmt.Printf("分成的段:%v\n%v\n%v\n", g.UserNum, g.UserKey, g.IsOk) + if g.UserKey == 0 { + g.UserKey = overallhandle.OnlyOneNumber(2) + } + curryTime := time.Now().Unix() + if g.IsOk { + + var userInfo models.PersonArchives + userInfo.Key = g.UserKey //唯一编号 + userInfo.Name = info[2] //姓名"` + userInfo.HireClass = 1 //雇佣类型(1:雇佣入职;2:再入职;)"` + userInfo.EmpType = 4 //用工关系(1:临时工 , 2:编外人员 ;3:实习&实习生;4:试用员工;5:待分配;6:待岗;7:临时调入;8:正式员工;9:长期病假;10:停薪留职;11:退休;12:辞职;13:辞退;14:离职)"` + var adminOrg int64 + var allOrgId []int64 + if info[3] != "" { + var comOrg models.AdministrativeOrganization + comOrg.GetCont(map[string]interface{}{"`name`": info[3]}, "`id`") + userInfo.Company = comOrg.Id //入职公司"` + adminOrg = comOrg.Id + var sunOrg overallhandle.GetOrgAllParent + sunOrg.GetOrgSonAllId(comOrg.Id) + sunOrg.Id = append(sunOrg.Id, comOrg.Id) + allOrgId = sunOrg.Id + } + if info[4] != "" { + mastOrg := GetMyOrgSunId(info[4], allOrgId) + userInfo.MainDeparment = mastOrg //主部门"` + adminOrg = mastOrg + } + if info[5] != "" { + suntOrg := GetMyOrgSunId(info[5], allOrgId) + userInfo.SunMainDeparment = suntOrg //二级主部门"` + adminOrg = suntOrg + } + if info[6] != "" { + postOrg := GetMyOrgSunId(info[6], allOrgId) + userInfo.WorkSection = postOrg //二级主部门"` + adminOrg = postOrg + } + userInfo.AdminOrg = adminOrg //所属行政组织"` + userInfo.Position, userInfo.JobId, userInfo.PersonInCharge = GetMyPositisName(info[7], adminOrg) + switch info[8] { + case "一级": + userInfo.JobLeve = 1 // 职务等级"` + case "二级": + userInfo.JobLeve = 2 // 职务等级"` + case "三级": + userInfo.JobLeve = 3 // 职务等级"` + case "四级": + userInfo.JobLeve = 4 // 职务等级"` + case "五级": + userInfo.JobLeve = 5 // 职务等级"` + default: + } + if info[9] != "" { + var jobInfo models.JobClass + jobInfo.GetCont(map[string]interface{}{"`name`": info[9]}, "`id`") + userInfo.JobClass = jobInfo.Id //管理类别"` + } + userInfo.Time = curryTime //写入时间"` + userInfo.EiteTime = curryTime //编辑时间"` + userInfo.State = 1 //状态(1:启用;2:禁用;3:删除)` + userInfo.Key = g.UserKey //key"` + var md5JiaMi overallhandle.Md5Encryption + md5JiaMi.Md5EncryptionInit(overall.CONSTANT_CONFIG.Appsetup.DefaultPassword) + md5Token := md5JiaMi.Md5EncryptionAlgorithm() + userInfo.Password = md5Token //密码"` + userInfo.IsLock = 1 + if info[30] != "" { + userInfo.WorkWechat = info[30] + } + err := overall.CONSTANT_DB_HR.Create(&userInfo).Error + if err != nil { + g.Msg = append(g.Msg, fmt.Sprintf("%v[%v]处理失败!", info[2], info[1])) + } else { + g.Msg = append(g.Msg, fmt.Sprintf("%v[%v]处理完成!", info[2], info[1])) + } + } else { + editInfo := overallhandle.MapOut() + editInfo["`name`"] = info[2] + var adminOrg int64 + var allOrgId []int64 + if info[3] != "" { + var comOrg models.AdministrativeOrganization + comOrg.GetCont(map[string]interface{}{"`name`": info[3]}, "`id`") + editInfo["`company`"] = comOrg.Id //入职公司"` + if comOrg.Id != 0 { + adminOrg = comOrg.Id + } + + var sunOrg overallhandle.GetOrgAllParent + sunOrg.GetOrgSonAllId(comOrg.Id) + sunOrg.Id = append(sunOrg.Id, comOrg.Id) + allOrgId = sunOrg.Id + } + if info[4] != "" { + mastOrg := GetMyOrgSunId(info[4], allOrgId) + editInfo["`maindeparment`"] = mastOrg //主部门"` + if mastOrg != 0 { + adminOrg = mastOrg + } + } + if info[5] != "" { + suntOrg := GetMyOrgSunId(info[5], allOrgId) + editInfo["`sun_main_deparment`"] = suntOrg //二级主部门"` + if suntOrg != 0 { + adminOrg = suntOrg + } + } + if info[6] != "" { + postOrg := GetMyOrgSunId(info[6], allOrgId) + editInfo["`workSection`"] = postOrg //二级主部门"` + if postOrg != 0 { + adminOrg = postOrg + } + + } + editInfo["`admin_org`"] = adminOrg //所属行政组织"` + editInfo["`position`"], editInfo["`job_id`"], editInfo["`person_in_charge`"] = GetMyPositisName(info[7], adminOrg) + switch info[8] { + case "一级": + editInfo["`job_leve`"] = 1 // 职务等级"` + case "二级": + editInfo["`job_leve`"] = 2 // 职务等级"` + case "三级": + editInfo["`job_leve`"] = 3 // 职务等级"` + case "四级": + editInfo["`job_leve`"] = 4 // 职务等级"` + case "五级": + editInfo["`job_leve`"] = 5 // 职务等级"` + default: + } + if info[9] != "" { + var jobInfo models.JobClass + jobInfo.GetCont(map[string]interface{}{"`name`": info[9]}, "`id`") + editInfo["`job_class`"] = jobInfo.Id //管理类别"` + } + editInfo["`eite_time`"] = curryTime + editInfo["`isLock`"] = 1 + if info[30] != "" { + editInfo["`work_wechat`"] = info[30] + } + var userInfo models.PersonArchives + err := userInfo.EiteCont(map[string]interface{}{"`key`": g.UserKey}, editInfo) + fmt.Printf("编辑信息:%v\n", err) + if err != nil { + g.Msg = append(g.Msg, fmt.Sprintf("%v[%v]处理失败!", info[2], info[1])) + } else { + g.Msg = append(g.Msg, fmt.Sprintf("%v[%v]处理完成!", info[2], info[1])) + } + // fmt.Printf("修改的数据:%v\n", editInfo) + } + synPros.Add(1) + go g.SecondaryTableUser(info) //人员信息副本 + synPros.Add(1) + go g.PoliticalOutlookEdit(info) //政治面貌 + synPros.Add(1) + go g.EditEducationInfo(info) //学历信息 + synPros.Add(1) + go g.FamilyMembers(info) //家庭成员 + synPros.Add(1) + go g.GrowthExperienceWithinTheGroup(info) //集团内成长经历 + synPros.Add(1) + go g.ExternalWorkExperienceOfTheGroup(info) //集团外部工作经历 + synPros.Add(1) + go g.EditExamineLevel(info, meritsYear) //绩效考核成绩 + synPros.Add(1) + go g.EditRewardsPunishments(info, rewPunYearsmap) //奖惩记录 + synPros.Add(1) + go g.EditAcademicTitle(info) //编辑职称 + synPros.Add(1) + go g.EditCertificate(info) //编辑证书 + synPros.Wait() +} + +/* +* +@ 作者: 秦东 +@ 时间: 2024-02-02 10:23:12 +@ 功能: 编辑证书 +@ 参数 + + # + +@ 返回值 + + # + +@ 方法原型 + + # +*/ +func (g *GroupParsingData) EditCertificate(info map[int]string) { + defer synPros.Done() + if info[339] != "" { + g.EditCertificateCont(info[338], info[339], info[340], info[341], info[342], info[343], info[344]) + } + if info[346] != "" { + g.EditCertificateCont(info[345], info[346], info[347], info[348], info[349], info[350], info[351]) + } + if info[353] != "" { + g.EditCertificateCont(info[352], info[353], info[354], info[355], info[356], info[357], info[358]) + } + if info[360] != "" { + g.EditCertificateCont(info[359], info[360], info[361], info[362], info[363], info[364], info[365]) + } + if info[367] != "" { + g.EditCertificateCont(info[366], info[367], info[368], info[369], info[370], info[371], info[372]) + } + if info[374] != "" { + g.EditCertificateCont(info[373], info[374], info[375], info[376], info[377], info[378], info[379]) + } +} + +/* +* +@ 作者: 秦东 +@ 时间: 2024-02-02 10:24:21 +@ 功能: 编辑证书内容 +*/ +func (g *GroupParsingData) EditCertificateCont(Title, Number, IssuingUnit, TimeData, EndTime, ValidPeriod, State string) { + var cerInfo models.CertificateHonors + err := cerInfo.GetCont(map[string]interface{}{"`userKey`": g.UserKey, "`number`": Number, "`title`": Title}) + cureeTime := time.Now().Unix() + if TimeData != "" { + cureeTime = overallhandle.ExcelDateToDate(TimeData).Unix() + } + if err != nil { + cerInfo.Title = Title //证书/荣誉名称"` + cerInfo.UserKey = g.UserKey //获得人员"` + cerInfo.Types = 4 //类型(1:职称证书;2:资格证书;3:荣誉;4:专业证书)` + if State == "是" { + cerInfo.State = 1 //状态(1:启用;2:禁用;3:删除)` + } else { + cerInfo.State = 2 //状态(1:启用;2:禁用;3:删除)` + } + + cerInfo.IssuingUnit = IssuingUnit //颁发单位"` + if TimeData != "" { + cerInfo.TimeData = cureeTime //获得时间"` + } + yearInt, _ := strconv.Atoi(overallhandle.UnixTimeToDay(cureeTime, 16)) + cerInfo.Years = yearInt //年"` + monthsInt, _ := strconv.Atoi(overallhandle.UnixTimeToDay(cureeTime, 17)) + cerInfo.Months = monthsInt //月"` + cerInfo.Number = Number //证书编号"` + if EndTime != "" { + cerInfo.EndTime = overallhandle.ExcelDateToDate(EndTime).Unix() //截止时间"` + } + cerInfo.ValidPeriod = ValidPeriod //有效期限"` + overall.CONSTANT_DB_HR.Create(&cerInfo) + } else { //编辑 + editCont := overallhandle.MapOut() + editCont["`title`"] = Title + editCont["`number`"] = Number + editCont["`issuing_unit`"] = IssuingUnit + editCont["`timedata`"] = cureeTime + if EndTime != "" { + editCont["`endTime`"] = overallhandle.ExcelDateToDate(EndTime).Unix() + } + editCont["`validPeriod`"] = ValidPeriod + if State == "是" { + editCont["`state`"] = 1 //状态(1:启用;2:禁用;3:删除)` + } else { + editCont["`state`"] = 2 //状态(1:启用;2:禁用;3:删除)` + } + yearInt, _ := strconv.Atoi(overallhandle.UnixTimeToDay(cureeTime, 16)) + editCont["`years`"] = yearInt + editCont["`types`"] = 4 + monthsInt, _ := strconv.Atoi(overallhandle.UnixTimeToDay(cureeTime, 17)) + editCont["`months`"] = monthsInt + var editInfoCont models.AcademicTitle + editInfoCont.EiteCont(map[string]interface{}{"`id`": cerInfo.Id}, editCont) + } +} + +/* +* +@ 作者: 秦东 +@ 时间: 2024-02-02 09:59:24 +@ 功能: 编辑职称 +@ 参数 + + # + +@ 返回值 + + # + +@ 方法原型 + + # +*/ +func (g *GroupParsingData) EditAcademicTitle(info map[int]string) { + defer synPros.Done() + if info[331] != "" { + g.EditAcademicTitleInfo(info[328], info[329], info[330], info[331], info[332]) + } + if info[336] != "" { + g.EditAcademicTitleInfo(info[333], info[334], info[335], info[336], info[337]) + } +} + +/* +* +@ 作者: 秦东 +@ 时间: 2024-02-02 10:00:42 +@ 功能: 编辑职称内容 +*/ +func (g *GroupParsingData) EditAcademicTitleInfo(types, series, speciality, number, timeVal string) { + var acaInfo models.AcademicTitle + err := acaInfo.GetCont(map[string]interface{}{"`userKey`": g.UserKey, "`number`": number}) + if err != nil { + acaInfo.Types = types //职称级别"` + acaInfo.Series = series //职称系列"` + acaInfo.Speciality = speciality //职称专业"` + acaInfo.Number = number //资格证书编号"` + if timeVal != "" { + acaInfo.Time = overallhandle.ExcelDateToDate(timeVal).Unix() //生效时间"` + } + + acaInfo.EditTime = time.Now().Unix() //写入时间"` + acaInfo.UserKey = g.UserKey //人员唯一识别符"` + overall.CONSTANT_DB_HR.Create(&acaInfo) + } else { //编辑 + editCont := overallhandle.MapOut() + editCont["`types`"] = types + editCont["`series`"] = series + editCont["`speciality`"] = speciality + editCont["`number`"] = number + if timeVal != "" { + editCont["`time`"] = overallhandle.ExcelDateToDate(timeVal).Unix() + } + editCont["`editTime`"] = time.Now().Unix() + var rewPunYearEditCont models.AcademicTitle + rewPunYearEditCont.EiteCont(map[string]interface{}{"`id`": acaInfo.Id}, editCont) + } +} + +/* +* +@ 作者: 秦东 +@ 时间: 2024-02-02 08:50:56 +@ 功能: 编辑奖惩 +@ 参数 + + # + +@ 返回值 + + # + +@ 方法原型 + + # +*/ +func (g *GroupParsingData) EditRewardsPunishments(info map[int]string, rewPunYearsmap map[int]int) { + defer synPros.Done() + // fmt.Printf("奖惩记录1: %v\n", rewPunYearsmap) + // fmt.Printf("奖惩记录: %v\n %v\n %v\n", info[299], info[304], info[309]) + if val, isOk := rewPunYearsmap[0]; isOk { + if info[299] != "" { + g.EditRewPunInfo(val, info[299], info[300], info[301], info[302], info[303]) + } + } + if val, isOk := rewPunYearsmap[1]; isOk { + if info[304] != "" { + g.EditRewPunInfo(val, info[304], info[305], info[306], info[307], info[308]) + } + } + if val, isOk := rewPunYearsmap[2]; isOk { + if info[309] != "" { + g.EditRewPunInfo(val, info[309], info[310], info[311], info[312], info[313]) + } + } +} +func (g *GroupParsingData) EditRewPunInfo(years int, level, rewPunClass, title, timeData, issuingUnit string) { + + fmt.Printf("奖惩记录2: %v\n", timeData) + + jiangCeng := RewPunLevelClassStr(rewPunClass) + var rewPunYearCont models.RewardsPenalties + err := rewPunYearCont.GetCont(map[string]interface{}{"`userkey`": g.UserKey, "`years`": years, "`months`": 0}) + timeVal := time.Now().Unix() + // yserInt, _ := strconv.Atoi(overallhandle.UnixTimeToDay(timeVal, 16)) + + if timeData != "" { + timeVal = overallhandle.ExcelDateToDate(timeData).Unix() + fmt.Printf("奖惩记录3: %v\n", timeVal) + } + if err != nil { //新增 + rewPunYearCont.Title = title //奖励/处分项目"` + rewPunYearCont.UserKey = g.UserKey //获得人员"` + if jiangCeng <= 6 { + rewPunYearCont.Types = 1 //类型(1:奖励;2:处分;)` + } else { + rewPunYearCont.Types = 2 //类型(1:奖励;2:处分;)` + } + rewPunYearCont.State = 1 //状态(1:启用;2:禁用;3:删除)` + rewPunYearCont.IssuingUnit = issuingUnit //颁发单位"` + + rewPunYearCont.TimeData = timeVal //获得时间"` + + rewPunYearCont.Years = years //年"` + rewPunYearCont.Months = 0 //月"` + rewPunYearCont.Level = RewPunLevelStr(level) //奖惩级别(1:部门级;2:公司级;3:县级;4:市级;5:省级;6:国家级)"` + rewPunYearCont.RewPunClass = jiangCeng //奖惩类型(1:年终评优;2:表扬;3:嘉奖;4:记功;5:记大功;6:特别奖励;7:批评;8:警告;9:记过;10:记大过;11:降级;12:留用察看;13:开除)"` + overall.CONSTANT_DB_HR.Create(&rewPunYearCont) + } else { //编辑 + editCont := overallhandle.MapOut() + editCont["`title`"] = title + if jiangCeng <= 6 { + editCont["`types`"] = 1 //类型(1:奖励;2:处分;)` + } else { + editCont["`types`"] = 2 //类型(1:奖励;2:处分;)` + } + editCont["`state`"] = 1 + editCont["`issuing_unit`"] = issuingUnit + editCont["`timedata`"] = timeVal + editCont["`years`"] = years + editCont["`months`"] = 0 + editCont["`level`"] = RewPunLevelStr(level) + editCont["`rewPunClass`"] = jiangCeng + var rewPunYearEditCont models.RewardsPenalties + rewPunYearEditCont.EiteCont(map[string]interface{}{"`id`": rewPunYearCont.Id}, editCont) + } +} + +/* +* +@ 作者: 秦东 +@ 时间: 2024-02-02 08:17:12 +@ 功能: 编辑考核成绩 +@ 参数 + + # + +@ 返回值 + + # + +@ 方法原型 + + # +*/ +func (g *GroupParsingData) EditExamineLevel(info map[int]string, meritsYear map[int]int) { + defer synPros.Done() + // if info[289] == "" { + // } + if val, isOk := meritsYear[0]; isOk { + g.EditExamineLevelInfo(info[289], val) + } + if val, isOk := meritsYear[1]; isOk { + g.EditExamineLevelInfo(info[290], val) + } + if val, isOk := meritsYear[2]; isOk { + g.EditExamineLevelInfo(info[291], val) + } +} + +/* +* +@ 作者: 秦东 +@ 时间: 2024-02-02 08:23:55 +@ 功能: 编辑绩效考核内容 +*/ +func (g *GroupParsingData) EditExamineLevelInfo(level string, years int) { + if level == "" { + return + } + var merInfo models.Meritslog + err := merInfo.GetCont(map[string]interface{}{"`userkey`": g.UserKey, "`years`": years, "`months`": 0}, "`id`", "`level`") + if err != nil { //新增 + merInfo.Score = 0 //绩效分数*10000保存"` + merInfo.UserKey = g.UserKey //获得人员"` + merInfo.Status = 1 //(1:启用;2:禁用;3:删除)` + merInfo.TimeData = time.Now().Unix() //获得时间"` + merInfo.Years = years //年"` + merInfo.Months = 0 //月"` + merInfo.Level = level //考核等级"` + overall.CONSTANT_DB_HR.Create(&merInfo) + } else { + editCont := overallhandle.MapOut() + if merInfo.Level != level { + editCont["`level`"] = level + editCont["`status`"] = 1 + editCont["`timedata`"] = time.Now().Unix() + var merNewInfo models.Meritslog + merNewInfo.EiteCont(map[string]interface{}{"`id`": merInfo.Id}, editCont) + } + } +} + +/* +* +@ 作者: 秦东 +@ 时间: 2024-02-01 16:14:40 +@ 功能: 集团外部工作经历 +@ 参数 + + # + +@ 返回值 + + # + +@ 方法原型 + + # +*/ +func (g *GroupParsingData) ExternalWorkExperienceOfTheGroup(info map[int]string) { + defer synPros.Done() + var workList []models.WorkHistory + err := overall.CONSTANT_DB_HR.Where("`key` = ?", g.UserKey).Find(&workList).Error + if err != nil || len(workList) < 1 { + if info[223] != "" { + g.ExternalWorkGroupLog(info[223], info[224], info[225], info[226], info[227], info[228], info[229], info[230], info[231], info[232], info[233], info[234], info[235]) + } + if info[236] != "" { + g.ExternalWorkGroupLog(info[236], info[237], info[238], info[239], info[240], info[241], info[242], info[243], info[244], info[245], info[246], info[247], info[248]) + } + if info[249] != "" { + g.ExternalWorkGroupLog(info[249], info[250], info[251], info[252], info[253], info[254], info[255], info[256], info[257], info[258], info[259], info[260], info[261]) + } + if info[262] != "" { + g.ExternalWorkGroupLog(info[262], info[263], info[264], info[265], info[266], info[267], info[268], info[269], info[270], info[271], info[272], info[273], info[274]) + } + if info[275] != "" { + g.ExternalWorkGroupLog(info[275], info[276], info[277], info[278], info[279], info[280], info[281], info[282], info[283], info[284], info[285], info[286], info[287]) + } + } else { //已经存在历史记录了 + jsonInfo, _ := json.Marshal(workList) + overallhandle.WriteLog("del", "删除旧集团外部工作经历数据!", string(jsonInfo)) + var workGroupLogCont models.WorkHistory + workGroupLogCont.DelCont(map[string]interface{}{"`key`": g.UserKey}) + if info[223] != "" { + g.ExternalWorkGroupLog(info[223], info[224], info[225], info[226], info[227], info[228], info[229], info[230], info[231], info[232], info[233], info[234], info[235]) + } + if info[236] != "" { + g.ExternalWorkGroupLog(info[236], info[237], info[238], info[239], info[240], info[241], info[242], info[243], info[244], info[245], info[246], info[247], info[248]) + } + if info[249] != "" { + g.ExternalWorkGroupLog(info[249], info[250], info[251], info[252], info[253], info[254], info[255], info[256], info[257], info[258], info[259], info[260], info[261]) + } + if info[262] != "" { + g.ExternalWorkGroupLog(info[262], info[263], info[264], info[265], info[266], info[267], info[268], info[269], info[270], info[271], info[272], info[273], info[274]) + } + if info[275] != "" { + g.ExternalWorkGroupLog(info[275], info[276], info[277], info[278], info[279], info[280], info[281], info[282], info[283], info[284], info[285], info[286], info[287]) + } + } +} + +/* +* +@ 作者: 秦东 +@ 时间: 2024-02-01 16:46:06 +@ 功能: 写入集团外工作经历 +EntryTime 入职时间 +Leavedate 离职日期 +Company 公司 +CompanyNature 公司性质 +Industry 所属行业 +Deparment 部门 +Job 职务 +WorkCont 工作内容 +MinionNumber 下属人数 +SuperiorPosition 上级职务 +Witness 证明人 +WitnessTel 证明人电话 +Remarks 备注 +*/ +func (g *GroupParsingData) ExternalWorkGroupLog(EntryTime, Leavedate, Company, CompanyNature, Industry, Deparment, Job, WorkCont, MinionNumber, SuperiorPosition, Witness, WitnessTel, Remarks string) { + var myWorkLog models.WorkHistory + myWorkLog.Number = g.UserNum //工号"` + myWorkLog.Key = g.UserKey //身份识别"` + myWorkLog.Company = Company //公司"` + myWorkLog.Deparment = Deparment //部门"` + myWorkLog.Job = Job //职务"` + if EntryTime != "" { + if EntryTime != "至今" { + myWorkLog.EntryTime = overallhandle.ExcelDateToDate(EntryTime).Unix() //入职时间"` + } else { + myWorkLog.EntryTime = 0 + } + } + if Leavedate != "" { + if Leavedate != "至今" { + myWorkLog.Leavedate = overallhandle.ExcelDateToDate(Leavedate).Unix() //离职日期"` + } else { + myWorkLog.Leavedate = 0 + } + } + myWorkLog.Witness = Witness //证明人"` + myWorkLog.WitnessTel = WitnessTel //证明人电话"` + myWorkLog.Remarks = Remarks //备注"` + myWorkLog.Time = time.Now().Unix() //创建时间"` + myWorkLog.State = 1 //状态(1:启用;2:禁用;3:删除)"` + myWorkLog.WorkCont = WorkCont //工作内容"` + myWorkLog.SuperiorPosition = SuperiorPosition //上级职务"` + if MinionNumber != "" { + manNum, _ := strconv.Atoi(MinionNumber) + myWorkLog.MinionNumber = manNum //下属人数"` + } + myWorkLog.CompanyNature = CompanyNature //公司性质 + myWorkLog.Industry = Industry //所属行业 + overall.CONSTANT_DB_HR.Create(&myWorkLog) +} + +/* +* +@ 作者: 秦东 +@ 时间: 2024-02-01 11:43:27 +@ 功能: 集团内部经历 +@ 参数 + + # + +@ 返回值 + + # + +@ 方法原型 + + # +*/ +func (g *GroupParsingData) GrowthExperienceWithinTheGroup(info map[int]string) { + defer synPros.Done() + var growInGroup []models.InsideWorkHistory + err := overall.CONSTANT_DB_HR.Where("`key` = ?", g.UserKey).Find(&growInGroup).Error + if err != nil || len(growInGroup) < 1 { + if info[92] != "" { + g.EditGroupInWorkLog(info[92], info[93], info[94], info[95], info[96], info[97], info[98], info[99], info[100], info[101], info[102], info[103], info[104]) + } + if info[105] != "" { + g.EditGroupInWorkLog(info[105], info[106], info[107], info[108], info[109], info[110], info[111], info[112], info[113], info[114], info[115], info[116], info[117]) + } + if info[118] != "" { + g.EditGroupInWorkLog(info[118], info[119], info[120], info[121], info[122], info[123], info[124], info[125], info[126], info[127], info[128], info[129], info[130]) + } + if info[131] != "" { + g.EditGroupInWorkLog(info[131], info[132], info[133], info[134], info[135], info[136], info[137], info[138], info[139], info[140], info[141], info[142], info[143]) + } + if info[144] != "" { + g.EditGroupInWorkLog(info[144], info[145], info[146], info[147], info[148], info[149], info[150], info[151], info[152], info[153], info[154], info[155], info[156]) + } + if info[157] != "" { + g.EditGroupInWorkLog(info[157], info[158], info[159], info[160], info[161], info[162], info[163], info[164], info[165], info[166], info[167], info[168], info[169]) + } + if info[170] != "" { + g.EditGroupInWorkLog(info[170], info[171], info[172], info[173], info[174], info[175], info[176], info[177], info[178], info[179], info[180], info[181], info[182]) + } + if info[183] != "" { + g.EditGroupInWorkLog(info[183], info[184], info[185], info[186], info[187], info[188], info[189], info[190], info[191], info[192], info[193], info[194], info[195]) + } + if info[196] != "" { + g.EditGroupInWorkLog(info[196], info[197], info[198], info[199], info[200], info[201], info[202], info[203], info[204], info[205], info[206], info[207], info[208]) + } + if info[209] != "" { + g.EditGroupInWorkLog(info[209], info[210], info[211], info[212], info[213], info[214], info[215], info[216], info[217], info[218], info[219], info[220], info[221]) + } + } else { + jsonInfo, _ := json.Marshal(growInGroup) + overallhandle.WriteLog("del", "删除旧集团内部经历数据!", string(jsonInfo)) + var workGroupLogCont models.InsideWorkHistory + workGroupLogCont.DelCont(map[string]interface{}{"`key`": g.UserKey}) + if info[92] != "" { + g.EditGroupInWorkLog(info[92], info[93], info[94], info[95], info[96], info[97], info[98], info[99], info[100], info[101], info[102], info[103], info[104]) + } + if info[105] != "" { + g.EditGroupInWorkLog(info[105], info[106], info[107], info[108], info[109], info[110], info[111], info[112], info[113], info[114], info[115], info[116], info[117]) + } + if info[118] != "" { + g.EditGroupInWorkLog(info[118], info[119], info[120], info[121], info[122], info[123], info[124], info[125], info[126], info[127], info[128], info[129], info[130]) + } + if info[131] != "" { + g.EditGroupInWorkLog(info[131], info[132], info[133], info[134], info[135], info[136], info[137], info[138], info[139], info[140], info[141], info[142], info[143]) + } + if info[144] != "" { + g.EditGroupInWorkLog(info[144], info[145], info[146], info[147], info[148], info[149], info[150], info[151], info[152], info[153], info[154], info[155], info[156]) + } + if info[157] != "" { + g.EditGroupInWorkLog(info[157], info[158], info[159], info[160], info[161], info[162], info[163], info[164], info[165], info[166], info[167], info[168], info[169]) + } + if info[170] != "" { + g.EditGroupInWorkLog(info[170], info[171], info[172], info[173], info[174], info[175], info[176], info[177], info[178], info[179], info[180], info[181], info[182]) + } + if info[183] != "" { + g.EditGroupInWorkLog(info[183], info[184], info[185], info[186], info[187], info[188], info[189], info[190], info[191], info[192], info[193], info[194], info[195]) + } + if info[196] != "" { + g.EditGroupInWorkLog(info[196], info[197], info[198], info[199], info[200], info[201], info[202], info[203], info[204], info[205], info[206], info[207], info[208]) + } + if info[209] != "" { + g.EditGroupInWorkLog(info[209], info[210], info[211], info[212], info[213], info[214], info[215], info[216], info[217], info[218], info[219], info[220], info[221]) + } + } +} + +/* +* +@ 作者: 秦东 +@ 时间: 2024-02-01 13:49:00 +@ 功能: 编辑集团内部记录 +startTime 开始时间 +endTime 结束时间 +changeType 变动类型 +changeReason 变动原因 +company 公司 +department 一级部室 +workShop 二级部门或车间 +workshopSection 工段 +position 职位 +gradePositions 职务等级 +superiorPosition 上级职位 +superiorName 上级名称 +subordinates 下属人数 +*/ +func (g *GroupParsingData) EditGroupInWorkLog(startTime, endTime, changeType, changeReason, company, department, workShop, workshopSection, position, gradePositions, superiorPosition, superiorName, subordinates string) { + var adminOrg int64 + var sunOrg overallhandle.GetOrgAllParent + var inWorkGroupInfo models.InsideWorkHistory + inWorkGroupInfo.Key = g.UserKey //员工识别符"` + if company != "" { + var comOrg models.AdministrativeOrganization + comOrg.GetCont(map[string]interface{}{"`name`": company}, "`id`") + inWorkGroupInfo.Company = comOrg.Id //公司"` + sunOrg.GetOrgSonAllId(comOrg.Id) + sunOrg.Id = append(sunOrg.Id, comOrg.Id) + adminOrg = comOrg.Id + } + if department != "" { + mastOrg := GetMyOrgSunId(department, sunOrg.Id) + inWorkGroupInfo.Department = mastOrg //一级部室"` + adminOrg = mastOrg + } + if workShop != "" { + suntOrg := GetMyOrgSunId(workShop, sunOrg.Id) + inWorkGroupInfo.WorkShop = suntOrg //二级部门或车间"` + adminOrg = suntOrg + } + if workshopSection != "" { + workOrg := GetMyOrgSunId(workshopSection, sunOrg.Id) + inWorkGroupInfo.WorkshopSection = workOrg //工段"` + adminOrg = workOrg + } + + inWorkGroupInfo.Position, inWorkGroupInfo.JobId, _ = GetMyPositisName(position, adminOrg) //职位"` + switch gradePositions { + case "一级": + inWorkGroupInfo.GradePositions = 1 // 职务等级"` + case "二级": + inWorkGroupInfo.GradePositions = 2 // 职务等级"` + case "三级": + inWorkGroupInfo.GradePositions = 3 // 职务等级"` + case "四级": + inWorkGroupInfo.GradePositions = 4 // 职务等级"` + case "五级": + inWorkGroupInfo.GradePositions = 5 // 职务等级"` + default: + } + if startTime != "" { + if startTime == "至今" { + inWorkGroupInfo.StartTime = 0 + } else { + inWorkGroupInfo.StartTime = overallhandle.ExcelDateToDate(startTime).Unix() //开始日期"` + } + } + if endTime != "" { + if endTime == "至今" { + inWorkGroupInfo.EndTime = 0 + } else { + inWorkGroupInfo.EndTime = overallhandle.ExcelDateToDate(endTime).Unix() //结束日期"` + } + } + // Team = //班组(1:长白;2:甲;3:乙;4:丙;5:丁)"` + inWorkGroupInfo.ChangeType = changeTypeToInt(changeType) //变动类型(1:预入职;2:雇佣入职;3:转正;4:晋升;5:降级;6:职等调整;7:调动调入;8:跨公司调动调入;9:借调;10:平调;11:兼职;12:预离职;13:离职;14:退休;15:返聘;16:员工初始化;)"` + inWorkGroupInfo.Time = time.Now().Unix() //创建时间"` + inWorkGroupInfo.State = 1 //状态(1:启用;2:禁用;3:删除)"` + // inWorkGroupInfo.AssignType = //1、主职;2:兼职"` + // inWorkGroupInfo.JobId = //职务"` + // inWorkGroupInfo.WorkCont = //工作内容"` + inWorkGroupInfo.ChangeReason = changeReason //变动原因"` + inWorkGroupInfo.SuperiorPosition = superiorPosition //上级职位"` + inWorkGroupInfo.SuperiorName = superiorName //上级名称"` + if subordinates != "" { + subNum, _ := strconv.Atoi(subordinates) + inWorkGroupInfo.Subordinates = subNum //下属人数"` + } + overall.CONSTANT_DB_HR.Create(&inWorkGroupInfo) +} + +/* +* +@ 作者: 秦东 +@ 时间: 2024-01-31 16:49:21 +@ 功能: 家庭成员 +@ 参数 + + # + +@ 返回值 + + # + +@ 方法原型 + + # +*/ +func (g *GroupParsingData) FamilyMembers(info map[int]string) { + defer synPros.Done() + var familyAry []models.FamilyMembers + err := overall.CONSTANT_DB_HR.Where("`key` = ?", g.UserKey).Find(&familyAry).Error + var emergencyFamily []models.EmergencyContact + creeTime := time.Now().Unix() + if err != nil || len(familyAry) < 1 { + if info[59] != "" && info[60] != "" { + g.EditFamilyInfo(info[59], info[60], info[61], info[62], info[63], info[64]) + if info[64] == "是" { + var oneInfo models.EmergencyContact + oneInfo.Number = g.UserNum //员工工号;index"` + oneInfo.Key = g.UserKey // + oneInfo.Name = info[60] //紧急联系人姓名"` + oneInfo.Relationship = info[59] //与紧急联系人关系"` + oneInfo.Tel = info[61] //紧急联系人电话"` + oneInfo.Time = creeTime //创建时间"` + oneInfo.State = 1 //状态(1:启用;2:禁用;3:删除)"` + emergencyFamily = append(emergencyFamily, oneInfo) + } + } + if info[65] != "" && info[66] != "" { + g.EditFamilyInfo(info[65], info[66], info[67], info[68], info[69], info[70]) + if info[70] == "是" { + var twoInfo models.EmergencyContact + twoInfo.Number = g.UserNum //员工工号;index"` + twoInfo.Key = g.UserKey // + twoInfo.Name = info[66] //紧急联系人姓名"` + twoInfo.Relationship = info[65] //与紧急联系人关系"` + twoInfo.Tel = info[67] //紧急联系人电话"` + twoInfo.Time = creeTime //创建时间"` + twoInfo.State = 1 //状态(1:启用;2:禁用;3:删除)"` + emergencyFamily = append(emergencyFamily, twoInfo) + } + } + if info[71] != "" && info[72] != "" { + g.EditFamilyInfo(info[71], info[72], info[73], info[74], info[75], info[76]) + if info[76] == "是" { + var twoInfo models.EmergencyContact + twoInfo.Number = g.UserNum //员工工号;index"` + twoInfo.Key = g.UserKey // + twoInfo.Name = info[72] //紧急联系人姓名"` + twoInfo.Relationship = info[71] //与紧急联系人关系"` + twoInfo.Tel = info[73] //紧急联系人电话"` + twoInfo.Time = creeTime //创建时间"` + twoInfo.State = 1 //状态(1:启用;2:禁用;3:删除)"` + emergencyFamily = append(emergencyFamily, twoInfo) + } + } + if info[77] != "" && info[78] != "" { + g.EditFamilyInfo(info[77], info[78], info[79], info[80], info[81], info[82]) + if info[76] == "是" { + var twoInfo models.EmergencyContact + twoInfo.Number = g.UserNum //员工工号;index"` + twoInfo.Key = g.UserKey // + twoInfo.Name = info[78] //紧急联系人姓名"` + twoInfo.Relationship = info[77] //与紧急联系人关系"` + twoInfo.Tel = info[79] //紧急联系人电话"` + twoInfo.Time = creeTime //创建时间"` + twoInfo.State = 1 //状态(1:启用;2:禁用;3:删除)"` + emergencyFamily = append(emergencyFamily, twoInfo) + } + } + } else { + jsonInfo, _ := json.Marshal(familyAry) + overallhandle.WriteLog("del", "删除旧家庭成员数据!", string(jsonInfo)) + var familyCont models.FamilyMembers + familyCont.DelCont(map[string]interface{}{"`key`": g.UserKey}) + if info[59] != "" && info[60] != "" { + g.EditFamilyInfo(info[59], info[60], info[61], info[62], info[63], info[64]) + if info[64] == "是" { + var oneInfo models.EmergencyContact + oneInfo.Number = g.UserNum //员工工号;index"` + oneInfo.Key = g.UserKey // + oneInfo.Name = info[60] //紧急联系人姓名"` + oneInfo.Relationship = info[59] //与紧急联系人关系"` + oneInfo.Tel = info[61] //紧急联系人电话"` + oneInfo.Time = creeTime //创建时间"` + oneInfo.State = 1 //状态(1:启用;2:禁用;3:删除)"` + emergencyFamily = append(emergencyFamily, oneInfo) + } + } + if info[65] != "" && info[66] != "" { + g.EditFamilyInfo(info[65], info[66], info[67], info[68], info[69], info[70]) + if info[70] == "是" { + var twoInfo models.EmergencyContact + twoInfo.Number = g.UserNum //员工工号;index"` + twoInfo.Key = g.UserKey // + twoInfo.Name = info[66] //紧急联系人姓名"` + twoInfo.Relationship = info[65] //与紧急联系人关系"` + twoInfo.Tel = info[67] //紧急联系人电话"` + twoInfo.Time = creeTime //创建时间"` + twoInfo.State = 1 //状态(1:启用;2:禁用;3:删除)"` + emergencyFamily = append(emergencyFamily, twoInfo) + } + } + if info[71] != "" && info[72] != "" { + g.EditFamilyInfo(info[71], info[72], info[73], info[74], info[75], info[76]) + if info[76] == "是" { + var twoInfo models.EmergencyContact + twoInfo.Number = g.UserNum //员工工号;index"` + twoInfo.Key = g.UserKey // + twoInfo.Name = info[72] //紧急联系人姓名"` + twoInfo.Relationship = info[71] //与紧急联系人关系"` + twoInfo.Tel = info[73] //紧急联系人电话"` + twoInfo.Time = creeTime //创建时间"` + twoInfo.State = 1 //状态(1:启用;2:禁用;3:删除)"` + emergencyFamily = append(emergencyFamily, twoInfo) + } + } + if info[77] != "" && info[78] != "" { + g.EditFamilyInfo(info[77], info[78], info[79], info[80], info[81], info[82]) + if info[82] == "是" { + var twoInfo models.EmergencyContact + twoInfo.Number = g.UserNum //员工工号;index"` + twoInfo.Key = g.UserKey // + twoInfo.Name = info[78] //紧急联系人姓名"` + twoInfo.Relationship = info[77] //与紧急联系人关系"` + twoInfo.Tel = info[79] //紧急联系人电话"` + twoInfo.Time = creeTime //创建时间"` + twoInfo.State = 1 //状态(1:启用;2:禁用;3:删除)"` + emergencyFamily = append(emergencyFamily, twoInfo) + } + } + } + //处理紧急联系人数据 + if len(emergencyFamily) > 0 { + var oldEmeList []models.EmergencyContact + err := overall.CONSTANT_DB_HR.Where("`key` = ?", g.UserKey).Find(&oldEmeList).Error + if err == nil { + jsonInfo, _ := json.Marshal(oldEmeList) + overallhandle.WriteLog("del", "删除旧紧急联系人数据!", string(jsonInfo)) + var emeDel models.EmergencyContact + emeDel.DelCont(map[string]interface{}{"`key`": g.UserKey}) + } + overall.CONSTANT_DB_HR.Create(&emergencyFamily) + } +} + +/* +* +@ 作者: 秦东 +@ 时间: 2024-02-01 10:05:31 +@ 功能: 编辑员工家属 +*/ +func (g *GroupParsingData) EditFamilyInfo(relationship, name, tel, workUnitPost, politicalOutlookCn, isSos string) { + var familyCont models.FamilyMembers + familyCont.Number = g.UserNum //员工工号"` + familyCont.Key = g.UserKey //key"` + familyCont.Relationship = relationship //亲属关系"` + familyCont.Name = name //姓名"` + familyCont.Company = "" //所在公司"` + familyCont.Deparment = "" //所在部门"` + familyCont.Postnme = "" //所在岗位"` + familyCont.Tel = tel //紧急联系人电话"` + familyCont.PoliticalOutlook = politiToInt(politicalOutlookCn) //政治面貌(1:群众;2:无党派;3:台盟会员;4:九三社员;5:致公党员;6:农工党员;7:民进会员;8:民建会员;9:民盟盟员;10:民革会员,11:共青团员;12:预备党员;13:中共党员)"` + familyCont.Time = time.Now().Unix() //创建时间"` + familyCont.State = 1 //状态(1:启用;2:禁用;3:删除)"` + familyCont.PoliticalOutlookCn = politicalOutlookCn //政治面貌汉字说明"` + familyCont.WorkUnitPost = workUnitPost //工作单位及职务"` + if isSos == "是" { + familyCont.IsSos = 1 //是否为紧急联系人(1、是;2:否)"` + } else { + familyCont.IsSos = 2 //是否为紧急联系人(1、是;2:否)"` + } + overall.CONSTANT_DB_HR.Create(&familyCont) +} + +/* +* +@ 作者: 秦东 +@ 时间: 2024-01-31 15:30:20 +@ 功能: 编辑学历信息 +@ 参数 + + # + +@ 返回值 + + # + +@ 方法原型 + + # +*/ +func (g *GroupParsingData) EditEducationInfo(info map[int]string) { + defer synPros.Done() + + var mySchoolLog []models.PersonnelEducation + err := overall.CONSTANT_DB_HR.Model(&models.PersonnelEducation{}).Where("`key` = ?", g.UserKey).Find(&mySchoolLog).Error + if err != nil || len(mySchoolLog) < 1 { + if info[32] != "" || info[35] != "" { //第一学历 + + g.AddOneSchollLog(info[32], info[33], info[34], info[35], info[36], info[37], info[38], info[39], info[40], 2) + + } + if info[41] != "" || info[44] != "" { //最高学历 + g.AddOneSchollLog(info[41], info[42], info[43], info[44], info[45], info[46], info[47], info[48], info[49], 3) + } + if info[50] != "" || info[53] != "" { //其他学历 + g.AddOneSchollLog(info[50], info[51], info[52], info[53], info[54], info[55], info[56], info[57], info[58], 1) + } + } else { + jsonInfo, _ := json.Marshal(mySchoolLog) + overallhandle.WriteLog("del", "删除旧集团外部工作经历数据!", string(jsonInfo)) + var delScho models.PersonnelEducation + delScho.DelCont(map[string]interface{}{"`key`": g.UserKey}) + if info[32] != "" || info[35] != "" { //第一学历 + + g.AddOneSchollLog(info[32], info[33], info[34], info[35], info[36], info[37], info[38], info[39], info[40], 2) + + } + if info[41] != "" || info[44] != "" { //最高学历 + g.AddOneSchollLog(info[41], info[42], info[43], info[44], info[45], info[46], info[47], info[48], info[49], 3) + } + if info[50] != "" || info[53] != "" { //其他学历 + g.AddOneSchollLog(info[50], info[51], info[52], info[53], info[54], info[55], info[56], info[57], info[58], 1) + } + } +} + +/* +* +@ 作者: 秦东 +@ 时间: 2024-01-31 15:59:16 +@ 功能: 编辑第一学历 +Education 学历 +EducationType 学历类型 +AcademicDegree 学位 +GraduationSchool 毕业学校 +SchoolType 院校类型 +CollegeFaction 所属院系 +Subject 专业 +AdmissionTime 入学时间 +GraduationTime 毕业时间 +*/ +func (g *GroupParsingData) EditSchollLog(Education, EducationType, AcademicDegree, GraduationSchool, SchoolType, CollegeFaction, Subject, AdmissionTime, GraduationTime string, level int) { + var mySchoolLog []models.PersonnelEducation + err := overall.CONSTANT_DB_HR.Model(&models.PersonnelEducation{}).Select("`id`,`level`").Where("`key` = ?", g.UserKey).Find(&mySchoolLog).Error + if err != nil || len(mySchoolLog) < 1 { + g.AddOneSchollLog(Education, EducationType, AcademicDegree, GraduationSchool, SchoolType, CollegeFaction, Subject, AdmissionTime, GraduationTime, level) + } else { + var editId int64 + fisrVal := 0 + higVal := 0 + for _, v := range mySchoolLog { + if v.Education == ducationToInt(Education) && v.GraduationSchool == GraduationSchool { + editId = v.Id + if v.Level == 3 { + higVal = 3 + } + if v.Level == 2 { + fisrVal = 2 + } + } + } + switch level { + case 2: + if fisrVal == 2 { + var editLevLog models.PersonnelEducation + editLevLog.EiteCont(map[string]interface{}{"`key`": g.UserKey, "`level`": 2}, map[string]interface{}{"`level`": 1}) + } + + case 3: + if higVal == 3 { + var editLevLog models.PersonnelEducation + editLevLog.EiteCont(map[string]interface{}{"`key`": g.UserKey, "`level`": 3}, map[string]interface{}{"`level`": 1}) + } + default: + } + if editId == 0 { + g.AddOneSchollLog(Education, EducationType, AcademicDegree, GraduationSchool, SchoolType, CollegeFaction, Subject, AdmissionTime, GraduationTime, level) + } else { + switch level { + case 2: + var editLevLog models.PersonnelEducation + editLevLog.EiteCont(map[string]interface{}{"`key`": g.UserKey, "`level`": 2}, map[string]interface{}{"`level`": 1}) + case 3: + var editLevLog models.PersonnelEducation + editLevLog.EiteCont(map[string]interface{}{"`key`": g.UserKey, "`level`": 3}, map[string]interface{}{"`level`": 1}) + default: + } + editCont := overallhandle.MapOut() + editCont["`time`"] = time.Now().Unix() + editCont["`education`"] = ducationToInt(Education) + editCont["`graduation_school`"] = GraduationSchool + editCont["`subject`"] = Subject + if AdmissionTime != "" { + editCont["`admission_time`"] = overallhandle.ExcelDateToDate(AdmissionTime).Unix() //入学时间"` + } + if GraduationTime != "" { + editCont["`graduation_time`"] = overallhandle.ExcelDateToDate(GraduationTime).Unix() //毕业时间"` + } + editCont["`level`"] = level + editCont["`academic_degree`"] = hestacademicdegreeToInt(AcademicDegree) + editCont["`state`"] = 1 + editCont["`academic_degree_cn`"] = AcademicDegree + editCont["`education_cn`"] = Education + editCont["`education_type`"] = EducationTypeStr(EducationType) + editCont["`collegeFaction`"] = CollegeFaction + editCont["`collegeFaction`"] = EducationTypeStr(SchoolType) + var editLog models.PersonnelEducation + editLog.EiteCont(map[string]interface{}{"`id`": editId}, editCont) + } + } +} + +/* +* +@ 作者: 秦东 +@ 时间: 2024-01-31 16:16:00 +@ 功能: 写入单一教育记录 +*/ +func (g *GroupParsingData) AddOneSchollLog(Education, EducationType, AcademicDegree, GraduationSchool, SchoolType, CollegeFaction, Subject, AdmissionTime, GraduationTime string, level int) { + var firstLog models.PersonnelEducation + firstLog.Number = g.UserNum //员工工号"` + firstLog.Education = ducationToInt(Education) //学历(1:初中及以下;2:中专;3:高中;4:中技;5:高技;6:函数专科;7:大学专科;8:函数本科;9:大学本科;10:硕士研究生;11:博士研究生;12:专家、教授)"` + firstLog.GraduationSchool = GraduationSchool //毕业学校"` + firstLog.Subject = Subject //专业"` + if AdmissionTime != "" { + firstLog.AdmissionTime = overallhandle.ExcelDateToDate(AdmissionTime).Unix() //入学时间"` + } + if GraduationTime != "" { + firstLog.GraduationTime = overallhandle.ExcelDateToDate(GraduationTime).Unix() //毕业时间"` + } + firstLog.Time = time.Now().Unix() //写入时间"` + firstLog.Level = level //学历类型(1:普通;2:第一学历;3:最高学历)"` + firstLog.AcademicDegree = hestacademicdegreeToInt(AcademicDegree) //学位(1:无;2:学士;3:硕士;4:博士)"` + firstLog.Key = g.UserKey //key"` + firstLog.State = 1 //状态(1:启用;2:禁用;3:删除)"` + + firstLog.AcademicDegreeCn = AcademicDegree //学位中文说明"` + firstLog.EducationCn = Education //学历中文说明"` + firstLog.EducationType = EducationTypeStr(EducationType) //学历类型(1、统招;2、函授)"` + firstLog.CollegeFaction = CollegeFaction //所属院系"` + firstLog.SchoolType = EducationTypeStr(SchoolType) //学历类型(院校类型(1、私立中学;2:公立中学;3:高职院校;4:民办专科院校;5:公办专科院校;6:民办本科院校;7:公办本科院校;8:”211“工程院校;9:”985“工程院校;10:双一流院校))"` + overall.CONSTANT_DB_HR.Create(&firstLog) +} + +/* +* +@ 作者: 秦东 +@ 时间: 2024-01-30 14:29:56 +@ 功能: 人员信息副本 +@ 参数 + + # + +@ 返回值 + + # + +@ 方法原型 + + # +*/ +func (g *GroupParsingData) SecondaryTableUser(info map[int]string) { + defer synPros.Done() + var myInfo models.PersonnelContent + err := myInfo.GetCont(map[string]interface{}{"`key`": g.UserKey}, "`number`") + fmt.Printf("员工附属信息%v\n", err) + if err != nil { + //附属内容不存在,进行新增。 + myInfo.Key = g.UserKey //Key"` + myInfo.Number = g.UserNum //员工工号;index"` + myInfo.Idcardno = info[23] //身份证号"` + // myInfo. Passportno = //护照号码"` + // myInfo. Globalroaming = //国际区号"` + myInfo.Mobilephone = info[28] //手机号码"` + myInfo.Email = info[31] //电子邮件"` + myInfo.Gender = genderToInt(info[10]) //性别(1:男性;2:女性;3:中性)"` + if info[11] != "" { + myInfo.Birthday = overallhandle.ExcelDateToDate(info[11]).Unix() //birthday"` + } + myInfo.Myfolk = info[13] //民族"` + myInfo.Nativeplace = info[19] //籍贯"` + if info[24] != "" { + myInfo.Idcardstartdate = overallhandle.ExcelDateToDate(info[24]).Unix() //身份证有效期开始"` + } + if info[25] != "" { + myInfo.Idcardenddate = overallhandle.ExcelDateToDate(info[25]).Unix() //身份证有效期结束"` + } + + myInfo.Idcardaddress = info[27] //身份证地址"` + // myInfo. IdcardIssued = //身份证签发机关"` + myInfo.Health = healthToInt(info[15]) //健康状况(1:良好;2:一般;3:较弱,4:有生理缺陷;5:残废)"` + myInfo.Maritalstatus = maritalstatusToInt(info[14]) //婚姻状况(1:未婚;2:已婚;3:丧偶;4:离异)"` + // myInfo. Internaltelephone = //内线电话"` + myInfo.Currentresidence = info[18] //现居住地址"` + myInfo.Time = time.Now().Unix() //创建时间"` + myInfo.Constellation = consteToInt(info[21]) //星座(1:白羊座;2:金牛座;3:双子座;4:巨蟹座;5:狮子座;6:处女座;7:天枰座;8:天蝎座;9:射手座;10:摩羯座;11:水瓶座;12:双鱼座)"` + if info[83] == "是" { + myInfo.Isdoubleworker = 1 //是否双职工(1:是;2:否)"` + g.WorkingCouple(info, true) + } else { + myInfo.Isdoubleworker = 2 //是否双职工(1:是;2:否)"` + g.WorkingCouple(info, false) + } + if info[321] == "是" { + myInfo.Isveterans = 1 //是否为退役军人(1:是;2:否)"` + g.EditVeterans(info, true) + } else { + myInfo.Isveterans = 2 + g.EditVeterans(info, false) + } + myInfo.Veteransnumber = info[322] + if info[295] != "" { + myInfo.Jobstartdate = overallhandle.ExcelDateToDate(info[295]).Unix() //参加工作日期"` + } //退役证编号"` + if info[297] != "" { + myInfo.Entrydate = overallhandle.ExcelDateToDate(info[297]).Unix() //入职日期"` + } + // myInfo. Probationperiod = //试用期"` + // myInfo. Planformaldate = //预计转正日期"` + if info[16] != "" { + myInfo.PoliticalOutlook = politiToInt(info[16]) //政治面貌(1:群众;2:无党派;3:台盟会员;4:九三社员;5:致公党员;6:农工党员;7:民进会员;8:民建会员;9:民盟盟员;10:民革会员,11:共青团员;12:预备党员;13:中共党员)"` + } + if info[314] != "" { + myInfo.PoliticalOutlook = politiToInt(info[314]) //政治面貌(1:群众;2:无党派;3:台盟会员;4:九三社员;5:致公党员;6:农工党员;7:民进会员;8:民建会员;9:民盟盟员;10:民革会员,11:共青团员;12:预备党员;13:中共党员)"` + } + myInfo.MaritalstatusCn = info[14] //婚姻状况汉字说明"` + myInfo.ConstellationingCn = info[21] //星座汉字说明"` + myInfo.PoliticalOutlookCn = info[16] //政治面貌汉字说明"` + myInfo.HealthCn = info[15] //健康状况中文说明"` + // myInfo.NameUsedBefore = //曾用名"` + myInfo.CareerPlanning = info[292] //职业生涯规划"` + myInfo.HelpObtained = info[293] //个人期望从组织获得的帮助"` + myInfo.Hobby = info[22] //爱好"` + + myInfo.DomicileType = info[17] //户籍类型 + if info[26] == "是" { + myInfo.IdCardnoLongTerm = 1 //身份证是否长期有效(1:是;2:否) + + } else { + myInfo.IdCardnoLongTerm = 2 //身份证是否长期有效(1:是;2:否) + + } + myInfo.MobileShortNumber = info[29] //手机小号 + myInfo.Channel = JoinJobChanel(info[294]) //入职渠道(1:社会招聘;2:校园招聘;3:内部推荐) + myInfo.BloodType = info[20] //血型 + } else { + //附属内容存在,进行编辑。 + editCont := overallhandle.MapOut() + editCont["`idcardno`"] = info[23] + editCont["`mobilephone`"] = info[28] + editCont["`email`"] = info[31] + editCont["`gender`"] = genderToInt(info[10]) + if info[11] != "" { + editCont["`birthday`"] = overallhandle.ExcelDateToDate(info[11]).Unix() + } + editCont["`myfolk`"] = info[13] + editCont["`nativeplace`"] = info[19] + if info[24] != "" { + editCont["`idcardstartdate`"] = overallhandle.ExcelDateToDate(info[24]).Unix() + } + if info[25] != "" { + editCont["`idcardenddate`"] = overallhandle.ExcelDateToDate(info[25]).Unix() + } + editCont["`idcardaddress`"] = info[27] + editCont["`health`"] = healthToInt(info[15]) + editCont["`maritalstatus`"] = maritalstatusToInt(info[14]) + editCont["`currentresidence`"] = info[18] + editCont["`constellationing`"] = consteToInt(info[21]) + if info[83] == "是" { + editCont["`isdoubleworker`"] = 1 //是否双职工(1:是;2:否)"` + g.WorkingCouple(info, true) + } else { + editCont["`isdoubleworker`"] = 2 //是否双职工(1:是;2:否)"` + g.WorkingCouple(info, false) + } + if info[321] == "是" { + editCont["`isveterans`"] = 1 //是否为退役军人(1:是;2:否)"` + g.EditVeterans(info, true) + } else { + editCont["`isveterans`"] = 2 + g.EditVeterans(info, false) + } + editCont["`veteransnumber`"] = info[322] + if info[295] != "" { + editCont["`jobstartdate`"] = overallhandle.ExcelDateToDate(info[295]).Unix() + } + if info[297] != "" { + editCont["`entrydate`"] = overallhandle.ExcelDateToDate(info[297]).Unix() + } + if info[16] != "" { + editCont["`political_outlook`"] = politiToInt(info[16]) + } + if info[314] != "" { + editCont["`political_outlook`"] = politiToInt(info[314]) + } + editCont["`maritalstatus_cn`"] = info[14] + editCont["`constellationing_cn`"] = info[21] + editCont["`political_outlook_cn`"] = info[16] + editCont["`health_cn`"] = info[15] + editCont["`career_planning`"] = info[292] + editCont["`help_obtained`"] = info[293] + editCont["`hobby`"] = info[22] + editCont["`domicile_type`"] = info[17] + if info[26] == "是" { + editCont["`idCardnoLongTerm`"] = 1 //身份证是否长期有效(1:是;2:否) + // g.WorkingCouple(info, true) + } else { + editCont["`idCardnoLongTerm`"] = 2 //身份证是否长期有效(1:是;2:否) + // g.WorkingCouple(info, false) + } + editCont["`mobileShortNumber`"] = info[29] + editCont["`channel`"] = JoinJobChanel(info[294]) + editCont["`bloodType`"] = info[20] + editCont["`time`"] = time.Now().Unix() + myInfo.EiteCont(map[string]interface{}{"`key`": g.UserKey}, editCont) + } +} + +/* +* +@ 作者: 秦东 +@ 时间: 2024-01-31 11:21:26 +@ 功能: 退役军人 +@ 参数 + + #info 人员信息 + #isTrue 是否为老兵 + +@ 返回值 + + # + +@ 方法原型 + + # +*/ +func (g *GroupParsingData) EditVeterans(info map[int]string, isTrue bool) { + var veteransInfo models.Veterans + err := veteransInfo.GetCont(map[string]interface{}{"`userkey`": g.UserKey}) + // fmt.Printf("退役军人:%v\n%v\n", err, veteransInfo) + if err != nil { + if info[322] != "" { + veteransInfo.Userkey = g.UserKey //gned;not null;comment:员工唯一识别符;"` + if isTrue { + veteransInfo.IsRetire = 1 //5是否为退役军人(1:是;2:否)"` + } else { + veteransInfo.IsRetire = 2 //5是否为退役军人(1:是;2:否)"` + } + + veteransInfo.RetireNumber = info[322] //mment:退役证编号"` + if info[323] != "" { + veteransInfo.JoinTime = overallhandle.ExcelDateToDate(info[323]).Unix() //ult:入伍时间"` + } + if info[324] != "" { + veteransInfo.RetireTime = overallhandle.ExcelDateToDate(info[324]).Unix() //default:退伍时间"` + } + veteransInfo.ArmyUnits = info[326] //参军单位"` + veteransInfo.TypesOfSoldiers = info[327] //5) ;comment:兵种"` + veteransInfo.Time = time.Now().Unix() //t null;comment:创建时间"` + overall.CONSTANT_DB_HR.Create(&veteransInfo) + } + + } else { + editCont := overallhandle.MapOut() + if isTrue { + editCont["isRetire"] = 1 + } else { + editCont["isRetire"] = 2 + } + editCont["retireNumber"] = info[322] + if info[323] != "" { + editCont["joinTime"] = overallhandle.ExcelDateToDate(info[323]).Unix() //ult:入伍时间"` + } + if info[324] != "" { + editCont["retireTime"] = overallhandle.ExcelDateToDate(info[324]).Unix() //default:退伍时间"` + } + editCont["armyUnits"] = info[326] + editCont["typesOfSoldiers"] = info[327] + editCont["time"] = time.Now().Unix() + veteransInfo.EiteCont(map[string]interface{}{"`userkey`": g.UserKey}, editCont) + } +} + +/* +* +@ 作者: 秦东 +@ 时间: 2024-01-31 10:03:58 +@ 功能: 政治面貌 +@ 参数 + + #info 表单内容 + +@ 返回值 + + # + +@ 方法原型 + + # +*/ +func (g *GroupParsingData) PoliticalOutlookEdit(info map[int]string) { + defer synPros.Done() + if info[314] != "" { + var polOutInfo models.PoliticalIdentity + err := polOutInfo.GetCont(map[string]interface{}{"`userkey`": g.UserKey}) + if err != nil { //不存在,新增 + if info[315] != "" || info[316] != "" { + polOutInfo.Userkey = g.UserKey //员工唯一识别符;"` + polOutInfo.PoliticalOutlook = politiToInt(info[314]) //政治面貌(1:群众;2:无党派;3:台盟会员;4:九三社员;5:致公党员;6:农工党员;7:民进会员;8:民建会员;9:民盟盟员;10:民革会员,11:共青团员;12:预备党员;13:中共党员)"` + if info[315] != "" { + polOutInfo.JoinTime = overallhandle.ExcelDateToDate(info[315]).Unix() //加入时间"` + } + polOutInfo.Branch = info[316] //所在党支部"` + polOutInfo.Bosition = info[317] //党内职务"` + polOutInfo.JoiningParty = info[318] //入党时所在单位"` + if info[319] == "是" { + polOutInfo.SwitchToClass = 1 //组织关系是否转入(1:是;2:否)"` + } else { + polOutInfo.SwitchToClass = 2 //组织关系是否转入(1:是;2:否)"` + } + if info[320] != "" { + polOutInfo.SwitchToTime = overallhandle.ExcelDateToDate(info[320]).Unix() //组织关系转入时间"` + } + polOutInfo.Time = time.Now().Unix() //创建时间"` + overall.CONSTANT_DB_HR.Create(&polOutInfo) + } + } else { + editCont := overallhandle.MapOut() + if info[314] != "" { + poloutName := politiToInt(info[314]) + if poloutName != polOutInfo.PoliticalOutlook { + editCont["`political_outlook`"] = poloutName + } + } + if info[315] != "" { + joinTimeVal := overallhandle.ExcelDateToDate(info[315]).Unix() + if joinTimeVal != polOutInfo.JoinTime { + editCont["`joinTime`"] = joinTimeVal + } + } + if info[316] != "" && info[316] != polOutInfo.Branch { + editCont["`branch`"] = info[316] + } + if info[317] != "" && info[317] != polOutInfo.Bosition { + editCont["`position`"] = info[317] + } + if info[318] != "" && info[318] != polOutInfo.JoiningParty { + editCont["`joiningParty`"] = info[318] + } + zhuan := 2 + if info[319] == "是" { + zhuan = 1 + } + if zhuan != polOutInfo.SwitchToClass { + editCont["`switchToClass`"] = zhuan + } + if info[320] != "" { + switchTimeVal := overallhandle.ExcelDateToDate(info[320]).Unix() + if switchTimeVal != polOutInfo.SwitchToTime { + editCont["`switchToTime`"] = switchTimeVal + } + } + if len(editCont) > 0 { + editCont["`time`"] = time.Now().Unix() + polOutInfo.EiteCont(map[string]interface{}{"`userkey`": g.UserKey}, editCont) + } + } + } + +} + +/* +* +@ 作者: 秦东 +@ 时间: 2024-01-31 08:18:15 +@ 功能: 双职工处理 +@ 参数 + + #info 表单内容 + #isTrue 是否为双职工 + +@ 返回值 + + # + +@ 方法原型 + + # +*/ +func (g *GroupParsingData) WorkingCouple(info map[int]string, isTrue bool) { + var doubleWorkMan []models.DoubleWorker + err := overall.CONSTANT_DB_HR.Where("`key` = ?", g.UserKey).Find(&doubleWorkMan).Error //获取旧数据 + if isTrue { //是双职工 + if err != nil || len(doubleWorkMan) < 1 { //无记录,新增 + NewAddDoubleWork(g.UserKey, g.UserNum, info) + } else { + var oldId int64 + oldId = 0 + //判断是否已经有存在得记录 + for _, v := range doubleWorkMan { + if v.Name == info[84] { + oldId = v.Id + break + } + } + if oldId != 0 { //存在,数据编辑 + editInfo := overallhandle.MapOut() + editInfo["`name`"] = info[84] + editInfo["`company`"] = info[85] + editInfo["`department`"] = info[86] + editInfo["`position`"] = info[88] + editInfo["`workPosit`"] = info[88] + editInfo["`workUnit`"] = info[87] + editInfo["`levele`"] = info[89] + if info[90] != "" { + editInfo["`joinTime`"] = overallhandle.ExcelDateToDate(info[90]).Unix() + } + + editInfo["`tel`"] = info[91] + editInfo["`time`"] = time.Now().Unix() + editInfo["`state`"] = 1 + var editCont models.DoubleWorker + editCont.EiteCont(map[string]interface{}{"`id`": oldId}, editInfo) + } else { //无记录,新增 + NewAddDoubleWork(g.UserKey, g.UserNum, info) + } + } + } else { //不是双职工,软删除老数据 + if len(doubleWorkMan) > 0 { + var delDoubleWork models.DoubleWorker + delDoubleWork.EiteCont(map[string]interface{}{"`key`": g.UserKey}, map[string]interface{}{"`state`": 3}) + } + } + +} + +// 新增双职工 +func NewAddDoubleWork(userKey int64, userNum string, info map[int]string) { + var inSetInfo models.DoubleWorker + inSetInfo.Key = userKey // + inSetInfo.Number = userNum //"` + inSetInfo.Name = info[84] //姓名"` + inSetInfo.Company = info[85] //所在公司"` + inSetInfo.Department = info[86] //所在部门"` + inSetInfo.Position = info[88] //所在岗位"` + inSetInfo.WorkUnit = info[87] + inSetInfo.WorkPosit = info[88] + + inSetInfo.Levele = info[89] + if info[90] != "" { + inSetInfo.JoinTime = overallhandle.ExcelDateToDate(info[90]).Unix() + } + inSetInfo.Tel = info[91] //联系方式"` + inSetInfo.Time = time.Now().Unix() //创建时间"` + inSetInfo.State = 1 //状态(1:启用;2:禁用;3:删除)` + overall.CONSTANT_DB_HR.Create(&inSetInfo) +} + +/* +* +@ 作者: 秦东 +@ 时间: 2024-01-30 13:51:25 +@ 功能: 计算本集团下得行政组织 +@ 参数 + + #orgName 行政组织名称 + #orgAllId 本组织下得所有行政部门 + +@ 返回值 + + # + +@ 方法原型 + + # +*/ +func GetMyOrgSunId(orgName string, orgAllId []int64) (orgId int64) { + var orgInfo models.AdministrativeOrganization + err := orgInfo.GetCont(map[string]interface{}{"`name`": orgName}, "`id`") + // err := overall.CONSTANT_DB_HR.Model(&models.AdministrativeOrganization{}).Where("`name` LIKE ? AND `id` IN ?", orgName, orgAllId).Updates(orgInfo).Error + if err != nil { + return + } + if overallhandle.IsInTrue[int64](orgInfo.Id, orgAllId) { + orgId = orgInfo.Id + } + return +} + +/* +* +@ 作者: 秦东 +@ 时间: 2024-01-30 13:57:08 +@ 功能: 根据名称获取位 +@ 参数 + + #name 职位名称 + #orgId 归属行政组织 + +@ 返回值 + + #posistId 职位ID + #dutiesId 职务ID + #isTrue 是否为本行政组织得负责人 + +@ 方法原型 + + #func GetMyPositisName(name string,orgId int64)(posistId,dutiesId int64,isTrue int) +*/ +func GetMyPositisName(name string, orgId int64) (posistId, dutiesId int64, isTrue int) { + var sunOrg overallhandle.GetOrgAllParent + sunOrg.GetOrgSonAllId(orgId) + sunOrg.Id = append(sunOrg.Id, orgId) + var posistInfo models.Position + err := overall.CONSTANT_DB_HR.Model(&models.Position{}).Select("`id`,`person_in_charge`,`duties`").Where("`name` LIKE ? AND `administrative_organization` IN ?", "%"+name+"%", sunOrg.Id).Find(&posistInfo).Error + if err != nil { + return + } + posistId = posistInfo.Id + dutiesId = posistInfo.Duties + isTrue = posistInfo.PersonInCharge + if posistInfo.PersonInCharge == 0 { + isTrue = 2 + } + return +} diff --git a/api/version1/personnelapi/userarchives.go b/api/version1/personnelapi/userarchives.go new file mode 100644 index 0000000..6e8c2cd --- /dev/null +++ b/api/version1/personnelapi/userarchives.go @@ -0,0 +1,448 @@ +package personnelapi + +import ( + "encoding/json" + "fmt" + "hr_server/models" + personalitycolor "hr_server/models/personalityColor" + "hr_server/overall" + "hr_server/overall/overallhandle" + "reflect" + "strconv" + "strings" + "time" + + "github.com/gin-gonic/gin" +) + +/* +* +@ 作者: 秦东 +@ 时间: 2024-01-20 16:20:09 +@ 功能: 根据工号获取个人档案 +@ 参数 + + # + +@ 返回值 + + # + +@ 方法原型 + + # +*/ +func (s *StaffApi) PersonnelFiles(c *gin.Context) { + var requestData overallhandle.NmuberOverall + err := c.ShouldBindJSON(&requestData) + if err != nil { + overallhandle.Result(101, requestData, c) + return + } + if requestData.Number == "" { + overallhandle.Result(1, requestData, c, "未知人员!不可查询信息") + return + } + var myInfo models.ManCont + err = myInfo.GetCont(map[string]interface{}{"`number`": requestData.Number}) + if err != nil { + overallhandle.Result(105, err, c) + return + } + saveInfo := overallhandle.MapOut() + structValue := reflect.ValueOf(myInfo) + structType := structValue.Type() + for i := 0; i < structValue.NumField(); i++ { + fieldValue := structValue.Field(i) + fieldType := structType.Field(i) + saveInfo[fieldType.Name] = fieldValue.Interface() + } + if myInfo.Birthday != 0 { + saveInfo["birthdayTime"] = overallhandle.UnixTimeToDay(myInfo.Birthday, 14) //生日 + } + if myInfo.Entrydate != 0 { + saveInfo["EntrydateTime"] = overallhandle.UnixTimeToDay(myInfo.Entrydate, 14) //入职日期 + } + //部门 + if myInfo.MainDeparment != 0 { + var demperMainInfos models.AdministrativeOrganization + demperMainInfos.GetCont(map[string]interface{}{"`id`": myInfo.MainDeparment}, "`name`") + saveInfo["MainDeparmentName"] = demperMainInfos.Name + } + //岗位 + if myInfo.AdminOrg != 0 { + var adminOrg models.AdministrativeOrganization + adminOrg.GetCont(map[string]interface{}{"`id`": myInfo.AdminOrg}, "`name`") + saveInfo["AdminOrgName"] = adminOrg.Name + } + //职务 + if myInfo.Position != 0 { + var postisInfo models.Position + postisInfo.GetCont(map[string]interface{}{"`id`": myInfo.Position}, "`name`", "`person_in_charge`") + saveInfo["PositionName"] = postisInfo.Name + saveInfo["PersonInCharge"] = postisInfo.PersonInCharge + } + if myInfo.Isdoubleworker == 1 { + var doubleWorkerInfo models.DoubleWorker + doubleWorkerInfo.GetCont(map[string]interface{}{"`number`": myInfo.Number, "`state`": 1}, "`name`", "`company`", "`department`", "`position`") + saveInfo["WorkCompany"] = fmt.Sprintf("%v%v%v%v", doubleWorkerInfo.Name, doubleWorkerInfo.Company, doubleWorkerInfo.Department, doubleWorkerInfo.Position) + } else { + saveInfo["WorkCompany"] = "" + } + saveInfo["GenderName"] = overallhandle.GenderStatus(int64(myInfo.Gender)) + saveInfo["ConstellationName"] = overallhandle.StarSign(int64(myInfo.Constellation)) + saveInfo["PolitOutlook"] = overallhandle.PoliticalIdentity(int64(myInfo.PoliticalOutlook)) + saveInfo["Maristatus"] = overallhandle.MaritalStatus(int64(myInfo.Maritalstatus)) + //教育经历 + synPro.Add(1) + go func() { + saveInfo["EducationalExperience"] = UserEducationalExperience(myInfo.Key) + }() + //工作履历 + synPro.Add(1) + go func() { + saveInfo["ExternalWork"] = getWorkHistoryList(myInfo.Key) //工作履历 + }() + //集团内工作履历 + synPro.Add(1) + go func() { + saveInfo["InternalWork"] = getGroupWorkHistoryList(myInfo.Key) //工作履历 + }() + //职称证书 + synPro.Add(1) + go func() { + AcademicTitle := GainCertificateHonors(myInfo.Key, 1) + saveInfo["AcademicTitle"] = strings.Join(AcademicTitle, ",") //工作履历 + }() + //资格证书 + synPro.Add(1) + go func() { + Diploma := GainCertificateHonors(myInfo.Key, 2) + saveInfo["Diploma"] = strings.Join(Diploma, ",") //工作履历 + }() + + currentTime := time.Now() + years := currentTime.Year() - 1 + //绩效成绩 Performance score + synPro.Add(1) + go func() { + saveInfo["Meritslog"] = GainTimeLangMeritslog(myInfo.Key, years, 2) //工作履历 + }() + //获奖情况 + synPro.Add(1) + go func() { + saveInfo["Rewards"] = GainRewardsPenalties(myInfo.Key, years, 2, 1) //工作履历 + }() + //惩罚情况 + synPro.Add(1) + go func() { + saveInfo["Penalties"] = GainRewardsPenalties(myInfo.Key, years, 2, 2) //工作履历 + }() + //性格社彩 + synPro.Add(1) + go func() { + xgsc := GainCharacterColor(myInfo.Number) + saveInfo["CharacterColour"] = strings.Join(xgsc.TestNumber, "、") //工作履历 + }() + synPro.Wait() + overallhandle.Result(0, saveInfo, c) +} + +/* +* +@ 作者: 秦东 +@ 时间: 2024-01-24 08:08:43 +@ 功能: 获取性格色彩 +@ 参数 + + # + +@ 返回值 + + # + +@ 方法原型 + + # +*/ +func GainCharacterColor(num string) (tpr TestPageColorResult) { + synPro.Done() + var myColor personalitycolor.Charcolortest + err := myColor.GetCont(map[string]interface{}{"`c_states`": 1, "`c_number`": num}) + if err != nil { + return + } + var testPage []TestPageColor + if myColor.TestJson != "" { + json.Unmarshal([]byte(myColor.TestJson), &testPage) + } + GetColorVal := JiSuanColor(testPage) + var ColorStrAry []TestPageColorVal + var redColor TestPageColorVal + redColor.Strval = GetColorVal["RedColor"] + redColor.Name = "红色" + redColor.Setval = 1 + ColorStrAry = append(ColorStrAry, redColor) + var blueColor TestPageColorVal + blueColor.Strval = GetColorVal["BlueColor"] + blueColor.Name = "蓝色" + blueColor.Setval = 1 + ColorStrAry = append(ColorStrAry, blueColor) + var yellowColor TestPageColorVal + yellowColor.Strval = GetColorVal["YellowColor"] + yellowColor.Name = "黄色" + yellowColor.Setval = 1 + ColorStrAry = append(ColorStrAry, yellowColor) + var greenColor TestPageColorVal + greenColor.Strval = GetColorVal["GreenColor"] + greenColor.Name = "绿色" + greenColor.Setval = 1 + ColorStrAry = append(ColorStrAry, greenColor) + var colorAry []int + colorAry = append(colorAry, GetColorVal["RedColor"]) + colorAry = append(colorAry, GetColorVal["BlueColor"]) + colorAry = append(colorAry, GetColorVal["YellowColor"]) + colorAry = append(colorAry, GetColorVal["GreenColor"]) + MaxColor := overallhandle.GetMaxNum[int](colorAry) + for _, v := range ColorStrAry { + if v.Strval == MaxColor { + if !overallhandle.IsInTrue[int](v.Setval, tpr.CheckedVal) { + tpr.CheckedVal = append(tpr.CheckedVal, v.Setval) + } + if !overallhandle.IsInTrue[string](v.Name, tpr.TestNumber) { + tpr.TestNumber = append(tpr.TestNumber, v.Name) + } + } + } + return +} + +// 计算颜色 +func JiSuanColor(testPage []TestPageColor) map[string]int { + if len(testPage) < 1 { + sendDataw := make(map[string]int) + sendDataw["RedColor"] = 0 + sendDataw["BlueColor"] = 0 + sendDataw["YellowColor"] = 0 + sendDataw["GreenColor"] = 0 + return sendDataw + } + A_front_count := 0 + B_front_count := 0 + C_front_count := 0 + D_front_count := 0 + A_after_count := 0 + B_after_count := 0 + C_after_count := 0 + D_after_count := 0 + + for _, v := range testPage { + testNumInt, _ := strconv.Atoi(v.TestNumber) + checkedValInt, _ := strconv.Atoi(v.CheckedVal) + if testNumInt <= 15 { + switch checkedValInt { + case 2: + B_front_count++ + case 3: + C_front_count++ + case 4: + D_front_count++ + default: + A_front_count++ + } + } else { + switch checkedValInt { + case 2: + B_after_count++ + case 3: + C_after_count++ + case 4: + D_after_count++ + default: + A_after_count++ + } + } + } + RedColor := A_front_count + D_after_count + BlueColor := B_front_count + C_after_count + YellowColor := C_front_count + B_after_count + GreenColor := D_front_count + A_after_count + sendData := make(map[string]int) + sendData["RedColor"] = RedColor + sendData["BlueColor"] = BlueColor + sendData["YellowColor"] = YellowColor + sendData["GreenColor"] = GreenColor + sendData["A_front_count"] = A_front_count + sendData["B_front_count"] = B_front_count + sendData["C_front_count"] = C_front_count + sendData["D_front_count"] = D_front_count + sendData["A_after_count"] = A_after_count + sendData["B_after_count"] = B_after_count + sendData["C_after_count"] = C_after_count + sendData["D_after_count"] = D_after_count + return sendData +} + +/* +* +@ 作者: 秦东 +@ 时间: 2024-01-23 15:42:56 +@ 功能: 奖惩记录 +@ 参数 + + #userKey 人员KEY + #years 当前年 + #duration 倒查几年 + #class 奖励还是惩罚 + +@ 返回值 + + # + +@ 方法原型 + + # +*/ +func GainRewardsPenalties(userKey int64, years, duration, class int) map[string]interface{} { + synPro.Done() + sendData := overallhandle.MapOut() + + if duration > 0 { + // fmt.Printf("奖惩记录111111: %v\n", duration) + for i := duration; i >= 0; i-- { + // fmt.Printf("奖惩记录33333: %v\n", i) + timeVal := years - i + var allScore []map[string]interface{} + overall.CONSTANT_DB_HR.Model(&models.RewardsPenalties{}).Where("`state` = 1 AND `userkey` = ? AND `years` = ? AND `type` = ?", userKey, timeVal, class).Find(&allScore) + // fmt.Printf("奖惩记录11111: %v\n", err) + timeValStr := strconv.Itoa(timeVal) + sendData[timeValStr] = allScore + // fmt.Printf("奖惩记录: %s\n", timeValStr) + } + } else { + var allScore map[string]interface{} + overall.CONSTANT_DB_HR.Model(&models.RewardsPenalties{}).Where("`state` = 1 AND `userkey` = ? AND `years` = ? AND `type` = ?", userKey, years, class).Find(&allScore) + timeValStr := strconv.Itoa(years) + sendData[timeValStr] = allScore + } + return sendData +} + +/* +* +@ 作者: 秦东 +@ 时间: 2024-01-23 15:20:52 +@ 功能: 获取多长时间的绩效 +@ 参数 + + #userKey 人员KEY + #years 当前年 + #duration 倒查几年 + +@ 返回值 + + # + +@ 方法原型 + + # +*/ +func GainTimeLangMeritslog(userKey int64, years, duration int) map[string]interface{} { + synPro.Done() + sendData := overallhandle.MapOut() + if duration > 0 { + for i := duration; i >= 0; i-- { + timeVal := years - i + var allScore int64 + overall.CONSTANT_DB_HR.Model(&models.Meritslog{}).Select("SUM(`score`) as scoresum").Where("`status` = 1 AND `userkey` = ? AND `years` = ?", userKey, timeVal).Find(&allScore) + timeValStr := strconv.Itoa(timeVal) + if allScore > 0 { + sendData[timeValStr] = float64(allScore) / 10000 + } else { + sendData[timeValStr] = 0 + } + } + } else { + var allScore int64 + overall.CONSTANT_DB_HR.Model(&models.Meritslog{}).Select("SUM(`score`) as scoresum").Where("`status` = 1 AND `userkey` = ? AND `years` = ?", userKey, years).Find(&allScore) + timeValStr := strconv.Itoa(years) + if allScore > 0 { + sendData[timeValStr] = float64(allScore) / 10000 + } else { + sendData[timeValStr] = 0 + } + } + return sendData +} + +/* +* +@ 作者: 秦东 +@ 时间: 2024-01-23 15:08:44 +@ 功能: 获取证书 +@ 参数 + + # + +@ 返回值 + + # + +@ 方法原型 + + # +*/ +func GainCertificateHonors(userKey int64, class int) (titleList []string) { + synPro.Done() + overall.CONSTANT_DB_HR.Model(&models.CertificateHonors{}).Select("`title`").Where("`state` = 1 AND `type` = ? AND `userkey` = ?", class, userKey).Find(&titleList) + return +} + +/* +* +@ 作者: 秦东 +@ 时间: 2024-01-23 09:46:31 +@ 功能: 获取教育径路 +@ 参数 + + # + +@ 返回值 + + # + +@ 方法原型 + + # +*/ +func UserEducationalExperience(num int64) (eduExper []educatExp) { + defer synPro.Done() + var dowWorkMan []models.PersonnelEducation + err := overall.CONSTANT_DB_HR.Model(&models.PersonnelEducation{}).Select("`id`", "`education`", "`graduation_school`", "`subject`", "`admission_time`", "`graduation_time`", "`level`,`academic_degree`").Where("`state` = 1 AND `key` = ?", num).Order("`level` desc").Find(&dowWorkMan).Error + if err != nil { + return + } + for _, v := range dowWorkMan { + var dwManCont educatExp // + dwManCont.GraduationSchool = v.GraduationSchool //毕业学校 + dwManCont.Subject = v.Subject //专业 + dwManCont.Education = v.Education //学历 + dwManCont.EducationName = overallhandle.EducationLevel(int64(v.Education)) + if v.AdmissionTime != 0 { + dwManCont.AdmissionTime = overallhandle.UnixTimeToDay(v.AdmissionTime, 14) //入学时间 + } + if v.GraduationTime != 0 { + dwManCont.GraduationTime = overallhandle.UnixTimeToDay(v.GraduationTime, 14) //毕业时间 + } + + dwManCont.AcademicDegree = overallhandle.AcademicDegree(int64(v.AcademicDegree)) //学位 + dwManCont.AcademicDegreeId = v.AcademicDegree + dwManCont.Level = overallhandle.GetXueWeiClass(int64(v.Level)) + dwManCont.LevelId = v.Level //学历类型 + dwManCont.Id = strconv.FormatInt(v.Id, 10) + dwManCont.EducationTypeName = overallhandle.EducationType(int64(v.EducationType)) + eduExper = append(eduExper, dwManCont) + } + + return +} diff --git a/api/version1/workWechat/method.go b/api/version1/workWechat/method.go new file mode 100644 index 0000000..641180d --- /dev/null +++ b/api/version1/workWechat/method.go @@ -0,0 +1,91 @@ +package workWechat + +import ( + "hr_server/middleware/wxbizjsonmsgcrypt" + "hr_server/middleware/wxbizmsgcrypt" + "hr_server/overall" +) + +/* +* +@ 作者: 秦东 +@ 时间: 2024-01-26 08:52:18 +@ 功能: 企业微信加解密-json +@ 参数 + + #token 应用Token + #encodingAesKey 应用Encodingaeskey + +@ 返回值 + + #wxcpt 初始化加解密类 + +@ 方法原型 + + # +*/ +func WechatDecryptJson(systemApp string) (wxcpt *wxbizjsonmsgcrypt.WXBizMsgCrypt) { + var token string + var encodingAesKey string + switch systemApp { + case "kpi": + token = overall.CONSTANT_CONFIG.WechatKpi.Token + encodingAesKey = overall.CONSTANT_CONFIG.WechatKpi.Encodingaeskey + case "school": + token = overall.CONSTANT_CONFIG.WechatSchool.Token + encodingAesKey = overall.CONSTANT_CONFIG.WechatSchool.Encodingaeskey + case "hr": + token = overall.CONSTANT_CONFIG.EmployeeFile.Token + encodingAesKey = overall.CONSTANT_CONFIG.EmployeeFile.Encodingaeskey + case "txl": + token = overall.CONSTANT_CONFIG.AddressBook.Token + encodingAesKey = overall.CONSTANT_CONFIG.AddressBook.Encodingaeskey + default: + token = overall.CONSTANT_CONFIG.WechatSchool.Token + encodingAesKey = overall.CONSTANT_CONFIG.WechatSchool.Encodingaeskey + } + wxcpt = wxbizjsonmsgcrypt.NewWXBizMsgCrypt(token, encodingAesKey, overall.CONSTANT_CONFIG.WechatCompany.CompanyId, wxbizjsonmsgcrypt.JsonType) + return +} + +/* +* +@ 作者: 秦东 +@ 时间: 2024-01-26 09:09:14 +@ 功能: 企业微信加解密-XML +@ 参数 + + #token 应用Token + #encodingAesKey 应用Encodingaeskey + +@ 返回值 + + #wxcpt 初始化加解密类 + +@ 方法原型 + + # +*/ +func WechatDecryptXml(systemApp string) (wxcpt *wxbizmsgcrypt.WXBizMsgCrypt) { + var token string + var encodingAesKey string + switch systemApp { + case "kpi": + token = overall.CONSTANT_CONFIG.WechatKpi.Token + encodingAesKey = overall.CONSTANT_CONFIG.WechatKpi.Encodingaeskey + case "school": + token = overall.CONSTANT_CONFIG.WechatSchool.Token + encodingAesKey = overall.CONSTANT_CONFIG.WechatSchool.Encodingaeskey + case "hr": + token = overall.CONSTANT_CONFIG.EmployeeFile.Token + encodingAesKey = overall.CONSTANT_CONFIG.EmployeeFile.Encodingaeskey + case "txl": + token = overall.CONSTANT_CONFIG.AddressBook.Token + encodingAesKey = overall.CONSTANT_CONFIG.AddressBook.Encodingaeskey + default: + token = overall.CONSTANT_CONFIG.WechatSchool.Token + encodingAesKey = overall.CONSTANT_CONFIG.WechatSchool.Encodingaeskey + } + wxcpt = wxbizmsgcrypt.NewWXBizMsgCrypt(token, encodingAesKey, overall.CONSTANT_CONFIG.WechatCompany.CompanyId, wxbizmsgcrypt.XmlType) + return +} diff --git a/api/version1/workWechat/type.go b/api/version1/workWechat/type.go index 2653948..b38dba8 100644 --- a/api/version1/workWechat/type.go +++ b/api/version1/workWechat/type.go @@ -3,12 +3,15 @@ package workWechat import ( "hr_server/models" "hr_server/overall/overallhandle" + "sync" "github.com/gin-gonic/gin" ) type ApiMethod struct{} +var synPro = sync.WaitGroup{} + // 微信相关项目入口 func (a *ApiMethod) Index(c *gin.Context) { outputCont := overallhandle.MapOut() @@ -32,8 +35,8 @@ type WeChatCallBack struct { // 获取Token参数 type WechatTokanVal struct { - SystemApp string `json:"system_app"` - IsAgain int `json:"is_again"` + SystemApp string `json:"system_app"` //系统 + IsAgain int `json:"is_again"` //重新授权 1:否,2:是 } // 企业微信身份认证 @@ -51,3 +54,140 @@ type WechatVerifyIdentity struct { Token string `json:"token"` UserInfo models.ManCont `json:"userinfo"` } +type WriteInfo struct { + UserNumber string `json:"usernumber"` + Class int `json:"class"` //写入内容类型:1、职业生涯规划;2:个人期望从组织获得的帮助 + Content string `json:"content"` +} + +// 企业微信部门信息 +type WechatDepartmentInfo struct { + Id int `json:"id"` //创建的部门id + Name string `json:"name"` //部门名称,代开发自建应用需要管理员授权才返回; + NameEn string `json:"name_en"` //英文名称,此字段从2019年12月30日起,对新创建第三方应用不再返回,2020年6月30日起,对所有历史第三方应用不再返回该字段 + DepartmentLeader []string `json:"department_leader"` //部门负责人的UserID;第三方仅通讯录应用可获取 + Parentid int `json:"parentid"` //父部门id。根部门为1 + Order int `json:"order"` //在父部门中的次序值。order值大的排序靠前。值范围是[0, 2^32) +} + +// 企业微信部门信息返回 +type WechatCallBackDepartment struct { + RevokeMsgSendCallBack + Department []WechatDepartmentInfo `json:"department"` //部门信息列表 +} + +// 企业微信部门成员详情 +type WechatCallBackPeople struct { + RevokeMsgSendCallBack + UserList []WechatUserList `json:"userlist"` //部门信息列表 + // UserList map[string]interface{} `json:"userlist"` +} + +// wechat userlist +type WechatUserList struct { + Alias string `json:"alias"` + Department []int `json:"department"` + Direct_leader []interface{} `json:"direct_leader"` + Enable int `json:"enable"` + Extattr Extattr `json:"extattr"` + External_profile External_profile `json:"external_profile"` + Hide_mobile int `json:"hide_mobile"` + Is_leader_in_dept []int `json:"is_leader_in_dept"` + Isleader int `json:"isleader"` + Main_department int `json:"main_department"` + Name string `json:"name"` + Order []int `json:"order"` + Position string `json:"position"` + Status int `json:"status"` + Telephone string `json:"telephone"` + Userid string `json:"userid"` +} + +type Attr struct { + Name string `json:"name"` + Text Text `json:"text"` + Type int `json:"type"` + Value string `json:"value"` + Web WebCont `json:"web"` +} +type WebCont struct { + Url string `json:"url"` + Title string `json:"title"` +} +type Extattr struct { + Attrs []Attr `json:"attrs"` +} + +type Text struct { + Value string `json:"value"` +} +type External_profile struct { + External_attr []interface{} `json:"external_attr"` + External_corp_name string `json:"external_corp_name"` + Wechat_channels Wechat_channels `json:"wechat_channels"` +} + +type Wechat_channels struct { + Nickname string `json:"nickname"` + Status int `json:"status"` +} + +// 企业微信回调记录 +type CallbackLog struct { + Id int64 `json:"id" gorm:"column:id;type:bigint(20);;primaryKey;unique;not null;autoIncrement;index"` + MsgSignature string `json:"msgSignature" gorm:"column:msg_signature;type:varchar(255);not null;comment:组织名称"` + TimeStamp int64 `json:"timestamp" gorm:"column:timestamp;type:bigint(20) unsigned;default:0;not null;comment:编辑时间"` + Nonce string `json:"nonce" gorm:"column:nonce;type:varchar(255);not null;comment:组织名称"` + Echostr string `json:"echostr" gorm:"column:echostr;type:text;not null;comment:组织名称"` + Xmlstr string `json:"xmlstr" gorm:"column:xmlstr;type:text;comment:组织名称"` + Jsonstr string `json:"jsonstr" gorm:"column:jsonstr;type:text;comment:组织名称"` + AddTime int64 `json:"addtime" gorm:"column:addtime;type:bigint(20) unsigned;default:0;not null;comment:编辑时间"` + Reqdata string `json:"reqdata" gorm:"column:reqdata;type:text;comment:组织名称"` +} + +// 上报地理位置 +type GeographicalPositionType struct { + CurrencyMessage + Latitude string `xml:"Latitude" json:"Latitude"` + Longitude string `xml:"Longitude" json:"Longitude"` + Precision string `xml:"Precision" json:"Precision"` + AppType string `xml:"AppType" json:"AppType"` +} + +// 通用更新切片 +type CurrencyMessage struct { + ToUsername string `xml:"ToUserName" json:"ToUserName"` + FromUsername string `xml:"FromUserName" json:"FromUserName"` + CreateTime uint32 `xml:"CreateTime" json:"CreateTime"` + MsgType string `xml:"MsgType" json:"MsgType"` + Agentid uint32 `xml:"AgentID" json:"AgentID"` + Event string `xml:"Event" json:"Event"` + EventKey string `xml:"EventKey" json:"EventKey"` + // TaskId string `xml:"TaskId"` +} + +// 上报地理位置Redis +type GeographicalPositionRedis struct { + UserId string `json:"userid"` + Latitude string `json:"latitude"` + Longitude string `json:"longitude"` + Precision string `json:"precision"` + Time int64 `json:"time"` + LatitudeBaiDu float64 `json:"latitudebaidu"` + LongitudeBaiDu float64 `json:"longitudebaidu"` +} + +// 更新的人员信息Attrs 文本 +type UpdateMyWechatText struct { + Name string `json:"name"` + Text Text `json:"text"` + Type int `json:"type"` + Value string `json:"value"` +} + +// 更新的人员信息Attrs 网址 +type UpdateMyWechatURL struct { + Name string `json:"name"` + Type int `json:"type"` + Web WebCont `json:"web"` +} diff --git a/api/version1/workWechat/typeApi.go b/api/version1/workWechat/typeApi.go new file mode 100644 index 0000000..8482bca --- /dev/null +++ b/api/version1/workWechat/typeApi.go @@ -0,0 +1,65 @@ +package workWechat + +//获取企业微信部门列表 +type GetWechatOrg struct { + WechatTokanVal + OrgId int `json:"org"` //行政组织ID +} + +//企业微信更新成员 +type UpdateWechatUserInfo struct { + WechatTokanVal + Info map[string]interface{} `json:"info"` //行政组织ID +} + +//企业微信回调基础参数 +type CallBackData struct { + MsgSignature string `json:"msg_signature"` + Timestamp string `json:"timestamp"` + Nonce string `json:"nonce"` + Echostr string `json:"echostr"` + ToUserName string `json:"tousername"` + AgentID string `json:"agentid"` + Encrypt string `json:"encrypt"` + DataType string `json:"datatype"` + SystemApp string `json:"systemapp"` +} + +//XML 格式回调 +type XmlMsgCont struct { + ToUsername string `xml:"ToUserName" json:"ToUserName"` + Agentid uint32 `xml:"AgentID" json:"AgentID"` + Encrypt string `xml:"Encrypt" json:"encrypt"` +} + +//返回消息体解密 +type DecryptMsgCont struct { + MsgSignature string `json:"msg_signature"` + Timestamp string `json:"timestamp"` + Nonce string `json:"nonce"` + SystemApp string `json:"systemapp"` + jsonMsgCont +} +type jsonMsgCont struct { + ToUsername string `json:"ToUserName"` + Agentid uint32 `json:"AgentID"` + Encrypt string `json:"encrypt"` +} + +//XML数据解密 +type MsgContentXml struct { + XmlMsgUpdateCont + Content string `xml:"Content" json:"Content"` + Msgid string `xml:"MsgId" json:"MsgId"` +} + +//通用更新切片 +type XmlMsgUpdateCont struct { + ToUsername string `xml:"ToUserName" json:"ToUserName"` + FromUsername string `xml:"FromUserName" json:"FromUserName"` + CreateTime uint32 `xml:"CreateTime" json:"CreateTime"` + MsgType string `xml:"MsgType" json:"MsgType"` + Agentid uint32 `xml:"AgentID" json:"AgentID"` + Event string `xml:"Event" json:"Event"` + EventKey string `xml:"EventKey" json:"EventKey"` +} diff --git a/api/version1/workWechat/wechat.go b/api/version1/workWechat/wechat.go index f78f899..eb9e04a 100644 --- a/api/version1/workWechat/wechat.go +++ b/api/version1/workWechat/wechat.go @@ -2,11 +2,15 @@ package workWechat import ( "encoding/json" + "encoding/xml" "errors" "fmt" "hr_server/grocerystore" + "hr_server/models" "hr_server/overall" "hr_server/overall/overallhandle" + "strconv" + "time" ) /* @@ -31,7 +35,7 @@ import ( */ func GainWechatToken(systemApp, key string, isAgain int) (token string, err error) { companyId := overall.CONSTANT_CONFIG.WechatCompany.CompanyId - redisFileKey := fmt.Sprintf("Wechat:Token:%v_%v_%v", companyId, key, overall.CONSTANT_CONFIG.RedisPrefixStr.Alias) + redisFileKey := fmt.Sprintf("Wechat:Token:%v_%v_%v_%v", systemApp, companyId, key, overall.CONSTANT_CONFIG.RedisPrefixStr.Alias) var secretStr string switch systemApp { case "kpi": @@ -40,6 +44,12 @@ func GainWechatToken(systemApp, key string, isAgain int) (token string, err erro case "school": redisFileKey = fmt.Sprintf("%v_%v_%v", redisFileKey, systemApp, overall.CONSTANT_CONFIG.WechatSchool.Agentid) secretStr = overall.CONSTANT_CONFIG.WechatSchool.Secret + case "hr": + redisFileKey = fmt.Sprintf("%v_%v_%v", redisFileKey, systemApp, overall.CONSTANT_CONFIG.EmployeeFile.Agentid) + secretStr = overall.CONSTANT_CONFIG.EmployeeFile.Secret + case "txl": + redisFileKey = fmt.Sprintf("%v_%v_%v", redisFileKey, systemApp, overall.CONSTANT_CONFIG.EmployeeFile.Agentid) + secretStr = overall.CONSTANT_CONFIG.AddressBook.Secret default: redisFileKey = fmt.Sprintf("%v_%v", redisFileKey, systemApp) } @@ -97,7 +107,7 @@ func getWechatServer(companyId, secretStr string) (token string, err error) { return } if callBackCont.Errcode != 0 { - err = errors.New("未能获得到TOKEN!") + err = errors.New(fmt.Sprintf("未能获得到TOKEN!%v", callBackCont.Errmsg)) return } token = callBackCont.Accesstoken @@ -161,3 +171,545 @@ func GainJsapiTicket(systemApp, key string, class int) (jsApiTickerStr string, e } return } + +/* +* +@ 作者: 秦东 +@ 时间: 2024-01-25 14:11:27 +@ 功能: 获取部门列表 +@ 参数 + + #org 行政组织 + #systemApp 系统 + #key 身份KEy + #isAgain 重新授权 1:否,2:是 + +@ 返回值 + + #departmentAry 部门列表 + #err 错误信息 + +@ 方法原型 + + #func GainWechatDepartment(org int64, systemApp, key string, isAgain int) (departmentAry []WechatDepartmentInfo, err error) +*/ +func GainWechatDepartment(org int64, systemApp, key string, isAgain int) (departmentAry []WechatDepartmentInfo, err error) { + token, err := GainWechatToken(systemApp, key, 1) + if err != nil { + return + } + sendWechatUrl := fmt.Sprintf("https://qyapi.weixin.qq.com/cgi-bin/department/list?access_token=%v&id=%v", token, org) + if org == 0 { + sendWechatUrl = fmt.Sprintf("https://qyapi.weixin.qq.com/cgi-bin/department/list?access_token=%v", token) + } + // fmt.Printf("网址-->%v-->%v\n", org, sendWechatUrl) + //获取企业微信取部门列表 + wechatCallBack := overallhandle.CurlGet(sendWechatUrl) + var deparmentsList WechatCallBackDepartment + err = json.Unmarshal(wechatCallBack, &deparmentsList) + if err != nil { + return + } + if deparmentsList.Errcode != 0 { + return + } + departmentAry = deparmentsList.Department + return +} + +/* +* +@ 作者: 秦东 +@ 时间: 2024-01-25 15:22:28 +@ 功能: 获取行政组织人员信息 +@ 参数 + + #org 行政组织 + #systemApp 系统 + #key 身份KEy + #isAgain 重新授权 1:否,2:是 + +@ 返回值 + + # + +@ 方法原型 + + # +*/ +func GainOrgPeopleInfo(org int64, systemApp, key string, isAgain int) (peopleAry interface{}, err error) { + token, err := GainWechatToken(systemApp, key, 1) + if err != nil { + return + } + sendWechatUrl := fmt.Sprintf("https://qyapi.weixin.qq.com/cgi-bin/user/list?access_token=%v&department_id=%v", token, org) + //获取企业微信取部门成员详情 + wechatCallBack := overallhandle.CurlGet(sendWechatUrl) + var orgPeopleList WechatCallBackPeople + // peo := overallhandle.MapOut() + err = json.Unmarshal(wechatCallBack, &orgPeopleList) + if err != nil { + return + } + if orgPeopleList.Errcode != 0 { + return + } + peopleAry = orgPeopleList.UserList + // peopleAry = peo + return +} + +/* +* +@ 作者: 秦东 +@ 时间: 2024-01-25 16:05:08 +@ 功能: 更新企业微信人员信息 +@ 参数 + + # + +@ 返回值 + + # + +@ 方法原型 + + # +*/ +func UpdateWechatPeopel(systemApp, key string, isAgain int, userInfo map[string]interface{}) (err error) { + if _, ok := userInfo["userid"]; !ok { + err = errors.New("关键信息不全userid") + return + } + token, err := GainWechatToken(systemApp, key, 1) + if err != nil { + return + } + userJson, err := json.Marshal(userInfo) + if err != nil { + overallhandle.WriteLog("e", "1、更新企业微信人员信息", err, userJson) + return + } + overallhandle.WriteLog("i", "更新企业微信人员信息", string(userJson)) + sendWechatUrl := fmt.Sprintf("https://qyapi.weixin.qq.com/cgi-bin/user/update?access_token=%v", token) + //获取企业微信取部门成员详情 + wechatCallBack := overallhandle.CurlPostJosn(sendWechatUrl, userJson) + var orgPeopleList RevokeMsgSendCallBack + err = json.Unmarshal(wechatCallBack, &orgPeopleList) + // fmt.Printf("成员详情--->%v\n", orgPeopleList) + if err != nil { + overallhandle.WriteLog("e", "2、更新企业微信人员信息", err, string(wechatCallBack)) + return + } + if orgPeopleList.Errcode != 0 { + err = errors.New(orgPeopleList.Errmsg) + overallhandle.WriteLog("e", "3、更新企业微信人员信息", orgPeopleList.Errcode, orgPeopleList.Errmsg) + return + } + return +} + +// 企业微信回调验证URL +func (c *CallBackData) VerificationUrl() (msg string) { + switch c.DataType { + case "json": + wxCallBackJson := WechatDecryptJson(c.SystemApp) + echoStr, cryptErr := wxCallBackJson.VerifyURL(c.MsgSignature, c.Timestamp, c.Nonce, c.Echostr) + msg = string(echoStr) + if cryptErr != nil { + fmt.Println("verifyUrl fail", cryptErr) + overallhandle.WriteLog("e", "verifyUrl fail", cryptErr) + } + default: + wxCallBackXml := WechatDecryptXml(c.SystemApp) + echoStr, cryptErr := wxCallBackXml.VerifyURL(c.MsgSignature, c.Timestamp, c.Nonce, c.Echostr) + msg = string(echoStr) + if cryptErr != nil { + fmt.Println("verifyUrl fail", cryptErr) + overallhandle.WriteLog("e", "verifyUrl fail", cryptErr) + } + } + return +} + +// 解密文档 +func (d *DecryptMsgCont) DecryptMsgInfo() (msg []byte, err error) { + decryptStr := fmt.Sprintf(`{"tousername":"%v","encrypt":"%v","agentid":"%v"}`, d.ToUsername, d.Encrypt, d.Agentid) + + reqData := []byte(decryptStr) + + wxcptJson := WechatDecryptJson(d.SystemApp) + + msg, cryptErr := wxcptJson.DecryptMsg(d.MsgSignature, d.Timestamp, d.Nonce, reqData) + if cryptErr != nil { + err = fmt.Errorf("解密失败1") + } + overallhandle.WriteLog("write", "企业微信回调内容", string(msg)) + var callbackLog CallbackLog + callbackLog.MsgSignature = d.MsgSignature + TimestampInt, _ := strconv.ParseInt(d.Timestamp, 10, 64) + callbackLog.TimeStamp = TimestampInt + callbackLog.Nonce = d.Nonce + callbackLog.Echostr = d.Encrypt + callbackLog.Xmlstr = string(msg) + callbackLog.AddTime = time.Now().Unix() + overallhandle.WriteLog("i", "企业微信回调内容", callbackLog) + return +} + +/* +* +@ 作者: 秦东 +@ 时间: 2024-01-26 09:27:14 +@ 功能: 进入应用上报地址位置 +@ 参数 + + # + +@ 返回值 + + # + +@ 方法原型 + + # +*/ +func GeographicalPosition(eventMsg []byte) { + var msgContent GeographicalPositionType + err := xml.Unmarshal(eventMsg, &msgContent) + if nil != err { + fmt.Println("***********Unmarshal fail") + overallhandle.WriteLog("e", "上报地理位置", err) + } + userAddress := overallhandle.MapOut() + userAddress["userid"] = msgContent.FromUsername //userID + userAddress["latitude"] = msgContent.Latitude //地理位置纬度 + userAddress["longitude"] = msgContent.Longitude //地理位置经度 + userAddress["precision"] = msgContent.Precision //地理位置精度 + userAddress["time"] = time.Now().Unix() + marshal, err := json.Marshal(userAddress) + if err != nil { + marshal = []byte{} + overallhandle.WriteLog("e", "上报地理位置,数据写入错误", marshal) + } + redisPrefix := fmt.Sprintf("AddressLocation:GeographicalPosition_%v:userId_%v", overall.CONSTANT_CONFIG.RedisPrefixStr.PreFix, msgContent.FromUsername) + redisClient := grocerystore.RunRedis(overall.CONSTANT_REDIS4) + locationJson, locationErr := redisClient.Lindex(redisPrefix, 0) + if locationErr != nil { + _, err := redisClient.Lpush(redisPrefix, string(marshal)) + overallhandle.WriteLog("add", "1、上报地理位置,", err) + } else { + + var geographicalPositionRedis GeographicalPositionRedis + jsonErr := json.Unmarshal([]byte(locationJson), &geographicalPositionRedis) + if jsonErr != nil { + _, err := redisClient.Lpush(redisPrefix, string(marshal)) + overallhandle.WriteLog("add", "2、上报地理位置,", err) + } else { + timeVal := geographicalPositionRedis.Time + if time.Now().Unix()-timeVal >= 300 { + _, err := redisClient.Lpush(redisPrefix, string(marshal)) + overallhandle.WriteLog("add", "3、上报地理位置,", err) + } + } + } +} + +/* +* +@ 作者: 秦东 +@ 时间: 2024-01-26 11:20:42 +@ 功能: 指定企业微信行政组织更新其下人员信息 +@ 参数 + + # + +@ 返回值 + + # + +@ 方法原型 + + # +*/ +func UpdateWechatOrgPeople(org int64, systemApp, key string, isAgain int) (err error) { + orgList, err := GainWechatDepartment(org, systemApp, key, isAgain) + if err != nil || len(orgList) < 1 { + overallhandle.WriteLog("e", "没有行政组织!", org, err) + return + } + for _, v := range orgList { + synPro.Add(1) + go OrgPeopelList(int64(v.Id), systemApp, key, isAgain) + } + synPro.Wait() + return +} + +/* +* +@ 作者: 秦东 +@ 时间: 2024-01-26 11:29:42 +@ 功能: 协程获取人员信息 +@ 参数 + + # + +@ 返回值 + + # + +@ 方法原型 + + # +*/ +func OrgPeopelList(org int64, systemApp, key string, isAgain int) { + defer synPro.Done() + orgList, err := GainOrgPeopleInfo(org, systemApp, key, isAgain) + if err != nil { + overallhandle.WriteLog("e", "没有行人员!", org, err) + return + } + var peopleAry []interface{} + if val, ok := orgList.([]WechatUserList); ok { + if len(val) > 0 { + for _, v := range val { + // fmt.Printf("org-2-->\n%T\n%v\n", v.Extattr, v.Extattr) + updateWechatUserCont := overallhandle.MapOut() + updateWechatUserCont["userid"] = v.Userid + var userCont models.PersonArchives + errUser := overall.CONSTANT_DB_HR.Model(&models.PersonArchives{}).Select("`number`,`work_wechat`,`wechat`").Where("`work_wechat` = ? OR `wechat` = ?", v.Userid, v.Userid).First(&userCont).Error //根据企业微信UserId寻找员工记录中是否存在记录 + var attrsAry []interface{} + isWriteUrl := true + isWriteNum := true + var wechatNum string + dangAnIsShow := true + for _, ev := range v.Extattr.Attrs { + // fmt.Printf("%v档案信息%v\n", v.Userid, ev) + //判断企业微信回调中是否有工号 + if ev.Name == "工号" && ev.Text.Value != "" { //有工号 + isWriteNum = false + wechatNum = ev.Text.Value + // dangAnUrl := fmt.Sprintf("http://hr.hxgk.group/#/?usernum=%v", ev.Text.Value) + // if ev.Text.Value != dangAnUrl { + // var dangAnInfi UpdateMyWechatURL + // dangAnInfi.Name = "档案" + // dangAnInfi.Type = 1 + // dangAnInfi.Web.Title = "详细信息" + // dangAnInfi.Web.Url = dangAnUrl + // attrsAry = append(attrsAry, dangAnInfi) + // isWriteUrl = false + // fmt.Printf("1写档案%v\n", v.Userid) + // } + if errUser == nil { //数据库中存在UserId信息 + if userCont.WorkWechat == "" && userCont.Wechat == "" { //如果没有绑定微信则绑定 + editUserTable := overallhandle.MapOut() + editUserTable["work_wechat"] = v.Userid + editUserTable["eite_time"] = time.Now().Unix() + var userNumInfo models.PersonArchives + userNumInfo.EiteCont(map[string]interface{}{"`number`": ev.Text.Value}, editUserTable) + } + } else { //数据库中不存在UserId信息,则写入UserId信息 + var userNumInfo models.PersonArchives + errNum := userNumInfo.GetCont(map[string]interface{}{"`number`": ev.Text.Value}, "`work_wechat`", "`wechat`") + if errNum == nil { //判断此工号员工是否存在,存在则写入相应数据记录中 + editUserTable := overallhandle.MapOut() + editUserTable["work_wechat"] = v.Userid + editUserTable["eite_time"] = time.Now().Unix() + userNumInfo.EiteCont(map[string]interface{}{"`number`": ev.Text.Value}, editUserTable) + } + } + } + // else { //无工号 + // if errUser == nil { //数据库中存在UserId信息 + // dangAnUrl := fmt.Sprintf("http://hr.hxgk.group/#/?usernum=%v", userCont.Number) + // if ev.Web.Url != dangAnUrl { + // var dangAnInfi UpdateMyWechatURL + // dangAnInfi.Name = "档案" + // dangAnInfi.Type = 1 + // dangAnInfi.Web.Title = "详细信息" + // dangAnInfi.Web.Url = dangAnUrl + // attrsAry = append(attrsAry, dangAnInfi) + // } + // var gonhaoInFo UpdateMyWechatText + // gonhaoInFo.Name = "工号" + // gonhaoInFo.Type = 0 + // gonhaoInFo.Value = userCont.Number + // gonhaoInFo.Text.Value = userCont.Number + // attrsAry = append(attrsAry, gonhaoInFo) + // } + // } + if ev.Name == "档案" && ev.Web.Url != "" { + dangAnIsShow = false + if isWriteUrl && errUser == nil { + dangAnUrl := fmt.Sprintf("http://hr.hxgk.group/#/?usernum=%v", userCont.Number) + if ev.Web.Url != dangAnUrl { + var dangAnInfi UpdateMyWechatURL + dangAnInfi.Name = "档案" + dangAnInfi.Type = 1 + dangAnInfi.Web.Title = "详细信息" + dangAnInfi.Web.Url = dangAnUrl + attrsAry = append(attrsAry, dangAnInfi) + isWriteUrl = false + // fmt.Printf("2写档案%v\n", v.Userid) + } else { + isWriteUrl = false + } + } + if isWriteNum && errUser == nil { + var gonhaoInFo UpdateMyWechatText + gonhaoInFo.Name = "工号" + gonhaoInFo.Type = 0 + gonhaoInFo.Value = userCont.Number + gonhaoInFo.Text.Value = userCont.Number + attrsAry = append(attrsAry, gonhaoInFo) + isWriteNum = false + } + } + if ev.Name == "档案" && ev.Web.Url == "" { + dangAnIsShow = false + if isWriteUrl && errUser == nil { + dangAnUrl := fmt.Sprintf("http://hr.hxgk.group/#/?usernum=%v", userCont.Number) + var dangAnInfi UpdateMyWechatURL + dangAnInfi.Name = "档案" + dangAnInfi.Type = 1 + dangAnInfi.Web.Title = "详细信息" + dangAnInfi.Web.Url = dangAnUrl + attrsAry = append(attrsAry, dangAnInfi) + isWriteUrl = false + // fmt.Printf("3写档案%v\n", v.Userid) + } + if isWriteNum && errUser == nil { + var gonhaoInFo UpdateMyWechatText + gonhaoInFo.Name = "工号" + gonhaoInFo.Type = 0 + gonhaoInFo.Value = userCont.Number + gonhaoInFo.Text.Value = userCont.Number + attrsAry = append(attrsAry, gonhaoInFo) + isWriteNum = false + } + } + if ev.Name == "工号" && isWriteNum { + if errUser == nil { + wechatNum = userCont.Number + } + if wechatNum != "" { + var gonhaoInFo UpdateMyWechatText + gonhaoInFo.Name = "工号" + gonhaoInFo.Type = 0 + gonhaoInFo.Value = userCont.Number + gonhaoInFo.Text.Value = userCont.Number + attrsAry = append(attrsAry, gonhaoInFo) + isWriteNum = false + } + } + if ev.Name == "档案" && isWriteUrl { + dangAnIsShow = false + if errUser == nil { + wechatNum = userCont.Number + } + if wechatNum != "" { + dangAnUrl := fmt.Sprintf("http://hr.hxgk.group/#/?usernum=%v", wechatNum) + var dangAnInfi UpdateMyWechatURL + dangAnInfi.Name = "档案" + dangAnInfi.Type = 1 + dangAnInfi.Web.Title = "详细信息" + dangAnInfi.Web.Url = dangAnUrl + attrsAry = append(attrsAry, dangAnInfi) + isWriteUrl = false + // fmt.Printf("4写档案%v\n", v.Userid) + } + } + } + if dangAnIsShow { + dangAnIsShow = true + if errUser == nil { + wechatNum = userCont.Number + } + if wechatNum != "" { + dangAnUrl := fmt.Sprintf("http://hr.hxgk.group/#/?usernum=%v", wechatNum) + var dangAnInfi UpdateMyWechatURL + dangAnInfi.Name = "档案" + dangAnInfi.Type = 1 + dangAnInfi.Web.Title = "详细信息" + dangAnInfi.Web.Url = dangAnUrl + attrsAry = append(attrsAry, dangAnInfi) + isWriteUrl = false + // fmt.Printf("4写档案%v\n", v.Userid) + } + } + if len(attrsAry) > 0 { + extattr := overallhandle.MapOut() + extattr["attrs"] = attrsAry + updateWechatUserCont["extattr"] = extattr + peopleAry = append(peopleAry, updateWechatUserCont) + } + + err = UpdateWechatPeopel(systemApp, key, isAgain, updateWechatUserCont) + if err != nil { + overallhandle.WriteLog("e", "更新完毕!", err, updateWechatUserCont) + } else { + overallhandle.WriteLog("i", "更新完毕!", err, updateWechatUserCont) + } + } + } + } + // errdsd := UpdateWechatPeopelAry(systemApp, key, isAgain, peopleAry) + peopleJson, _ := json.Marshal(peopleAry) + // fmt.Printf("集体更新---->%v\n---->%v\n", string(peopleJson), errdsd) + overallhandle.WriteLog("e", "更新完毕!END", org, string(peopleJson)) +} + +/* +* +@ 作者: 秦东 +@ 时间: 2024-01-25 16:05:08 +@ 功能: 批量更新企业微信人员信息 +@ 参数 + + # + +@ 返回值 + + # + +@ 方法原型 + + # +*/ +func UpdateWechatPeopelAry(systemApp, key string, isAgain int, userInfo []interface{}) (err error) { + // if _, ok := userInfo["userid"]; !ok { + // err = errors.New("关键信息不全userid") + // return + // } + if len(userInfo) < 1 { + err = errors.New("关键信息不全userid") + return + } + token, err := GainWechatToken(systemApp, key, 1) + if err != nil { + return + } + userJson, err := json.Marshal(userInfo) + if err != nil { + overallhandle.WriteLog("e", "1、更新企业微信人员信息", err, userJson) + return + } + overallhandle.WriteLog("i", "更新企业微信人员信息", string(userJson)) + sendWechatUrl := fmt.Sprintf("https://qyapi.weixin.qq.com/cgi-bin/user/update?access_token=%v", token) + //获取企业微信取部门成员详情 + wechatCallBack := overallhandle.CurlPostJosn(sendWechatUrl, userJson) + var orgPeopleList RevokeMsgSendCallBack + err = json.Unmarshal(wechatCallBack, &orgPeopleList) + // fmt.Printf("成员详情--->%v\n", orgPeopleList) + if err != nil { + overallhandle.WriteLog("e", "2、更新企业微信人员信息", err, string(wechatCallBack)) + return + } + if orgPeopleList.Errcode != 0 { + err = errors.New(orgPeopleList.Errmsg) + overallhandle.WriteLog("e", "3、更新企业微信人员信息", orgPeopleList.Errcode, orgPeopleList.Errmsg) + return + } + return +} diff --git a/api/version1/workWechat/wechatApi.go b/api/version1/workWechat/wechatApi.go index c9454f4..aef1296 100644 --- a/api/version1/workWechat/wechatApi.go +++ b/api/version1/workWechat/wechatApi.go @@ -2,9 +2,11 @@ package workWechat import ( "encoding/json" + "encoding/xml" "errors" "fmt" "hr_server/grocerystore" + "hr_server/models" "hr_server/overall" "hr_server/overall/overallhandle" "net/http" @@ -12,6 +14,7 @@ import ( "reflect" "strconv" "strings" + "time" "github.com/gin-gonic/gin" ) @@ -130,8 +133,9 @@ func (a *ApiMethod) AuthenticationUser(c *gin.Context) { isAgainInt = 1 } token, err := GainWechatToken(systemApp, md5Token, isAgainInt) + fmt.Printf("验证数据--》%v\n%v\n", token, err) if err != nil { - overallhandle.Result(1, token, c, "身份认证失败") + overallhandle.Result(1, err, c, "身份认证失败") return } var additional []string @@ -144,7 +148,7 @@ func (a *ApiMethod) AuthenticationUser(c *gin.Context) { urlParameter := strings.Join(additional, "&") //重定向身份认证 - callBackUrl := url.QueryEscape(fmt.Sprintf("%v/kpiapi/wechat/callbackauthuser?%v", overall.CONSTANT_CONFIG.Appsetup.WebUrl, urlParameter)) + callBackUrl := url.QueryEscape(fmt.Sprintf("%v/hrapi/wechat/wechatCallBack?%v", overall.CONSTANT_CONFIG.Appsetup.WebUrl, urlParameter)) redirectUrl := fmt.Sprintf("https://open.weixin.qq.com/connect/oauth2/authorize?appid=%v&redirect_uri=%v&response_type=code&scope=snsapi_base&state=%v#wechat_redirect", overall.CONSTANT_CONFIG.WechatCompany.CompanyId, callBackUrl, token) // formUrl := c.Request.URL.Path // formUrls := c.Request.RequestURI @@ -194,7 +198,11 @@ func (a *ApiMethod) CallBackAuthUser(c *gin.Context) { isAgain = "1" } userNum := c.Query("usernum") - gainWechatInfo := fmt.Sprintf("https://qyapi.weixin.qq.com/cgi-bin/auth/getuserinfo?access_token=%v&code=%v", state, code) + md5Token := GainTokenKey(c) + isAgainInt, _ := strconv.Atoi(isAgain) + token, _ := GainWechatToken(systemApp, md5Token, isAgainInt) + gainWechatInfo := fmt.Sprintf("https://qyapi.weixin.qq.com/cgi-bin/auth/getuserinfo?access_token=%v&code=%v", token, code) + // gainWechatInfo := fmt.Sprintf("https://qyapi.weixin.qq.com/cgi-bin/auth/getuserinfo?access_token=%v&code=%v", state, code) wechatInfoByte := overallhandle.CurlGet(gainWechatInfo) var callBackWechatInfo WorkWechatUserAuter err := json.Unmarshal(wechatInfoByte, &callBackWechatInfo) @@ -208,7 +216,7 @@ func (a *ApiMethod) CallBackAuthUser(c *gin.Context) { AgainEmpower(c) return } - overallhandle.Result(1, callBackWechatInfo, c, "未能查询到您的信息!企业微信授权失败!3") + overallhandle.Result(12, callBackWechatInfo, c, "未能查询到您的信息!企业微信授权失败!3") return } var userWechatId string @@ -222,9 +230,9 @@ func (a *ApiMethod) CallBackAuthUser(c *gin.Context) { overallhandle.Result(1, err, c, "未能查询到您的信息!企业微信授权失败!") return } - wechatCont, err := SetUpWechatInfo(code) + wechatCont, err := SetUpWechatInfo(userWechatId) if err != nil { - overallhandle.Result(1, err, c) + overallhandle.Result(13, err, c) return } callBackLoginUrl := fmt.Sprintf("%v/#/?usernum=%v&openid=%v&userkey=%v&token=%v", overall.CONSTANT_CONFIG.Appsetup.WebUrl, userNum, wechatCont.UserInfo.Number, wechatCont.UserKey, wechatCont.Token) @@ -344,7 +352,400 @@ func AgainEmpower(c *gin.Context) { urlParameter := strings.Join(additional, "&") //重定向身份认证 - callBackUrl := url.QueryEscape(fmt.Sprintf("%v/kpiapi/wechat/callbackauthuser?%v", overall.CONSTANT_CONFIG.Appsetup.WebUrl, urlParameter)) + callBackUrl := url.QueryEscape(fmt.Sprintf("%v/hrapi/wechat/wechatCallBack?%v", overall.CONSTANT_CONFIG.Appsetup.WebUrl, urlParameter)) redirectUrl := fmt.Sprintf("https://open.weixin.qq.com/connect/oauth2/authorize?appid=%v&redirect_uri=%v&response_type=code&scope=snsapi_base&state=%v#wechat_redirect", overall.CONSTANT_CONFIG.WechatCompany.CompanyId, callBackUrl, token) c.Redirect(http.StatusMovedPermanently, redirectUrl) } + +/* +* +@ 作者: 秦东 +@ 时间: 2024-01-24 16:00:12 +@ 功能: 写职业生涯规划或个人期望从组织获得的帮助 +@ 参数 + + # + +@ 返回值 + + # + +@ 方法原型 + + # +*/ +func (a *ApiMethod) WriteMyPlanHelp(c *gin.Context) { + var requestData WriteInfo + err := c.ShouldBindJSON(&requestData) + if err != nil { + overallhandle.Result(100, err, c) + return + } + isNewAdd := false + var myInfo models.PersonnelContent + err = myInfo.GetCont(map[string]interface{}{"`number`": requestData.UserNumber}, "`number`", "`career_planning`", "`help_obtained`", "`hobby`") + if err != nil { + var myMastInfo models.PersonArchives + err = myMastInfo.GetCont(map[string]interface{}{"`number`": requestData.UserNumber}, `id`) + if err != nil { + overallhandle.Result(1, err, c, "人员信息错误!不可写入!") + return + } + isNewAdd = true + } + if isNewAdd { + myInfo.Number = requestData.UserNumber + if requestData.Class == 1 { + myInfo.CareerPlanning = requestData.Content + } else { + myInfo.CareerPlanning = requestData.Content + } + myInfo.Time = time.Now().Unix() + err = overall.CONSTANT_DB_HR.Create(&myInfo).Error + if err != nil { + overallhandle.Result(106, err, c) + return + } + } else { + editCont := overallhandle.MapOut() + editCont["time"] = time.Now().Unix() + if requestData.Class == 1 { + editCont["career_planning"] = requestData.Content + } else { + editCont["help_obtained"] = requestData.Content + } + err = myInfo.EiteCont(map[string]interface{}{"`number`": requestData.UserNumber}, editCont) + if err != nil { + overallhandle.Result(106, err, c) + return + } + } + overallhandle.Result(0, err, c) +} + +/* +* +@ 作者: 秦东 +@ 时间: 2024-01-25 08:13:07 +@ 功能: 企业微信接收消息回调 +@ 参数 + + # + +@ 返回值 + + # + +@ 方法原型 + + # +*/ +func (a *ApiMethod) WorkWechatCallBack(c *gin.Context) { + +} + +/* +* +@ 作者: 秦东 +@ 时间: 2024-01-25 14:45:06 +@ 功能: 获取企业微信部门列表 +@ 参数 + + # + +@ 返回值 + + # + +@ 方法原型 + + # +*/ +func (a *ApiMethod) GainWechatDepartmentList(c *gin.Context) { + var requestData GetWechatOrg + err := c.ShouldBindJSON(&requestData) + if err != nil { + overallhandle.Result(100, err, c) + return + } + md5Token := GainTokenKey(c) + orgList, err := GainWechatDepartment(int64(requestData.OrgId), requestData.SystemApp, md5Token, requestData.IsAgain) + if err != nil { + overallhandle.Result(1, err, c) + return + } + overallhandle.Result(0, orgList, c) +} + +/* +* +@ 作者: 秦东 +@ 时间: 2024-01-25 14:11:27 +@ 功能: 获取部门列表 +@ 参数 + + #org 行政组织 + #systemApp 系统 + #key 身份KEy + #isAgain 重新授权 1:否,2:是 + +@ 返回值 + + #departmentAry 部门列表 + #err 错误信息 + +@ 方法原型 + + #func GainWechatDepartment(org int64, systemApp, key string, isAgain int) (departmentAry []WechatDepartmentInfo, err error) +*/ + +// 获取token Key +func GainTokenKey(c *gin.Context) (md5Token string) { + host := c.Request.Header.Get("Host") + userAgent := c.Request.Header.Get("User-Agent") + wechatTokenStr := fmt.Sprintf("%v_%v", host, userAgent) + var md5JiaMi overallhandle.Md5Encryption + md5JiaMi.Md5EncryptionInit(wechatTokenStr) + md5Token = md5JiaMi.Md5EncryptionAlgorithm() + return +} + +/* +* +@ 作者: 秦东 +@ 时间: 2024-01-25 15:38:03 +@ 功能: 获取企业微信部门人员列表信息 +@ 参数 + + # + +@ 返回值 + + # + +@ 方法原型 + + # +*/ +func (a *ApiMethod) GainOrgPeopel(c *gin.Context) { + var requestData GetWechatOrg + err := c.ShouldBindJSON(&requestData) + if err != nil { + overallhandle.Result(100, err, c) + return + } + md5Token := GainTokenKey(c) + orgList, err := GainOrgPeopleInfo(int64(requestData.OrgId), requestData.SystemApp, md5Token, requestData.IsAgain) + if err != nil { + overallhandle.Result(1, err, c) + return + } + overallhandle.Result(0, orgList, c) +} + +/* +* +@ 作者: 秦东 +@ 时间: 2024-01-25 16:18:22 +@ 功能: 更新企业微信成员信息 +@ 参数 + + # + +@ 返回值 + + # + +@ 方法原型 + + # +*/ +func (a *ApiMethod) UpdateWechatUser(c *gin.Context) { + var requestData UpdateWechatUserInfo + err := c.ShouldBindJSON(&requestData) + if err != nil { + overallhandle.Result(100, err, c) + return + } + md5Token := GainTokenKey(c) + err = UpdateWechatPeopel(requestData.SystemApp, md5Token, requestData.IsAgain, requestData.Info) + if err != nil { + overallhandle.Result(1, err, c) + return + } + overallhandle.Result(0, err, c) +} + +/* +* +@ 作者: 秦东 +@ 时间: 2024-01-26 08:20:59 +@ 功能: 企业微信应用回调响应数据处理 +@ 参数 + + # + +@ 返回值 + + # + +@ 方法原型 + + # +*/ +func (a *ApiMethod) WechatCallBackResponse(c *gin.Context) { + MsgSignature := c.Query("msg_signature") //企业微信加密签名,msg_signature计算结合了企业填写的token、请求中的timestamp、nonce、加密的消息体。 + Timestamp := c.Query("timestamp") //时间戳。与nonce结合使用,用于防止请求重放攻击。 + Nonce := c.Query("nonce") //随机数。与timestamp结合使用,用于防止请求重放攻击。 + Echostr := c.Query("echostr") //加密的字符串。需要解密得到消息内容明文,解密后有random、msg_len、msg、receiveid四个字段,其中msg即为消息内容明文 + EchostrType := c.Query("type") + SystemApp := c.Query("systemapp") + + if EchostrType == "" { + EchostrType = "json" + } + if SystemApp == "" { + SystemApp = "kpi" + } + var basicValueCallback CallBackData //企业微信回调基础参数 + basicValueCallback.MsgSignature = MsgSignature + basicValueCallback.Timestamp = Timestamp + basicValueCallback.Nonce = Nonce + basicValueCallback.DataType = EchostrType + basicValueCallback.SystemApp = SystemApp + var msgStr string + if Echostr != "" { + //Api地址验证 + basicValueCallback.Echostr = Echostr + msgStr = basicValueCallback.VerificationUrl() + c.String(200, msgStr) + } else { + //回调事件 + var callBackXmlMsg XmlMsgCont + xmlErr := c.ShouldBindXML(&callBackXmlMsg) + if xmlErr != nil { + fmt.Printf("回调事件失败!%v\n", xmlErr) + overallhandle.WriteLog("e", "回调事件失败!xmlErr", xmlErr) + return + } + var jieMiCont DecryptMsgCont + jieMiCont.MsgSignature = MsgSignature + jieMiCont.Timestamp = Timestamp + jieMiCont.Nonce = Nonce + jieMiCont.ToUsername = callBackXmlMsg.ToUsername + jieMiCont.Agentid = callBackXmlMsg.Agentid + jieMiCont.Encrypt = callBackXmlMsg.Encrypt + decryptMsgCont, jsonErr := jieMiCont.DecryptMsgInfo() + if jsonErr != nil { + fmt.Printf("回调事件失败!%v\n", jsonErr) + overallhandle.WriteLog("e", "回调事件失败!jsonErr", jsonErr) + return + } + var msgCont MsgContentXml + errXml := xml.Unmarshal(decryptMsgCont, &msgCont) + if errXml != nil { + fmt.Printf("回调事件失败!%v\n", errXml) + overallhandle.WriteLog("e", "回调事件失败!errXml", errXml) + return + } + switch msgCont.MsgType { + case "text": //文本 + case "image": //图片 + case "voice": //语音 + case "video": //视频 + case "location": //位置 + GeographicalPosition(decryptMsgCont) + case "link": //链接 + case "event": //事件格式类型 + EventProcessing(decryptMsgCont, jieMiCont, c) + default: + overallhandle.WriteLog("t", "未知回调事件!", msgCont) + } + } +} + +/* +* +@ 作者: 秦东 +@ 时间: 2024-01-26 09:34:19 +@ 功能: 事件处理 +@ 参数 + + #msg 解密后的数据 + #jieMiCont 接收数据结构体 + #c gin全局结构体 + +@ 返回值 + + # + +@ 方法原型 + + # +*/ +func EventProcessing(msg []byte, jieMiCont DecryptMsgCont, c *gin.Context) { + //通用类型判断是回调的什么事件 + var commonType CurrencyMessage + xml.Unmarshal(msg, &commonType) + switch commonType.Event { + case "subscribe": //关注 + case "unsubscribe": //取消关注 + case "enter_agent": //本事件在成员进入企业微信的应用时触发 + case "LOCATION": //上报地理位置 + GeographicalPosition(msg) + case "batch_job_result": //异步任务完成事件推送 + case "change_contact": //通讯录变更事件 + // WorkWechatMailList(msgContent.ChangeType, decryptMsg) + case "click": //点击菜单拉取消息的事件推送 + case "view": //点击菜单跳转链接的事件推送 + case "scancode_push": //扫码推事件的事件推送 + case "scancode_waitmsg": //扫码推事件且弹出“消息接收中”提示框的事件推送 + case "pic_sysphoto": //弹出系统拍照发图的事件推送 + case "pic_photo_or_album": //弹出拍照或者相册发图的事件推送 + case "pic_weixin": //弹出微信相册发图器的事件推送 + case "location_select": //弹出地理位置选择器的事件推送 + case "open_approval_change": //审批状态通知事件 自建应用 + // OpenApprovalChange(decryptMsg) + case "sys_approval_change": //系统审批应用 + case "share_agent_change": //企业互联共享应用事件回调 + case "share_chain_change": //上下游共享应用事件回调 + case "template_card_event": //模板卡片事件推送 + // TemplateEvent(msg, jieMiCont, c) + case "template_card_menu_event": //通用模板卡片右上角菜单事件推送 + default: + } + overallhandle.WriteLog("t", "事件回调内容", commonType) +} + +/* +* +@ 作者: 秦东 +@ 时间: 2024-01-26 11:40:12 +@ 功能: 通过Api更新企业微信人员数据 +@ 参数 + + # + +@ 返回值 + + # + +@ 方法原型 + + # +*/ +func (a *ApiMethod) WechatPeopelInfoUpdate(c *gin.Context) { + var requestData overallhandle.PublicId[int64] + err := c.ShouldBindJSON(&requestData) + if err != nil { + overallhandle.Result(100, err, c) + return + } + md5Token := GainTokenKey(c) + err = UpdateWechatOrgPeople(requestData.Id, "txl", md5Token, 1) + if err != nil { + overallhandle.Result(1, err, c) + return + } + overallhandle.Result(0, err, c) +} diff --git a/apirouter/personnel/people.go b/apirouter/personnel/people.go index b304a15..c1633be 100644 --- a/apirouter/personnel/people.go +++ b/apirouter/personnel/people.go @@ -17,9 +17,11 @@ func (p *PersonnelRoute) InitRouterGroup(route *gin.RouterGroup) { apiRouter.POST("addstaff", apiHandle.AddStaff) //添加人员档案 apiRouter.POST("allocationofrights", apiHandle.AllocationOfRights) //分配权限 // apiRouter.POST("archiveslist", apiHandle.ArchivesList) //人员列表(新) - apiRouter.POST("archiveslist", apiHandle.ArchivesListWai) //人员列表(新) - apiRouter.POST("archiveslistcont", apiHandle.ArchivesListCont) //人员档案列表(平台用) - apiRouter.POST("archivescont", apiHandle.ArchivesCon) //个人档案 + apiRouter.POST("archiveslist", apiHandle.ArchivesListWai) //人员列表(新) + apiRouter.POST("archiveslistcont", apiHandle.ArchivesListCont) //人员档案列表(平台用) + apiRouter.POST("archivescont", apiHandle.ArchivesCon) //个人档案 + apiRouter.POST("personnelFiles", apiHandle.PersonnelFiles) //根据工号获取个人档案 + apiRouter.POST("kingdeehr", apiHandle.NewKingdee) //对接金蝶HR系统 apiRouter.POST("editpassword", apiHandle.EditPassWord) //修改密码 apiRouter.POST("wechat_give_uscont", apiHandle.WeChatGiveUsCont) //根据微信OpenId获取个人档案 @@ -80,6 +82,8 @@ func (p *PersonnelRoute) InitRouterGroup(route *gin.RouterGroup) { apiRouter.POST("getorgtimerate", apiHandle.GetOrgTimeRate) //获取公司指定年月的离职率 apiRouter.POST("get_edu_stru", apiHandle.GetEducationalStructure) //获取学历结构 + apiRouter.POST("uploadUserFiles", apiHandle.UploadUserFiles) //解析上传的人员信息表格 + } } diff --git a/apirouter/workWechatRouter/router.go b/apirouter/workWechatRouter/router.go index 4ab6063..0beaa08 100644 --- a/apirouter/workWechatRouter/router.go +++ b/apirouter/workWechatRouter/router.go @@ -12,11 +12,19 @@ func (a *ApiRouter) RouterGroupPc(router *gin.RouterGroup) { var methodBinding = version1.AppApiInlet.WechatApi { - apiRouter.GET("", methodBinding.Index) //入口 - apiRouter.POST("", methodBinding.Index) //入口 - apiRouter.POST("gainWechatToken", methodBinding.GainWechatToken) //获取Token、 - apiRouter.POST("wechatJsapiTicket", methodBinding.WechatJsapiTicket) //获取企业的jsapi_ticket 或 获取应用的jsapi_ticket - apiRouter.GET("authuser", methodBinding.AuthenticationUser) //获取身份认证 - apiRouter.GET("wechatCallBack", methodBinding.CallBackAuthUser) //获取身份认证 + apiRouter.GET("", methodBinding.Index) //入口 + apiRouter.POST("", methodBinding.Index) //入口 + apiRouter.POST("gainWechatToken", methodBinding.GainWechatToken) //获取Token、 + apiRouter.POST("wechatJsapiTicket", methodBinding.WechatJsapiTicket) //获取企业的jsapi_ticket 或 获取应用的jsapi_ticket + apiRouter.GET("authuser", methodBinding.AuthenticationUser) //获取身份认证 + apiRouter.GET("wechatCallBack", methodBinding.CallBackAuthUser) //获取身份认证 + apiRouter.POST("writeMyPlanHelp", methodBinding.WriteMyPlanHelp) //写职业生涯规划或个人期望从组织获得的帮助 + apiRouter.POST("workWechatCallBack", methodBinding.WorkWechatCallBack) //企业微信接收消息回调 + apiRouter.POST("gainWechatDepartmentList", methodBinding.GainWechatDepartmentList) //获取企业微信部门列表 + apiRouter.POST("gainOrgPeopel", methodBinding.GainOrgPeopel) //获取企业微信部门人员列表信息 + apiRouter.POST("updateWechatUser", methodBinding.UpdateWechatUser) //更新企业微信成员信息 + apiRouter.POST("wechatCallBackResponse", methodBinding.WechatCallBackResponse) //企业微信应用回调响应数据处理 + apiRouter.GET("wechatCallBackResponse", methodBinding.WechatCallBackResponse) //企业微信应用回调响应数据处理 + apiRouter.POST("wechatPeopelInfoUpdate", methodBinding.WechatPeopelInfoUpdate) //通过Api更新企业微信人员数据 } } diff --git a/config/configApp/appConfig.yaml b/config/configApp/appConfig.yaml index 4810dd4..afcdf30 100644 --- a/config/configApp/appConfig.yaml +++ b/config/configApp/appConfig.yaml @@ -37,4 +37,16 @@ wechatkpi: agentid: 1000036 secret: 'J83SKVK9QCdQs_fTjPWUx3ouqucrHf_EwxtQUlY0fQk' token: 'kkUA3s2s3' #Token - encodingaeskey: 'ZI29of85mTgQPik8LLjDnYKlAECDbI23Pq886VJ9Azf' #EncodingAESKey \ No newline at end of file + encodingaeskey: 'ZI29of85mTgQPik8LLjDnYKlAECDbI23Pq886VJ9Azf' #EncodingAESKey +#个人资料 +employeefile: + agentid: 1000083 + secret: 'IPetRDqicfUGKCEoM4wnPMCB7gzBSmkXJdvjOxoiovQ' + token: 'kkUA3s2s3' #Token + encodingaeskey: 'ZI29of85mTgQPik8LLjDnYKlAECDbI23Pq886VJ9Azf' +#通讯录 +addressbook: + agentid: 0 + secret: 'yjcQXkh6_116QKjfZfbRSyzdrFFZ9jbVlKJtL2tn3OU' + token: 'kkUA3s2s3' #Token + encodingaeskey: 'ZI29of85mTgQPik8LLjDnYKlAECDbI23Pq886VJ9Azf' \ No newline at end of file diff --git a/config/configApp/server.go b/config/configApp/server.go index 60d50e8..ce14593 100644 --- a/config/configApp/server.go +++ b/config/configApp/server.go @@ -9,6 +9,8 @@ type Server struct { WechatCompany wechatCompany `mapstructure:"wechatcompany" json:"wechatcompany" yaml:"wechatcompany"` //企业ID WechatSchool wechatConfig `mapstructure:"wechatschool" json:"wechatschool" yaml:"wechatschool"` //知行学院 WechatKpi wechatConfig `mapstructure:"wechatkpi" json:"wechatkpi" yaml:"wechatkpi"` //绩效考核 + EmployeeFile wechatConfig `mapstructure:"employeefile" json:"employeefile" yaml:"employeefile"` //个人资料 + AddressBook wechatConfig `mapstructure:"addressbook" json:"addressbook" yaml:"addressbook"` //通讯录 } //服务配置详情 diff --git a/config/configDatabase/database.go b/config/configDatabase/database.go index 2e5f0a3..4434cec 100644 --- a/config/configDatabase/database.go +++ b/config/configDatabase/database.go @@ -12,9 +12,10 @@ import ( type MysqlSetUp struct { MasterMysql MasterMysqlSetUp `mapstructure:"master" json:"master" yaml:"master"` //主数据库 //其他数据库依次添加 - WechatMysql MasterMysqlSetUp `mapstructure:"wechat" json:"wechat" yaml:"wechat"` //微信数据库 - HrMysql MasterMysqlSetUp `mapstructure:"hrdatabase" json:"hrdatabase" yaml:"hrdatabase"` //HR数据库 - HrMysqlJin MasterMysqlSetUp `mapstructure:"hrdatabasejin" json:"hrdatabasejin" yaml:"hrdatabasejin"` //HR数据库 + WechatMysql MasterMysqlSetUp `mapstructure:"wechat" json:"wechat" yaml:"wechat"` //微信数据库 + HrMysql MasterMysqlSetUp `mapstructure:"hrdatabase" json:"hrdatabase" yaml:"hrdatabase"` //HR数据库 + HrMysqlJin MasterMysqlSetUp `mapstructure:"hrdatabasejin" json:"hrdatabasejin" yaml:"hrdatabasejin"` //HR数据库 + PersonalityColor MasterMysqlSetUp `mapstructure:"charactercolor" json:"charactercolor" yaml:"charactercolor"` //HR数据库 } type MasterMysqlSetUp struct { diff --git a/config/configDatabase/database.yaml b/config/configDatabase/database.yaml index 5e72645..f7dff19 100644 --- a/config/configDatabase/database.yaml +++ b/config/configDatabase/database.yaml @@ -63,4 +63,17 @@ hrdatabasejin: name: 'human_resources' #数据库名称 max_idle_conns: 100 #最大空闲数量 max_open_conns: 1500 #最大打开数量 - gorm_log: true #是否开启gorm日志 \ No newline at end of file + gorm_log: true #是否开启gorm日志 +#性格色彩 +charactercolor: + url_path: '172.20.5.33' #数据库地址 + port: 4000 #数据库端口 + charset: 'utf8mb4' #数据库编码方式 + parseTime: 'True' #是否自动转换时间 + loc: 'Local' #时区 + name: 'charactercolor' #数据库名称 + username: 'root' #数据库用户民 + password: '9z_Bu28r1*DZ3K6@+a' #数据库密码 + max_idle_conns: 100 #最大空闲数量 + max_open_conns: 1500 #最大打开数量 + gorm_log: false #是否开启gorm日志 \ No newline at end of file diff --git a/devlog.md b/devlog.md new file mode 100644 index 0000000..2e4b6a7 --- /dev/null +++ b/devlog.md @@ -0,0 +1,161 @@ +# 开发日志 + +## 2024-01-29 + +### 数据库操作 + +#### 1、person_archives 人员主表 + +增加表字段 + +``` +ALTER TABLE `person_archives` ADD `work_section` bigint unsigned DEFAULT '0' COMMENT '工段'; +``` + +#### 2、personnel_content 人员副表 + +增加表字段 + +``` +ALTER TABLE `personnel_content` ADD `domicile_type` varchar(100) COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '户籍类型'; +ALTER TABLE `personnel_content` ADD `idCardnoLongTerm` int unsigned NOT NULL DEFAULT '2' COMMENT '身份证是否长期有效(1:是;2:否)'; +ALTER TABLE `person_archives` ADD `mobileShortNumber` varchar(50) COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '手机小号'; +ALTER TABLE `person_archives` ADD `channel` int unsigned NOT NULL DEFAULT '1' COMMENT '入职渠道(1:社会招聘;2:校园招聘;3:内部推荐)'; +ALTER TABLE `person_archives` ADD `bloodType` varchar(10) COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '血型'; +``` + +#### 3、personnel_education 教育经历 + +增加字段 + +``` +ALTER TABLE `personnel_education` ADD `education_type` int unsigned NOT NULL DEFAULT '1' COMMENT '学历类型(1、全日制统招学历;2、成人高考学历;3、自学考试学历;4:开放大学学历;5:网络教育学历)'; +ALTER TABLE `personnel_education` ADD `collegeFaction` varchar(255) COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '所属院系'; +ALTER TABLE `personnel_education` ADD `schoolType` int unsigned NOT NULL DEFAULT '0' COMMENT '院校类型(1、私立中学;2:公立中学;3:高职院校;4:民办专科院校;5:公办专科院校;6:民办本科院校;7:公办本科院校;8:”211“工程院校;9:”985“工程院校;10:双一流院校)' +``` + +#### 4、family_members 员工家属 + +增加字段 + +``` +ALTER TABLE `family_members` ADD `workUnitPost` varchar(255) COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '工作单位及职务'; +ALTER TABLE `family_members` ADD `isSos` int unsigned NOT NULL DEFAULT '2' COMMENT '是否为紧急联系人(1、是;2:否)'; +``` + +#### 5、double_worker 双职工 + +添加字段 + +``` +ALTER TABLE `double_worker` ADD `workUnit` varchar(100) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '工段'; +ALTER TABLE `double_worker` ADD `workPosit` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '职位'; +ALTER TABLE `double_worker` ADD `levele` varchar(30) COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '职等'; +``` + +#### 6、inside_work_history 集团内部工作经历 + +添加字段 + +``` +ALTER TABLE `inside_work_history` ADD `changeType` int unsigned NOT NULL DEFAULT '1' COMMENT '变动类型(1、新入职;2:平调;3:降职;4:升职)'; +ALTER TABLE `inside_work_history` ADD `changeReason` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '变动原因'; +ALTER TABLE `inside_work_history` ADD `superiorPosition` varchar(255) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '上级职位'; +ALTER TABLE `inside_work_history` ADD `superiorName` varchar(50) COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '上级名称'; +ALTER TABLE `inside_work_history` ADD `subordinates` int unsigned NOT NULL DEFAULT '0' COMMENT '下属人数'; +``` + +#### 7、work_history 工作履历 + +添加字段 + +``` +ALTER TABLE `work_history` ADD `companyNature` varchar(255) COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '公司性质'; +ALTER TABLE `work_history` ADD `industry` varchar(255) COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '所属行业'; +``` + +#### 8、meritslog 绩效 + +添加字段 + +``` +ALTER TABLE `work_history` ADD `level` varchar(255) COLLATE utf8mb4_bin DEFAULT '' COMMENT '考核等级'; +``` + +#### 9、rewards_penalties 奖惩 + +添加字段 + +``` +ALTER TABLE rewards_penalties ADD level int unsigned NOT NULL DEFAULT '1' COMMENT '奖惩级别(1:部门级;2:公司级;3:县级;4:市级;5:省级;6:国家级)'; +ALTER TABLE rewards_penalties ADD rewPunClass int unsigned NOT NULL DEFAULT '1' COMMENT '奖惩类型(1:年终评优;2:表扬;3:嘉奖;4:记功;5:记大功;6:特别奖励;7:批评;8:警告;9:记过;10:记大过;11:降级;12:留用察看;13:开除)'; +``` + +#### 10、political_identity 政治属性 + +添加表 + +``` +CREATE TABLE `political_identity` ( + `userkey` bigint unsigned NOT NULL DEFAULT '0' COMMENT '员工唯一识别符', + `political_outlook` int unsigned NOT NULL DEFAULT '1' COMMENT '政治面貌(1:群众;2:无党派;3:台盟会员;4:九三社员;5:致公党员;6:农工党员;7:民进会员;8:民建会员;9:民盟盟员;10:民革会员,11:共青团员;12:预备党员;13:中共党员)', + `joinTime` bigint NOT NULL DEFAULT '0' COMMENT '加入时间', + `branch` varchar(255) COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '所在党支部', + `position` varchar(100) COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '党内职务', + `joiningParty` varchar(255) COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '入党时所在单位', + `switchToClass` int unsigned NOT NULL DEFAULT '2' COMMENT '组织关系是否转入(1:是;2:否)', + `switchToTime` bigint NOT NULL DEFAULT '0' COMMENT '组织关系转入时间', + `time` bigint unsigned NOT NULL DEFAULT '0', + PRIMARY KEY (`userkey`), + UNIQUE KEY `userkey` (`userkey`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='政治属性'; +``` + +#### 11、veterans 退役军人信息 + +添加表 + +``` +CREATE TABLE `veterans` ( + `userkey` bigint unsigned NOT NULL DEFAULT '0', + `isRetire` int unsigned NOT NULL DEFAULT '2' COMMENT '是否为退役军人(1:是;2:否)', + `retireNumber` varchar(255) COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '退役证编号', + `joinTime` bigint NOT NULL DEFAULT '0' COMMENT '入伍时间', + `retireTime` bigint NOT NULL DEFAULT '0' COMMENT '退伍时间', + `armyUnits` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '参军单位', + `typesOfSoldiers` varchar(255) COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '兵种', + `time` bigint unsigned NOT NULL DEFAULT '0', + PRIMARY KEY (`userkey`), + UNIQUE KEY `userkey` (`userkey`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='老兵信息'; +``` + +#### 12、academictitle 职称 + +添加表 + +``` +CREATE TABLE `academictitle` ( + `id` bigint unsigned NOT NULL, + `types` varchar(255) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '职称级别', + `series` varchar(255) COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '职称系列', + `speciality` varchar(255) COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '职称专业', + `number` varchar(255) COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '资格证书编号', + `time` bigint unsigned NOT NULL DEFAULT '0' COMMENT '生效时间', + `editTime` bigint unsigned NOT NULL DEFAULT '0', + `userKey` bigint unsigned NOT NULL DEFAULT '0' COMMENT '人员唯一识别符', + PRIMARY KEY (`id`), + UNIQUE KEY `id` (`id`), + KEY `userKey` (`userKey`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='职称'; +``` + +#### 13、certificate_honors 证书 + +添加字段 + +``` +ALTER TABLE rewards_penalties ADD number varchar(255) COLLATE utf8mb4_bin DEFAULT '' COMMENT '证书编号''; +ALTER TABLE rewards_penalties ADD endTime int unsigned NOT NULL DEFAULT '1' COMMENT '奖惩级别(1:部门级;2:公司级;3:县级;4:市级;5:省级;6:国家级)'; +ALTER TABLE rewards_penalties ADD validPeriod int unsigned NOT NULL DEFAULT '1' COMMENT '奖惩级别(1:部门级;2:公司级;3:县级;4:市级;5:省级;6:国家级)'; +``` diff --git a/go.mod b/go.mod index e12a998..976fa9a 100644 --- a/go.mod +++ b/go.mod @@ -3,6 +3,7 @@ module hr_server go 1.18 require ( + github.com/360EntSecGroup-Skylar/excelize v1.4.1 github.com/fsnotify/fsnotify v1.5.1 github.com/gin-gonic/gin v1.7.7 github.com/go-redis/redis/v8 v8.11.5 @@ -32,6 +33,7 @@ require ( github.com/mattn/go-isatty v0.0.14 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect + github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 // indirect github.com/onsi/gomega v1.19.0 // indirect github.com/pelletier/go-toml v1.9.4 // indirect github.com/spf13/afero v1.6.0 // indirect @@ -40,10 +42,16 @@ require ( github.com/spf13/pflag v1.0.5 // indirect github.com/subosito/gotenv v1.2.0 // indirect github.com/ugorji/go/codec v1.2.7 // indirect - golang.org/x/crypto v0.0.0-20220331220935-ae2d96664a29 // indirect - golang.org/x/sys v0.0.0-20220405210540-1e041c57c461 // indirect - golang.org/x/text v0.3.7 // indirect + golang.org/x/crypto v0.12.0 // indirect + golang.org/x/net v0.14.0 // indirect + golang.org/x/sys v0.11.0 // indirect + golang.org/x/text v0.12.0 // indirect google.golang.org/protobuf v1.28.0 // indirect gopkg.in/ini.v1 v1.66.2 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect ) + +replace ( + github.com/360EntSecGroup-Skylar/excelize/v2 => github.com/xuri/excelize/v2 v2.6.0 + github.com/xuri/excelize/v2 => github.com/360EntSecGroup-Skylar/excelize/v2 v2.6.0 +) diff --git a/go.sum b/go.sum index 3c9a643..ab008e4 100644 --- a/go.sum +++ b/go.sum @@ -1,3 +1,5 @@ +github.com/360EntSecGroup-Skylar/excelize v1.4.1 h1:l55mJb6rkkaUzOpSsgEeKYtS6/0gHwBYyfo5Jcjv/Ks= +github.com/360EntSecGroup-Skylar/excelize v1.4.1/go.mod h1:vnax29X2usfl7HHkBrX5EvSCJcmH3dT9luvxzu8iGAE= github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= @@ -68,6 +70,8 @@ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJ github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 h1:RWengNIwukTxcDr9M+97sNutRR1RKhG96O6jWumTTnw= +github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8= github.com/mozillazg/go-pinyin v0.19.0 h1:p+J8/kjJ558KPvVGYLvqBhxf8jbZA2exSLCs2uUVN8c= github.com/mozillazg/go-pinyin v0.19.0/go.mod h1:iR4EnMMRXkfpFVV5FMi4FNB6wGq9NV6uDWbUuPhP4Yc= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= @@ -98,6 +102,7 @@ github.com/spf13/viper v1.10.1 h1:nuJZuYpG7gTj/XqiUwg8bA0cp1+M2mC3J4g5luUYBKk= github.com/spf13/viper v1.10.1/go.mod h1:IGlFPqhNAPKRxohIzWpI5QEy4kuI7tcl5WvR+8qy1rU= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.2.3-0.20181224173747-660f15d67dbb/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= @@ -114,11 +119,12 @@ golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACk golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220331220935-ae2d96664a29 h1:tkVvjkPTB7pnW3jnid7kNyAMPVWllTNOf/qKDze4p9o= -golang.org/x/crypto v0.0.0-20220331220935-ae2d96664a29/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.12.0 h1:tFM/ta59kqch6LlvYnPa0yx5a83cL2nHflFhYKvv9Yk= +golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220225172249-27dd8689420f h1:oA4XRj0qtSt8Yo1Zms0CUlsT3KG69V2UGQWPBxujDmc= +golang.org/x/net v0.14.0 h1:BONx9s002vGdD9umnlX1Po8vOZmrgH34qlHcD1MfK14= +golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -127,15 +133,16 @@ golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220405210540-1e041c57c461 h1:kHVeDEnfKn3T238CvrUcz6KeEsFHVaKh4kMTt6Wsysg= -golang.org/x/sys v0.0.0-20220405210540-1e041c57c461/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM= +golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.12.0 h1:k+n5B8goJNdU7hSvEtMUz3d1Q6D/XW4COJSJR6fN0mc= +golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= diff --git a/hr_server.exe b/hr_server.exe index a69ce32..fdd24e7 100644 Binary files a/hr_server.exe and b/hr_server.exe differ diff --git a/initialization/databaseinit/mysql.go b/initialization/databaseinit/mysql.go index f7c0017..22a371c 100644 --- a/initialization/databaseinit/mysql.go +++ b/initialization/databaseinit/mysql.go @@ -32,9 +32,16 @@ func LoadDatabase() { } //开启Hr数据库 overall.CONSTANT_DB_HR_Jin = sqlConfig.HrMysqlJin.OpenSql() - if overall.CONSTANT_DB_HR == nil { + if overall.CONSTANT_DB_HR_Jin == nil { fmt.Printf("%v数据库开启失败!\n", sqlConfig.HrMysqlJin.Name) } else { fmt.Printf("%v数据库开启成功!\n", sqlConfig.HrMysqlJin.Name) } + //开启Hr数据库 + overall.CONSTANT_Personality_Color = sqlConfig.PersonalityColor.OpenSql() + if overall.CONSTANT_Personality_Color == nil { + fmt.Printf("%v数据库开启失败!\n", sqlConfig.PersonalityColor.Name) + } else { + fmt.Printf("%v数据库开启成功!\n", sqlConfig.PersonalityColor.Name) + } } diff --git a/middleware/wxbizjsonmsgcrypt/wxbizjsonmsgcrypt.go b/middleware/wxbizjsonmsgcrypt/wxbizjsonmsgcrypt.go new file mode 100644 index 0000000..1cddd5d --- /dev/null +++ b/middleware/wxbizjsonmsgcrypt/wxbizjsonmsgcrypt.go @@ -0,0 +1,310 @@ +package wxbizjsonmsgcrypt + +import ( + "bytes" + "crypto/aes" + "crypto/cipher" + "crypto/sha1" + "encoding/base64" + "encoding/binary" + "encoding/json" + "fmt" + "math/rand" + "sort" + "strings" +) + +const letterBytes = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" + +const ( + ValidateSignatureError int = -40001 + ParseJsonError int = -40002 + ComputeSignatureError int = -40003 + IllegalAesKey int = -40004 + ValidateCorpidError int = -40005 + EncryptAESError int = -40006 + DecryptAESError int = -40007 + IllegalBuffer int = -40008 + EncodeBase64Error int = -40009 + DecodeBase64Error int = -40010 + GenJsonError int = -40011 + IllegalProtocolType int = -40012 +) + +type ProtocolType int + +const ( + JsonType ProtocolType = 1 +) + +type CryptError struct { + ErrCode int + ErrMsg string +} + +func NewCryptError(err_code int, err_msg string) *CryptError { + return &CryptError{ErrCode: err_code, ErrMsg: err_msg} +} + +type WXBizJsonMsg4Recv struct { + Tousername string `json:"tousername"` + Encrypt string `json:"encrypt"` + Agentid string `json:"agentid"` +} + +type WXBizJsonMsg4Send struct { + Encrypt string `json:"encrypt"` + Signature string `json:"msgsignature"` + Timestamp string `json:"timestamp"` + Nonce string `json:"nonce"` +} + +func NewWXBizJsonMsg4Send(encrypt, signature, timestamp, nonce string) *WXBizJsonMsg4Send { + return &WXBizJsonMsg4Send{Encrypt: encrypt, Signature: signature, Timestamp: timestamp, Nonce: nonce} +} + +type ProtocolProcessor interface { + parse(src_data []byte) (*WXBizJsonMsg4Recv, *CryptError) + serialize(msg_send *WXBizJsonMsg4Send) ([]byte, *CryptError) +} + +type WXBizMsgCrypt struct { + token string + encoding_aeskey string + receiver_id string + protocol_processor ProtocolProcessor +} + +type JsonProcessor struct { +} + +func (self *JsonProcessor) parse(src_data []byte) (*WXBizJsonMsg4Recv, *CryptError) { + var msg4_recv WXBizJsonMsg4Recv + err := json.Unmarshal(src_data, &msg4_recv) + if nil != err { + fmt.Println("Unmarshal fail", err) + return nil, NewCryptError(ParseJsonError, "json to msg fail") + } + return &msg4_recv, nil +} + +func (self *JsonProcessor) serialize(msg4_send *WXBizJsonMsg4Send) ([]byte, *CryptError) { + json_msg, err := json.Marshal(msg4_send) + if nil != err { + return nil, NewCryptError(GenJsonError, err.Error()) + } + + return json_msg, nil +} + +func NewWXBizMsgCrypt(token, encoding_aeskey, receiver_id string, protocol_type ProtocolType) *WXBizMsgCrypt { + var protocol_processor ProtocolProcessor + if protocol_type != JsonType { + panic("unsupport protocal") + } else { + protocol_processor = new(JsonProcessor) + } + + return &WXBizMsgCrypt{token: token, encoding_aeskey: (encoding_aeskey + "="), receiver_id: receiver_id, protocol_processor: protocol_processor} +} + +func (self *WXBizMsgCrypt) randString(n int) string { + b := make([]byte, n) + for i := range b { + b[i] = letterBytes[rand.Int63()%int64(len(letterBytes))] + } + return string(b) +} + +func (self *WXBizMsgCrypt) pKCS7Padding(plaintext string, block_size int) []byte { + padding := block_size - (len(plaintext) % block_size) + padtext := bytes.Repeat([]byte{byte(padding)}, padding) + var buffer bytes.Buffer + buffer.WriteString(plaintext) + buffer.Write(padtext) + return buffer.Bytes() +} + +func (self *WXBizMsgCrypt) pKCS7Unpadding(plaintext []byte, block_size int) ([]byte, *CryptError) { + plaintext_len := len(plaintext) + if nil == plaintext || plaintext_len == 0 { + return nil, NewCryptError(DecryptAESError, "pKCS7Unpadding error nil or zero") + } + if plaintext_len%block_size != 0 { + return nil, NewCryptError(DecryptAESError, "pKCS7Unpadding text not a multiple of the block size") + } + padding_len := int(plaintext[plaintext_len-1]) + return plaintext[:plaintext_len-padding_len], nil +} + +func (self *WXBizMsgCrypt) cbcEncrypter(plaintext string) ([]byte, *CryptError) { + aeskey, err := base64.StdEncoding.DecodeString(self.encoding_aeskey) + if nil != err { + return nil, NewCryptError(DecodeBase64Error, err.Error()) + } + const block_size = 32 + pad_msg := self.pKCS7Padding(plaintext, block_size) + + block, err := aes.NewCipher(aeskey) + if err != nil { + return nil, NewCryptError(EncryptAESError, err.Error()) + } + + ciphertext := make([]byte, len(pad_msg)) + iv := aeskey[:aes.BlockSize] + + mode := cipher.NewCBCEncrypter(block, iv) + + mode.CryptBlocks(ciphertext, pad_msg) + base64_msg := make([]byte, base64.StdEncoding.EncodedLen(len(ciphertext))) + base64.StdEncoding.Encode(base64_msg, ciphertext) + + return base64_msg, nil +} + +func (self *WXBizMsgCrypt) cbcDecrypter(base64_encrypt_msg string) ([]byte, *CryptError) { + aeskey, err := base64.StdEncoding.DecodeString(self.encoding_aeskey) + if nil != err { + return nil, NewCryptError(DecodeBase64Error, err.Error()) + } + + encrypt_msg, err := base64.StdEncoding.DecodeString(base64_encrypt_msg) + if nil != err { + return nil, NewCryptError(DecodeBase64Error, err.Error()) + } + + block, err := aes.NewCipher(aeskey) + if err != nil { + return nil, NewCryptError(DecryptAESError, err.Error()) + } + + if len(encrypt_msg) < aes.BlockSize { + return nil, NewCryptError(DecryptAESError, "encrypt_msg size is not valid") + } + + iv := aeskey[:aes.BlockSize] + + if len(encrypt_msg)%aes.BlockSize != 0 { + return nil, NewCryptError(DecryptAESError, "encrypt_msg not a multiple of the block size") + } + + mode := cipher.NewCBCDecrypter(block, iv) + + mode.CryptBlocks(encrypt_msg, encrypt_msg) + + return encrypt_msg, nil +} + +func (self *WXBizMsgCrypt) calSignature(timestamp, nonce, data string) string { + sort_arr := []string{self.token, timestamp, nonce, data} + sort.Strings(sort_arr) + var buffer bytes.Buffer + for _, value := range sort_arr { + buffer.WriteString(value) + } + + sha := sha1.New() + sha.Write(buffer.Bytes()) + signature := fmt.Sprintf("%x", sha.Sum(nil)) + return string(signature) +} + +func (self *WXBizMsgCrypt) ParsePlainText(plaintext []byte) ([]byte, uint32, []byte, []byte, *CryptError) { + const block_size = 32 + plaintext, err := self.pKCS7Unpadding(plaintext, block_size) + if nil != err { + return nil, 0, nil, nil, err + } + + text_len := uint32(len(plaintext)) + if text_len < 20 { + return nil, 0, nil, nil, NewCryptError(IllegalBuffer, "plain is to small 1") + } + random := plaintext[:16] + msg_len := binary.BigEndian.Uint32(plaintext[16:20]) + if text_len < (20 + msg_len) { + return nil, 0, nil, nil, NewCryptError(IllegalBuffer, "plain is to small 2") + } + + msg := plaintext[20 : 20+msg_len] + receiver_id := plaintext[20+msg_len:] + + return random, msg_len, msg, receiver_id, nil +} + +func (self *WXBizMsgCrypt) VerifyURL(msg_signature, timestamp, nonce, echostr string) ([]byte, *CryptError) { + signature := self.calSignature(timestamp, nonce, echostr) + + if strings.Compare(signature, msg_signature) != 0 { + return nil, NewCryptError(ValidateSignatureError, "signature not equal") + } + + plaintext, err := self.cbcDecrypter(echostr) + if nil != err { + return nil, err + } + + _, _, msg, receiver_id, err := self.ParsePlainText(plaintext) + if nil != err { + return nil, err + } + + if len(self.receiver_id) > 0 && strings.Compare(string(receiver_id), self.receiver_id) != 0 { + fmt.Println(string(receiver_id), self.receiver_id, len(receiver_id), len(self.receiver_id)) + return nil, NewCryptError(ValidateCorpidError, "receiver_id is not equil") + } + + return msg, nil +} + +func (self *WXBizMsgCrypt) EncryptMsg(reply_msg, timestamp, nonce string) ([]byte, *CryptError) { + rand_str := self.randString(16) + var buffer bytes.Buffer + buffer.WriteString(rand_str) + + msg_len_buf := make([]byte, 4) + binary.BigEndian.PutUint32(msg_len_buf, uint32(len(reply_msg))) + buffer.Write(msg_len_buf) + buffer.WriteString(reply_msg) + buffer.WriteString(self.receiver_id) + + tmp_ciphertext, err := self.cbcEncrypter(buffer.String()) + if nil != err { + return nil, err + } + ciphertext := string(tmp_ciphertext) + + signature := self.calSignature(timestamp, nonce, ciphertext) + + msg4_send := NewWXBizJsonMsg4Send(ciphertext, signature, timestamp, nonce) + return self.protocol_processor.serialize(msg4_send) +} + +func (self *WXBizMsgCrypt) DecryptMsg(msg_signature, timestamp, nonce string, post_data []byte) ([]byte, *CryptError) { + msg4_recv, crypt_err := self.protocol_processor.parse(post_data) + if nil != crypt_err { + return nil, crypt_err + } + + signature := self.calSignature(timestamp, nonce, msg4_recv.Encrypt) + + if strings.Compare(signature, msg_signature) != 0 { + return nil, NewCryptError(ValidateSignatureError, "signature not equal") + } + + plaintext, crypt_err := self.cbcDecrypter(msg4_recv.Encrypt) + if nil != crypt_err { + return nil, crypt_err + } + + _, _, msg, receiver_id, crypt_err := self.ParsePlainText(plaintext) + if nil != crypt_err { + return nil, crypt_err + } + + if len(self.receiver_id) > 0 && strings.Compare(string(receiver_id), self.receiver_id) != 0 { + return nil, NewCryptError(ValidateCorpidError, "receiver_id is not equil") + } + + return msg, nil +} diff --git a/middleware/wxbizmsgcrypt/wxbizmsgcrypt.go b/middleware/wxbizmsgcrypt/wxbizmsgcrypt.go new file mode 100644 index 0000000..9f30dca --- /dev/null +++ b/middleware/wxbizmsgcrypt/wxbizmsgcrypt.go @@ -0,0 +1,315 @@ +package wxbizmsgcrypt + +import ( + "bytes" + "crypto/aes" + "crypto/cipher" + "crypto/sha1" + "encoding/base64" + "encoding/binary" + "encoding/xml" + "fmt" + "math/rand" + "sort" + "strings" +) + +const letterBytes = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" + +const ( + ValidateSignatureError int = -40001 + ParseXmlError int = -40002 + ComputeSignatureError int = -40003 + IllegalAesKey int = -40004 + ValidateCorpidError int = -40005 + EncryptAESError int = -40006 + DecryptAESError int = -40007 + IllegalBuffer int = -40008 + EncodeBase64Error int = -40009 + DecodeBase64Error int = -40010 + GenXmlError int = -40010 + ParseJsonError int = -40012 + GenJsonError int = -40013 + IllegalProtocolType int = -40014 +) + +type ProtocolType int + +const ( + XmlType ProtocolType = 1 +) + +type CryptError struct { + ErrCode int + ErrMsg string +} + +func NewCryptError(err_code int, err_msg string) *CryptError { + return &CryptError{ErrCode: err_code, ErrMsg: err_msg} +} + +type WXBizMsg4Recv struct { + Tousername string `xml:"ToUserName"` + Encrypt string `xml:"Encrypt"` + Agentid string `xml:"AgentID"` +} + +type CDATA struct { + Value string `xml:",cdata"` +} + +type WXBizMsg4Send struct { + XMLName xml.Name `xml:"xml"` + Encrypt CDATA `xml:"Encrypt"` + Signature CDATA `xml:"MsgSignature"` + Timestamp string `xml:"TimeStamp"` + Nonce CDATA `xml:"Nonce"` +} + +func NewWXBizMsg4Send(encrypt, signature, timestamp, nonce string) *WXBizMsg4Send { + return &WXBizMsg4Send{Encrypt: CDATA{Value: encrypt}, Signature: CDATA{Value: signature}, Timestamp: timestamp, Nonce: CDATA{Value: nonce}} +} + +type ProtocolProcessor interface { + parse(src_data []byte) (*WXBizMsg4Recv, *CryptError) + serialize(msg_send *WXBizMsg4Send) ([]byte, *CryptError) +} + +type WXBizMsgCrypt struct { + token string + encoding_aeskey string + receiver_id string + protocol_processor ProtocolProcessor +} + +type XmlProcessor struct { +} + +func (self *XmlProcessor) parse(src_data []byte) (*WXBizMsg4Recv, *CryptError) { + var msg4_recv WXBizMsg4Recv + err := xml.Unmarshal(src_data, &msg4_recv) + if nil != err { + return nil, NewCryptError(ParseXmlError, "xml to msg fail") + } + return &msg4_recv, nil +} + +func (self *XmlProcessor) serialize(msg4_send *WXBizMsg4Send) ([]byte, *CryptError) { + xml_msg, err := xml.Marshal(msg4_send) + if nil != err { + return nil, NewCryptError(GenXmlError, err.Error()) + } + return xml_msg, nil +} + +func NewWXBizMsgCrypt(token, encoding_aeskey, receiver_id string, protocol_type ProtocolType) *WXBizMsgCrypt { + var protocol_processor ProtocolProcessor + if protocol_type != XmlType { + panic("unsupport protocal") + } else { + protocol_processor = new(XmlProcessor) + } + + return &WXBizMsgCrypt{token: token, encoding_aeskey: (encoding_aeskey + "="), receiver_id: receiver_id, protocol_processor: protocol_processor} +} + +func (self *WXBizMsgCrypt) randString(n int) string { + b := make([]byte, n) + for i := range b { + b[i] = letterBytes[rand.Int63()%int64(len(letterBytes))] + } + return string(b) +} + +func (self *WXBizMsgCrypt) pKCS7Padding(plaintext string, block_size int) []byte { + padding := block_size - (len(plaintext) % block_size) + padtext := bytes.Repeat([]byte{byte(padding)}, padding) + var buffer bytes.Buffer + buffer.WriteString(plaintext) + buffer.Write(padtext) + return buffer.Bytes() +} + +func (self *WXBizMsgCrypt) pKCS7Unpadding(plaintext []byte, block_size int) ([]byte, *CryptError) { + plaintext_len := len(plaintext) + if nil == plaintext || plaintext_len == 0 { + return nil, NewCryptError(DecryptAESError, "pKCS7Unpadding error nil or zero") + } + if plaintext_len%block_size != 0 { + return nil, NewCryptError(DecryptAESError, "pKCS7Unpadding text not a multiple of the block size") + } + padding_len := int(plaintext[plaintext_len-1]) + return plaintext[:plaintext_len-padding_len], nil +} + +func (self *WXBizMsgCrypt) cbcEncrypter(plaintext string) ([]byte, *CryptError) { + aeskey, err := base64.StdEncoding.DecodeString(self.encoding_aeskey) + if nil != err { + return nil, NewCryptError(DecodeBase64Error, err.Error()) + } + const block_size = 32 + pad_msg := self.pKCS7Padding(plaintext, block_size) + + block, err := aes.NewCipher(aeskey) + if err != nil { + return nil, NewCryptError(EncryptAESError, err.Error()) + } + + ciphertext := make([]byte, len(pad_msg)) + iv := aeskey[:aes.BlockSize] + + mode := cipher.NewCBCEncrypter(block, iv) + + mode.CryptBlocks(ciphertext, pad_msg) + base64_msg := make([]byte, base64.StdEncoding.EncodedLen(len(ciphertext))) + base64.StdEncoding.Encode(base64_msg, ciphertext) + + return base64_msg, nil +} + +func (self *WXBizMsgCrypt) cbcDecrypter(base64_encrypt_msg string) ([]byte, *CryptError) { + aeskey, err := base64.StdEncoding.DecodeString(self.encoding_aeskey) + if nil != err { + return nil, NewCryptError(DecodeBase64Error, err.Error()) + } + + encrypt_msg, err := base64.StdEncoding.DecodeString(base64_encrypt_msg) + if nil != err { + return nil, NewCryptError(DecodeBase64Error, err.Error()) + } + + block, err := aes.NewCipher(aeskey) + if err != nil { + return nil, NewCryptError(DecryptAESError, err.Error()) + } + + if len(encrypt_msg) < aes.BlockSize { + return nil, NewCryptError(DecryptAESError, "encrypt_msg size is not valid") + } + + iv := aeskey[:aes.BlockSize] + + if len(encrypt_msg)%aes.BlockSize != 0 { + return nil, NewCryptError(DecryptAESError, "encrypt_msg not a multiple of the block size") + } + + mode := cipher.NewCBCDecrypter(block, iv) + + mode.CryptBlocks(encrypt_msg, encrypt_msg) + + return encrypt_msg, nil +} + +func (self *WXBizMsgCrypt) calSignature(timestamp, nonce, data string) string { + sort_arr := []string{self.token, timestamp, nonce, data} + sort.Strings(sort_arr) + var buffer bytes.Buffer + for _, value := range sort_arr { + buffer.WriteString(value) + } + + sha := sha1.New() + sha.Write(buffer.Bytes()) + signature := fmt.Sprintf("%x", sha.Sum(nil)) + return string(signature) +} + +func (self *WXBizMsgCrypt) ParsePlainText(plaintext []byte) ([]byte, uint32, []byte, []byte, *CryptError) { + const block_size = 32 + plaintext, err := self.pKCS7Unpadding(plaintext, block_size) + if nil != err { + return nil, 0, nil, nil, err + } + + text_len := uint32(len(plaintext)) + if text_len < 20 { + return nil, 0, nil, nil, NewCryptError(IllegalBuffer, "plain is to small 1") + } + random := plaintext[:16] + msg_len := binary.BigEndian.Uint32(plaintext[16:20]) + if text_len < (20 + msg_len) { + return nil, 0, nil, nil, NewCryptError(IllegalBuffer, "plain is to small 2") + } + + msg := plaintext[20 : 20+msg_len] + receiver_id := plaintext[20+msg_len:] + + return random, msg_len, msg, receiver_id, nil +} + +func (self *WXBizMsgCrypt) VerifyURL(msg_signature, timestamp, nonce, echostr string) ([]byte, *CryptError) { + signature := self.calSignature(timestamp, nonce, echostr) + + if strings.Compare(signature, msg_signature) != 0 { + return nil, NewCryptError(ValidateSignatureError, "signature not equal") + } + + plaintext, err := self.cbcDecrypter(echostr) + if nil != err { + return nil, err + } + + _, _, msg, receiver_id, err := self.ParsePlainText(plaintext) + if nil != err { + return nil, err + } + + if len(self.receiver_id) > 0 && strings.Compare(string(receiver_id), self.receiver_id) != 0 { + fmt.Println(string(receiver_id), self.receiver_id, len(receiver_id), len(self.receiver_id)) + return nil, NewCryptError(ValidateCorpidError, "receiver_id is not equil") + } + + return msg, nil +} + +func (self *WXBizMsgCrypt) EncryptMsg(reply_msg, timestamp, nonce string) ([]byte, *CryptError) { + rand_str := self.randString(16) + var buffer bytes.Buffer + buffer.WriteString(rand_str) + + msg_len_buf := make([]byte, 4) + binary.BigEndian.PutUint32(msg_len_buf, uint32(len(reply_msg))) + buffer.Write(msg_len_buf) + buffer.WriteString(reply_msg) + buffer.WriteString(self.receiver_id) + + tmp_ciphertext, err := self.cbcEncrypter(buffer.String()) + if nil != err { + return nil, err + } + ciphertext := string(tmp_ciphertext) + + signature := self.calSignature(timestamp, nonce, ciphertext) + + msg4_send := NewWXBizMsg4Send(ciphertext, signature, timestamp, nonce) + return self.protocol_processor.serialize(msg4_send) +} + +func (self *WXBizMsgCrypt) DecryptMsg(msg_signature, timestamp, nonce string, post_data []byte) ([]byte, *CryptError) { + msg4_recv, crypt_err := self.protocol_processor.parse(post_data) + if nil != crypt_err { + return nil, crypt_err + } + + signature := self.calSignature(timestamp, nonce, msg4_recv.Encrypt) + + if strings.Compare(signature, msg_signature) != 0 { + return nil, NewCryptError(ValidateSignatureError, "signature not equal") + } + + plaintext, crypt_err := self.cbcDecrypter(msg4_recv.Encrypt) + if nil != crypt_err { + return nil, crypt_err + } + + _, _, msg, receiver_id, crypt_err := self.ParsePlainText(plaintext) + if nil != crypt_err { + return nil, crypt_err + } + + if len(self.receiver_id) > 0 && strings.Compare(string(receiver_id), self.receiver_id) != 0 { + return nil, NewCryptError(ValidateCorpidError, "receiver_id is not equil") + } + + return msg, nil +} diff --git a/models/academictitle.go b/models/academictitle.go new file mode 100644 index 0000000..3a71747 --- /dev/null +++ b/models/academictitle.go @@ -0,0 +1,46 @@ +package models + +import ( + "hr_server/overall" + "strings" +) + +// 双职工 +type AcademicTitle struct { + Id int64 `json:"id" gorm:"primaryKey;column:id;type:bigint(20) unsigned;not null;comment:ID"` + Types string `json:"types" gorm:"column:types;type:varchar(255) unsigned;default:'';not null;comment:职称级别"` + Series string `json:"series" gorm:"column:series;type:varchar(255) unsigned;default:'';not null;comment:职称系列"` + Speciality string `json:"speciality" gorm:"column:speciality;type:varchar(255) unsigned;default:'';not null;comment:职称专业"` + Number string `json:"number" gorm:"column:number;type:varchar(255) unsigned;default:'';not null;comment:资格证书编号"` + Time int64 `json:"time" gorm:"column:time;type:bigint(20) unsigned;default:0;not null;comment:生效时间"` + EditTime int64 `json:"editTime" gorm:"column:editTime;type:bigint(20) unsigned;default:0;not null;comment:写入时间"` + UserKey int64 `json:"userKey" gorm:"column:userKey;type:bigint(20) unsigned;default:0;not null;comment:人员唯一识别符"` +} + +func (AcademicTitle *AcademicTitle) TableName() string { + return "academictitle" +} + +// 编辑双职工内容 +func (AcademicTitle *AcademicTitle) EiteCont(whereMap interface{}, saveData interface{}) (err error) { + err = overall.CONSTANT_DB_HR.Model(&AcademicTitle).Where(whereMap).Updates(saveData).Error + return +} + +// 获取双职工内容 +func (cont *AcademicTitle) GetCont(whereMap interface{}, field ...string) (err error) { + gormDb := overall.CONSTANT_DB_HR.Model(&cont) + if len(field) > 0 { + fieldStr := strings.Join(field, ",") + gormDb = gormDb.Select(fieldStr) + } + gormDb = gormDb.Where(whereMap) + err = gormDb.First(&cont).Error + return +} + +// 删除内容 +func (cont *AcademicTitle) DelCont(whereMap interface{}) (err error) { + err = overall.CONSTANT_DB_HR.Where(whereMap).Delete(&cont).Error + return +} diff --git a/models/certificate_honors.go b/models/certificate_honors.go new file mode 100644 index 0000000..61feb74 --- /dev/null +++ b/models/certificate_honors.go @@ -0,0 +1,44 @@ +package models + +import ( + "hr_server/overall" + "strings" +) + +// 证书 +type CertificateHonors struct { + Id int64 `json:"id" gorm:"primaryKey;column:id;type:bigint(20) unsigned;not null;comment:ID"` + Title string `json:"title" gorm:"column:title;type:varchar(30) unsigned;not null;comment:证书/荣誉名称"` + UserKey int64 `json:"userkey" gorm:"column:userkey;type:bigint(20) unsigned;default:0;not null;comment:获得人员"` + Types int `json:"types" gorm:"column:types;type:tinyint(1) unsigned;default:1;not null;comment:类型(1:职称证书;2:资格证书;3:荣誉)` + State int `json:"state" gorm:"column:state;type:tinyint(1) unsigned;default:1;not null;comment:状态(1:启用;2:禁用;3:删除)` + IssuingUnit string `json:"issuingUnit" gorm:"column:issuing_unit;type:varchar(255) unsigned;default:'';not null;comment:颁发单位"` + TimeData int64 `json:"timedata" gorm:"column:timedata;type:bigint(20) unsigned;default:0;not null;comment:获得时间"` + Years int `json:"years" gorm:"column:years;type:int(7) unsigned;default:0;not null;comment:年"` + Months int `json:"months" gorm:"column:months;type:int(7) unsigned;default:0;not null;comment:月"` + Number string `json:"number" gorm:"column:number;type:varchar(255) unsigned;not null;comment:证书编号"` + EndTime int64 `json:"endTime" gorm:"column:endTime;type:bigint(20) unsigned;default:0;not null;comment:截止时间"` + ValidPeriod string `json:"validPeriod" gorm:"column:validPeriod;type:varchar(255) unsigned;not null;comment:有效期限"` +} + +func (CertificateHonors *CertificateHonors) TableName() string { + return "certificate_honors" +} + +// 编辑双职工内容 +func (CertificateHonors *CertificateHonors) EiteCont(whereMap interface{}, saveData interface{}) (err error) { + err = overall.CONSTANT_DB_HR.Model(&CertificateHonors).Where(whereMap).Updates(saveData).Error + return +} + +// 获取双职工内容 +func (cont *CertificateHonors) GetCont(whereMap interface{}, field ...string) (err error) { + gormDb := overall.CONSTANT_DB_HR.Model(&cont) + if len(field) > 0 { + fieldStr := strings.Join(field, ",") + gormDb = gormDb.Select(fieldStr) + } + gormDb = gormDb.Where(whereMap) + err = gormDb.First(&cont).Error + return +} diff --git a/models/double_worker.go b/models/double_worker.go index 0fdb715..51febc3 100644 --- a/models/double_worker.go +++ b/models/double_worker.go @@ -5,7 +5,7 @@ import ( "strings" ) -//双职工 +// 双职工 type DoubleWorker struct { Id int64 `json:"id" gorm:"primaryKey;column:id;type:bigint(20) unsigned;not null;comment:ID"` Number string `json:"number" gorm:"column:number;type:varchar(30) unsigned;not null;comment:员工工号;index"` @@ -17,19 +17,23 @@ type DoubleWorker struct { Time int64 `json:"time" gorm:"column:time;type:bigint(20) unsigned;default:0;not null;comment:创建时间"` State int `json:"state" gorm:"column:state;type:tinyint(1) unsigned;default:1;not null;comment:状态(1:启用;2:禁用;3:删除)` Key int64 `json:"key" gorm:"column:key;type:bigint(50) unsigned;default:0;not null;comment:key"` + WorkUnit string `json:"workUnit" gorm:"column:workUnit;type:varchar(100) unsigned;default:'';not null;comment:工段"` + WorkPosit string `json:"workPosit" gorm:"column:workPosit;type:varchar(100) unsigned;default:'';not null;comment:职位"` + Levele string `json:"levele" gorm:"column:levele;type:varchar(10) unsigned;default:'';not null;comment:职等"` + JoinTime int64 `json:"joinTime" gorm:"column:joinTime;type:bigint(20) unsigned;default:0;not null;comment:入职时间"` } func (DoubleWorker *DoubleWorker) TableName() string { return "double_worker" } -//编辑双职工内容 +// 编辑双职工内容 func (DoubleWorker *DoubleWorker) EiteCont(whereMap interface{}, saveData interface{}) (err error) { err = overall.CONSTANT_DB_HR.Model(&DoubleWorker).Where(whereMap).Updates(saveData).Error return } -//获取双职工内容 +// 获取双职工内容 func (cont *DoubleWorker) GetCont(whereMap interface{}, field ...string) (err error) { gormDb := overall.CONSTANT_DB_HR.Model(&cont) if len(field) > 0 { @@ -40,3 +44,9 @@ func (cont *DoubleWorker) GetCont(whereMap interface{}, field ...string) (err er err = gormDb.First(&cont).Error return } + +// 删除内容 +func (cont *DoubleWorker) DelCont(whereMap interface{}) (err error) { + err = overall.CONSTANT_DB_HR.Where(whereMap).Delete(&cont).Error + return +} diff --git a/models/emergency_contact.go b/models/emergency_contact.go index 6fdc3e8..4ff71f1 100644 --- a/models/emergency_contact.go +++ b/models/emergency_contact.go @@ -5,7 +5,7 @@ import ( "strings" ) -//紧急联系人 +// 紧急联系人 type EmergencyContact struct { Id int64 `json:"id" gorm:"primaryKey;column:id;type:bigint(20) unsigned;not null;comment:ID"` Number string `json:"number" gorm:"primaryKey;column:number;type:varchar(30) unsigned;not null;comment:员工工号;index"` @@ -21,13 +21,13 @@ func (EmergencyContact *EmergencyContact) TableName() string { return "emergency_contact" } -//编辑职务分类内容 +// 编辑职务分类内容 func (EmergencyContact *EmergencyContact) EiteCont(whereMap interface{}, saveData interface{}) (err error) { err = overall.CONSTANT_DB_HR.Model(&EmergencyContact).Where(whereMap).Updates(saveData).Error return } -//获取行政组织内容 +// 获取行政组织内容 func (cont *EmergencyContact) GetCont(whereMap interface{}, field ...string) (err error) { gormDb := overall.CONSTANT_DB_HR.Model(&cont) if len(field) > 0 { @@ -39,8 +39,15 @@ func (cont *EmergencyContact) GetCont(whereMap interface{}, field ...string) (er return } -//根据条件获取总数 +// 根据条件获取总数 func (cont *EmergencyContact) CountCont(whereMap interface{}) (countId int64) { overall.CONSTANT_DB_HR.Model(&cont).Where(whereMap).Count(&countId) return } + +// 删除内容 +func (cont *EmergencyContact) DelCont(whereMap interface{}) (err error) { + + err = overall.CONSTANT_DB_HR.Where(whereMap).Delete(&cont).Error + return +} diff --git a/models/family_members.go b/models/family_members.go index 0147cf9..00f413b 100644 --- a/models/family_members.go +++ b/models/family_members.go @@ -5,7 +5,7 @@ import ( "strings" ) -//员工家属 +// 员工家属 type FamilyMembers struct { Id int64 `json:"id" gorm:"primaryKey;column:id;type:bigint(20) unsigned;not null;comment:ID"` Number string `json:"number" gorm:"column:number;type:varchar(30) unsigned;not null;comment:员工工号"` @@ -21,19 +21,21 @@ type FamilyMembers struct { State int `json:"state" gorm:"column:state;type:tinyint(1) unsigned;default:1;not null;comment:状态(1:启用;2:禁用;3:删除)"` PoliticalOutlookCn string `json:"politicaloutlookcn" gorm:"column:political_outlook_cn;type:varchar(30) unsigned;not null;comment:政治面貌汉字说明"` + WorkUnitPost string `json:"workUnitPost" gorm:"column:workUnitPost;type:varchar(255) unsigned;default:'';not null;comment:工作单位及职务"` + IsSos int `json:"isSos" gorm:"column:isSos;type:int(1) unsigned;default:2;not null;comment:是否为紧急联系人(1、是;2:否)"` } func (FamilyMembers *FamilyMembers) TableName() string { return "family_members" } -//编辑员工家属内容 +// 编辑员工家属内容 func (FamilyMembers *FamilyMembers) EiteCont(whereMap interface{}, saveData interface{}) (err error) { err = overall.CONSTANT_DB_HR.Model(&FamilyMembers).Where(whereMap).Updates(saveData).Error return } -//获取员工家属内容 +// 获取员工家属内容 func (cont *FamilyMembers) GetCont(whereMap interface{}, field ...string) (err error) { gormDb := overall.CONSTANT_DB_HR.Model(&cont) if len(field) > 0 { @@ -44,3 +46,10 @@ func (cont *FamilyMembers) GetCont(whereMap interface{}, field ...string) (err e err = gormDb.First(&cont).Error return } + +// 删除内容 +func (cont *FamilyMembers) DelCont(whereMap interface{}) (err error) { + + err = overall.CONSTANT_DB_HR.Where(whereMap).Delete(&cont).Error + return +} diff --git a/models/inside_work_history.go b/models/inside_work_history.go index 35bc7df..9e18686 100644 --- a/models/inside_work_history.go +++ b/models/inside_work_history.go @@ -7,23 +7,29 @@ import ( // 集团内部工作经历 type InsideWorkHistory struct { - Id int64 `json:"id" gorm:"primaryKey;column:id;type:bigint(20) unsigned;not null;comment:Id;index"` - Key int64 `json:"key" gorm:"column:key;type:bigint(20) unsigned;default:0;not null;comment:员工识别符"` - Group int64 `json:"group" gorm:"column:group;type:bigint(20) unsigned;default:0;not null;comment:集团"` - Company int64 `json:"company" gorm:"column:company;type:bigint(20) unsigned;default:0;not null;comment:公司"` - Department int64 `json:"department" gorm:"column:department;type:bigint(20) unsigned;default:0;not null;comment:部室"` - WorkShop int64 `json:"workshop" gorm:"column:workshop;type:bigint(20) unsigned;default:0;not null;comment:二级部门或车间"` - WorkshopSection int64 `json:"workshopsection" gorm:"column:workshop_section;type:bigint(20) unsigned;default:0;not null;comment:工段"` - Position int64 `json:"position" gorm:"column:position;type:bigint(20) unsigned;default:0;not null;comment:职位"` - GradePositions int64 `json:"gradepositions" gorm:"column:grade_positions;type:bigint(20) unsigned;default:0;not null;comment:职等"` - StartTime int64 `json:"starttime" gorm:"column:start_time;type:bigint(20) unsigned;default:0;not null;comment:开始日期"` - EndTime int64 `json:"endtime" gorm:"column:end_time;type:bigint(20) unsigned;default:0;not null;comment:结束日期"` - Team int64 `json:"team" gorm:"column:team;type:int(1) unsigned;default:1;not null;comment:班组(1:长白;2:甲;3:乙;4:丙;5:丁)"` - ChangeType int `json:"changetype" gorm:"column:change_type;type:int(1) unsigned;default:1;not null;comment:变动类型(1:预入职;2:雇佣入职;3:转正;4:晋升;5:降级;6:职等调整;7:调动调入;8:跨公司调动调入;9:借调;10:平调;11:兼职;12:预离职;13:离职;14:退休;15:返聘;16:员工初始化;)"` - Time int64 `json:"time" gorm:"column:time;type:bigint(20) unsigned;default:0;not null;comment:创建时间"` - State int `json:"state" gorm:"column:state;type:int(1) unsigned;default:1;not null;comment:状态(1:启用;2:禁用;3:删除)"` - AssignType int `json:"assigntype" gorm:"column:assign_type;type:int(1) unsigned;default:1;not null;comment:1、主职;2:兼职"` - JobId int64 `json:"jobid" gorm:"column:jobid;type:bigint(20) unsigned;default:0;not null;comment:职务"` + Id int64 `json:"id" gorm:"primaryKey;column:id;type:bigint(20) unsigned;not null;comment:Id;index"` + Key int64 `json:"key" gorm:"column:key;type:bigint(20) unsigned;default:0;not null;comment:员工识别符"` + Group int64 `json:"group" gorm:"column:group;type:bigint(20) unsigned;default:0;not null;comment:集团"` + Company int64 `json:"company" gorm:"column:company;type:bigint(20) unsigned;default:0;not null;comment:公司"` + Department int64 `json:"department" gorm:"column:department;type:bigint(20) unsigned;default:0;not null;comment:部室"` + WorkShop int64 `json:"workshop" gorm:"column:workshop;type:bigint(20) unsigned;default:0;not null;comment:二级部门或车间"` + WorkshopSection int64 `json:"workshopsection" gorm:"column:workshop_section;type:bigint(20) unsigned;default:0;not null;comment:工段"` + Position int64 `json:"position" gorm:"column:position;type:bigint(20) unsigned;default:0;not null;comment:职位"` + GradePositions int64 `json:"gradepositions" gorm:"column:grade_positions;type:bigint(20) unsigned;default:0;not null;comment:职等"` + StartTime int64 `json:"starttime" gorm:"column:start_time;type:bigint(20) unsigned;default:0;not null;comment:开始日期"` + EndTime int64 `json:"endtime" gorm:"column:end_time;type:bigint(20) unsigned;default:0;not null;comment:结束日期"` + Team int64 `json:"team" gorm:"column:team;type:int(1) unsigned;default:1;not null;comment:班组(1:长白;2:甲;3:乙;4:丙;5:丁)"` + ChangeType int `json:"changetype" gorm:"column:change_type;type:int(1) unsigned;default:1;not null;comment:变动类型(1:预入职;2:雇佣入职;3:转正;4:晋升;5:降级;6:职等调整;7:调动调入;8:跨公司调动调入;9:借调;10:平调;11:兼职;12:预离职;13:离职;14:退休;15:返聘;16:员工初始化;17、新入职;18:平调;19:降职;20:升职)"` + Time int64 `json:"time" gorm:"column:time;type:bigint(20) unsigned;default:0;not null;comment:创建时间"` + State int `json:"state" gorm:"column:state;type:int(1) unsigned;default:1;not null;comment:状态(1:启用;2:禁用;3:删除)"` + AssignType int `json:"assigntype" gorm:"column:assign_type;type:int(1) unsigned;default:1;not null;comment:1、主职;2:兼职"` + JobId int64 `json:"jobid" gorm:"column:jobid;type:bigint(20) unsigned;default:0;not null;comment:职务"` + WorkCont string `json:"workcont" gorm:"column:workcont;type:longtext ;comment:工作内容"` + + ChangeReason string `json:"changeReason" gorm:"column:changeReason;type:longtext ;comment:变动原因"` + SuperiorPosition string `json:"superiorPosition" gorm:"column:superiorPosition;type:varchar(255) ;comment:上级职位"` + SuperiorName string `json:"superiorName" gorm:"column:superiorName;type:varchar(255) unsigned;default:'';comment:上级名称"` + Subordinates int `json:"subordinates" gorm:"column:subordinates;type:int(5) unsigned;default:0;not null;comment:下属人数"` } func (InsideWorkHistory *InsideWorkHistory) TableName() string { @@ -47,3 +53,10 @@ func (cont *InsideWorkHistory) GetCont(whereMap interface{}, field ...string) (e err = gormDb.First(&cont).Error return } + +// 删除内容 +func (cont *InsideWorkHistory) DelCont(whereMap interface{}) (err error) { + + err = overall.CONSTANT_DB_HR.Where(whereMap).Delete(&cont).Error + return +} diff --git a/models/job_class.go b/models/job_class.go index abc82a1..357a49b 100644 --- a/models/job_class.go +++ b/models/job_class.go @@ -5,7 +5,7 @@ import ( "strings" ) -//职务分类 +// 职务分类 type JobClass struct { Id int64 `json:"id" gorm:"primaryKey;column:id;type:bigint(20) unsigned;not null;comment:Id;index"` Name string `json:"name" gorm:"column:name;type:varchar(255) unsigned;default:'';not null;comment:职务分类名称"` @@ -19,13 +19,13 @@ func (JobClass *JobClass) TableName() string { return "job_class" } -//编辑职务分类内容 +// 编辑职务分类内容 func (JobClass *JobClass) EiteJobClassCont(whereMap map[string]interface{}, saveData map[string]interface{}) (err error) { err = overall.CONSTANT_DB_HR.Model(&JobClass).Where(whereMap).Updates(saveData).Error return } -//获取详细内容 +// 获取详细内容 func (cont *JobClass) GetCont(whereMap interface{}, field ...string) (err error) { gormDb := overall.CONSTANT_DB_HR.Model(&cont) if len(field) > 0 { diff --git a/models/man_cont.go b/models/man_cont.go index 0b4cc47..f8ae973 100644 --- a/models/man_cont.go +++ b/models/man_cont.go @@ -63,6 +63,9 @@ type ManCont struct { PersonInCharge int `json:"personincharge" gorm:"column:person_in_charge;type:tinyint(1) unsigned;default:1;not null;comment:负责人(1:是;2:否)` ResponsibleDepartment string `json:"responsibledepartment" gorm:"column:responsible_department;type:longtext;default:'';not null;comment:负责的行政组织"` ResponsibleDepartmentJson string `json:"responsibledepartmentjson" gorm:"column:responsible_department_json;type:longtext;default:'';not null;comment:负责的行政组织json"` + CareerPlanning string `json:"career_planning" gorm:"column:career_planning;type:longtext;default:'';not null;comment:职业生涯规划"` + HelpObtained string `json:"help_obtained" gorm:"column:help_obtained;type:longtext;default:'';not null;comment:个人期望从组织获得的帮助"` + Hobby string `json:"hobby" gorm:"column:hobby;type:text;default:'';not null;comment:爱好"` } func (ManCont *ManCont) TableName() string { diff --git a/models/meritslog.go b/models/meritslog.go new file mode 100644 index 0000000..39a8f17 --- /dev/null +++ b/models/meritslog.go @@ -0,0 +1,40 @@ +package models + +import ( + "hr_server/overall" + "strings" +) + +// 绩效考核成绩 +type Meritslog struct { + Id int64 `json:"id" gorm:"primaryKey;column:id;type:bigint(20) unsigned;not null;comment:ID"` + Score int64 `json:"score" gorm:"column:score;type:bigint(20) unsigned;default:0;not null;comment:绩效分数*10000保存"` + UserKey int64 `json:"userkey" gorm:"column:userkey;type:bigint(20) unsigned;default:0;not null;comment:获得人员"` + Status int `json:"status" gorm:"column:status;type:tinyint(1) unsigned;default:1;not null;comment:状态(1:启用;2:禁用;3:删除)` + TimeData int64 `json:"timedata" gorm:"column:timedata;type:bigint(20) unsigned;default:0;not null;comment:获得时间"` + Years int `json:"years" gorm:"column:years;type:int(7) unsigned;default:0;not null;comment:年"` + Months int `json:"months" gorm:"column:months;type:int(7) unsigned;default:0;not null;comment:月"` + Level string `json:"level" gorm:"column:level;type:varchar(255);not null;comment:考核等级"` +} + +func (Meritslog *Meritslog) TableName() string { + return "meritslog" +} + +// 编辑双职工内容 +func (Meritslog *Meritslog) EiteCont(whereMap interface{}, saveData interface{}) (err error) { + err = overall.CONSTANT_DB_HR.Model(&Meritslog).Where(whereMap).Updates(saveData).Error + return +} + +// 获取双职工内容 +func (cont *Meritslog) GetCont(whereMap interface{}, field ...string) (err error) { + gormDb := overall.CONSTANT_DB_HR.Model(&cont) + if len(field) > 0 { + fieldStr := strings.Join(field, ",") + gormDb = gormDb.Select(fieldStr) + } + gormDb = gormDb.Where(whereMap) + err = gormDb.First(&cont).Error + return +} diff --git a/models/personalityColor/charcolortest.go b/models/personalityColor/charcolortest.go new file mode 100644 index 0000000..634eaf2 --- /dev/null +++ b/models/personalityColor/charcolortest.go @@ -0,0 +1,52 @@ +package personalitycolor + +import ( + "hr_server/overall" + "strings" +) + +// 授权账户 +type Charcolortest struct { + Id int64 `json:"id" gorm:"primaryKey;column:c_id;type:bigint(20) unsigned;not null;comment:Id;index"` + Class int64 `json:"class" gorm:"column:c_class;type:bigint(20) unsigned;default:0;not null;comment:测试试卷类型"` + Types int `json:"types" gorm:"column:c_type;type:tinyint(1) unsigned;default:1;not null;comment:1:内部测试;2:外部测试` + Number string `json:"number" gorm:"column:c_number;type:varchar(10) unsigned;not null;comment:工号"` + Name string `json:"name" gorm:"column:c_name;type:varchar(50) unsigned;not null;comment:姓名"` + Department string `json:"department" gorm:"column:c_department;type:varchar(255) unsigned;not null;comment:部门"` + Tel string `json:"tel" gorm:"column:c_tel;type:varchar(50) unsigned;not null;comment:联系电话"` + Address string `json:"address" gorm:"column:c_address;type:varchar(255) unsigned;not null;comment:联系地址"` + UserJson string `json:"userJson" gorm:"column:c_user_json;type:text unsigned;comment:内部员工详细信息"` + TestJson string `json:"testJson" gorm:"column:c_test_json;type:mediumtext unsigned;comment:试卷答案"` + Time int64 `json:"addtime" gorm:"column:c_add_time;type:bigint(20) unsigned;default:0;not null;comment:写入时间"` + EiteTime int64 `json:"eitetime" gorm:"column:c_eite_time;type:bigint(20) unsigned;default:0;not null;comment:编辑时间"` + State int `json:"state" gorm:"column:c_states;type:tinyint(1) unsigned;default:1;not null;comment:状态(1:有效;2:无效)` + BranchName string `json:"branchName" gorm:"column:c_branch_name;type:varchar(255) unsigned;not null;comment:部门"` +} + +func (Position *Charcolortest) TableName() string { + return "charcolortest" +} + +// 编辑职务分类内容 +func (cont *Charcolortest) EiteCont(whereMap interface{}, saveData map[string]interface{}) (err error) { + err = overall.CONSTANT_Personality_Color.Model(&cont).Where(whereMap).Updates(saveData).Error + return +} + +// 获取行政组织内容 +func (cont *Charcolortest) GetCont(whereMap interface{}, field ...string) (err error) { + gormDb := overall.CONSTANT_Personality_Color.Model(&cont) + if len(field) > 0 { + fieldStr := strings.Join(field, ",") + gormDb = gormDb.Select(fieldStr) + } + gormDb = gormDb.Where(whereMap) + err = gormDb.First(&cont).Error + return +} + +// 根据条件获取总数 +func (cont *Charcolortest) CountCont(whereMap interface{}) (countId int64) { + overall.CONSTANT_Personality_Color.Model(&cont).Where(whereMap).Count(&countId) + return +} diff --git a/models/personarchives.go b/models/personarchives.go index 68bd6ea..4183df2 100644 --- a/models/personarchives.go +++ b/models/personarchives.go @@ -39,6 +39,8 @@ type PersonArchives struct { PersonInCharge int `json:"personincharge" gorm:"column:person_in_charge;type:tinyint(1) unsigned;default:1;not null;comment:负责人(1:是;2:否)` ResponsibleDepartment string `json:"responsibledepartment" gorm:"column:responsible_department;type:longtext;default:'';not null;comment:负责的行政组织"` ResponsibleDepartmentJson string `json:"responsibledepartmentjson" gorm:"column:responsible_department_json;type:longtext;default:'';not null;comment:负责的行政组织json"` + WorkSection int64 `json:"workSection" gorm:"column:work_section;type:bigint(20) unsigned;default:0;not null;comment:工段"` + IsLock int `json:"isLock" gorm:"column:isLock;type:int(1) unsigned;default:1;not null;comment:信息是否锁定` } func (PersonArchives *PersonArchives) TableName() string { diff --git a/models/personnel_content.go b/models/personnel_content.go index 07664ef..d0a927a 100644 --- a/models/personnel_content.go +++ b/models/personnel_content.go @@ -1,6 +1,7 @@ package models import ( + "fmt" "hr_server/overall" "strings" ) @@ -43,6 +44,15 @@ type PersonnelContent struct { PoliticalOutlookCn string `json:"politicaloutlookcn" gorm:"column:political_outlook_cn;type:varchar(50) unsigned;default:'';not null;comment:政治面貌汉字说明"` HealthCn string `json:"healthcn" gorm:"column:health_cn;type:varchar(50) unsigned;default:'';not null;comment:健康状况中文说明"` NameUsedBefore string `json:"nameusedbefore" gorm:"column:name_used_before;type:varchar(255) unsigned;default:'';not null;comment:曾用名"` + CareerPlanning string `json:"career_planning" gorm:"column:career_planning;type:longtext;default:'';not null;comment:职业生涯规划"` + HelpObtained string `json:"help_obtained" gorm:"column:help_obtained;type:longtext;default:'';not null;comment:个人期望从组织获得的帮助"` + Hobby string `json:"hobby" gorm:"column:hobby;type:text;default:'';not null;comment:爱好"` + + DomicileType string `json:"domicileType" gorm:"column:domicile_type;type:varchar(100) unsigned;default:'';not null;comment:户籍类型"` + IdCardnoLongTerm int `json:"idCardnoLongTerm" gorm:"column:idCardnoLongTerm;type:int(1) unsigned;default:0;not null;comment:身份证是否长期有效(1:是;2:否)"` + MobileShortNumber string `json:"mobileShortNumber" gorm:"column:mobileShortNumber;type:varchar(50) unsigned;default:'';not null;comment:手机小号"` + Channel int `json:"channel" gorm:"column:channel;type:int(1) unsigned;default:0;not null;comment:入职渠道(1:社会招聘;2:校园招聘;3:内部推荐)"` + BloodType string `json:"bloodType" gorm:"column:bloodType;type:varchar(10) unsigned;default:'';not null;comment:血型"` } func (PersonnelContent *PersonnelContent) TableName() string { @@ -60,6 +70,7 @@ func (cont *PersonnelContent) GetCont(whereMap interface{}, field ...string) (er gormDb := overall.CONSTANT_DB_HR.Model(&cont) if len(field) > 0 { fieldStr := strings.Join(field, ",") + fmt.Printf("Sql: %v\n", fieldStr) gormDb = gormDb.Select(fieldStr) } gormDb = gormDb.Where(whereMap) diff --git a/models/personnel_education.go b/models/personnel_education.go index 37dd549..df3bc2d 100644 --- a/models/personnel_education.go +++ b/models/personnel_education.go @@ -23,19 +23,22 @@ type PersonnelEducation struct { AcademicDegreeCn string `json:"academicdegreecn" gorm:"column:academic_degree_cn;type:varchar(30) unsigned;comment:学位中文说明"` EducationCn string `json:"educationcn" gorm:"column:education_cn;type:varchar(30) unsigned;comment:学历中文说明"` + EducationType int `json:"educationType" gorm:"column:education_type;type:tinyint(1) unsigned;default:1;not null;comment:学历类型(1、全日制统招学历;2、成人高考学历;3、自学考试学历;4:开放大学学历;5:网络教育学历)"` + CollegeFaction string `json:"collegeFaction" gorm:"column:collegeFaction;type:varchar(30) unsigned;comment:所属院系"` + SchoolType int `json:"schoolType" gorm:"column:schoolType;type:tinyint(1) unsigned;default:1;not null;comment:学历类型(院校类型(1、私立中学;2:公立中学;3:高职院校;4:民办专科院校;5:公办专科院校;6:民办本科院校;7:公办本科院校;8:”211“工程院校;9:”985“工程院校;10:双一流院校))"` } func (PersonnelEducation *PersonnelEducation) TableName() string { return "personnel_education" } -//编辑教育经历内容 +// 编辑教育经历内容 func (PersonnelEducation *PersonnelEducation) EiteCont(whereMap interface{}, saveData interface{}) (err error) { err = overall.CONSTANT_DB_HR.Model(&PersonnelEducation).Where(whereMap).Updates(saveData).Error return } -//获取教育经历内容 +// 获取教育经历内容 func (cont *PersonnelEducation) GetCont(whereMap interface{}, field ...string) (err error) { gormDb := overall.CONSTANT_DB_HR.Model(&cont) if len(field) > 0 { @@ -46,3 +49,9 @@ func (cont *PersonnelEducation) GetCont(whereMap interface{}, field ...string) ( err = gormDb.First(&cont).Error return } + +// 删除内容 +func (cont *PersonnelEducation) DelCont(whereMap interface{}) (err error) { + err = overall.CONSTANT_DB_HR.Where(whereMap).Delete(&cont).Error + return +} diff --git a/models/political_identity.go b/models/political_identity.go new file mode 100644 index 0000000..1e3340e --- /dev/null +++ b/models/political_identity.go @@ -0,0 +1,63 @@ +package models + +import ( + "hr_server/overall" + "strings" +) + +type PoliticalIdentity struct { + Userkey int64 `json:"userkey" gorm:"primaryKey;column:userkey;type:bigint(20) unsigned;not null;comment:员工唯一识别符;"` + PoliticalOutlook int `json:"politicaloutlook" gorm:"column:political_outlook;type:int(3) unsigned;default:1;comment:政治面貌(1:群众;2:无党派;3:台盟会员;4:九三社员;5:致公党员;6:农工党员;7:民进会员;8:民建会员;9:民盟盟员;10:民革会员,11:共青团员;12:预备党员;13:中共党员)"` + JoinTime int64 `json:"joinTime" gorm:"column:joinTime;type:bigint(20) unsigned;default:0;not null;comment:加入时间"` + Branch string `json:"branch" gorm:"column:branch;type:varchar(255) ;comment:所在党支部"` + Bosition string `json:"position" gorm:"column:position;type:varchar(255) ;comment:党内职务"` + JoiningParty string `json:"joiningParty" gorm:"column:joiningParty;type:varchar(255) ;comment:入党时所在单位"` + SwitchToClass int `json:"switchToClass" gorm:"column:switchToClass;type:int(1) unsigned;default:50;not null;comment:组织关系是否转入(1:是;2:否)"` + SwitchToTime int64 `json:"switchToTime" gorm:"column:switchToTime;type:bigint(20) unsigned;default:0;not null;comment:组织关系转入时间"` + Time int64 `json:"time" gorm:"column:time;type:bigint(20) unsigned;default:0;not null;comment:创建时间"` +} + +func (PoliticalIdentity *PoliticalIdentity) TableName() string { + return "political_identity" +} + +// 编辑内容 +func (cont *PoliticalIdentity) EiteCont(whereMap interface{}, saveData interface{}) (err error) { + err = overall.CONSTANT_DB_HR.Model(&cont).Where(whereMap).Updates(saveData).Error + return +} + +// 获取内容 +func (cont *PoliticalIdentity) GetCont(whereMap interface{}, field ...string) (err error) { + gormDb := overall.CONSTANT_DB_HR.Model(&cont) + if len(field) > 0 { + fieldStr := strings.Join(field, ",") + gormDb = gormDb.Select(fieldStr) + } + gormDb = gormDb.Where(whereMap) + err = gormDb.First(&cont).Error + return +} + +// 根据条件获取总数 +func (cont *PoliticalIdentity) CountCont(whereMap interface{}) (countId int64) { + overall.CONSTANT_DB_HR.Model(&cont).Where(whereMap).Count(&countId) + return +} + +// 读取全部信息 +func (cont *PoliticalIdentity) ContMap(whereMap interface{}, field ...string) (countAry []PoliticalIdentity, err error) { + gormDb := overall.CONSTANT_DB_HR.Model(&cont) + if len(field) > 0 { + fieldStr := strings.Join(field, ",") + gormDb = gormDb.Select(fieldStr) + } + err = gormDb.Where(whereMap).Find(&countAry).Error + return +} + +// 删除内容 +func (cont *PoliticalIdentity) DelCont(whereMap interface{}) (err error) { + err = overall.CONSTANT_DB_HR.Where(whereMap).Delete(&cont).Error + return +} diff --git a/models/rewards_penalties.go b/models/rewards_penalties.go new file mode 100644 index 0000000..f9207f2 --- /dev/null +++ b/models/rewards_penalties.go @@ -0,0 +1,43 @@ +package models + +import ( + "hr_server/overall" + "strings" +) + +// 证书 +type RewardsPenalties struct { + Id int64 `json:"id" gorm:"primaryKey;column:id;type:bigint(20) unsigned;not null;comment:ID"` + Title string `json:"title" gorm:"column:title;type:varchar(30) unsigned;not null;comment:奖励/处分项目"` + UserKey int64 `json:"userkey" gorm:"column:userkey;type:bigint(20) unsigned;default:0;not null;comment:获得人员"` + Types int `json:"types" gorm:"column:types;type:tinyint(1) unsigned;default:1;not null;comment:类型(1:奖励;2:处分;)` + State int `json:"state" gorm:"column:state;type:tinyint(1) unsigned;default:1;not null;comment:状态(1:启用;2:禁用;3:删除)` + IssuingUnit string `json:"issuingUnit" gorm:"column:issuing_unit;type:varchar(255) unsigned;default:'';not null;comment:颁发单位"` + TimeData int64 `json:"timedata" gorm:"column:timedata;type:bigint(20) unsigned;default:0;not null;comment:获得时间"` + Years int `json:"years" gorm:"column:years;type:int(7) unsigned;default:0;not null;comment:年"` + Months int `json:"months" gorm:"column:months;type:int(7) unsigned;default:0;not null;comment:月"` + Level int `json:"level" gorm:"column:level;type:int(7) unsigned;default:0;not null;comment:奖惩级别(1:部门级;2:公司级;3:县级;4:市级;5:省级;6:国家级)"` + RewPunClass int `json:"rewPunClass" gorm:"column:rewPunClass;type:int(7) unsigned;default:0;not null;comment:奖惩类型(1:年终评优;2:表扬;3:嘉奖;4:记功;5:记大功;6:特别奖励;7:批评;8:警告;9:记过;10:记大过;11:降级;12:留用察看;13:开除)"` +} + +func (RewardsPenalties *RewardsPenalties) TableName() string { + return "rewards_penalties" +} + +// 编辑双职工内容 +func (RewardsPenalties *RewardsPenalties) EiteCont(whereMap interface{}, saveData interface{}) (err error) { + err = overall.CONSTANT_DB_HR.Model(&RewardsPenalties).Where(whereMap).Updates(saveData).Error + return +} + +// 获取双职工内容 +func (cont *RewardsPenalties) GetCont(whereMap interface{}, field ...string) (err error) { + gormDb := overall.CONSTANT_DB_HR.Model(&cont) + if len(field) > 0 { + fieldStr := strings.Join(field, ",") + gormDb = gormDb.Select(fieldStr) + } + gormDb = gormDb.Where(whereMap) + err = gormDb.First(&cont).Error + return +} diff --git a/models/veterans.go b/models/veterans.go new file mode 100644 index 0000000..44417c1 --- /dev/null +++ b/models/veterans.go @@ -0,0 +1,62 @@ +package models + +import ( + "hr_server/overall" + "strings" +) + +type Veterans struct { + Userkey int64 `json:"userkey" gorm:"primaryKey;column:userkey;type:bigint(20) unsigned;not null;comment:员工唯一识别符;"` + IsRetire int `json:"isRetire" gorm:"column:isRetire;type:int(1) unsigned;default:50;not null;comment:是否为退役军人(1:是;2:否)"` + RetireNumber string `json:"retireNumber" gorm:"column:retireNumber;type:varchar(255) ;comment:退役证编号"` + JoinTime int64 `json:"joinTime" gorm:"column:joinTime;type:bigint(20) unsigned;default:0;not null;comment:入伍时间"` + RetireTime int64 `json:"retireTime" gorm:"column:retireTime;type:bigint(20) unsigned;default:0;not null;comment:退伍时间"` + ArmyUnits string `json:"armyUnits" gorm:"column:armyUnits;type:varchar(255) ;comment:参军单位"` + TypesOfSoldiers string `json:"typesOfSoldiers" gorm:"column:typesOfSoldiers;type:varchar(255) ;comment:兵种"` + Time int64 `json:"time" gorm:"column:time;type:bigint(20) unsigned;default:0;not null;comment:创建时间"` +} + +func (Veterans *Veterans) TableName() string { + return "veterans" +} + +// 编辑内容 +func (cont *Veterans) EiteCont(whereMap interface{}, saveData interface{}) (err error) { + err = overall.CONSTANT_DB_HR.Model(&cont).Where(whereMap).Updates(saveData).Error + return +} + +// 获取内容 +func (cont *Veterans) GetCont(whereMap interface{}, field ...string) (err error) { + gormDb := overall.CONSTANT_DB_HR.Model(&cont) + if len(field) > 0 { + fieldStr := strings.Join(field, ",") + gormDb = gormDb.Select(fieldStr) + } + gormDb = gormDb.Where(whereMap) + err = gormDb.First(&cont).Error + return +} + +// 根据条件获取总数 +func (cont *Veterans) CountCont(whereMap interface{}) (countId int64) { + overall.CONSTANT_DB_HR.Model(&cont).Where(whereMap).Count(&countId) + return +} + +// 读取全部信息 +func (cont *Veterans) ContMap(whereMap interface{}, field ...string) (countAry []Veterans, err error) { + gormDb := overall.CONSTANT_DB_HR.Model(&cont) + if len(field) > 0 { + fieldStr := strings.Join(field, ",") + gormDb = gormDb.Select(fieldStr) + } + err = gormDb.Where(whereMap).Find(&countAry).Error + return +} + +// 删除内容 +func (cont *Veterans) DelCont(whereMap interface{}) (err error) { + err = overall.CONSTANT_DB_HR.Where(whereMap).Delete(&cont).Error + return +} diff --git a/models/work_history.go b/models/work_history.go index de23d94..d1a5544 100644 --- a/models/work_history.go +++ b/models/work_history.go @@ -5,34 +5,39 @@ import ( "strings" ) -//工作履历 +// 工作履历 type WorkHistory struct { - Id int64 `json:"id" gorm:"primaryKey;column:id;type:bigint(20) unsigned;not null;comment:Id;index"` - Number string `json:"number" gorm:"column:number;type:varchar(50) unsigned;default:'';not null;comment:工号"` - Key int64 `json:"key" gorm:"column:key;type:bigint(50) unsigned;default:0;not null;comment:身份识别"` - Company string `json:"company" gorm:"column:company;type:varchar(255) unsigned;default:'';comment:公司"` - Deparment string `json:"deparment" gorm:"column:deparment;type:varchar(255) unsigned;default:'';comment:部门"` - Job string `json:"job" gorm:"column:job;type:varchar(255) unsigned;default:'';comment:职务"` - EntryTime int64 `json:"entrytime" gorm:"column:entry_time;type:bigint(20) unsigned;default:0;not null;comment:入职时间"` - Leavedate int64 `json:"leavedate" gorm:"column:leavedate;type:bigint(20) unsigned;default:0;not null;comment:离职日期"` - Witness string `json:"witness" gorm:"column:witness;type:varchar(255) unsigned;default:'';comment:证明人"` - WitnessTel string `json:"witnesstel" gorm:"column:witness_tel;type:varchar(255) unsigned;default:'';comment:证明人电话"` - Remarks string `json:"remarks" gorm:"column:remarks;type:text unsigned;default:'';comment:备注"` - Time int64 `json:"time" gorm:"column:time;type:bigint(20) unsigned;default:0;not null;comment:创建时间"` - State int `json:"state" gorm:"column:state;type:int(1) unsigned;default:1;not null;comment:状态(1:启用;2:禁用;3:删除)"` + Id int64 `json:"id" gorm:"primaryKey;column:id;type:bigint(20) unsigned;not null;comment:Id;index"` + Number string `json:"number" gorm:"column:number;type:varchar(50) unsigned;default:'';not null;comment:工号"` + Key int64 `json:"key" gorm:"column:key;type:bigint(50) unsigned;default:0;not null;comment:身份识别"` + Company string `json:"company" gorm:"column:company;type:varchar(255) unsigned;default:'';comment:公司"` + Deparment string `json:"deparment" gorm:"column:deparment;type:varchar(255) unsigned;default:'';comment:部门"` + Job string `json:"job" gorm:"column:job;type:varchar(255) unsigned;default:'';comment:职务"` + EntryTime int64 `json:"entrytime" gorm:"column:entry_time;type:bigint(20) unsigned;default:0;not null;comment:入职时间"` + Leavedate int64 `json:"leavedate" gorm:"column:leavedate;type:bigint(20) unsigned;default:0;not null;comment:离职日期"` + Witness string `json:"witness" gorm:"column:witness;type:varchar(255) unsigned;default:'';comment:证明人"` + WitnessTel string `json:"witnesstel" gorm:"column:witness_tel;type:varchar(255) unsigned;default:'';comment:证明人电话"` + Remarks string `json:"remarks" gorm:"column:remarks;type:text unsigned;default:'';comment:备注"` + Time int64 `json:"time" gorm:"column:time;type:bigint(20) unsigned;default:0;not null;comment:创建时间"` + State int `json:"state" gorm:"column:state;type:int(1) unsigned;default:1;not null;comment:状态(1:启用;2:禁用;3:删除)"` + WorkCont string `json:"workcont" gorm:"column:workcont;type:longtext ;comment:工作内容"` + SuperiorPosition string `json:"superiorPosition" gorm:"column:superior_position;type:varchar(255) unsigned;default:'';comment:上级职务"` + MinionNumber int `json:"minion_number" gorm:"column:minion_number;type:int(5) unsigned;default:1;not null;comment:下属人数"` + CompanyNature string `json:"companyNature" gorm:"column:companyNature;type:varchar(255) unsigned;default:'';comment:公司性质"` + Industry string `json:"industry" gorm:"column:industry;type:varchar(255) unsigned;default:'';comment:所属行业"` } func (WorkHistory *WorkHistory) TableName() string { return "work_history" } -//编辑职务分类内容 +// 编辑职务分类内容 func (cont *WorkHistory) EiteCont(whereMap interface{}, saveData map[string]interface{}) (err error) { err = overall.CONSTANT_DB_HR.Model(&cont).Where(whereMap).Updates(saveData).Error return } -//获取行政组织内容 +// 获取行政组织内容 func (cont *WorkHistory) GetCont(whereMap interface{}, field ...string) (err error) { gormDb := overall.CONSTANT_DB_HR.Model(&cont) if len(field) > 0 { @@ -44,8 +49,15 @@ func (cont *WorkHistory) GetCont(whereMap interface{}, field ...string) (err err return } -//根据条件获取总数 +// 根据条件获取总数 func (cont *WorkHistory) CountCont(whereMap interface{}) (countId int64) { overall.CONSTANT_DB_HR.Model(&cont).Where(whereMap).Count(&countId) return } + +// 删除内容 +func (cont *WorkHistory) DelCont(whereMap interface{}) (err error) { + + err = overall.CONSTANT_DB_HR.Where(whereMap).Delete(&cont).Error + return +} diff --git a/overall/app_config_const.go b/overall/app_config_const.go index 72742d7..82fd73d 100644 --- a/overall/app_config_const.go +++ b/overall/app_config_const.go @@ -7,15 +7,16 @@ import ( "gorm.io/gorm" ) -//全局配置 +// 全局配置 var ( //服务常量 CONSTANT_CONFIG configApp.Server // - CONSTANT_DB_Master *gorm.DB //主数据库 - CONSTANT_DB_Wechat *gorm.DB //微信数据库 - CONSTANT_DB_HR *gorm.DB //微信数据库 - CONSTANT_DB_HR_Jin *gorm.DB //微信数据库 + CONSTANT_DB_Master *gorm.DB //主数据库 + CONSTANT_DB_Wechat *gorm.DB //微信数据库 + CONSTANT_DB_HR *gorm.DB //微信数据库 + CONSTANT_DB_HR_Jin *gorm.DB //微信数据库 + CONSTANT_Personality_Color *gorm.DB //性格色彩 //Redis CONSTANT_REDIS0 *redis.Client CONSTANT_REDIS1 *redis.Client diff --git a/overall/overallhandle/overall_handle.go b/overall/overallhandle/overall_handle.go index be333e5..9051c08 100644 --- a/overall/overallhandle/overall_handle.go +++ b/overall/overallhandle/overall_handle.go @@ -1479,3 +1479,543 @@ func MapToStruct(mapString map[string]string, structInterface interface{}, tag s } return } + +/** +@ 作者: 秦东 +@ 时间: 2024-01-23 10:02:14 +@ 功能: 教育等级 +@ 参数 + #level 等级 +@ 返回值 + # +@ 方法原型 + # +*/ +//'学历(1:初中及以下;2:中专;3:高中;4:中技;5:高技;6:函数专科;7:大学专科;8:函数本科;9:大学本科;10:硕士研究生;11:博士研究生;12:专家、教授)' +func EducationLevel(level int64) string { + switch level { + case 2: + return "中专" + case 3: + return "高中" + case 4: + return "中技" + case 5: + return "高技" + case 6: + return "函授专科" + case 7: + return "大学专科" + case 8: + return "函数本科" + case 9: + return "大学本科" + case 10: + return "硕士研究生" + case 11: + return "博士研究生" + case 12: + return "专家、教授" + default: + return "初中及以下" + } +} + +/* +* +@ 作者: 秦东 +@ 时间: 2024-01-23 10:06:12 +@ 功能: 学位 +@ 参数 + + # + +@ 返回值 + + # + +@ 方法原型 + + # +*/ +func AcademicDegree(level int64) string { + switch level { + case 2: + return "学士" + case 3: + return "硕士" + case 4: + return "博士" + default: + return "无" + } +} + +// 学历类型 +func GetXueWeiClass(level int64) string { + switch level { + case 2: + return "第一学历" + case 3: + return "最高学历" + default: + return "普通" + } +} + +// 政治身份 +// 政治面貌(1:群众;2:无党派;3:台盟会员;4:九三社员;5:致公党员;6:农工党员;7:民进会员;8:民建会员;9:民盟盟员;10:民革会员,11:共青团员;12:预备党员;13:中共党员) +func PoliticalIdentity(level int64) string { + switch level { + case 2: + return "无党派" + case 3: + return "台盟会员" + case 4: + return "九三社员" + case 5: + return "致公党员" + case 6: + return "农工党员" + case 7: + return "民进会员" + case 8: + return "民建会员" + case 9: + return "民盟盟员" + case 10: + return "民革会员" + case 11: + return "共青团员" + case 12: + return "预备党员" + case 13: + return "中共党员" + default: + return "群众" + } +} + +// 星座 +// 星座(1:白羊座;2:金牛座;3:双子座;4:巨蟹座;5:狮子座;6:处女座;7:天枰座;8:天蝎座;9:射手座;10:摩羯座;11:水瓶座;12:双鱼座) +func StarSign(level int64) string { + switch level { + case 2: + return "金牛座" + case 3: + return "双子座" + case 4: + return "巨蟹座" + case 5: + return "狮子座" + case 6: + return "处女座" + case 7: + return "天枰座" + case 8: + return "天蝎座" + case 9: + return "射手座" + case 10: + return "摩羯座" + case 11: + return "水瓶座" + case 12: + return "双鱼座" + default: + return "白羊座" + } +} + +// 健康状况 +func HealthState(level int64) string { + switch level { + case 1: + return "良好" + case 3: + return "较弱" + case 4: + return "有生理缺陷" + case 5: + return "残废" + default: + return "一般" + } +} + +// 婚姻状况 +func MaritalStatus(level int64) string { + switch level { + case 2: + return "已婚" + case 3: + return "丧偶" + case 4: + return "离异" + default: + return "未婚" + } +} + +// 性别 +func GenderStatus(level int64) string { + switch level { + case 1: + return "男" + case 2: + return "女" + case 3: + return "第三性别" + default: + return "未知" + } +} + +// 员工状态 +// 用工关系(1:临时工 , 2:编外人员 ;3:实习&实习生;4:试用员工;5:待分配;6:待岗;7:临时调入;8:正式员工;9:长期病假;10:停薪留职;11:退休;12:辞职;13:辞退;14:离职) +func EmpTypeStatus(level int64) string { + switch level { + case 2: + return "编外人员" + case 3: + return "实习&实习生" + case 4: + return "试用员工" + case 5: + return "待分配" + case 6: + return "待岗" + case 7: + return "临时调入" + case 8: + return "正式员工" + case 9: + return "长期病假" + case 10: + return "停薪留职" + case 11: + return "退休" + case 12: + return "辞职" + case 13: + return "辞退" + case 14: + return "离职" + default: + return "临时工" + } +} + +// 学历类型 +func EducationType(level int64) string { + switch level { + case 1: + return "全日制统招" + case 2: + return "成人高考" + case 3: + return "自学考试" + case 4: + return "开放大学" + case 5: + return "网络教育" + case 6: + return "函授" + default: + return "" + } +} + +// 学历类型 +func EducationTypeAll(level int64) string { + switch level { + case 1: + return "全日制统招学历" + case 2: + return "成人高考学历" + case 3: + return "自学考试学历" + case 4: + return "开放大学学历" + case 5: + return "网络教育学历" + case 6: + return "函授学历" + default: + return "" + } +} + +//取最大值 + +func GetMaxNum[T GenericityVariableInt](ary []T) T { + if len(ary) == 0 { + return 0 + } + + maxVal := ary[0] + for i := 1; i < len(ary); i++ { + if maxVal < ary[i] { + maxVal = ary[i] + } + } + + return maxVal +} + +// 判断文件上传的TYPE +func JudgeUpFileType(extTage string) int { + images := []string{".jpg", ".jpeg", ".png", ".gif", ".bmp", ".avif", ".webp", ".tif", ".pcx", ".tga", ".exif", ".fpx", ".svg", ".psd", ".cdr", ".pcd", ".dxf", ".ufo", ".hdri", ".eps", ".flic", ".ai", ".ico", ".emf", ".raw", ".WMF", ".avif", ".apng", ".Webp", ".BMP", ".PCX", ".TIF", ".GIF", ".JPEG", ".JPG", ".TGA", ".EXIF", ".FPX", ".SVG", ".PSD", ".CDR", ".PCD", ".DXF", ".UFO", ".EPS", ".AI", ".PNG", ".HDRI", ".RAW", ".WMF", ".FLIC", ".EMF", ".APNG", ".ICO"} + videoExt := []string{".mp4", ".avi", ".3gp", ".flv", ".rm", ".rmvb", ".wmv", ".mpeg", ".mpeg1", ".mpeg2", ".divx", ".xvid", ".dv", ".mkv", ".asf", ".asx", ".mov", ".m4v", ".dat", ".mkv", ".vob", ".ogg", ".mod", ".MP4", ".3GP", ".AVI", ".RM", ".RMVB", ".WMV", ".MPEG", ".MPEG1", ".MPEG2", ".DivX", ".XVID", ".DV", ".MKV", ".MOV", ".OGG", ".MOD", ".M4V", ".DAT", ".VOB"} + officeExt := []string{".doc", ".docx", ".xml", ".ppt", ".pptx", ".pot", ".PPS", ".dot", ".mht", ".xlt"} + zipExt := []string{".rar", ".zip", ".7z", ".ar", ".bz", ".car", ".dar", ".cpgz", ".f", ".ha"} + excel := []string{".xls", ".xlsx", "csv"} + if IsInTrue[string](extTage, images) { + return 1 + } + if IsInTrue[string](extTage, videoExt) { + return 2 + } + if IsInTrue[string](extTage, officeExt) { + return 3 + } + if IsInTrue[string](extTage, zipExt) { + return 4 + } + if IsInTrue[string](extTage, excel) { + return 5 + } + return 6 +} + +/* +* +@ 作者: 秦东 +@ 时间: 2024-01-29 13:12:16 +@ 功能: 院校类型 +@ 参数 + + # + +@ 返回值 + + # + +@ 方法原型 + + # +*/ +func SchoolType(level int) string { + var typeName string + switch level { + case 1: + typeName = "私立中学" + case 2: + typeName = "公立中学" + case 3: + typeName = "高职院校" + case 4: + typeName = "民办专科院校" + case 5: + typeName = "公办专科院校" + case 6: + typeName = "民办本科院校" + case 7: + typeName = "公办本科院校" + case 8: + typeName = "”211“工程院校" + case 9: + typeName = "”985“工程院校" + case 10: + typeName = ":双一流院校" + default: + typeName = "" + } + return typeName +} + +// 职位变动类型 +func PositionChangeType(level int64) string { + switch level { + case 2: + return "平调" + case 3: + return "降职" + case 4: + return "升职" + default: + return "新入职" + } +} + +// 雇佣类型(1:社会招聘;2:校园招聘;3:内部推荐) +func JoinJobChanelStr(hir int) string { + switch hir { + case 2: + return "校园招聘" + case 3: + return "内部推荐" + default: + return "社会招聘" + } +} + +// 获取所有下级 +func (g *GetOrgAllParent) GetOrgSonAllId(orgId int64) { + var orgAry []int64 + if orgId != 0 { + err := overall.CONSTANT_DB_HR.Model(&models.AdministrativeOrganization{}).Select("`id`").Where("`state` = 1 AND `superior` = ?", orgId).Find(&orgAry).Error + if err != nil { + return + } + for _, v := range orgAry { + if !IsInTrue[int64](v, g.Id) { + g.Id = append(g.Id, v) + g.GetOrgSonAllId(v) + } else { + g.GetOrgSonAllId(v) + } + } + } + +} + +/* +* +@ 作者: 秦东 +@ 时间: 2024-01-30 16:23:36 +@ 功能: Excel 5位时间转换 +@ 参数 + + # + +@ 返回值 + + # + +@ 方法原型 + + # +*/ +func ExcelDateToDate(excelDate string) time.Time { + excelTime := time.Date(1899, time.December, 30, 0, 0, 0, 0, time.UTC) + var days, _ = strconv.ParseFloat(excelDate, 64) + return excelTime.Add(time.Second * time.Duration(days*86400)) +} + +/* +* +@ 作者: 秦东 +@ 时间: 2024-02-01 13:17:23 +@ 功能: 职务变动对照 +*/ +func changeTypeToStr(emp int) string { + switch emp { + case 1: + return "预入职" + case 2: + return "雇佣入职" + case 3: + return "转正" + case 4: + return "升职" + case 5: + return "降职" + case 6: + return "职等调整" + case 7: + return "调动调入" + case 8: + return "跨公司调动调入" + case 9: + return "借调" + case 10: + return "平调" + case 11: + return "兼职" + case 12: + return "预离职" + case 13: + return "离职" + case 14: + return "退休" + case 15: + return "返聘" + case 16: + return "员工初始化" + case 17: + return "擅自离职" + case 18: + return "即辞即走" + case 19: + return "组织调整" + case 20: + return "辞退" + case 21: + return "跨公司借调调出" + case 22: + return "跨公司借调调入" + case 23: + return "培训期间离职" + case 24: + return "合同到期" + case 25: + return "实习结束" + case 26: + return "新入职" + default: + return "预入职" + } +} + +// 奖惩级别 +func RewPunLevel(level int) string { + switch level { + case 1: + return "部门级" + case 2: + return "公司级" + case 3: + return "县级" + case 4: + return "市级" + case 5: + return "省级" + case 6: + return "国家级" + default: + return "" + } +} +func RewPunLevelClass(emp int) string { + switch emp { + case 1: + return "年终评优" + case 2: + return "表扬" + case 3: + return "嘉奖" + case 4: + return "记功" + case 5: + return "记大功" + case 6: + return "特别奖励" + case 7: + return "批评" + case 8: + return "警告" + case 9: + return "记过" + case 10: + return "记大过" + case 11: + return "降级" + case 12: + return "留用察看" + case 13: + return "开除" + default: + return "" + } +} diff --git a/overall/overallhandle/type.go b/overall/overallhandle/type.go index 5b110a7..99b4462 100644 --- a/overall/overallhandle/type.go +++ b/overall/overallhandle/type.go @@ -74,6 +74,9 @@ type MenuPermitThree struct { type GenericityVariable interface { int | int8 | int16 | int32 | int64 | string } +type GenericityVariableInt interface { + int | int8 | int16 | int32 | int64 | float32 | float64 +} //所有子集 type AllSunList[T GenericityVariable] struct { @@ -105,3 +108,8 @@ type DateTimeTotimes struct { AllTime int64 `json:"alltime"` Time string `json:"time"` } + +// 获取行政组织所有ID +type GetOrgAllParent struct { + Id []int64 `json:"id"` +} diff --git a/scheduledtask/time_task.go b/scheduledtask/time_task.go index f47657c..ef3189a 100644 --- a/scheduledtask/time_task.go +++ b/scheduledtask/time_task.go @@ -3,6 +3,7 @@ package scheduledtask import ( "fmt" "hr_server/api/jindie_docking/dockingorganization" + "hr_server/api/version1/workWechat" "hr_server/overall/overallhandle" "time" @@ -51,6 +52,158 @@ func TimeTask() { overallhandle.WriteLog("t", "结束执行职位对照") }) //每天0时15分执行 + c.AddFunc("0 0 2 * * *", func() { + overallhandle.WriteLog("t", "开始执行企业微信信息对照(高管)") + dockingorganization.Position() + md5Token := "WorkWechatUpdatePeopleInfo" + errWechat := workWechat.UpdateWechatOrgPeople(48, "txl", md5Token, 1) + overallhandle.WriteLog("t", "结束执行企业微信信息对照(高管)", errWechat) + + }) //每天2时分执行 + c.AddFunc("0 5 2 * * *", func() { + overallhandle.WriteLog("t", "开始执行企业微信信息对照(综合办)") + dockingorganization.Position() + md5Token := "WorkWechatUpdatePeopleInfo" + errWechat := workWechat.UpdateWechatOrgPeople(49, "txl", md5Token, 1) + overallhandle.WriteLog("t", "结束执行企业微信信息对照(综合办)", errWechat) + + }) //每天2时5分执行 + c.AddFunc("0 10 2 * * *", func() { + overallhandle.WriteLog("t", "开始执行企业微信信息对照(人资部)") + dockingorganization.Position() + md5Token := "WorkWechatUpdatePeopleInfo" + errWechat := workWechat.UpdateWechatOrgPeople(50, "txl", md5Token, 1) + overallhandle.WriteLog("t", "结束执行企业微信信息对照(人资部)", errWechat) + + }) //每天2时10分执行 + c.AddFunc("0 12 2 * * *", func() { + overallhandle.WriteLog("t", "开始执行企业微信信息对照(企管部)") + dockingorganization.Position() + md5Token := "WorkWechatUpdatePeopleInfo" + errWechat := workWechat.UpdateWechatOrgPeople(51, "txl", md5Token, 1) + overallhandle.WriteLog("t", "结束执行企业微信信息对照(企管部)", errWechat) + + }) //每天2时12分执行 + c.AddFunc("0 15 2 * * *", func() { + overallhandle.WriteLog("t", "开始执行企业微信信息对照(财务部)") + dockingorganization.Position() + md5Token := "WorkWechatUpdatePeopleInfo" + errWechat := workWechat.UpdateWechatOrgPeople(52, "txl", md5Token, 1) + overallhandle.WriteLog("t", "结束执行企业微信信息对照(财务部)", errWechat) + + }) //每天2时15分执行 + c.AddFunc("0 20 2 * * *", func() { + overallhandle.WriteLog("t", "开始执行企业微信信息对照(营销部)") + dockingorganization.Position() + md5Token := "WorkWechatUpdatePeopleInfo" + errWechat := workWechat.UpdateWechatOrgPeople(53, "txl", md5Token, 1) + overallhandle.WriteLog("t", "结束执行企业微信信息对照(营销部)", errWechat) + + }) //每天2时20分执行 + c.AddFunc("0 22 2 * * *", func() { + overallhandle.WriteLog("t", "开始执行企业微信信息对照(生产部)") + dockingorganization.Position() + md5Token := "WorkWechatUpdatePeopleInfo" + errWechat := workWechat.UpdateWechatOrgPeople(54, "txl", md5Token, 1) + overallhandle.WriteLog("t", "结束执行企业微信信息对照(生产部)", errWechat) + + }) //每天2时22分执行 + c.AddFunc("0 25 2 * * *", func() { + overallhandle.WriteLog("t", "开始执行企业微信信息对照(质检中心)") + dockingorganization.Position() + md5Token := "WorkWechatUpdatePeopleInfo" + errWechat := workWechat.UpdateWechatOrgPeople(55, "txl", md5Token, 1) + overallhandle.WriteLog("t", "结束执行企业微信信息对照(质检中心)", errWechat) + + }) //每天2时25分执行 + c.AddFunc("0 27 2 * * *", func() { + overallhandle.WriteLog("t", "开始执行企业微信信息对照(保卫部)") + dockingorganization.Position() + md5Token := "WorkWechatUpdatePeopleInfo" + errWechat := workWechat.UpdateWechatOrgPeople(57, "txl", md5Token, 1) + overallhandle.WriteLog("t", "结束执行企业微信信息对照(保卫部)", errWechat) + + }) //每天2时27分执行 + c.AddFunc("0 30 2 * * *", func() { + overallhandle.WriteLog("t", "开始执行企业微信信息对照(技术部)") + dockingorganization.Position() + md5Token := "WorkWechatUpdatePeopleInfo" + errWechat := workWechat.UpdateWechatOrgPeople(145, "txl", md5Token, 1) + overallhandle.WriteLog("t", "结束执行企业微信信息对照(技术部)", errWechat) + + }) //每天2时30分执行 + c.AddFunc("0 32 2 * * *", func() { + overallhandle.WriteLog("t", "开始执行企业微信信息对照(安环部)") + dockingorganization.Position() + md5Token := "WorkWechatUpdatePeopleInfo" + errWechat := workWechat.UpdateWechatOrgPeople(56, "txl", md5Token, 1) + overallhandle.WriteLog("t", "结束执行企业微信信息对照(安环部)", errWechat) + + }) //每天2时32分执行 + c.AddFunc("0 34 2 * * *", func() { + overallhandle.WriteLog("t", "开始执行企业微信信息对照(备煤车间)") + dockingorganization.Position() + md5Token := "WorkWechatUpdatePeopleInfo" + errWechat := workWechat.UpdateWechatOrgPeople(306, "txl", md5Token, 1) + overallhandle.WriteLog("t", "结束执行企业微信信息对照(备煤车间)", errWechat) + + }) //每天2时34分执行 + c.AddFunc("0 44 2 * * *", func() { + overallhandle.WriteLog("t", "开始执行企业微信信息对照(机焦车间)") + dockingorganization.Position() + md5Token := "WorkWechatUpdatePeopleInfo" + errWechat := workWechat.UpdateWechatOrgPeople(307, "txl", md5Token, 1) + overallhandle.WriteLog("t", "结束执行企业微信信息对照(机焦车间)", errWechat) + + }) //每天2时44分执行 + c.AddFunc("0 54 2 * * *", func() { + overallhandle.WriteLog("t", "开始执行企业微信信息对照(化产分厂)") + dockingorganization.Position() + md5Token := "WorkWechatUpdatePeopleInfo" + errWechat := workWechat.UpdateWechatOrgPeople(59, "txl", md5Token, 1) + overallhandle.WriteLog("t", "结束执行企业微信信息对照(化产分厂)", errWechat) + + }) //每天2时54分执行 + c.AddFunc("0 59 2 * * *", func() { + overallhandle.WriteLog("t", "开始执行企业微信信息对照(甲醇分厂)") + dockingorganization.Position() + md5Token := "WorkWechatUpdatePeopleInfo" + errWechat := workWechat.UpdateWechatOrgPeople(61, "txl", md5Token, 1) + overallhandle.WriteLog("t", "结束执行企业微信信息对照(甲醇分厂)", errWechat) + + }) //每天2时59分执行 + c.AddFunc("0 10 3 * * *", func() { + overallhandle.WriteLog("t", "开始执行企业微信信息对照(动力分厂)") + dockingorganization.Position() + md5Token := "WorkWechatUpdatePeopleInfo" + errWechat := workWechat.UpdateWechatOrgPeople(60, "txl", md5Token, 1) + overallhandle.WriteLog("t", "结束执行企业微信信息对照(动力分厂)", errWechat) + + }) //每天3时10分执行 + c.AddFunc("0 20 3 * * *", func() { + overallhandle.WriteLog("t", "开始执行企业微信信息对照(电仪分厂)") + dockingorganization.Position() + md5Token := "WorkWechatUpdatePeopleInfo" + errWechat := workWechat.UpdateWechatOrgPeople(181, "txl", md5Token, 1) + overallhandle.WriteLog("t", "结束执行企业微信信息对照(电仪分厂)", errWechat) + + }) //每天3时20分执行 + c.AddFunc("0 25 3 * * *", func() { + overallhandle.WriteLog("t", "开始执行企业微信信息对照(仓储中心)") + dockingorganization.Position() + md5Token := "WorkWechatUpdatePeopleInfo" + errWechat := workWechat.UpdateWechatOrgPeople(73, "txl", md5Token, 1) + overallhandle.WriteLog("t", "结束执行企业微信信息对照(仓储中心)", errWechat) + + }) //每天3时25分执行 + c.AddFunc("0 26 3 * * *", func() { + overallhandle.WriteLog("t", "开始执行企业微信信息对照(物流中心)") + dockingorganization.Position() + md5Token := "WorkWechatUpdatePeopleInfo" + errWechat := workWechat.UpdateWechatOrgPeople(76, "txl", md5Token, 1) + overallhandle.WriteLog("t", "结束执行企业微信信息对照(物流中心)", errWechat) + + }) //每天3时26分执行 //启动 c.Start() //设定全部执行后,最后关闭定时任务