Browse Source

完成表格上传内容

v2_dev
超级管理员 2 years ago
parent
commit
37688a6011
  1. BIN
      api/version1/personnelapi/__debug_bin.exe
  2. 112
      api/version1/personnelapi/controll.go
  3. 23
      api/version1/personnelapi/kingdeeempty.go
  4. 103
      api/version1/personnelapi/kingdeenew.go
  5. 61
      api/version1/personnelapi/staffarchives.go
  6. 64
      api/version1/personnelapi/type.go
  7. 25
      api/version1/personnelapi/types.go
  8. 1887
      api/version1/personnelapi/uploadfile.go
  9. 448
      api/version1/personnelapi/userarchives.go
  10. 91
      api/version1/workWechat/method.go
  11. 144
      api/version1/workWechat/type.go
  12. 65
      api/version1/workWechat/typeApi.go
  13. 556
      api/version1/workWechat/wechat.go
  14. 415
      api/version1/workWechat/wechatApi.go
  15. 10
      apirouter/personnel/people.go
  16. 20
      apirouter/workWechatRouter/router.go
  17. 14
      config/configApp/appConfig.yaml
  18. 2
      config/configApp/server.go
  19. 7
      config/configDatabase/database.go
  20. 15
      config/configDatabase/database.yaml
  21. 161
      devlog.md
  22. 14
      go.mod
  23. 19
      go.sum
  24. BIN
      hr_server.exe
  25. 9
      initialization/databaseinit/mysql.go
  26. 310
      middleware/wxbizjsonmsgcrypt/wxbizjsonmsgcrypt.go
  27. 315
      middleware/wxbizmsgcrypt/wxbizmsgcrypt.go
  28. 46
      models/academictitle.go
  29. 44
      models/certificate_honors.go
  30. 16
      models/double_worker.go
  31. 15
      models/emergency_contact.go
  32. 15
      models/family_members.go
  33. 47
      models/inside_work_history.go
  34. 6
      models/job_class.go
  35. 3
      models/man_cont.go
  36. 40
      models/meritslog.go
  37. 52
      models/personalityColor/charcolortest.go
  38. 2
      models/personarchives.go
  39. 11
      models/personnel_content.go
  40. 13
      models/personnel_education.go
  41. 63
      models/political_identity.go
  42. 43
      models/rewards_penalties.go
  43. 62
      models/veterans.go
  44. 46
      models/work_history.go
  45. 11
      overall/app_config_const.go
  46. 540
      overall/overallhandle/overall_handle.go
  47. 8
      overall/overallhandle/type.go
  48. 153
      scheduledtask/time_task.go

BIN
api/version1/personnelapi/__debug_bin.exe

Binary file not shown.

112
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
}
}

23
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
}

103
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)

61
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

64
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"`
}

25
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"`
}

1887
api/version1/personnelapi/uploadfile.go

File diff suppressed because it is too large

448
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
}

91
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
}

144
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"`
}

65
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"`
}

556
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
}

415
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)
}

10
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) //解析上传的人员信息表格
}
}

20
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更新企业微信人员数据
}
}

14
config/configApp/appConfig.yaml

@ -37,4 +37,16 @@ wechatkpi:
agentid: 1000036
secret: 'J83SKVK9QCdQs_fTjPWUx3ouqucrHf_EwxtQUlY0fQk'
token: 'kkUA3s2s3' #Token
encodingaeskey: 'ZI29of85mTgQPik8LLjDnYKlAECDbI23Pq886VJ9Azf' #EncodingAESKey
encodingaeskey: 'ZI29of85mTgQPik8LLjDnYKlAECDbI23Pq886VJ9Azf' #EncodingAESKey
#个人资料
employeefile:
agentid: 1000083
secret: 'IPetRDqicfUGKCEoM4wnPMCB7gzBSmkXJdvjOxoiovQ'
token: 'kkUA3s2s3' #Token
encodingaeskey: 'ZI29of85mTgQPik8LLjDnYKlAECDbI23Pq886VJ9Azf'
#通讯录
addressbook:
agentid: 0
secret: 'yjcQXkh6_116QKjfZfbRSyzdrFFZ9jbVlKJtL2tn3OU'
token: 'kkUA3s2s3' #Token
encodingaeskey: 'ZI29of85mTgQPik8LLjDnYKlAECDbI23Pq886VJ9Azf'

2
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"` //通讯录
}
//服务配置详情

7
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 {

15
config/configDatabase/database.yaml

@ -63,4 +63,17 @@ hrdatabasejin:
name: 'human_resources' #数据库名称
max_idle_conns: 100 #最大空闲数量
max_open_conns: 1500 #最大打开数量
gorm_log: true #是否开启gorm日志
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日志

161
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:国家级)';
```

14
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
)

19
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=

BIN
hr_server.exe

Binary file not shown.

9
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)
}
}

310
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
}

315
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
}

46
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
}

44
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
}

16
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
}

15
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
}

15
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
}

47
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
}

6
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 {

3
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 {

40
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
}

52
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
}

2
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 {

11
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)

13
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
}

63
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
}

43
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
}

62
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
}

46
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
}

11
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

540
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 ""
}
}

8
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"`
}

153
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()
//设定全部执行后,最后关闭定时任务

Loading…
Cancel
Save