Compare commits

...

14 Commits
master ... v2

  1. 183
      README.md
  2. 124
      api/empower/authorize/empower.go
  3. 63
      api/empower/authorize/type.go
  4. 9
      api/empower/inlet.go
  5. 682
      api/jindie_docking/dockingorganization/controller.go
  6. 24
      api/jindie_docking/dockingorganization/getposturl.go
  7. 60
      api/jindie_docking/dockingorganization/type.go
  8. 9
      api/jindie_docking/inlet.go
  9. 27
      api/version1/administrativeorganization/govcont.go
  10. 12
      api/version1/administrativeorganization/job_class.go
  11. 114
      api/version1/administrativeorganization/position.go
  12. 184
      api/version1/administrativeorganization/team.go
  13. 38
      api/version1/administrativeorganization/type.go
  14. 10
      api/version1/inlet.go
  15. 43
      api/version1/permitpowerapi/menu_permit.go
  16. 47
      api/version1/permitpowerapi/position_permit.go
  17. 23
      api/version1/permitpowerapi/type.go
  18. BIN
      api/version1/personnelapi/__debug_bin.exe
  19. 281
      api/version1/personnelapi/controll.go
  20. 824
      api/version1/personnelapi/kingdee.go
  21. 1714
      api/version1/personnelapi/kingdeenew.go
  22. 1334
      api/version1/personnelapi/staff.go
  23. 1550
      api/version1/personnelapi/staffarchives.go
  24. 448
      api/version1/personnelapi/type.go
  25. 113
      api/version1/personnelapi/types.go
  26. 305
      api/version1/shiyan/shiyan.go
  27. 78
      api/version1/shiyan/type.go
  28. 19
      apirouter/dockingjindie/jindie.go
  29. 3
      apirouter/dockingjindie/type.go
  30. 19
      apirouter/empowerrote/empowerroter.go
  31. 3
      apirouter/empowerrote/type.go
  32. 17
      apirouter/inlet.go
  33. 11
      apirouter/organization/organization_group.go
  34. 20
      apirouter/permit/permit.go
  35. 4
      apirouter/permit/type.go
  36. 99
      apirouter/personnel/people.go
  37. 5
      apirouter/personnel/type.go
  38. 20
      apirouter/shiyanrouter/shiyan.go
  39. 3
      apirouter/shiyanrouter/type.go
  40. 9
      config/configApp/appConfig.yaml
  41. 15
      config/configApp/server.go
  42. 5
      config/configDatabase/database.go
  43. 13
      config/configDatabase/database.yaml
  44. 21
      config/configJson/org.json
  45. 4
      config/configNosql/redis.go
  46. 11
      config_server/configApp/appConfig.yaml
  47. 22
      config_server/configApp/server.go
  48. 72
      config_server/configDatabase/database.go
  49. 54
      config_server/configDatabase/database.yaml
  50. 21
      config_server/configJson/org.json
  51. 41
      config_server/configNosql/redis.go
  52. 41
      config_server/configNosql/redis.yaml
  53. 3
      go.mod
  54. 2
      go.sum
  55. 380
      grocerystore/redis.go
  56. BIN
      hr_server.exe
  57. 173
      identification/authentication.go
  58. 8
      identification/type.go
  59. 7
      initialization/databaseinit/mysql.go
  60. 4
      initialization/nosql/redis.go
  61. 39
      initialization/route/route_entry.go
  62. 501
      log/202206/20220603.log
  63. 980
      log/202206/20220604.log
  64. 35
      log/202206/20220605.log
  65. 15
      log/202206/20220606.log
  66. 83
      log/202206/20220607.log
  67. 504
      log/202206/20220608.log
  68. 23
      log/202206/20220609.log
  69. 502
      log/202206/20220616.log
  70. 525
      log/202206/20220617.log
  71. 525
      log/202206/20220618.log
  72. 35
      log/202206/20220619.log
  73. 15
      log/202206/20220620.log
  74. 31
      log/202206/20220621.log
  75. 509
      log/202206/20220622.log
  76. 2013
      log/202206/20220623.log
  77. 15
      log/202206/20220624.log
  78. 16
      log/202206/20220625.log
  79. 15
      log/202206/20220626.log
  80. 15
      log/202206/20220627.log
  81. 15
      log/202206/20220628.log
  82. 15
      log/202206/20220629.log
  83. 3
      log/202206/20220630.log
  84. 12
      log/202207/20220701.log
  85. 15
      log/202207/20220702.log
  86. 3
      log/202207/20220703.log
  87. 5
      main.go
  88. 38
      middleware/snowflake/snowflake.go
  89. 21
      middleware/snowflake/type.go
  90. 16
      models/administrative_organization.go
  91. 11
      models/administrative_organization_type.go
  92. 42
      models/double_worker.go
  93. 33
      models/duties.go
  94. 37
      models/duties_class_leve.go
  95. 46
      models/emergency_contact.go
  96. 46
      models/empoweruser.go
  97. 46
      models/family_members.go
  98. 48
      models/inside_work_history.go
  99. 39
      models/inside_work_view.go
  100. 27
      models/job_class.go

183
README.md

@ -2,17 +2,19 @@
```Project
|—— api
| └── version1
└── version1
└── empower
|—— router
|—— initialization
| └── database
| └── nosql
| └── app
| └── route
└── database
└── nosql
└── app
└── route
|identification
|—— config
| └── database
| └── nosql
| └── app
└── database
└── nosql
└── app
|—— models
|—— overall
|—— middleware
@ -23,12 +25,14 @@
|--------- |------ |-----|
| `api` | api相关业务 | api业务实现 |
| `--version1` | 业务版本文件夹 | 版本界定 |
| `--empower` |OAuth 2.0 授权 |授权Token|
| `router` | 路由器 | 业务路由设定 |
| `initialization` | 初始化相关业务 | 系统初始化方面的实现 |
| `--database` | 数据库业务 | 数据库业务初始化实现 |
| `--nosql` | nosql数据库业务 | nosql业务初始化实现(例:Redis) |
| `--app` | app数据库业务 | app业务初始化实现 |
| `--route` | 路由初始化 | 路由初始化 |
| `identification` | 授权验证器 | 授权验证器 |
| `config` | 系统配置相关业务 | 系统系统配置方面的实现 |
| `--database` | 数据库业务 | 数据库业务系统配置实现 |
| `--nosql` | nosql数据库业务 | nosql业务系统配置实现(例:Redis) |
@ -37,4 +41,167 @@
| `overall` | 全局对象 | 全局对象|
| `middleware` | 中间件 | 中间件 |
## 加密规则
```
1、分解步骤
one = md5(CodeString)+md5(AppKey)
two = md5(one)+AppKey
therr = md5(two)
2、合并
md5(md5(md5(CodeString)+md5(AppKey))+AppKey)
```
## 接口访问规则
1、以POST方式访问 http://xxxx/empower/gaintoken
#### 参数
```json
{
"username":"jindie",
"password":"jindie123"
}
```
| 参数 | 说明 |
|---------|---------|
| username | 账号 |
| password | 密码 |
#### 返回值
```json
{
"code": 0,
"msg": "成功",
"data": {
"token": "6235a9de7109ba50852f3f9d3b3052ae",
"number": "16534571868477"
}
}
```
| 参数 | 说明 | |
|---------|---------|---------|
| code | | 状态码 |
| msg | | 信息 |
| data | | 附加值 |
| | token | Token(有效时间为180分钟) |
| | number | 随机数 |
1、以POST方式访问 http://xxxx/接口
#### Header参数
| 参数 | 说明 |
|---------|---------|
| token | 获取到得参数 |
| number | 加密后得随机数(参考加密规则) |
| Content-Type | 内容类型 |
| Origin | 站点信息 |
| User-Agent | 用户代理 |
#### Body参数 (接口需要得添加参数)
```json
{
"page":"1",
"pagesize":"20"
}
```
| 参数 | 说明 |
|---------|---------|
| page | 页码 |
| pagesize | 每页显示多少条 |
#### 返回值
```json
{
"code": 0,
"msg": "成功",
"data": {
"count": 20,
"page": 1,
"pageSize": 20,
"total": 1147,
"list": []
}
}
```
| 参数 | 说明 | |
|---------|---------|---------|
| code | | 状态码 |
| msg | | 信息 |
| data | | 附加值 |
| | count | 本页共多少数据 |
| | page | 当前页码 |
| | pageSize | 每页显示多少条 |
| | .... | .... |
## 视图说明
| 视图名 | 说明 |
|---------|---------|
| duties_class_leve | 职务及类别和等级 |
| org_cont_type | 行政组织及类别 |
## Log
```
2022.04.19 建立人员信息相关数据模型
2022.04.20 处理员工档案的增删改查
```
```
2022.06.13
创建人员档案主表
```
```mysql
CREATE TABLE `person_archives` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`number` varchar(30) NOT NULL DEFAULT '' COMMENT '工号',
`name` varchar(50) NOT NULL DEFAULT '',
`icon` varchar(255) DEFAULT '' COMMENT '头像',
`hire_class` tinyint(1) unsigned NOT NULL DEFAULT '1' COMMENT '雇佣类型(1:雇佣入职;2:再入职;)',
`emp_type` tinyint(1) unsigned NOT NULL DEFAULT '1' COMMENT '用工关系(1:实习生;2:待分配;3:试用员工;4:正式员工;5:停薪留职;6:退休;7:辞退;8:离职)',
`company` bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT '入职公司',
`maindeparment` bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT '主部门',
`deparment` text COMMENT '部门',
`admin_org` bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT '所属行政组织',
`position` bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT '职位',
`job_class` bigint(20) unsigned DEFAULT '2' COMMENT '职务分类',
`job_id` bigint(20) unsigned DEFAULT '0' COMMENT '职务',
`job_leve` bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT '职务等级',
`time` bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT '写入时间',
`eite_time` bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT '编辑时间',
`wechat` varchar(255) DEFAULT '' COMMENT '微信UserId',
`work_wechat` varchar(255) DEFAULT '' COMMENT '企业微信UserId',
`state` tinyint(1) unsigned NOT NULL DEFAULT '1' COMMENT '状态(1:启用;2:禁用;3:删除)',
`key` bigint(50) unsigned NOT NULL DEFAULT '0' COMMENT 'key',
`is_admin` tinyint(1) unsigned NOT NULL DEFAULT '1' COMMENT '是否为管理员(1:不是;2:分公司;3:集团管理员;4:超级管)',
`password` varchar(255) DEFAULT '' COMMENT '密码',
`role` longtext COMMENT '角色',
PRIMARY KEY (`id`) USING BTREE,
KEY `number` (`number`) USING BTREE,
KEY `position` (`position`,`admin_org`,`company`) USING BTREE,
KEY `key` (`key`) USING BTREE,
FULLTEXT KEY `deparment` (`deparment`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC COMMENT='员工档案(主)';
```
```
2022.06.14
人员主表写入
人员附表写入
双职工表编辑与写入
紧急联系人
员工家属
```

124
api/empower/authorize/empower.go

@ -0,0 +1,124 @@
package authorize
import (
"fmt"
"hr_server/grocerystore"
"hr_server/models"
"hr_server/overall"
"hr_server/overall/overallhandle"
"strconv"
"github.com/gin-gonic/gin"
)
//授权
func (e *EmpowerApi) GainToken(c *gin.Context) {
ContentType := c.Request.Header.Get("Content-Type")
Origin := c.Request.Header.Get("Origin")
userAgent := c.Request.Header.Get("User-Agent")
var requestData gainAuthorize
err := c.ShouldBindJSON(&requestData)
if err != nil {
overallhandle.Result(100, err, c)
return
}
if ContentType == "" || userAgent == "" || Origin == "" {
overallhandle.Result(100, err, c)
return
}
if requestData.UserNumber == "" || requestData.Password == "" {
overallhandle.Result(101, err, c)
return
}
//密码加密
var passwordMd5 overallhandle.Md5Encryption
passwordMd5.Md5EncryptionInit(requestData.Password)
passwordMd5Str := passwordMd5.Md5EncryptionAlgorithm()
var empowerUser models.EmpowerUser
userErr := empowerUser.GetCont(map[string]interface{}{"userkey": requestData.UserNumber, "password": passwordMd5Str}, "verification_code")
if userErr != nil {
overallhandle.Result(2000, passwordMd5Str, c)
return
}
//获取随机数
randCode := strconv.FormatInt(overallhandle.TableNumber(), 10)
// randCode := strconv.FormatInt(16557925694780, 10)
//头文件加密
//ContentType
var ContentTypeMd5 overallhandle.Md5Encryption
ContentTypeMd5.Md5EncryptionInit(ContentType)
if empowerUser.VerificationCode != "" {
ContentTypeMd5.AppKey = empowerUser.VerificationCode
}
fmt.Printf("ContentTypeMd5Str ----->%v\n", ContentTypeMd5)
ContentTypeMd5Str := ContentTypeMd5.Md5EncryptionAlgorithm()
//Origin
var OriginMd5 overallhandle.Md5Encryption
OriginMd5.Md5EncryptionInit(Origin)
if empowerUser.VerificationCode != "" {
OriginMd5.AppKey = empowerUser.VerificationCode
}
originMd5Str := OriginMd5.Md5EncryptionAlgorithm()
//userAgent
var userAgentMd5 overallhandle.Md5Encryption
userAgentMd5.Md5EncryptionInit(userAgent)
if empowerUser.VerificationCode != "" {
userAgentMd5.AppKey = empowerUser.VerificationCode
}
userAgentMd5Str := userAgentMd5.Md5EncryptionAlgorithm()
//随机数加密
var randomNumberMd5 overallhandle.Md5Encryption
randomNumberMd5.Md5EncryptionInit(randCode)
if empowerUser.VerificationCode != "" {
randomNumberMd5.AppKey = empowerUser.VerificationCode
}
numberMd5 := randomNumberMd5.Md5EncryptionAlgorithm()
//用户名加密
var userKeyMd5 overallhandle.Md5Encryption
userKeyMd5.Md5EncryptionInit(requestData.UserNumber)
if empowerUser.VerificationCode != "" {
userKeyMd5.AppKey = empowerUser.VerificationCode
}
userKeyMd5Str := userKeyMd5.Md5EncryptionAlgorithm()
clearCodeToken := fmt.Sprintf("%v-%v-%v-%v-%v-%v", ContentTypeMd5Str, originMd5Str, userAgentMd5Str, numberMd5, userKeyMd5Str, passwordMd5Str)
fmt.Printf("redisKey---->ContentTypeMd5Str:%v-originMd5Str:%v-userAgentMd5Str:%v-numberMd5:%v-userKeyMd5Str:%v-passwordMd5Str:%v\n", ContentTypeMd5Str, originMd5Str, userAgentMd5Str, numberMd5, userKeyMd5Str, passwordMd5Str)
//token 加密
var tokenMd5 overallhandle.Md5Encryption
tokenMd5.Md5EncryptionInit(clearCodeToken)
if empowerUser.VerificationCode != "" {
tokenMd5.AppKey = empowerUser.VerificationCode
}
fmt.Printf("tokenMd5Appk ----->%v\n", tokenMd5)
tokenMd5Str := tokenMd5.Md5EncryptionAlgorithm()
//设定redis Key名称
redisKey := fmt.Sprintf("Authentication:ApiAuthent_%v", tokenMd5Str)
saveTokenRedis := overallhandle.MapOut()
saveTokenRedis["number"] = randCode
saveTokenRedis["userkey"] = requestData.UserNumber
saveTokenRedis["password"] = requestData.Password
//将验证信息写入Redis
redisClient := grocerystore.RunRedis(overall.CONSTANT_REDIS3)
redisClient.SetRedisTime(10800)
redisClient.HashMsetAdd(redisKey, saveTokenRedis)
//输出验证
// clearTokenStr := fmt.Sprintf("%v-%v", tokenMd5Str, numberMd5)
// var clearTokenMd5 overallhandle.Md5Encryption
// clearTokenMd5.Md5EncryptionInit(clearTokenStr)
// clearTokenMd5Str := clearTokenMd5.Md5EncryptionAlgorithm()
var sendToken SendToken
sendToken.Number = randCode
sendToken.Token = tokenMd5Str
overallhandle.Result(0, sendToken, c)
}

63
api/empower/authorize/type.go

@ -0,0 +1,63 @@
package authorize
import (
"hr_server/overall/overallhandle"
"github.com/gin-gonic/gin"
)
type EmpowerApi struct{}
type jiaMiKey struct {
Number string `json:"number"`
AppKey string `json:"appkey"`
}
//入口
func (e *EmpowerApi) Index(c *gin.Context) {
var requestData jiaMiKey
err := c.ShouldBindJSON(&requestData)
if err != nil {
overallhandle.Result(100, err, c)
return
}
// var empowerUser models.EmpowerUser
// userErr := empowerUser.GetCont(map[string]interface{}{"userkey": "kingdeeSysAdmin", "password": "Kingdee@Human$Resources"}, "verification_code")
// var ContentTypeMd5 overallhandle.Md5Encryption
// if empowerUser.VerificationCode != "" {
// ContentTypeMd5.AppKey = empowerUser.VerificationCode
// }
var ContentTypeMd5 overallhandle.Md5Encryption
ContentTypeMd5.Md5EncryptionInit(requestData.Number)
ContentTypeMd5.AppKey = requestData.AppKey
ContentTypeMd5Str, dfg := ContentTypeMd5.Md5EncryptionAlgorithmFj()
outputCont := overallhandle.MapOut()
outputCont["index"] = "MD5加密验证"
// outputCont["userErr"] = userErr
outputCont["md5"] = ContentTypeMd5Str
outputCont["number"] = requestData.Number
outputCont["appkey"] = requestData.AppKey
outputCont["step"] = dfg
overallhandle.Result(0, outputCont, c)
}
//授权
type gainAuthorize struct {
UserNumber string `json:"username"`
Password string `json:"password"`
}
//输出Token
type SendToken struct {
Token string `json:"token"`
Number string `json:"number"`
}
//保存Redis Token
type SaveToken struct {
Number string `json:"number"` //随机数
UserKey string `json:"userkey"` //用户名
PassWord string `json:"password"` //密码
}

9
api/empower/inlet.go

@ -0,0 +1,9 @@
package empower
import "hr_server/api/empower/authorize"
type ApiInlet struct {
Authorize authorize.EmpowerApi
}
var AppApiInlet = new(ApiInlet)

682
api/jindie_docking/dockingorganization/controller.go

@ -0,0 +1,682 @@
package dockingorganization
import (
"encoding/json"
"fmt"
"hr_server/models"
"hr_server/overall"
"hr_server/overall/overallhandle"
"strconv"
"strings"
"time"
"github.com/gin-gonic/gin"
)
//接口实验
func (d *DockingJinDieApi) DockKingdeeApi(c *gin.Context) {
// GetOrgType()
// JobClass()
// DutiesContrast()
OrgAdmin()
// Position()
// xingzheng()
outMap := overallhandle.MapOut()
overallhandle.Result(0, outMap, c)
}
func xingzheng() {
var orgList []models.AdministrativeOrganization
// orgList.GetCont(map[string]interface{}{"ispower": 1})
overall.CONSTANT_DB_HR.Where("ispower = 1").Find(&orgList)
var id []string
var num []string
for _, v := range orgList {
id = append(id, strconv.FormatInt(v.Id, 10))
num = append(num, v.Number)
}
fmt.Println(strings.Join(id, ","))
fmt.Println(strings.Join(num, ","))
}
//行政组织类型
func GetOrgType() {
var orgContAry []orgClass
sendUrl := fmt.Sprintf("%v/person/adminUnitType", overall.DockingKingdeeUrl)
respBody, err := GetUrl(sendUrl)
if err != nil {
overallhandle.WriteLog("e", "未能获取到行政组织类型!", err)
return
}
err = json.Unmarshal(respBody, &orgContAry)
if err != nil {
overallhandle.WriteLog("e", "行政组织类型映射错误!", err)
return
}
overallhandle.WriteLog("i", "行政组织类型映射成功!", orgContAry)
if len(orgContAry) < 0 {
overallhandle.WriteLog("e", "未能获取到行政组织类型!", orgContAry)
return
}
fmt.Printf("err---------------------->%v\n", err)
var kingDeeIdAry []string
//进行行政组织类别对照
for _, v := range orgContAry {
if overallhandle.StringIsInMap(v.Id, kingDeeIdAry) == false {
kingDeeIdAry = append(kingDeeIdAry, v.Id)
}
//判断该项是否存在
var orgCont models.AdministrativeOrganizationType
orgErr := orgCont.GetCont(map[string]interface{}{"kingdeeid": v.Id}, "id", "name", "state")
if orgErr == nil {
//判断是否编辑
if v.Name != orgCont.Name {
editOrgErr := orgCont.EiteCont(map[string]interface{}{"id": orgCont.Id}, map[string]interface{}{"name": v.Name, "state": 1})
if editOrgErr == nil {
overallhandle.WriteLog("edit", "行政组织类型更新成功!", editOrgErr, v)
} else {
overallhandle.WriteLog("edit", "行政组织类型更新失败!", editOrgErr, v)
}
} else {
if orgCont.State != 1 {
editOrgErr := orgCont.EiteCont(map[string]interface{}{"id": orgCont.Id}, map[string]interface{}{"state": 1})
if editOrgErr == nil {
overallhandle.WriteLog("edit", "行政组织类型更新成功!state", editOrgErr, v)
} else {
overallhandle.WriteLog("edit", "行政组织类型更新失败!state", editOrgErr, v)
}
}
}
} else {
orgCont.Name = v.Name
orgCont.State = 1
orgCont.Time = time.Now().Unix()
orgCont.KingdeeId = v.Id
addOrgErr := overall.CONSTANT_DB_HR.Create(&orgCont).Error
if addOrgErr == nil {
overallhandle.WriteLog("add", "行政组织类型写入成功!", addOrgErr, orgCont)
} else {
overallhandle.WriteLog("add", "行政组织类型写入失败!", addOrgErr, orgCont)
}
}
}
var orgAll []models.AdministrativeOrganizationType
allErr := overall.CONSTANT_DB_HR.Where("`state` = 1").Find(&orgAll).Error
if allErr == nil {
var eidtId []string
for _, av := range orgAll {
if overallhandle.StringIsInMap(av.KingdeeId, kingDeeIdAry) == false {
if overallhandle.StringIsInMap(av.KingdeeId, eidtId) == false {
eidtId = append(eidtId, av.KingdeeId)
}
}
}
if len(eidtId) > 0 {
orgContEditErr := overall.CONSTANT_DB_HR.Model(&models.AdministrativeOrganizationType{}).Where("`kingdeeid` IN ?", eidtId).Updates(map[string]interface{}{"state": 2}).Error
if orgContEditErr == nil {
overallhandle.WriteLog("edit", "禁用已不使用得行政组织类型成功!", orgContEditErr, eidtId)
} else {
overallhandle.WriteLog("edit", "禁用已不使用得行政组织类型失败!", orgContEditErr, eidtId)
}
}
}
}
//职务类型
func JobClass() {
// fmt.Printf("1")
var jobClassInfo []jobClassType
sendUrl := fmt.Sprintf("%v/person/ptype", overall.DockingKingdeeUrl)
respBody, err := GetUrl(sendUrl)
if err != nil {
overallhandle.WriteLog("e", "未能获取到职务类型!", err)
return
}
err = json.Unmarshal(respBody, &jobClassInfo)
if err != nil {
overallhandle.WriteLog("e", "职务类型映射错误!", err)
return
}
overallhandle.WriteLog("i", "职务类型映射成功!", jobClassInfo)
if len(jobClassInfo) < 0 {
overallhandle.WriteLog("e", "未能获取到职务类型!", jobClassInfo)
return
}
var kingDeeIdAry []string
//进行职务类型对照
for _, v := range jobClassInfo {
if overallhandle.StringIsInMap(v.Id, kingDeeIdAry) == false {
kingDeeIdAry = append(kingDeeIdAry, v.Id)
}
//判断该项是否存在
var jobClassCont models.JobClass
jobClassErr := jobClassCont.GetCont(map[string]interface{}{"kingdeeid": v.Id})
if jobClassErr == nil {
//存在判断是否要进行更新
if v.Name != jobClassCont.Name {
editOrgErr := jobClassCont.EiteJobClassCont(map[string]interface{}{"id": jobClassCont.Id}, map[string]interface{}{"name": v.Name, "state": 1})
if editOrgErr == nil {
overallhandle.WriteLog("edit", "职务类型更新成功!", editOrgErr, v)
} else {
overallhandle.WriteLog("edit", "职务类型更新失败!", editOrgErr, v)
}
} else {
if jobClassCont.State != 1 {
editOrgErr := jobClassCont.EiteJobClassCont(map[string]interface{}{"id": jobClassCont.Id}, map[string]interface{}{"state": 1})
if editOrgErr == nil {
overallhandle.WriteLog("edit", "职务类型更新成功!state", editOrgErr, v)
} else {
overallhandle.WriteLog("edit", "职务类型更新失败!state", editOrgErr, v)
}
}
}
} else {
//不存在,进行新增
jobClassCont.Name = v.Name
jobClassCont.KingdeeNum = v.Fnumber
jobClassCont.KingdeeId = v.Id
jobClassCont.State = 1
jobClassCont.Time = time.Now().Unix()
addErr := overall.CONSTANT_DB_HR.Create(&jobClassCont).Error
if addErr == nil {
overallhandle.WriteLog("add", "职务类型写入成功!", addErr, jobClassCont)
} else {
overallhandle.WriteLog("add", "职务类型写入失败!", addErr, jobClassCont)
}
}
}
var jobClassAll []models.JobClass
allErr := overall.CONSTANT_DB_HR.Where("`state` = 1").Find(&jobClassAll).Error
if allErr == nil {
var eidtId []string
for _, av := range jobClassAll {
if overallhandle.StringIsInMap(av.KingdeeId, kingDeeIdAry) == false {
if overallhandle.StringIsInMap(av.KingdeeId, eidtId) == false {
eidtId = append(eidtId, av.KingdeeId)
}
}
}
if len(eidtId) > 0 {
jobClassContEditErr := overall.CONSTANT_DB_HR.Model(&models.JobClass{}).Where("`kingdeeid` IN ?", eidtId).Updates(map[string]interface{}{"state": 2}).Error
if jobClassContEditErr == nil {
overallhandle.WriteLog("edit", "禁用已不使用得职务类型成功!", jobClassContEditErr, eidtId)
} else {
overallhandle.WriteLog("edit", "禁用已不使用得职务类型失败!", jobClassContEditErr, eidtId)
}
}
}
}
//职务
func DutiesContrast() {
var jobInfo []jobContDuck
sendUrl := fmt.Sprintf("%v/person/job", overall.DockingKingdeeUrl)
respBody, err := GetUrl(sendUrl)
if err != nil {
overallhandle.WriteLog("e", "未能获取到职务!", err)
return
}
err = json.Unmarshal(respBody, &jobInfo)
if err != nil {
overallhandle.WriteLog("e", "职务映射错误!", err)
return
}
overallhandle.WriteLog("i", "职务映射成功!", jobInfo)
if len(jobInfo) < 0 {
overallhandle.WriteLog("e", "未能获取到职务!", jobInfo)
return
}
var kingDeeIdAry []string
//进行职务对照
for _, v := range jobInfo {
if overallhandle.StringIsInMap(v.Id, kingDeeIdAry) == false {
kingDeeIdAry = append(kingDeeIdAry, v.Id)
}
//判断该项是否存在
var dutiesCont models.Duties
dutiesErr := dutiesCont.GetCont(map[string]interface{}{"kingdeeid": v.Id}, "`id`", "`name`", `state`, `job_type`)
if dutiesErr == nil {
//存在,进行更新
//获取职务Id
var jobClassInfo models.JobClass
jobClassInfo.GetCont(map[string]interface{}{"kingdeeid": v.Fjobtype}, "`id`")
var editOrgErr error
isCaoZuo := false
if v.Name != dutiesCont.Name {
if dutiesCont.JobType != jobClassInfo.Id {
editOrgErr = dutiesCont.EiteCont(map[string]interface{}{"id": dutiesCont.Id}, map[string]interface{}{"name": v.Name, "state": 1, "job_type": jobClassInfo.Id})
isCaoZuo = true
} else {
editOrgErr = dutiesCont.EiteCont(map[string]interface{}{"id": dutiesCont.Id}, map[string]interface{}{"name": v.Name, "state": 1})
isCaoZuo = true
}
} else {
if dutiesCont.State != 1 {
if dutiesCont.JobType != jobClassInfo.Id {
editOrgErr = dutiesCont.EiteCont(map[string]interface{}{"id": dutiesCont.Id}, map[string]interface{}{"state": 1, "job_type": jobClassInfo.Id})
isCaoZuo = true
} else {
editOrgErr = dutiesCont.EiteCont(map[string]interface{}{"id": dutiesCont.Id}, map[string]interface{}{"state": 1})
isCaoZuo = true
}
}
}
if isCaoZuo == true {
if editOrgErr == nil {
overallhandle.WriteLog("edit", "职务更新成功!", editOrgErr, v)
} else {
overallhandle.WriteLog("edit", "职务更新失败!", editOrgErr, v)
}
}
} else {
//不存在,进行新增
//获取旧对照表数据
var oldDutiesInfo models.Duties
oldDutErr := overall.CONSTANT_DB_HR_Jin.Model(&models.Duties{}).Select("weight,number").Where("`name` = ?", v.Name).First(&oldDutiesInfo).Error
//获取职务Id
var jobClassInfo models.JobClass
jobClassErr := jobClassInfo.GetCont(map[string]interface{}{"kingdeeid": v.Fjobtype}, "`id`")
var dutiesInfo models.Duties
dutiesInfo.Name = v.Name
if jobClassErr == nil {
dutiesInfo.JobType = jobClassInfo.Id
}
if oldDutErr == nil {
dutiesInfo.Weight = oldDutiesInfo.Weight
dutiesInfo.Number = oldDutiesInfo.Number
}
dutiesInfo.Time = time.Now().Unix()
dutiesInfo.State = 1
dutiesInfo.KingdeeId = v.Id
dutiesInfo.KingdeeNum = v.Fnumber
addErr := overall.CONSTANT_DB_HR.Create(&dutiesInfo).Error
if addErr == nil {
overallhandle.WriteLog("add", "职务写入成功!", addErr, dutiesInfo)
} else {
overallhandle.WriteLog("add", "职务写入失败!", addErr, dutiesInfo)
}
}
}
var dutiesAll []models.Duties
allErr := overall.CONSTANT_DB_HR.Where("`state` = 1").Find(&dutiesAll).Error
if allErr == nil {
var eidtId []string
for _, av := range dutiesAll {
if overallhandle.StringIsInMap(av.KingdeeId, kingDeeIdAry) == false {
if overallhandle.StringIsInMap(av.KingdeeId, eidtId) == false {
eidtId = append(eidtId, av.KingdeeId)
}
}
}
if len(eidtId) > 0 {
dutiesContEditErr := overall.CONSTANT_DB_HR.Model(&models.Duties{}).Where("`kingdeeid` IN ?", eidtId).Updates(map[string]interface{}{"state": 2}).Error
if dutiesContEditErr == nil {
overallhandle.WriteLog("edit", "禁用已不使用得职务成功!", dutiesContEditErr, eidtId)
} else {
overallhandle.WriteLog("edit", "禁用已不使用得职务失败!", dutiesContEditErr, eidtId)
}
}
}
}
//行政组织
func OrgAdmin() {
var orgInfo []orgAdminType
sendUrl := fmt.Sprintf("%v/person/adminunit", overall.DockingKingdeeUrl)
respBody, err := GetUrl(sendUrl)
if err != nil {
overallhandle.WriteLog("e", "未能获取到行政组织!", err)
return
}
err = json.Unmarshal(respBody, &orgInfo)
if err != nil {
overallhandle.WriteLog("e", "行政组织映射错误!", err)
return
}
overallhandle.WriteLog("i", "行政组织映射完成!", orgInfo)
if len(orgInfo) < 0 {
overallhandle.WriteLog("e", "未能获取到行政组织!", orgInfo)
return
}
var kingDeeIdAry []string
//进行职务对照
for _, v := range orgInfo {
if overallhandle.StringIsInMap(v.Id, kingDeeIdAry) == false {
kingDeeIdAry = append(kingDeeIdAry, v.Id)
}
//判断该项是否存在
var orgInfoContCont models.AdministrativeOrganization
orgInfoContErr := orgInfoContCont.GetCont(map[string]interface{}{"kingdeeid": v.Id})
if orgInfoContErr == nil {
//存在,进行更新
isEdit := false
saveData := overallhandle.MapOut()
if v.Name != orgInfoContCont.Name {
saveData["name"] = v.Name
isEdit = true
}
if v.Abbreviation != orgInfoContCont.Abbreviation {
saveData["abbreviation"] = v.Abbreviation
isEdit = true
}
if v.Number != orgInfoContCont.Number {
saveData["number"] = v.Number
isEdit = true
}
if orgInfoContCont.State != 1 {
saveData["state"] = 1
isEdit = true
}
//判断行政组织类型是否需要改变
var judgeOrgType models.AdministrativeOrganizationType
judgeOrgTypeErr := judgeOrgType.GetCont(map[string]interface{}{"id": orgInfoContCont.OrganizationType}, "`id`", "`kingdeeid`")
if judgeOrgTypeErr == nil {
if v.GovClass != judgeOrgType.KingdeeId {
var orgTypeNewType models.AdministrativeOrganizationType
orgTypeNewTypeErr := orgTypeNewType.GetCont(map[string]interface{}{"kingdeeid": v.Superior}, "id")
if orgTypeNewTypeErr == nil {
saveData["organization_type"] = orgTypeNewType.Id
isEdit = true
}
}
}
if isEdit == true {
saveData["time"] = time.Now().Unix()
editErr := orgInfoContCont.EiteCont(map[string]interface{}{"id": orgInfoContCont.Id}, saveData)
if editErr == nil {
overallhandle.WriteLog("edit", "行政组织更新成功!", editErr, v, saveData)
} else {
overallhandle.WriteLog("edit", "行政组织更新失败!", editErr, v, saveData)
}
}
} else {
//不存在进行添加
var orgCont models.AdministrativeOrganization
orgCont.KingdeeId = v.Id
orgCont.Number = v.Number
orgCont.Name = v.Name
orgCont.Abbreviation = v.Abbreviation
orgCont.State = 1
orgCont.Time = time.Now().Unix()
//获取行政组织类型
var orgType models.AdministrativeOrganizationType
orgTypeErr := orgType.GetCont(map[string]interface{}{"kingdeeid": v.GovClass}, "id")
if orgTypeErr == nil {
orgCont.OrganizationType = orgType.Id
}
//获取知行学院及企业微信对照码
var orgOldCont models.AdministrativeOrganization
orgOldErr := overall.CONSTANT_DB_HR_Jin.Model(&models.AdministrativeOrganization{}).Select("wechat_organization_id,schoole").Where("`number` = ?", v.Number).First(&orgOldCont).Error
if orgOldErr == nil {
orgCont.WechatOrganizationId = orgOldCont.WechatOrganizationId
orgCont.Schoole = orgOldCont.Schoole
}
if overallhandle.StringIsInMap(v.Number, OrgNumberDuiZhao) {
orgCont.IsPower = 1
}
// orgCont.IsPower
addErr := overall.CONSTANT_DB_HR.Create(&orgCont).Error
if addErr == nil {
overallhandle.WriteLog("add", "行政组织写入成功!", addErr, orgCont)
} else {
overallhandle.WriteLog("add", "行政组织写入失败!", addErr, orgCont)
}
}
}
//职务上级校正
for _, cv := range orgInfo {
var parentContCorre models.AdministrativeOrganization
parentErr := parentContCorre.GetCont(map[string]interface{}{"kingdeeid": cv.Id}, "`id`", "`superior`")
if parentErr == nil {
var orgCorrePrent models.AdministrativeOrganization
orgCorrePrentErr := orgCorrePrent.GetCont(map[string]interface{}{"kingdeeid": cv.Superior}, "id")
if orgCorrePrentErr == nil {
if parentContCorre.Superior != orgCorrePrent.Id {
saveData := overallhandle.MapOut()
saveData["superior"] = orgCorrePrent.Id
saveData["time"] = time.Now().Unix()
parentIngErr := parentContCorre.EiteCont(map[string]interface{}{"id": parentContCorre.Id}, saveData)
overallhandle.WriteLog("add", "行政组织写入成功!", parentIngErr, saveData)
}
}
}
}
//关闭已经弃用得行政组织
var orgAdminAll []models.AdministrativeOrganization
allErr := overall.CONSTANT_DB_HR.Where("`state` = 1").Find(&orgAdminAll).Error
if allErr == nil {
var eidtId []string
for _, av := range orgAdminAll {
if overallhandle.StringIsInMap(av.KingdeeId, kingDeeIdAry) == false {
if overallhandle.StringIsInMap(av.KingdeeId, eidtId) == false {
eidtId = append(eidtId, av.KingdeeId)
}
}
}
if len(eidtId) > 0 {
orgAdminEditErr := overall.CONSTANT_DB_HR.Model(&models.AdministrativeOrganization{}).Where("`kingdeeid` IN ?", eidtId).Updates(map[string]interface{}{"state": 2}).Error
if orgAdminEditErr == nil {
overallhandle.WriteLog("edit", "禁用已不使用得行政组织成功!", orgAdminEditErr, eidtId)
} else {
overallhandle.WriteLog("edit", "禁用已不使用得行政组织失败!", orgAdminEditErr, eidtId)
}
}
}
}
//职位
func Position() {
var orgInfo []positionType
sendUrl := fmt.Sprintf("%v/person/position", overall.DockingKingdeeUrl)
respBody, err := GetUrl(sendUrl)
if err != nil {
overallhandle.WriteLog("e", "未能获取到职位!", err)
return
}
err = json.Unmarshal(respBody, &orgInfo)
if err != nil {
overallhandle.WriteLog("e", "职位映射错误!", err)
return
}
overallhandle.WriteLog("i", "职位映射完成!", orgInfo)
if len(orgInfo) < 0 {
overallhandle.WriteLog("e", "金蝶对照数据!", orgInfo)
return
}
var kingDeeIdAry []string
//批量写入
var batchPosition []models.Position
//进行职位对照
for _, v := range orgInfo {
if overallhandle.StringIsInMap(v.Id, kingDeeIdAry) == false {
kingDeeIdAry = append(kingDeeIdAry, v.Id)
}
// strconv.Atoi(v.FIsRespPosition)
personInt64, _ := strconv.Atoi(v.FIsRespPosition)
//获取职务信息
var zhiwuCont models.Duties
zhiwuCont.GetCont(map[string]interface{}{"kingdeeid": v.FJobID}, "id")
//判断该项是否存在
var positCont models.Position
positContErr := positCont.GetCont(map[string]interface{}{"kingdeeid": v.Id})
if positContErr == nil {
//存在,进行更新
isEdit := false
saveData := overallhandle.MapOut()
if v.Name != positCont.Name {
saveData["name"] = v.Name
isEdit = true
}
if positCont.State != 1 {
saveData["state"] = 1
isEdit = true
}
if v.Fnumber != positCont.Number {
saveData["number"] = v.Fnumber
isEdit = true
}
if zhiwuCont.Id != positCont.Duties {
saveData["duties"] = zhiwuCont.Id
isEdit = true
}
//获取行政组织
var orgCont models.AdministrativeOrganization
orgContErr := orgCont.GetCont(map[string]interface{}{"kingdeeid": v.FAdminOrgUnitID}, "id", "superior")
if orgContErr == nil {
if orgCont.Id != positCont.AdministrativeOrganization {
saveData["administrative_organization"] = orgCont.Id
saveData["department"] = overallhandle.GetGroupOrDepartPower(orgCont.Superior, 1)
isEdit = true
}
}
if isEdit == true {
saveData["time"] = time.Now().Unix()
editErr := positCont.EiteCont(map[string]interface{}{"id": positCont.Id}, saveData)
if editErr == nil {
overallhandle.WriteLog("edit", "职位更新成功!", editErr, v, saveData)
} else {
overallhandle.WriteLog("edit", "职位更新失败!", editErr, v, saveData)
}
}
} else {
//不存在,新增
positCont.Number = v.Fnumber
positCont.Name = v.Name
positCont.KingdeeId = v.Id
positCont.Time = time.Now().Unix()
positCont.State = 1
//获取行政组织
var orgCont models.AdministrativeOrganization
orgContErr := orgCont.GetCont(map[string]interface{}{"kingdeeid": v.FAdminOrgUnitID}, "id", "superior")
if orgContErr == nil {
positCont.AdministrativeOrganization = orgCont.Id
positCont.Department = overallhandle.GetGroupOrDepartPower(orgCont.Superior, 1)
}
//获取知行学院及企业微信对照码
var orgOldCont models.Position
orgOldErr := overall.CONSTANT_DB_HR_Jin.Model(&models.Position{}).Select("school,person_in_charge").Where("`number` = ?", v.Fnumber).First(&orgOldCont).Error
positCont.PersonInCharge = personInt64
if orgOldErr == nil {
if personInt64 != orgOldCont.PersonInCharge {
if orgOldCont.PersonInCharge == 1 {
positCont.PersonInCharge = orgOldCont.PersonInCharge
}
}
positCont.School = orgOldCont.School
}
positCont.Duties = zhiwuCont.Id
batchPosition = append(batchPosition, positCont)
// if v.Id == "QBsfJ1fbSKW+3q6eOJltjHSuYS4=" {
// fmt.Printf("positCont---->%v\n", positCont)
// return
// }
if len(batchPosition)%100 == 0 {
synPro.Add(1)
go writePositis(batchPosition)
var batchPositionNew []models.Position
batchPosition = batchPositionNew
// addErr := overall.CONSTANT_DB_HR.Create(&batchPosition).Error
// if addErr == nil {
// var batchPositionNew []models.Position
// batchPosition = batchPositionNew
// overallhandle.WriteLog("add", "职位写入成功!", addErr, batchPosition)
// } else {
// overallhandle.WriteLog("add", "职位写入失败!", addErr, batchPosition)
// }
}
}
}
if len(batchPosition) > 0 {
synPro.Add(1)
go writePositis(batchPosition)
}
synPro.Wait()
//职位上级校正
var calibPositList []positionType
for _, cv := range orgInfo {
calibPositList = append(calibPositList, cv)
if len(calibPositList)%100 == 0 {
synPro.Add(1)
go calibrationPosition(calibPositList)
var calibPositListNew []positionType
calibPositList = calibPositListNew
}
}
if len(calibPositList) > 0 {
synPro.Add(1)
go calibrationPosition(calibPositList)
}
synPro.Wait()
//关闭已经弃用得行政组织
var orgAdminAll []models.Position
allErr := overall.CONSTANT_DB_HR.Where("`state` = 1").Find(&orgAdminAll).Error
if allErr == nil {
var eidtId []string
for _, av := range orgAdminAll {
if overallhandle.StringIsInMap(av.KingdeeId, kingDeeIdAry) == false {
if overallhandle.StringIsInMap(av.KingdeeId, eidtId) == false {
eidtId = append(eidtId, av.KingdeeId)
}
}
}
if len(eidtId) > 0 {
orgAdminEditErr := overall.CONSTANT_DB_HR.Model(&models.Position{}).Where("`kingdeeid` IN ?", eidtId).Updates(map[string]interface{}{"state": 2}).Error
if orgAdminEditErr == nil {
overallhandle.WriteLog("edit", "禁用已不使用得职位成功!", orgAdminEditErr, eidtId)
} else {
overallhandle.WriteLog("edit", "禁用已不使用得职位失败!", orgAdminEditErr, eidtId)
}
}
}
}
//协程写入职位
func writePositis(batchPositionNew []models.Position) {
defer synPro.Done()
if len(batchPositionNew) > 0 {
addErr := overall.CONSTANT_DB_HR.Create(&batchPositionNew).Error
if addErr == nil {
overallhandle.WriteLog("add", "职位写入成功!", addErr, batchPositionNew)
} else {
overallhandle.WriteLog("add", "职位写入失败!", addErr, batchPositionNew)
}
}
}
//协程职位校正
func calibrationPosition(orgInfo []positionType) {
defer synPro.Done()
if len(orgInfo) > 0 {
for _, cv := range orgInfo {
var parentContCorre models.Position
parentErr := parentContCorre.GetCont(map[string]interface{}{"kingdeeid": cv.Id}, "`id`", "`superior`")
if parentErr == nil {
var orgCorrePrent models.Position
orgCorrePrentErr := orgCorrePrent.GetCont(map[string]interface{}{"kingdeeid": cv.FParentID}, "id")
if orgCorrePrentErr == nil {
if parentContCorre.Superior != orgCorrePrent.Id {
saveData := overallhandle.MapOut()
saveData["superior"] = orgCorrePrent.Id
saveData["time"] = time.Now().Unix()
parentContCorre.EiteCont(map[string]interface{}{"id": parentContCorre.Id}, saveData)
}
}
}
}
}
}

24
api/jindie_docking/dockingorganization/getposturl.go

@ -0,0 +1,24 @@
package dockingorganization
import (
"fmt"
"hr_server/overall/overallhandle"
"io/ioutil"
"net/http"
"time"
)
func GetUrl(sendUrl string) (respBody []byte, err error) {
req, err := http.NewRequest("GET", sendUrl, nil)
client := &http.Client{Timeout: 500 * time.Second} // 设置请求超时时长5s
resp, err := client.Do(req)
if err != nil {
errmsg := fmt.Sprintf("访问请求[%v] http.DefaultClient.Do() err: %v", sendUrl, err)
overallhandle.WriteLog("e", errmsg)
return
}
defer resp.Body.Close()
respBody, err = ioutil.ReadAll(resp.Body)
return
}

60
api/jindie_docking/dockingorganization/type.go

@ -0,0 +1,60 @@
package dockingorganization
import (
"hr_server/overall/overallhandle"
"sync"
"github.com/gin-gonic/gin"
)
type DockingJinDieApi struct{}
//入口
func (e *DockingJinDieApi) Index(c *gin.Context) {
outputCont := overallhandle.MapOut()
outputCont["index"] = "金蝶对接入口"
overallhandle.Result(0, outputCont, c)
}
var synPro = sync.WaitGroup{}
//行政组织类型
type orgClass struct {
Id string `json:"id"`
Name string `json:"name"`
}
//职务类型
type jobClassType struct {
orgClass
Fnumber string `json:"fnumber"`
}
//职务对照
type jobContDuck struct {
jobClassType
Fjobtype string `json:"fjobtype"`
}
//行政组织
type orgAdminType struct {
orgClass
Number string `json:"number"`
Superior string `json:"superior"`
GovClass string `json:"govclass"`
Abbreviation string `json:"abbreviation"`
}
//职位
type positionType struct {
jobClassType
FAdminOrgUnitID string `json:"FAdminOrgUnitID"`
FParentID string `json:"FParentID"`
FIsRespPosition string `json:"FIsRespPosition"` //0:不是负责人职位;1:是负责人职位
FJobID string `json:"FJobID"` //关联职务
}
var (
OrdIdDuiZhaoAry = []int64{7, 32, 34, 40, 45, 64, 65, 91, 94, 98, 102, 104, 106, 111, 115, 116, 122, 124, 126, 128, 130, 137, 139, 140, 141, 142, 143, 144, 145, 146, 148, 149, 150, 151, 155, 156, 158, 159, 161, 166, 167, 174, 175, 176, 183, 184, 185, 186, 190, 193, 194, 195, 198, 199, 200, 201, 202, 208, 210, 211, 213, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 228, 229, 230, 231, 232, 233, 235, 236, 237, 238, 239, 240, 241, 242, 243, 249, 250, 254, 264, 267, 270, 274, 276, 279, 280, 281, 292, 293, 294, 295, 296, 297, 298, 299, 300, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 322, 323, 326, 327, 329, 330, 331, 333, 334, 335, 337, 346, 348, 353, 360, 361, 362, 363, 365, 368, 369, 371, 383, 385, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 403, 405, 407, 408}
OrgNumberDuiZhao = []string{"HXSW06", "RX15", "HXSW03", "HXSW07", "RX1702", "WL00", "RXGH00", "RX16", "RX17", "RX20", "GK03", "GK04", "GK06", "GK09", "GK1003", "GK11", "ZQ07", "HXJF03", "GK18", "HXJF06", "ZQ00", "HXJF01", "ZQ01", "ZQ12", "ZQ13", "ZQ09", "ZQ14", "ZQ16", "ZQ17", "ZQ08", "ZQ10", "ZQ11", "ZQ15", "ZQ18", "HXSW08", "GK16", "RX22", "RX23", "SGFDC01", "YLHY01", "YLHY02", "WL01", "WL02", "WL05", "WL06", "HCGJ00", "WL09", "WL12", "HCGJ01", "ZK00", "ZT09", "ZT10", "HXSW11", "WL13", "WL14", "WL15", "WL16", "GK17", "YH00", "YT00", "ZK01", "ZT00", "ZT01", "ZT02", "ZT03", "ZT04", "ZT05", "ZT06", "ZT07", "ZT08", "WL04", "WL07", "WL03", "WL08", "WL10", "WL11", "HXZY01", "HXJF00", "WL17", "ZQ02", "ZQ03", "ZQ04", "HXJF04", "ZQ06", "HXJF05", "HXZTGC00", "ZQ05", "HXJF02", "RX19", "RX21", "RX14", "RX18", "GK01", "GK02", "GK05", "GK07", "GK08", "GK10", "GK1002", "04", "HXZY00", "YLHY00", "RX00", "BY00", "HXKJ00", "HXSW", "TLWL00", "YLNY00", "HXHQ00", "TYWY00", "01", "02", "03", "HY00", "GK00", "RXDL00", "SGFDC00", "00", "HX00", "HXXCL00", "HX01", "HX0101", "HX0102", "HX02", "RX01", "RX02", "RX25", "RX03", "RX04", "RX06", "RX08", "RX10", "RX12", "HX03", "RX05", "RX07", "RX09", "RX11", "RX13", "GK12", "GK13", "GK14", "GK15", "HXSW00", "HXSW01", "HXSW10", "HXSW02", "HXSW09", "HXSW04", "HXZYRL06", "HXZYRL03", "HXLSNY00", "JAAZGC00", "HXXNY01", "HXXNY02", "HXXNY03", "HXXNY04", "HXXNY05", "HXXNY06", "HXXNY07", "HXXNY08", "HXXNY09", "HXXNY10", "HXXNY11", "HXZYRL00", "HXXNY00", "HXZYRL02", "HXZYRL05", "HXZYRL04", "HXZYRL01"}
)

9
api/jindie_docking/inlet.go

@ -0,0 +1,9 @@
package jindiedocking
import "hr_server/api/jindie_docking/dockingorganization"
type ApiInlet struct {
DockJinDieApi dockingorganization.DockingJinDieApi
}
var AppApiInlet = new(ApiInlet)

27
api/version1/administrativeorganization/govcont.go

@ -263,3 +263,30 @@ func (o *OrganizationApi) EiteGovStateOrDel(c *gin.Context) {
}
}
}
//行政组织树
func (o *OrganizationApi) GovThree(c *gin.Context) {
var requestData govThreeType
c.ShouldBindJSON(&requestData)
if requestData.Id == 0 && requestData.IdStr == "" {
requestData.Id = 0
}
if requestData.IdStr != "" {
idInt64, _ := strconv.ParseInt(requestData.IdStr, 10, 64)
requestData.Id = idInt64
}
var govMap overallhandle.MenuList
gormDb := overall.CONSTANT_DB_HR.Model(&models.AdministrativeOrganization{}).Select("administrative_organization.*,aot.name as classname,aot.level").Joins("left join administrative_organization_type as aot on aot.id = administrative_organization.organization_type").Where("administrative_organization.`state` IN ?", []int{1, 2})
if requestData.Level != 0 {
gormDb = gormDb.Where("aot.level <= ?", requestData.Level)
}
err := gormDb.Find(&govMap).Error
if err != nil {
overallhandle.Result(107, err, c)
return
}
// fmt.Printf("id==========>%v", govMap)
// govMap.GovRecursion(requestData.Id, 0)
govMapThree := overallhandle.GovThreeList(requestData.Id, govMap)
overallhandle.Result(0, govMapThree, c)
}

12
api/version1/administrativeorganization/job_class.go

@ -21,7 +21,7 @@ func (o *OrganizationApi) DutiesClassList(c *gin.Context) {
requestData.PageSize = 10
}
var jobClassList []models.JobClass
gormDb := overall.CONSTANT_DB_HR.Model(&models.JobClass{})
gormDb := overall.CONSTANT_DB_HR.Model(&models.JobClass{}).Select("`id`", "`name`", "`state`")
if requestData.Name != "" {
// nameFactor := fmt.Sprintf("%%v%")
gormDb = gormDb.Where("`name` LIKE ?", "%"+requestData.Name+"%")
@ -36,8 +36,16 @@ func (o *OrganizationApi) DutiesClassList(c *gin.Context) {
if errGorm != nil {
overallhandle.Result(105, errGorm, c)
} else {
var jobClassAry []outJobClassList
for _, v := range jobClassList {
var jobClassCont outJobClassList
jobClassCont.Id = strconv.FormatInt(v.Id, 10)
jobClassCont.Name = v.Name
jobClassCont.State = v.State
jobClassAry = append(jobClassAry, jobClassCont)
}
// overallhandle.Result(0, jobClassList, c)
overallhandle.ResultList(0, requestData.Page, requestData.PageSize, total, int64(len(jobClassList)), jobClassList, c)
overallhandle.ResultList(0, requestData.Page, requestData.PageSize, total, int64(len(jobClassAry)), jobClassAry, c)
}
}

114
api/version1/administrativeorganization/position.go

@ -1,6 +1,7 @@
package administrativeorganization
import (
"encoding/json"
"fmt"
"hr_server/models"
"hr_server/overall"
@ -49,15 +50,22 @@ func (o *OrganizationApi) PositionList(c *gin.Context) {
total = 0
}
var positionAry []positionOutInfo
errGorm := gormDb.Limit(requestData.PageSize).Offset(overallhandle.LimitPage(requestData.Page, requestData.PageSize)).Find(&positionAry).Error
errGorm := gormDb.Order("p.department DESC,p.duties DESC,p.duties ASC").Limit(requestData.PageSize).Offset(overallhandle.LimitPage(requestData.Page, requestData.PageSize)).Find(&positionAry).Error
for i, v := range positionAry {
var getSpur models.Position
getWhe := overallhandle.MapOut()
getWhe["id"] = v.Superior
fmt.Printf("%v\n", v.Superior)
// fmt.Printf("%v\n", v.Superior)
getSpur.GetCont(getWhe, "number", "name")
positionAry[i].SuperiorNumber = getSpur.Number
positionAry[i].SuperiorName = getSpur.Name
var getSpurDepart models.AdministrativeOrganization
getWheDepart := overallhandle.MapOut()
getWheDepart["id"] = v.Department
getSpurDepart.GetCont(getWheDepart, "name")
positionAry[i].DepartmentName = getSpurDepart.Name
}
if errGorm != nil {
overallhandle.Result(105, errGorm, c)
@ -123,6 +131,7 @@ func (o *OrganizationApi) AddPositionCont(c *gin.Context) {
isExit := overallhandle.MapOut()
isExit["department"] = departmentId
isExit["name"] = requestData.Name
isExit["administrative_organization"] = organizationId
judgeErr := positionCont.GetCont(isExit)
if judgeErr == nil {
overallhandle.Result(101, isExit, c, "该职位在本部门下已经存在!请不要重复添加")
@ -319,3 +328,104 @@ func (o *OrganizationApi) EitePositionStateOrDel(c *gin.Context) {
}
}
}
//获取职位权限配置清单
func (o *OrganizationApi) GetPositionRole(c *gin.Context) {
var requestData overallhandle.GetId
err := c.ShouldBindJSON(&requestData)
if err != nil {
overallhandle.Result(100, requestData, c)
return
}
if requestData.Id == 0 && requestData.IdStr == "" {
overallhandle.Result(101, requestData, c)
return
}
if requestData.IdStr != "" {
idInt, inIntErr := strconv.ParseInt(requestData.IdStr, 10, 64)
if inIntErr == nil {
requestData.Id = idInt
}
}
where := overallhandle.MapOut()
var positionRole models.Position
where["id"] = requestData.Id
inFoErr := positionRole.GetCont(where, "menu_permit", "button_permit")
if inFoErr != nil {
overallhandle.Result(105, requestData, c)
return
}
_, datahhh := GetMenuOperation(positionRole.MenuPermit, positionRole.ButtonPermit)
overallhandle.Result(0, datahhh, c)
}
//遍历确权
func GetMenuOperation(menuStr, menuOperStr string) (isTrue bool, sendData []powerConfigList) {
isTrue = false
var menuStrMap []int64
var menuOperStrMap []int64
json.Unmarshal([]byte(menuStr), &menuStrMap)
json.Unmarshal([]byte(menuOperStr), &menuOperStrMap)
var systemMenuList []models.SystemMenu
menuOperErr := overall.CONSTANT_DB_Master.Where("`m_steat` IN ?", []int{1, 2}).Order("m_sort asc").Order("m_id desc").Find(&systemMenuList).Error
if menuOperErr != nil {
return
}
fmt.Printf("menuStr------>%v--------------->%v\n", menuStr, menuStrMap)
sendData = GetMenuPowerThree(1, 0, systemMenuList, menuStrMap, menuOperStrMap)
return
}
//递归无限树
func GetMenuPowerThree(jurisd int, parentId int64, threeData []models.SystemMenu, menuStrMap, menuOperStrMap []int64) []powerConfigList {
// treeList := []SystemMenuThree{}
treeListPower := []powerConfigList{}
for _, v := range threeData {
if v.ParentId == parentId {
var powerConfigCont powerConfigList
powerConfigCont.Id = v.Id
powerConfigCont.Title = v.Title
powerConfigCont.IsTrue = overallhandle.JudgeInMap(v.Id, menuStrMap)
child := GetMenuPowerThree(jurisd, v.Id, threeData, menuStrMap, menuOperStrMap)
powerConfigCont.Child = child
isTrue, menuOper := MenuOperation(jurisd, v.Id)
if isTrue == true {
var operList []powerCont
for _, oper_val := range menuOper {
var operCont powerCont
operCont.Id = oper_val.OperId
operCont.Title = oper_val.OperTitle
operCont.IsTrue = overallhandle.JudgeInMap(oper_val.OperId, menuOperStrMap)
operList = append(operList, operCont)
}
powerConfigCont.MenuOperation = operList
}
treeListPower = append(treeListPower, powerConfigCont)
}
}
return treeListPower
}
//获取菜单操作项目
func MenuOperation(jurisd int, menuId int64) (isTrue bool, operation []models.MenuOperation) {
isTrue = false
// if jurisd != 1 {
// operErr := overall.CONSTANT_DB_Master.Where("`menu_id` = ? AND oper_id IN ?", menuId, global.Gva_Authority_Authentication).Order("oper_id desc").Find(&operation).Error
// if operErr == nil {
// isTrue = true
// }
// } else {
// operErr := overall.CONSTANT_DB_Master.Where("`menu_id` = ?", menuId).Order("oper_id desc").Find(&operation).Error
// if operErr == nil {
// isTrue = true
// }
// }
operErr := overall.CONSTANT_DB_Master.Where("`menu_id` = ?", menuId).Order("oper_id desc").Find(&operation).Error
if operErr == nil {
isTrue = true
}
return
}

184
api/version1/administrativeorganization/team.go

@ -0,0 +1,184 @@
package administrativeorganization
import (
"hr_server/models"
"hr_server/overall"
"hr_server/overall/overallhandle"
"time"
"github.com/gin-gonic/gin"
)
//获取班组内容
func (o *OrganizationApi) GetTeamCont(c *gin.Context) {
var requestData overallhandle.GetId
err := c.ShouldBindJSON(&requestData)
if err != nil {
overallhandle.Result(100, requestData, c)
return
}
if requestData.IdStr == "" {
overallhandle.Result(101, requestData, c)
return
}
var getTeamCont models.TeamGroup
getErr := getTeamCont.GetCont(map[string]interface{}{"`id`": requestData.IdStr})
if getErr != nil {
overallhandle.Result(105, getErr, c)
return
}
overallhandle.Result(0, getTeamCont, c)
}
//添加班组
func (o *OrganizationApi) AddTeamCont(c *gin.Context) {
var requestData NameVal
err := c.ShouldBindJSON(&requestData)
if err != nil {
overallhandle.Result(100, requestData, c)
return
}
if requestData.Name == "" {
overallhandle.Result(101, requestData, c)
return
}
var teamCont models.TeamGroup
errTeam := teamCont.GetCont(map[string]interface{}{"`name`": requestData.Name})
if errTeam == nil {
overallhandle.Result(103, teamCont, c)
return
}
var saveData models.TeamGroup
saveData.Name = requestData.Name
saveData.State = 1
saveData.Time = time.Now().Unix()
saveErr := overall.CONSTANT_DB_HR.Create(&saveData).Error
if saveErr == nil {
overallhandle.Result(0, saveData, c)
} else {
overallhandle.Result(104, saveData, c)
}
}
//编辑班组
func (o *OrganizationApi) EiteTeamCont(c *gin.Context) {
var requestData eidtTeamCont
err := c.ShouldBindJSON(&requestData)
if err != nil {
overallhandle.Result(100, requestData, c)
return
}
if requestData.Id == "" {
overallhandle.Result(101, requestData, c)
return
}
if requestData.Name == "" {
overallhandle.Result(101, requestData, c)
return
}
var getTeamCont models.TeamGroup
getErr := getTeamCont.GetCont(map[string]interface{}{"`id`": requestData.Id})
if getErr != nil {
overallhandle.Result(105, getErr, c)
return
}
if getTeamCont.Name != requestData.Name {
var teamCont models.TeamGroup
errTeam := teamCont.GetCont(map[string]interface{}{"`name`": requestData.Name})
if errTeam == nil {
overallhandle.Result(103, teamCont, c)
return
}
eidtCont := overallhandle.MapOut()
eidtCont["name"] = requestData.Name
eidtCont["time"] = time.Now().Unix()
eidtErr := getTeamCont.EiteTeamGroupCont(map[string]interface{}{"`id`": requestData.Id}, eidtCont)
if eidtErr == nil {
overallhandle.Result(0, eidtCont, c)
} else {
overallhandle.Result(106, eidtErr, c)
}
} else {
overallhandle.Result(0, getTeamCont, c)
}
}
//编辑状态与删除班组
func (o *OrganizationApi) EidtDelTeamCont(c *gin.Context) {
var requestData EiteJobStateDel
err := c.ShouldBindJSON(&requestData)
if err != nil {
overallhandle.Result(100, requestData, c)
return
}
if requestData.IdStr == "" {
overallhandle.Result(101, requestData, c)
return
}
if requestData.State == 0 {
requestData.State = 1
}
if requestData.IsTrue == 0 {
requestData.IsTrue = 2
}
var getTeamCont models.TeamGroup
getErr := getTeamCont.GetCont(map[string]interface{}{"`id`": requestData.IdStr})
if getErr != nil {
overallhandle.Result(105, getErr, c)
return
}
whereAry := overallhandle.MapOut()
whereAry["id"] = requestData.IdStr
saveData := overallhandle.MapOut()
saveData["time"] = time.Now().Unix()
saveData["state"] = requestData.State
if requestData.State != 3 {
eiteErr := getTeamCont.EiteTeamGroupCont(whereAry, saveData)
if eiteErr != nil {
overallhandle.Result(106, eiteErr, c)
} else {
overallhandle.Result(0, saveData, c)
}
} else {
if requestData.IsTrue != 1 {
//软删除
eiteErr := getTeamCont.EiteTeamGroupCont(whereAry, saveData)
if eiteErr != nil {
overallhandle.Result(106, eiteErr, c)
} else {
overallhandle.Result(0, saveData, c)
}
} else {
//硬删除
delErr := overall.CONSTANT_DB_HR.Where(whereAry).Delete(&getTeamCont)
if delErr == nil {
overallhandle.Result(0, saveData, c)
} else {
overallhandle.Result(108, delErr, c)
}
}
}
}
//班组列表
func (o *OrganizationApi) TeamContList(c *gin.Context) {
var requestData JobClassPageSelect
c.ShouldBindJSON(&requestData)
gormDb := overall.CONSTANT_DB_HR.Model(&models.TeamGroup{}).Where("`state` = 1")
if requestData.Name != "" {
gormDb = gormDb.Where("`name` LIKE ?", "%"+requestData.Name+"%")
}
var total int64
totalErr := gormDb.Count(&total).Error
if totalErr != nil {
total = 0
}
var teamList []models.TeamGroup
err := gormDb.Limit(requestData.PageSize).Offset(overallhandle.LimitPage(requestData.Page, requestData.PageSize)).Find(&teamList).Error
if err != nil {
overallhandle.Result(105, err, c)
} else {
overallhandle.ResultList(0, requestData.Page, requestData.PageSize, total, int64(len(teamList)), teamList, c)
}
}

38
api/version1/administrativeorganization/type.go

@ -12,6 +12,7 @@ type OrganizationApi struct{}
//入口
func (o *OrganizationApi) Index(c *gin.Context) {
outputCont := overallhandle.MapOut()
outputCont["index"] = "组织管理入口"
overallhandle.Result(0, outputCont, c)
}
@ -162,4 +163,41 @@ type positionOutInfo struct {
JobName string `json:"jobname" gorm:"column:jobname;type:varchar(255) unsigned;default:'';not null;comment:职务类型"`
SuperiorName string `json:"superiorname"` //上级名称
SuperiorNumber string `json:"superiornumber"` //上级编号
DepartmentName string `json:"departmentname"`
}
//行政组织树查询
type govThreeType struct {
overallhandle.GetId
Level int `json:"level"`
}
/*
配置系统角色
*/
//权限列表基础字段
type powerCont struct {
Id int64 `json:"id"`
Title string `json:"title"`
IsTrue bool `json:"istrue"`
}
//权限树
type powerConfigList struct {
powerCont
Child []powerConfigList `json:"child"`
MenuOperation []powerCont `json:"menuOperation"`
}
//输出职务分类列表
type outJobClassList struct {
Id string `json:"id"`
Name string `json:"name"`
State int `json:"state"`
}
//修改班组
type eidtTeamCont struct {
Id string `json:"id"`
Name string `json:"name"`
}

10
api/version1/inlet.go

@ -1,9 +1,17 @@
package version1
import "hr_server/api/version1/administrativeorganization"
import (
"hr_server/api/version1/administrativeorganization"
"hr_server/api/version1/permitpowerapi"
"hr_server/api/version1/personnelapi"
"hr_server/api/version1/shiyan"
)
type ApiInlet struct {
OrganizationApi administrativeorganization.OrganizationApi
PermitPowerApi permitpowerapi.PermitPowerApi
StaffApi personnelapi.StaffApi
ShiyanApi shiyan.ShiYan
}
var AppApiInlet = new(ApiInlet)

43
api/version1/permitpowerapi/menu_permit.go

@ -0,0 +1,43 @@
package permitpowerapi
import (
"hr_server/models"
"hr_server/overall"
"hr_server/overall/overallhandle"
"github.com/gin-gonic/gin"
)
//权限列表
func (p *PermitPowerApi) PermitPowerList(c *gin.Context) {
var muneList []models.SystemMenu
err := overall.CONSTANT_DB_Master.Model(&models.SystemMenu{}).Where("m_steat = 1").Order("m_sort ASC").Order("m_id ASC").Find(&muneList).Error
if err != nil {
overallhandle.Result(105, err, c, "职位编码不能为空!")
return
}
var list []models.SystemMenuOperation
for _, v := range muneList {
var listCont models.SystemMenuOperation
listCont.Id = v.Id
listCont.Title = v.Title // 菜单名称"`
listCont.State = v.State // 是否启用(1:启用;2:禁用;3:删除)"`
listCont.ParentId = v.ParentId // '父级(顶级:0)"`
listCont.ApiUrl = v.ApiUrl // 地址"`
listCont.Time = v.Time // 创建时间"`
listCont.EiteTime = v.EiteTime // 修改时间"`
listCont.UserId = v.UserId // 写入人"`
listCont.Sort = v.Sort // 排序"`
listCont.MenuPermit = getMenuButton(v.Id)
list = append(list, listCont)
}
printList := overallhandle.MenuThreePermit(0, list)
overallhandle.Result(0, printList, c)
}
//获取菜单按钮
func getMenuButton(menuId int64) (buttonList []models.MenuOperation) {
overall.CONSTANT_DB_Master.Where("menu_id = ?", menuId).Find(&buttonList)
return
}

47
api/version1/permitpowerapi/position_permit.go

@ -0,0 +1,47 @@
package permitpowerapi
import (
"encoding/json"
"hr_server/models"
"hr_server/overall/overallhandle"
"time"
"github.com/gin-gonic/gin"
)
//岗位(职位)配权
func (p *PermitPowerApi) PositionAllotment(c *gin.Context) {
var requestData PositionAllotmentType
err := c.ShouldBindJSON(&requestData)
if err != nil {
overallhandle.Result(100, err, c)
return
}
if requestData.Id == "" {
overallhandle.Result(101, requestData.Id, c)
return
}
whereAry := overallhandle.MapOut()
whereAry["id"] = requestData.Id
var jobClassInfo models.Position
//判断行政组织是否存在
judgeExist := jobClassInfo.GetCont(whereAry)
if judgeExist != nil {
overallhandle.Result(107, judgeExist, c)
return
}
//权限
menuPermit, _ := json.Marshal(requestData.MenuPermit)
buttonPermit, _ := json.Marshal(requestData.ButtonPermit)
//赋权
saveData := overallhandle.MapOut()
saveData["time"] = time.Now().Unix()
saveData["menu_permit"] = menuPermit
saveData["button_permit"] = buttonPermit
eiteErr := jobClassInfo.EiteCont(whereAry, saveData)
if eiteErr != nil {
overallhandle.Result(106, eiteErr, c)
} else {
overallhandle.Result(0, saveData, c)
}
}

23
api/version1/permitpowerapi/type.go

@ -0,0 +1,23 @@
package permitpowerapi
import (
"hr_server/overall/overallhandle"
"github.com/gin-gonic/gin"
)
type PermitPowerApi struct{}
//入口
func (p *PermitPowerApi) Index(c *gin.Context) {
outputCont := overallhandle.MapOut()
outputCont["index"] = "权限管理入口"
overallhandle.Result(0, outputCont, c)
}
//岗位(职位)配权
type PositionAllotmentType struct {
Id string `json:"id"` //岗位(职位) ID
MenuPermit []int64 `json:"menupermit"` //菜单权限
ButtonPermit []int64 `json:"buttonpermit"` //按钮权限
}

BIN
api/version1/personnelapi/__debug_bin.exe

Binary file not shown.

281
api/version1/personnelapi/controll.go

@ -0,0 +1,281 @@
package personnelapi
//用工关系转换
//1:实习生;2:待分配;3:试用员工;4:正式员工;5:停薪留职;6:退休;7:辞退;8:离职
func emptypeToInt(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
default:
return 1
}
}
//雇佣类型转换
//雇佣类型(1:雇佣入职;2:再入职;3:返聘)
func hireTypeToInt(hir string) int {
switch hir {
case "雇佣入职":
return 1
case "再入职":
return 2
case "返聘":
return 3
default:
return 1
}
}
/*
婚姻状态
婚姻状况1未婚2已婚3丧偶4离异
*/
func maritalstatusToInt(name string) int {
switch name {
case "未婚":
return 1
case "已婚":
return 2
case "丧偶":
return 3
case "离异":
return 4
default:
return 1
}
}
/*
星座
1白羊座2金牛座3双子座4巨蟹座5狮子座6处女座7天枰座8天蝎座9射手座10摩羯座11水瓶座12双鱼座
*/
func consteToInt(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
default:
return 1
}
}
/*
政治面貌
(1群众 2无党派3台盟会员4九三社员5致公党员6农工党员7民进会员8民建会员9民盟盟员10民革会员11共青团员12预备党员13中共党员)
*/
func politiToInt(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 1
}
}
/*
性别
1男性2女性3中性
*/
func genderToInt(name string) int {
switch name {
case "男":
return 1
case "女":
return 2
case "中性":
return 3
case "男性":
return 1
case "女性":
return 2
default:
return 1
}
}
/*
健康状况
1良好2一般3较弱4有生理缺陷5残废
*/
func healthToInt(name string) int {
switch name {
case "良好":
return 1
case "一般":
return 2
case "较弱":
return 3
case "有生理缺陷":
return 4
case "残废":
return 5
default:
return 2
}
}
/*
健康状况
1主职2兼职
*/
func assignTypeToInt(name string) int {
switch name {
case "主职":
return 1
default:
return 2
}
}
/*
变动类型
1:预入职2雇佣入职3转正4晋升5降级6职等调整7调动调入8跨公司调动调入9借调10平调11兼职12预离职13离职14退休15返聘16员工初始化
*/
func changeTypeToInt(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
case "退休":
return 14
case "返聘":
return 15
case "员工初始化":
return 16
default:
return 1
}
}
/*
学历
(1初中及以下2中专3高中4中技5高技6函数专科7大学专科8函数本科9大学本科10硕士研究生11博士研究生12专家教授)
*/
func ducationToInt(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
default:
return 1
}
}
//学位(0:无;1:学士;2:硕士;3:博士)int
func hestacademicdegreeToInt(hir string) int {
switch hir {
case "学士":
return 1
case "硕士":
return 2
case "博士":
return 3
default:
return 0
}
}

824
api/version1/personnelapi/kingdee.go

@ -0,0 +1,824 @@
package personnelapi
import (
"fmt"
"hr_server/models"
"hr_server/overall"
"hr_server/overall/overallhandle"
"strconv"
"strings"
"time"
"github.com/gin-gonic/gin"
)
//金蝶人员信息对接
func (s *StaffApi) Kingdee(c *gin.Context) {
var requestData addKingdeePersonnel
c.ShouldBindJSON(&requestData)
if requestData.Number == "" {
overallhandle.Result(1, requestData.Number, c, "工号不能为空!")
return
}
var manContent models.PersonArchives
manErr := manContent.GetCont(map[string]interface{}{"`number`": requestData.Number})
if manErr == nil {
//已经存在!进行变动操作
manErr = eidtAddManCont(manContent, requestData)
} else {
//不存在!进行新增操作
manErr = newAddManCont(requestData)
}
if manErr != nil {
overallhandle.Result(104, manErr, c)
return
}
overallhandle.Result(0, manErr, c)
}
//编辑员工
func eidtAddManCont(perArcInfo models.PersonArchives, manCont addKingdeePersonnel) error {
eidtManCont := overallhandle.MapOut()
if manCont.Name != "" && manCont.Name != perArcInfo.Name {
eidtManCont["`name`"] = manCont.Name
}
if manCont.Icon != "" && manCont.Icon != perArcInfo.Icon {
eidtManCont["`icon`"] = manCont.Icon
}
if manCont.HireType != 0 && manCont.HireType != perArcInfo.HireClass {
eidtManCont["`hire_class`"] = manCont.HireType
}
if manCont.EmpType != 0 && manCont.EmpType != perArcInfo.EmpType {
eidtManCont["`emp_type`"] = manCont.EmpType
}
//人员变更记录
var manChangeRecord models.PersonnelChangeRecord
changeRecordTrue := false
//公司
if manCont.Company != "" {
var orgCompany models.AdministrativeOrganization
orgErr := orgCompany.GetCont(map[string]interface{}{"kingdeeid": manCont.Company}, "`id`")
if orgErr == nil {
if orgCompany.Id != perArcInfo.Company {
eidtManCont["`company`"] = orgCompany.Id
changeRecordTrue = true
}
manChangeRecord.Company = orgCompany.Id
}
}
//主部门
if manCont.MainDepartment != "" {
var orgMainDepart models.AdministrativeOrganization
orgErr := orgMainDepart.GetCont(map[string]interface{}{"kingdeeid": manCont.MainDepartment}, "`id`")
if orgErr == nil {
if orgMainDepart.Id != perArcInfo.Company {
eidtManCont["`maindeparment`"] = orgMainDepart.Id
changeRecordTrue = true
}
manChangeRecord.MainDepartment = orgMainDepart.Id
}
}
//部门
if len(manCont.Department) > 0 {
var departId []string
for _, dv := range manCont.Department {
var orgMainDepartAry models.AdministrativeOrganization
orgErr := orgMainDepartAry.GetCont(map[string]interface{}{"kingdeeid": dv}, "`id`")
if orgErr == nil {
orgIdStr := strconv.FormatInt(orgMainDepartAry.Id, 10)
if overallhandle.StringIsInMap(orgIdStr, departId) == false {
departId = append(departId, orgIdStr)
}
}
}
oldDepart := strings.Split(perArcInfo.Deparment, ",")
chaJiDepart := overallhandle.DifferenceSet[string](departId, oldDepart)
if len(chaJiDepart) > 0 {
departIdStr := strings.Join(departId, ",")
eidtManCont["`deparment`"] = departIdStr
manChangeRecord.Department = departIdStr
changeRecordTrue = true
}
}
//行政组织
if manCont.AdminOrg != "" {
var orgMainDepartAdmin models.AdministrativeOrganization
orgErr := orgMainDepartAdmin.GetCont(map[string]interface{}{"kingdeeid": manCont.AdminOrg}, "`id`")
if orgErr == nil {
if orgMainDepartAdmin.Id != perArcInfo.AdminOrg {
eidtManCont["`admin_org`"] = orgMainDepartAdmin.Id
changeRecordTrue = true
}
manChangeRecord.Adminorg = orgMainDepartAdmin.Id
}
}
//职位
if manCont.Position != "" {
var positionCont models.Position
positErr := positionCont.GetCont(map[string]interface{}{`kingdeeid`: manCont.Position}, "`id`")
if positErr == nil {
if positionCont.Id != perArcInfo.Position {
eidtManCont["`position`"] = positionCont.Id
changeRecordTrue = true
}
manChangeRecord.Position = positionCont.Id
}
}
//职务
if manCont.JobName != "" {
var dutiesCont models.DutiesClassLeve
dutiesErr := dutiesCont.GetCont(map[string]interface{}{"`d_king`": manCont.JobName}, "d_id")
if dutiesErr == nil {
if dutiesCont.Id != perArcInfo.Position {
eidtManCont["`job_id`"] = dutiesCont.Id
changeRecordTrue = true
}
if dutiesCont.ClassId != perArcInfo.JobClass {
eidtManCont["`job_class`"] = dutiesCont.ClassId
changeRecordTrue = true
}
manChangeRecord.JobId = dutiesCont.Id
manChangeRecord.JobClass = dutiesCont.ClassId
}
}
if manCont.PositionGrade != 0 {
if manCont.PositionGrade != perArcInfo.JobLeve {
eidtManCont["`job_leve`"] = manCont.PositionGrade
}
manChangeRecord.JobLevel = manCont.PositionGrade
changeRecordTrue = true
}
fmt.Printf("第一学历--->%v--->%v\n", changeRecordTrue, manChangeRecord)
if len(eidtManCont) > 0 {
var manMainCont models.PersonArchives
eidtErrMain := manMainCont.EiteCont(map[string]interface{}{"`id`": perArcInfo.Id}, eidtManCont)
if eidtErrMain != nil {
return eidtErrMain
} else {
if changeRecordTrue == true {
//写入变动记录
manChangeRecord.Type = manCont.HireType
manChangeRecord.Number = perArcInfo.Number
manChangeRecord.Time = time.Now().Unix()
// rybdErr := overall.CONSTANT_DB_HR.Create(&manChangeRecord).Error
// jsonCont, _ := json.Marshal(manChangeRecord)
// fmt.Printf("第二学历--->%v--->%v\n", rybdErr, string(jsonCont))
}
//编辑人员附属信息
synPro.Add(1)
go editManAuxiliaryData(manCont)
//编辑紧急联系人信息
synPro.Add(1)
go emergencyContactPerson(manCont)
//编辑员工家属信息
synPro.Add(1)
go eidtFamilyMembers(manCont.Number, manCont.MemberOfFamily)
//编辑员工教育经历
synPro.Add(1)
go educatExperKingdee(manCont)
synPro.Wait()
}
}
return nil
}
//新增员工
func newAddManCont(manCont addKingdeePersonnel) error {
var manMainCont models.PersonArchives
manMainCont.Number = manCont.Number
manMainCont.Name = manCont.Name
manMainCont.Icon = manCont.Icon
manMainCont.HireClass = manCont.HireType
manMainCont.EmpType = manCont.EmpType
timeTady := time.Now().Unix()
manMainCont.Time = timeTady
manMainCont.EiteTime = timeTady
manMainCont.State = 1
if manCont.Company != "" {
var orgCompany models.AdministrativeOrganization
orgErr := orgCompany.GetCont(map[string]interface{}{"kingdeeid": manCont.Company}, "`id`")
if orgErr == nil {
manMainCont.Company = orgCompany.Id
}
}
if manCont.MainDepartment != "" {
var orgMainDepart models.AdministrativeOrganization
orgErr := orgMainDepart.GetCont(map[string]interface{}{"kingdeeid": manCont.MainDepartment}, "`id`")
if orgErr == nil {
manMainCont.MainDeparment = orgMainDepart.Id
}
}
if len(manCont.Department) > 0 {
var departId []string
for _, dv := range manCont.Department {
var orgMainDepartAry models.AdministrativeOrganization
orgErr := orgMainDepartAry.GetCont(map[string]interface{}{"kingdeeid": dv}, "`id`")
if orgErr == nil {
orgIdStr := strconv.FormatInt(orgMainDepartAry.Id, 10)
if overallhandle.StringIsInMap(orgIdStr, departId) == false {
departId = append(departId, orgIdStr)
}
}
}
departIdStr := strings.Join(departId, ",")
manMainCont.Deparment = departIdStr
}
if manCont.AdminOrg != "" {
var orgMainDepartAdmin models.AdministrativeOrganization
orgErr := orgMainDepartAdmin.GetCont(map[string]interface{}{"kingdeeid": manCont.AdminOrg}, "`id`")
if orgErr == nil {
manMainCont.AdminOrg = orgMainDepartAdmin.Id
}
}
//职位
if manCont.Position != "" {
var positionCont models.Position
positErr := positionCont.GetCont(map[string]interface{}{`kingdeeid`: manCont.Position}, "`id`")
if positErr == nil {
manMainCont.Position = positionCont.Id
}
}
//职务
if manCont.JobName != "" {
var dutiesCont models.DutiesClassLeve
dutiesErr := dutiesCont.GetCont(map[string]interface{}{"`d_king`": manCont.JobName}, "d_id")
if dutiesErr == nil {
manMainCont.JobId = dutiesCont.Id
manMainCont.JobClass = dutiesCont.ClassId
}
}
if manCont.PositionGrade != 0 {
manMainCont.JobLeve = manCont.PositionGrade
}
//获取老人员主表内容
var oldPersonArchives models.Personnel
oldPersErr := overall.CONSTANT_DB_HR_Jin.Where(map[string]interface{}{"`number`": manCont.Number}).First(&oldPersonArchives).Error
if oldPersErr == nil {
if manCont.Icon == "" {
manMainCont.Icon = oldPersonArchives.Icon
}
if oldPersonArchives.Key != 0 {
manMainCont.Key = oldPersonArchives.Key
} else {
manMainCont.Key = overallhandle.TableNumber()
}
if oldPersonArchives.Wechat != "" {
manMainCont.Wechat = oldPersonArchives.Wechat
}
if oldPersonArchives.WorkWechat != "" {
manMainCont.WorkWechat = oldPersonArchives.WorkWechat
}
manMainCont.IsAdmin = oldPersonArchives.IsAdmin
manMainCont.Role = oldPersonArchives.Role
if oldPersonArchives.Password != "" {
manMainCont.Password = oldPersonArchives.Password
} else {
//密码加密
var passwordMd5 overallhandle.Md5Encryption
passwordMd5.Md5EncryptionInit(overall.CONSTANT_CONFIG.Appsetup.DefaultPassword)
manMainCont.Password = passwordMd5.Md5EncryptionAlgorithm()
}
} else {
manMainCont.Key = overallhandle.TableNumber()
//密码加密
var passwordMd5 overallhandle.Md5Encryption
passwordMd5.Md5EncryptionInit(overall.CONSTANT_CONFIG.Appsetup.DefaultPassword)
manMainCont.Password = passwordMd5.Md5EncryptionAlgorithm()
}
addManContErr := overall.CONSTANT_DB_HR.Create(&manMainCont).Error
if addManContErr != nil {
return addManContErr
} else {
//编辑人员附属信息
synPro.Add(1)
go editManAuxiliaryData(manCont)
//编辑紧急联系人信息
synPro.Add(1)
go emergencyContactPerson(manCont)
//编辑员工家属信息
synPro.Add(1)
go eidtFamilyMembers(manCont.Number, manCont.MemberOfFamily)
//编辑员工教育经历
synPro.Add(1)
go educatExperKingdee(manCont)
synPro.Wait()
}
return nil
}
//编辑人员附属信息
func editManAuxiliaryData(manCont addKingdeePersonnel) {
defer synPro.Done()
var manInfo models.PersonnelContent
manErr := manInfo.GetCont(map[string]interface{}{"`number`": manCont.Number})
if manErr == nil {
saveData := overallhandle.MapOut()
if manCont.IDCardNo != "" && manCont.IDCardNo != manInfo.Idcardno {
saveData["idcardno"] = manCont.IDCardNo
}
if manCont.IDCardStartTime != "" {
idCardStarTime, _ := overallhandle.DateToTimeStamp(fmt.Sprintf("%v 00:00:00", manCont.IDCardStartTime))
if idCardStarTime != manInfo.Idcardstartdate {
saveData["idcardstartdate"] = idCardStarTime
}
}
if manCont.IDCardEndTime != "" {
idCardEndTime, _ := overallhandle.DateToTimeStamp(fmt.Sprintf("%v 00:00:00", manCont.IDCardEndTime))
if idCardEndTime != manInfo.Idcardenddate {
saveData["idcardenddate"] = idCardEndTime
}
}
if manCont.IDCardAddress != "" && manCont.IDCardAddress != manInfo.Idcardaddress {
saveData["idcardaddress"] = manCont.IDCardAddress
}
if manCont.IDCardIsSued != "" && manCont.IDCardIsSued != manInfo.IdcardIssued {
saveData["idcardIssued"] = manCont.IDCardIsSued
}
if manCont.Mobilephone != "" && manCont.Mobilephone != manInfo.Mobilephone {
saveData["mobilephone"] = manCont.Mobilephone
}
if manCont.Email != "" && manCont.Email != manInfo.Email {
saveData["email"] = manCont.Email
}
if manCont.Gender != 0 && manCont.Gender != manInfo.Gender {
saveData["gender"] = manCont.Gender
}
if manCont.Birthday != "" {
brrthday, _ := overallhandle.DateToTimeStamp(fmt.Sprintf("%v 00:00:00", manCont.Birthday))
if brrthday != manInfo.Birthday {
saveData["birthday"] = brrthday
}
}
if manCont.Nation != "" && manCont.Nation != manInfo.Myfolk {
saveData["myfolk"] = manCont.Nation
}
if manCont.NativePlace != "" && manCont.NativePlace != manInfo.Nativeplace {
saveData["nativeplace"] = manCont.NativePlace
}
if manCont.Health != 0 && manCont.Health != manInfo.Health {
saveData["health"] = manCont.Health
}
if manCont.Maritalstatus != 0 && manCont.Maritalstatus != manInfo.Maritalstatus {
saveData["maritalstatus"] = manCont.Maritalstatus
}
if manCont.CurrentResidence != "" && manCont.CurrentResidence != manInfo.Currentresidence {
saveData["currentresidence"] = manCont.CurrentResidence
}
if manCont.Constellation != 0 && manCont.Constellation != manInfo.Constellation {
saveData["constellationing"] = manCont.Constellation
}
if manCont.Iisdoubleworker != 0 && manCont.Iisdoubleworker != manInfo.Isdoubleworker {
saveData["isdoubleworker"] = manCont.Iisdoubleworker
eidtDoubleWorker(manCont, manCont.Iisdoubleworker)
}
if manCont.Isveterans != 0 && manCont.Isveterans != manInfo.Isveterans {
saveData["isveterans"] = manCont.Isveterans
if manCont.Isveterans == 1 {
if manCont.Veteransnumber != "" && manCont.Veteransnumber != manInfo.Veteransnumber {
saveData["veteransnumber"] = manCont.Veteransnumber
}
} else {
saveData["veteransnumber"] = ""
}
}
if manCont.WorkingDate != "" {
workInData, _ := overallhandle.DateToTimeStamp(fmt.Sprintf("%v 00:00:00", manCont.WorkingDate))
if workInData != manInfo.Jobstartdate {
saveData["jobstartdate"] = workInData
}
}
if manCont.EntryDate != "" {
entryData, _ := overallhandle.DateToTimeStamp(fmt.Sprintf("%v 00:00:00", manCont.EntryDate))
if entryData != manInfo.Entrydate {
saveData["entrydate"] = entryData
}
}
if manCont.ProbationPeriod != 0 && manCont.ProbationPeriod != manInfo.Probationperiod {
saveData["probationperiod"] = manCont.ProbationPeriod
entryData := manInfo.Entrydate
if manCont.EntryDate != "" {
entryData, _ = overallhandle.DateToTimeStamp(fmt.Sprintf("%v 00:00:00", manCont.EntryDate))
}
planformalData := overallhandle.GetFutureMonthTime(entryData, manCont.ProbationPeriod, 2)
saveData["planformaldate"] = planformalData
}
if manCont.ConfirmationDate != "" {
planformalData, _ := overallhandle.DateToTimeStamp(fmt.Sprintf("%v 00:00:00", manCont.ConfirmationDate))
saveData["planformaldate"] = planformalData
}
if manCont.PoliticalOutlook != 0 && manCont.PoliticalOutlook != manInfo.PoliticalOutlook {
saveData["political_outlook"] = manCont.PoliticalOutlook
}
if len(saveData) > 0 {
saveData["`time`"] = time.Now().Unix()
manInfo.EiteCont(map[string]interface{}{"`number`": manCont.Number}, saveData)
}
} else {
manInfo.Number = manCont.Number
manInfo.Idcardno = manCont.IDCardNo
idCardStarTime := time.Now().Unix()
if manCont.IDCardStartTime != "" {
idCardStarTime, _ = overallhandle.DateToTimeStamp(fmt.Sprintf("%v 00:00:00", manCont.IDCardStartTime))
}
manInfo.Idcardstartdate = idCardStarTime //身份证有效期开始
idCardEndTime := time.Now().Unix()
if manCont.IDCardEndTime != "" {
idCardEndTime, _ = overallhandle.DateToTimeStamp(fmt.Sprintf("%v 00:00:00", manCont.IDCardEndTime))
}
manInfo.Idcardenddate = idCardEndTime //身份证有效期结束
manInfo.Idcardaddress = manCont.IDCardAddress //身份证地址
manInfo.IdcardIssued = manCont.IDCardIsSued //身份证签发机关
manInfo.Mobilephone = manCont.Mobilephone
manInfo.Email = manCont.Email
manInfo.Gender = manCont.Gender
brrthday, _ := overallhandle.DateToTimeStamp(fmt.Sprintf("%v 00:00:00", manCont.Birthday))
manInfo.Birthday = brrthday
manInfo.Myfolk = manCont.Nation
manInfo.Nativeplace = manCont.NativePlace
manInfo.Health = manCont.Health
manInfo.Maritalstatus = manCont.Maritalstatus
manInfo.Currentresidence = manCont.CurrentResidence
manInfo.Time = time.Now().Unix()
manInfo.Constellation = manCont.Constellation
manInfo.Isdoubleworker = manCont.Iisdoubleworker
manInfo.Isveterans = manCont.Isveterans
manInfo.Veteransnumber = manCont.Veteransnumber
workInData := time.Now().Unix()
if manCont.WorkingDate != "" {
workInData, _ = overallhandle.DateToTimeStamp(fmt.Sprintf("%v 00:00:00", manCont.WorkingDate))
}
manInfo.Jobstartdate = workInData
entryData := time.Now().Unix()
if manCont.EntryDate != "" {
entryData, _ = overallhandle.DateToTimeStamp(fmt.Sprintf("%v 00:00:00", manCont.EntryDate))
}
manInfo.Entrydate = entryData
manInfo.Probationperiod = manCont.ProbationPeriod
planformalData := time.Now().Unix()
if manCont.ConfirmationDate != "" {
planformalData, _ = overallhandle.DateToTimeStamp(fmt.Sprintf("%v 00:00:00", manCont.ConfirmationDate))
} else {
planformalData = overallhandle.GetFutureMonthTime(entryData, manCont.ProbationPeriod, 2)
}
manInfo.Planformaldate = planformalData
manInfo.PoliticalOutlook = manCont.PoliticalOutlook
overall.CONSTANT_DB_HR.Create(&manInfo)
if manCont.Iisdoubleworker == 1 {
//编辑双职工
eidtDoubleWorker(manCont, 1)
}
}
}
//编辑双职工
func eidtDoubleWorker(manCont addKingdeePersonnel, state int) {
var doubleWorkCont models.DoubleWorker
dwErr := doubleWorkCont.GetCont(map[string]interface{}{"`number`": manCont.Number})
if dwErr == nil {
saveData := overallhandle.MapOut()
if manCont.SpouseName != "" && manCont.SpouseName != doubleWorkCont.Name {
saveData["`name`"] = manCont.SpouseName
}
if manCont.SpouseCompany != "" && manCont.SpouseCompany != doubleWorkCont.Company {
saveData["`company`"] = manCont.SpouseCompany
}
if manCont.SpouseDepartment != "" && manCont.SpouseDepartment != doubleWorkCont.Department {
saveData["`department`"] = manCont.SpouseDepartment
}
if manCont.SpousePosition != "" && manCont.SpousePosition != doubleWorkCont.Position {
saveData["`position`"] = manCont.SpousePosition
}
if manCont.SpouseTel != "" && manCont.SpouseTel != doubleWorkCont.Tel {
saveData["`tel`"] = manCont.SpouseTel
}
if state != 0 && state != doubleWorkCont.State {
saveData["`state`"] = state
}
if len(saveData) > 0 {
saveData["`time`"] = time.Now().Unix()
doubleWorkCont.EiteCont(map[string]interface{}{"`number`": manCont.Number}, saveData)
}
} else {
saveData := overallhandle.MapOut()
saveData["state"] = 2
doubleWorkCont.EiteCont(map[string]interface{}{"`number`": manCont.Number}, saveData)
doubleWorkCont.Number = manCont.Number
doubleWorkCont.Name = manCont.SpouseName
doubleWorkCont.Tel = manCont.SpouseTel
doubleWorkCont.Company = manCont.SpouseCompany
doubleWorkCont.Department = manCont.SpouseDepartment
doubleWorkCont.Position = manCont.SpousePosition
doubleWorkCont.State = state
overall.CONSTANT_DB_HR.Create(&doubleWorkCont)
}
}
//编辑紧急联系人信息
func emergencyContactPerson(manCont addKingdeePersonnel) {
defer synPro.Done()
var emeContPerAry []emergencyContact
if manCont.UrgentNameOne != "" || manCont.UrgentRelationshipOne != "" || manCont.UrgentMobilephoneOne != "" {
var emeContPerOne emergencyContact
emeContPerOne.Name = manCont.UrgentNameOne //姓名1
emeContPerOne.Relationship = manCont.UrgentRelationshipOne //与紧急联系人1
emeContPerOne.Mobilephone = manCont.UrgentMobilephoneOne //联系电话1
emeContPerAry = append(emeContPerAry, emeContPerOne)
}
if manCont.UrgentNameTwo != "" || manCont.UrgentRelationshipTwo != "" || manCont.UrgentMobilephoneTwo != "" {
var emeContPerTwo emergencyContact
emeContPerTwo.Name = manCont.UrgentNameTwo //姓名2
emeContPerTwo.Relationship = manCont.UrgentRelationshipTwo //与紧急联系人2
emeContPerTwo.Mobilephone = manCont.UrgentMobilephoneTwo //联系电话2
emeContPerAry = append(emeContPerAry, emeContPerTwo)
}
if len(emeContPerAry) > 0 {
var oldEmePersList []models.EmergencyContact
oldEmeErr := overall.CONSTANT_DB_HR.Where("`number` = ?", manCont.Number).Find(&oldEmePersList).Error
if oldEmeErr == nil {
var writeName []string
var allId []int64
var isEite []int64
for _, ev := range emeContPerAry {
for _, ov := range oldEmePersList {
if overallhandle.JudgeInMap(ov.Id, allId) == false {
allId = append(allId, ov.Id)
}
if ev.Name == ov.Name {
writeName = append(writeName, ev.Name)
if overallhandle.JudgeInMap(ov.Id, isEite) == false {
isEite = append(isEite, ov.Id)
}
eitdCont := overallhandle.MapOut()
if ev.Relationship != "" && ev.Relationship != ov.Relationship {
eitdCont["relationship"] = ev.Relationship
}
if ev.Mobilephone != "" && ev.Mobilephone != ov.Tel {
eitdCont["tel"] = ev.Mobilephone
}
if ov.State != 1 {
eitdCont["state"] = 1
}
if len(eitdCont) > 0 {
eitdCont["time"] = time.Now().Unix()
var oldEmePersCont models.EmergencyContact
oldEmePersCont.EiteCont(map[string]interface{}{"`id`": ov.Id}, eitdCont)
}
}
}
}
//判断两个紧急人员是否都写入
// if len(writeName) != 2 {
for _, sv := range emeContPerAry {
if overallhandle.StringIsInMap(sv.Name, writeName) == false {
var addEmeCont models.EmergencyContact
addEmeCont.Number = manCont.Number
addEmeCont.Name = sv.Name
addEmeCont.Relationship = sv.Relationship
addEmeCont.Tel = sv.Mobilephone
addEmeCont.State = 1
addEmeCont.Time = time.Now().Unix()
overall.CONSTANT_DB_HR.Create(&addEmeCont)
}
}
// }
} else {
for _, insetv := range emeContPerAry {
var addEmeCont models.EmergencyContact
addEmeCont.Number = manCont.Number
addEmeCont.Name = insetv.Name
addEmeCont.Relationship = insetv.Relationship
addEmeCont.Tel = insetv.Mobilephone
addEmeCont.State = 1
addEmeCont.Time = time.Now().Unix()
overall.CONSTANT_DB_HR.Create(&addEmeCont)
}
}
}
}
//编辑员工家属
func eidtFamilyMembers(num string, family []memberOfFamily) {
defer synPro.Done()
if len(family) > 0 && num != "" {
var familyAry []models.FamilyMembers
famErr := overall.CONSTANT_DB_HR.Where("`number` = ?", num).Find(&familyAry).Error
if famErr == nil {
var writeName []string
var allId []int64
var isEite []int64
for _, fv := range family {
for _, fav := range familyAry {
if overallhandle.JudgeInMap(fav.Id, allId) == false {
allId = append(allId, fav.Id)
}
if fv.Name == fav.Name {
writeName = append(writeName, fv.Name)
if overallhandle.JudgeInMap(fav.Id, isEite) == false {
isEite = append(isEite, fav.Id)
}
eitdCont := overallhandle.MapOut()
if fv.Relationship != "" && fv.Relationship != fav.Relationship {
eitdCont["relation"] = fv.Relationship
}
if fv.Mobilephone != "" && fv.Mobilephone != fav.Tel {
eitdCont["tel"] = fv.Mobilephone
}
if fv.Company != "" && fv.Company != fav.Company {
eitdCont["company"] = fv.Company
}
if fv.Department != "" && fv.Department != fav.Deparment {
eitdCont["deparment"] = fv.Department
}
if fv.Position != "" && fv.Position != fav.Postnme {
eitdCont["postnme"] = fv.Position
}
if fv.PoliticalOutlook != 0 && fv.PoliticalOutlook != fav.PoliticalOutlook {
eitdCont["political_outlook"] = fv.PoliticalOutlook
}
if len(eitdCont) > 0 {
eitdCont["time"] = time.Now().Unix()
var oldFamilyCont models.FamilyMembers
oldFamilyCont.EiteCont(map[string]interface{}{"`id`": fav.Id}, eitdCont)
}
}
}
}
//新增不存在得家庭成员
for _, afv := range family {
if overallhandle.StringIsInMap(afv.Name, writeName) == false {
var addFamliyCont models.FamilyMembers
addFamliyCont.Number = num
addFamliyCont.Relationship = afv.Relationship //亲属关系"`
addFamliyCont.Name = afv.Name //姓名"`
addFamliyCont.Company = afv.Company //所在公司"`
addFamliyCont.Deparment = afv.Department //所在部门"`
addFamliyCont.Postnme = afv.Position //所在岗位"`
addFamliyCont.Tel = afv.Mobilephone //紧急联系人电话"`
addFamliyCont.PoliticalOutlook = afv.PoliticalOutlook //政治面貌
addFamliyCont.Time = time.Now().Unix() // 创建时间"`
overall.CONSTANT_DB_HR.Create(&addFamliyCont)
}
}
} else {
//新增家庭成员
for _, v := range family {
var addFamliyCont models.FamilyMembers
addFamliyCont.Number = num
addFamliyCont.Relationship = v.Relationship //亲属关系"`
addFamliyCont.Name = v.Name //姓名"`
addFamliyCont.Company = v.Company //所在公司"`
addFamliyCont.Deparment = v.Department //所在部门"`
addFamliyCont.Postnme = v.Position //所在岗位"`
addFamliyCont.Tel = v.Mobilephone //紧急联系人电话"`
addFamliyCont.PoliticalOutlook = v.PoliticalOutlook //政治面貌
addFamliyCont.Time = time.Now().Unix() // 创建时间"`
overall.CONSTANT_DB_HR.Create(&addFamliyCont)
}
}
}
}
//教育经历
func educatExperKingdee(manCont addKingdeePersonnel) {
defer synPro.Done()
if manCont.HighestGraduationSchool != "" {
//最高学历
var perEduContHig models.PersonnelEducation
highestGormDb := overall.CONSTANT_DB_HR.Model(&models.PersonnelEducation{}).Where("number = ? AND graduation_school = ? AND subject = ?", manCont.Number, manCont.HighestGraduationSchool, manCont.HighestSubject)
higErr := highestGormDb.First(&perEduContHig).Error
if higErr == nil {
eitdCont := overallhandle.MapOut()
if manCont.HighestEducation != 0 && manCont.HighestEducation != perEduContHig.Education {
eitdCont["education"] = manCont.HighestEducation
}
if manCont.HighestAcademicDegree != 0 && manCont.HighestAcademicDegree != perEduContHig.AcademicDegree {
eitdCont["academic_degree"] = manCont.HighestAcademicDegree
}
if manCont.HighestAdmissionTime != "" {
entranceTime, _ := overallhandle.DateToTimeStamp(fmt.Sprintf("%v 00:00:00", manCont.HighestAdmissionTime))
if entranceTime != perEduContHig.AdmissionTime {
eitdCont["admission_time"] = entranceTime
}
}
if manCont.HighestGraduationTime != "" {
graduationTime, _ := overallhandle.DateToTimeStamp(fmt.Sprintf("%v 00:00:00", manCont.HighestGraduationTime))
if graduationTime != perEduContHig.GraduationTime {
eitdCont["graduation_time"] = graduationTime
}
}
if len(eitdCont) > 0 {
eitdCont["Time"] = time.Now().Unix()
eitdCont["level"] = 3
var oldFamilyCont models.PersonnelEducation
oldFamilyCont.EiteCont(map[string]interface{}{"`id`": perEduContHig.Id}, eitdCont)
}
} else {
var perEduContFirstIsTrue models.PersonnelEducation
highestGormDbIsTrue := overall.CONSTANT_DB_HR.Model(&models.PersonnelEducation{}).Where("number = ?", manCont.Number).First(&perEduContFirstIsTrue).Error
if highestGormDbIsTrue == nil {
eitdCont := overallhandle.MapOut()
eitdCont["Time"] = time.Now().Unix()
eitdCont["level"] = 1
var oldFamilyCont models.PersonnelEducation
oldFamilyCont.EiteCont(map[string]interface{}{"`number`": manCont.Number, "level": 3}, eitdCont)
}
perEduContHig.Number = manCont.Number // 员工工号
perEduContHig.Education = manCont.HighestEducation // 学历(1:初中及以下;2:中专;3:高中;4:中技;5:高技;6:函数专科;7:大学专科;8:函数本科;9:大学本科;10:硕士研究生;11:博士研究生;12:专家、教授)"`
perEduContHig.GraduationSchool = manCont.HighestGraduationSchool // 毕业学校"`
perEduContHig.Subject = manCont.HighestSubject // 专业"`
entranceTime := time.Now().Unix()
if manCont.HighestAdmissionTime != "" {
entranceTime, _ = overallhandle.DateToTimeStamp(fmt.Sprintf("%v 00:00:00", manCont.HighestAdmissionTime))
}
perEduContHig.AdmissionTime = entranceTime // 入学时间"`
graduationTime := time.Now().Unix()
if manCont.HighestGraduationTime != "" {
graduationTime, _ = overallhandle.DateToTimeStamp(fmt.Sprintf("%v 00:00:00", manCont.HighestGraduationTime))
}
perEduContHig.GraduationTime = graduationTime // 毕业时间"`
perEduContHig.Time = time.Now().Unix() // 写入时间"`
perEduContHig.AcademicDegree = manCont.HighestAcademicDegree
perEduContHig.Level = 3 // 学历类型(1:普通;2:第一学历;3:最高学历)"`
overall.CONSTANT_DB_HR.Create(&perEduContHig)
}
}
//第一学历
if manCont.FirstGraduationSchool != "" {
//第一学历
var perEduContFirst models.PersonnelEducation
firsthestGormDb := overall.CONSTANT_DB_HR.Model(&models.PersonnelEducation{}).Where("number = ? AND graduation_school = ? AND subject = ?", manCont.Number, manCont.FirstGraduationSchool, manCont.FirstSubject)
higErr := firsthestGormDb.First(&perEduContFirst).Error
if higErr == nil {
eitdContFirst := overallhandle.MapOut()
if manCont.FirstEducation != 0 && manCont.FirstEducation != perEduContFirst.Education {
eitdContFirst["education"] = manCont.FirstEducation
}
if manCont.FirstAcademicDegree != 0 && manCont.FirstAcademicDegree != perEduContFirst.AcademicDegree {
eitdContFirst["academic_degree"] = manCont.FirstAcademicDegree
}
if manCont.FirstAdmissionTime != "" {
entranceTimeFirst, _ := overallhandle.DateToTimeStamp(fmt.Sprintf("%v 00:00:00", manCont.FirstAdmissionTime))
if entranceTimeFirst != perEduContFirst.AdmissionTime {
eitdContFirst["admission_time"] = entranceTimeFirst
}
}
if manCont.FirstGraduationTime != "" {
graduationTimeFirst, _ := overallhandle.DateToTimeStamp(fmt.Sprintf("%v 00:00:00", manCont.FirstGraduationTime))
if graduationTimeFirst != perEduContFirst.GraduationTime {
eitdContFirst["graduation_time"] = graduationTimeFirst
}
}
if len(eitdContFirst) > 0 {
eitdContFirst["Time"] = time.Now().Unix()
eitdContFirst["level"] = 3
var oldFamilyContFirst models.PersonnelEducation
oldFamilyContFirst.EiteCont(map[string]interface{}{"`id`": perEduContFirst.Id}, eitdContFirst)
}
} else {
var perEduContFirstIsTrue models.PersonnelEducation
highestGormDbIsTrue := overall.CONSTANT_DB_HR.Model(&models.PersonnelEducation{}).Where("number = ?", manCont.Number).First(&perEduContFirstIsTrue).Error
if highestGormDbIsTrue == nil {
eitdContFirst := overallhandle.MapOut()
eitdContFirst["Time"] = time.Now().Unix()
eitdContFirst["level"] = 1
var oldFamilyContFirst models.PersonnelEducation
oldFamilyContFirst.EiteCont(map[string]interface{}{"`number`": manCont.Number, "level": 1}, eitdContFirst)
}
perEduContFirst.Number = manCont.Number // 员工工号
perEduContFirst.Education = manCont.FirstEducation // 学历(1:初中及以下;2:中专;3:高中;4:中技;5:高技;6:函数专科;7:大学专科;8:函数本科;9:大学本科;10:硕士研究生;11:博士研究生;12:专家、教授)"`
perEduContFirst.GraduationSchool = manCont.FirstGraduationSchool // 毕业学校"`
perEduContFirst.Subject = manCont.FirstSubject // 专业"`
entranceTimeFirst := time.Now().Unix()
if manCont.HighestAdmissionTime != "" {
entranceTimeFirst, _ = overallhandle.DateToTimeStamp(fmt.Sprintf("%v 00:00:00", manCont.HighestAdmissionTime))
}
perEduContFirst.AdmissionTime = entranceTimeFirst // 入学时间"`
graduationTimef := time.Now().Unix()
if manCont.HighestGraduationTime != "" {
graduationTimef, _ = overallhandle.DateToTimeStamp(fmt.Sprintf("%v 00:00:00", manCont.HighestGraduationTime))
}
perEduContFirst.GraduationTime = graduationTimef // 毕业时间"`
perEduContFirst.Time = time.Now().Unix() // 写入时间"`
perEduContFirst.AcademicDegree = manCont.FirstAcademicDegree
perEduContFirst.Level = 2 // 学历类型(1:普通;2:第一学历;3:最高学历)"`
overall.CONSTANT_DB_HR.Create(&perEduContFirst)
}
}
}

1714
api/version1/personnelapi/kingdeenew.go

File diff suppressed because it is too large

1334
api/version1/personnelapi/staff.go

File diff suppressed because it is too large

1550
api/version1/personnelapi/staffarchives.go

File diff suppressed because it is too large

448
api/version1/personnelapi/type.go

@ -0,0 +1,448 @@
package personnelapi
import (
"hr_server/models"
"hr_server/overall/overallhandle"
"sync"
"github.com/gin-gonic/gin"
)
//协程
var synPro = sync.WaitGroup{}
//人员API
type StaffApi struct{}
//入口
func (s *StaffApi) Index(c *gin.Context) {
outputCont := overallhandle.MapOut()
outputCont["index"] = "人员档案API"
overallhandle.Result(0, outputCont, c)
}
//人员列表查询
type peopleList struct {
overallhandle.PageTurning
Number string `json:"number"` //工号
Name string `json:"name"` //name
HireClass int `json:"hireclass"` //雇佣类型
Company int64 `json:"company"` //公司
// Deparment string `json:"deparment"` //部门
AdminOrg int64 `json:"adminorg"` //所属行政组织
Position int64 `json:"position"` //职位
EmpType int `json:"emptype"` //用工关系(1:实习生;2:待分配;3:试用员工;4:正式员工;5:停薪留职;6:退休;7:辞退;8:离职)
Role string `json:"role"`
}
//人员列表输出
type peopleOutList struct {
models.Personnel
Mobilephone string `json:"mobilephone" gorm:"column:mobilephone;type:varchar(50) unsigned;default:'';not null;comment:手机号码"`
Gender int `json:"gender" gorm:"column:type;gender:tinyint(1) unsigned;default:1;not null;comment:性别(1:男性;2:女性;3:中性)"`
Isdoubleworker int `json:"isdoubleworker" gorm:"column:type;isdoubleworker:tinyint(1) unsigned;default:1;not null;comment:是否双职工(1:是;2:否)"`
Isveterans int `json:"isveterans" gorm:"column:type;isveterans:tinyint(1) unsigned;default:1;not null;comment:是否为退役军人(1:是;2:否)"`
Entrydate int64 `json:"entrydate" gorm:"column:entrydate;type:bigint(20) unsigned;default:0;not null;comment:入职日期"`
Probationperiod int64 `json:"probationperiod" gorm:"column:probationperiod;type:int(5) unsigned;default:0;not null;comment:试用期"`
Planformaldate int64 `json:"planformaldate" gorm:"column:planformaldate;type:bigint(20) unsigned;default:0;not null;comment:预计转正日期"`
CompanyName string `json:"companyname"` //公司名称
DeparmentName string `json:"deparmentname"` //部门名称
PositionName string `json:"positionname"` //职位
KeyStr string `json:"keystr"` //身份认证
}
type peopleManOutList struct {
models.ManCont
CompanyName string `json:"companyname"` //公司名称
MainDeparmentName string `json:"maindeparmentname"` //主部门
SunMainDeparmentName string `json:"sunmaindeparmentname"` //二级主部门
// DeparmentName string `json:"deparmentname"` //部门名称
WorkPostName string `json:"workpostname"` //工段名称
PositionName string `json:"positionname"` //职位
KeyStr string `json:"keystr"` //身份认证
}
//获取部门细腻些
type getDepartmentInfo struct {
Id int64 `json:"id"` //id
Number string `json:"number"` //行政编码
Name string `json:"name"` //组织名称
}
//添加员工参数
type addPersonnel struct {
//员工主表
Number string `json:"number"` //工号1
Password string `json:"password"` //密码1
Name string `json:"name"` //姓名1
Icon string `json:"icon"` //头像
HireType int `json:"hiretype"` //1雇佣类型(1:雇佣入职;2:再入职;3:返聘)
EmpType int `json:"emptype"` //用工关系(1:实习生;2:待分配;3:试用员工;4:正式员工;5:停薪留职;6:退休;7:辞退;8:离职;9:应聘人员)
Company int64 `json:"company"` //公司
MainDepartment string `json:"maindepartment"` //主部门
Department []string `json:"department"` //分厂(部室)
AdminOrg int64 `json:"adminorg"` //工段
Position int64 `json:"position"` //职位(岗位)1
JobName string `json:"jobname"` //职务
PositionGrade int64 `json:"positiongrade"` //入职等级
Team string `json:"team"` //工段
//员工副表
Passportno string `json:"passportno"` //护照号码
Globalroaming string `json:"globalroaming"` //国际区号
IDCardNo string `json:"idcardno"` //身份证号码
IDCardStartTime string `json:"idcardnostarttime"` //身份证有效期开始
IDCardEndTime string `json:"idcardnoendtime"` //身份证有效期结束
IDCardAddress string `json:"idcardnoaddress"` //身份证地址
IDCardIsSued string `json:"idcardissued"` //身份证签发机关
Mobilephone string `json:"mobilephone"` //联系电话
Email string `json:"email"` //电子邮件
Gender int `json:"gender"` //性别
Birthday string `json:"birthday"` //生日
Nation string `json:"nation"` //民族
NativePlace string `json:"nativeplace"` //籍贯
Health int `json:"health"` //健康状况(1:良好;2:一般;3:较弱,4:有生理缺陷;5:残废
Maritalstatus int `json:"maritalstatus"` //婚姻状况(1:未婚;2:已婚;3:丧偶;4:离异)
CurrentResidence string `json:"currentresidence"` //现居地
WorkingDate string `json:"workingdate"` //参加工作日期
EntryDate string `json:"entrydate"` //入职日期
ProbationPeriod int `json:"probationperiod"` //试用期(月)
ConfirmationDate string `json:"confirmationdate"` //转正日期
Constellation int `json:"constellation"` //星座(1:白羊座;2:金牛座;3:双子座;4:巨蟹座;5:狮子座;6:处女座;7:天枰座;8:天蝎座;9:射手座;10:摩羯座;11:水瓶座;12:双鱼座)
PoliticalOutlook int `json:"politicaloutlook"` //政治面貌(1:群众;2:无党派;3:台盟会员;4:九三社员;5:致公党员;6:农工党员;7:民进会员;8:民建会员;9:民盟盟员;10:民革会员,11:共青团员;12:预备党员;13:中共党员)
Isveterans int `json:"isveterans"` //是否为退役军人(1:是;2:否)
Veteransnumber string `json:"veteransnumber"` //退役证编号
Iisdoubleworker int `json:"isdoubleworker"` //是否双职工(1:是;2:否)
DoubleWorkerList []DoubleWorkerInFo `json:"doubleworkerlist"` //双职工列表
EducationalExperience []educationalExperience `json:"educationalexperience"` //教育经历
EmergencyContact []emergencyContact `json:"emergencycontact"` //紧急联系人
MemberOfFamily []memberOfFamily `json:"memberoffamily"` //家庭成员
WorkHistoryList []workHistoryAry `json:"workhistorylist"` //工作履历
//集团内工作履历
InsideWorkHistory []insideHistoryerMy `json:"insideworkhistory"` //工作履历
}
//集团内部工作履历
type insideHistoryerMy struct {
OrgId string `json:"orgid"` //行政组织
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:员工初始化;)
AssignType int `json:"assigntype"` //1:主职,2:兼职
Team string `json:"team"` //班组
}
//教育经历
type educationalExperience struct {
GraduationSchool string `json:"graduationschool"` //毕业学校
Subject string `json:"subject"` //专业
Education int `json:"education"` //学历(1:初中及以下;2:中专;3:高中;4:中技;5:高技;6:函数专科;7:大学专科;8:函数本科;9:大学本科;10:硕士研究生;11:博士研究生;12:专家、教授)
AdmissionTime string `json:"admissiontime"` //入学时间
GraduationTime string `json:"graduationtime"` //毕业时间
AcademicDegree string `json:"academicdegree"` //学位(1:无;2:学士;3:硕士;4:博士)
Level string `json:"level"` //学历类型
}
//紧急联系人
type emergencyContact struct {
Id string `json:"id"`
Name string `json:"name"` //姓名
Relationship string `json:"relationship"` //与紧急联系人
Mobilephone string `json:"mobilephone"` //联系电话
}
//家庭成员
type memberOfFamily struct {
emergencyContact
Company string `json:"company"` //公司
Department string `json:"department"` //分厂(部室)
Position string `json:"position"` //职位(岗位)
PoliticalOutlook int `json:"politicaloutlook"` //政治面貌(1:群众;2:无党派;3:台盟会员;4:九三社员;5:致公党员;6:农工党员;7:民进会员;8:民建会员;9:民盟盟员;10:民革会员,11:共青团员;12:预备党员;13:中共党员)
IdStr string `json:"idstr"`
}
//职务相关
type jobAttber 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(255) unsigned;default:'';not null;comment:编号"`
Name string `json:"name" gorm:"column:name;type:varchar(255) unsigned;default:'';not null;comment:名称"`
PersonInCharge int `json:"personincharge" gorm:"column:person_in_charge;type:tinyint(1) unsigned;default:0;not null;comment:是否为本部门负责人"`
Dutid int64 `json:"dutid" gorm:"column:dutid;type:bigint(20) unsigned;default:0;not null;comment:职务Id"`
Dutname string `json:"dutname" gorm:"column:dutname;type:varchar(255) unsigned;default:'';not null;comment:职务名称"`
DutNumber string `json:"dutnumber" gorm:"column:dutnumber;type:varchar(255) unsigned;default:'';not null;comment:职务编号"`
Jobid int64 `json:"jobid" gorm:"column:jobid;type:bigint(20) unsigned;default:0;not null;comment:职务分类Id"`
JobName string `json:"jobname" gorm:"column:jobname;type:varchar(255) unsigned;default:'';not null;comment:职务分类名称"`
}
//配权
type allocationOfRightsToRole struct {
Id string `json:"id"`
RoleId string `json:"roleid"`
}
//添加员工参数
type addKingdeePersonnel struct {
Number string `json:"number"` //工号1
Name string `json:"name"` //姓名1
Icon string `json:"icon"` //头像
HireType int `json:"hiretype"` //1雇佣类型(1:雇佣入职;2:再入职;3:返聘)
EmpType int `json:"emptype"` //用工关系(1:实习生;2:待分配;3:试用员工;4:正式员工;5:停薪留职;6:退休;7:辞退;8:离职) int
Company string `json:"company"` //公司
MainDepartment string `json:"maindepartment"` //主部门
Department []string `json:"department"` //分厂(部室)
AdminOrg string `json:"adminorg"` //工段
Position string `json:"position"` //职位(岗位)1
JobName string `json:"jobname"` //职务
PositionGrade int64 `json:"positiongrade"` //入职等级 int64
//员工副表
Passportno string `json:"passportno"` //护照号码
Globalroaming string `json:"globalroaming"` //国际区号
IDCardNo string `json:"idcardno"` //身份证号码
IDCardStartTime string `json:"idcardnostarttime"` //身份证有效期开始
IDCardEndTime string `json:"idcardnoendtime"` //身份证有效期结束
IDCardAddress string `json:"idcardnoaddress"` //身份证地址
IDCardIsSued string `json:"idcardissued"` //身份证签发机关
Mobilephone string `json:"mobilephone"` //联系电话
Email string `json:"email"` //电子邮件
Gender int `json:"gender"` //性别 int
Birthday string `json:"birthday"` //生日
Nation string `json:"nation"` //民族
NativePlace string `json:"nativeplace"` //籍贯
Health int `json:"health"` //健康状况(1:良好;2:一般;3:较弱,4:有生理缺陷;5:残废 int
Maritalstatus int `json:"maritalstatus"` //婚姻状况(1:未婚;2:已婚;3:丧偶;4:离异) int
CurrentResidence string `json:"currentresidence"` //现居地
WorkingDate string `json:"workingdate"` //参加工作日期
EntryDate string `json:"entrydate"` //入职日期
ProbationPeriod int `json:"probationperiod"` //试用期(月)
ConfirmationDate string `json:"confirmationdate"` //转正日期 int
Constellation int `json:"constellation"` //星座(1:白羊座;2:金牛座;3:双子座;4:巨蟹座;5:狮子座;6:处女座;7:天枰座;8:天蝎座;9:射手座;10:摩羯座;11:水瓶座;12:双鱼座) int
PoliticalOutlook int `json:"politicaloutlook"` //政治面貌(1:群众; 2:无党派;3:台盟会员;4:九三社员;5:致公党员;6:农工党员;7:民进会员;8:民建会员;9:民盟盟员;10:民革会员,11:共青团员;12:预备党员;13:中共党员) int
//退役军人
Isveterans int `json:"isveterans"` //是否为退役军人(1:是;2:否) int
Veteransnumber string `json:"veteransnumber"` //退役证编号
//双职工表
//是否为双职工
Iisdoubleworker int `json:"isdoubleworker"` //是否双职工(1:是;2:否) int
SpouseName string `json:"spousename"` //配偶姓名
SpouseCompany string `json:"spousecompany"` //配偶所在公司
SpouseDepartment string `json:"spousedepartment"` //配偶所在部门
SpousePosition string `json:"spouseposition"` //配偶所在岗位
SpouseTel string `json:"spousetel"` //配偶联系方式
//教育经历表
//最高学历
HighestGraduationSchool string `json:"highestschool"` //毕业学校
HighestEducation int `json:"highesteducation"` //学历(1:初中及以下;2:中专;3:高中;4:中技;5:高技;6:函数专科;7:大学专科;8:函数本科;9:大学本科;10:硕士研究生;11:博士研究生;12:专家、教授)int
HighestSubject string `json:"highestsubject"` //专业
HighestAdmissionTime string `json:"highestadmissiontime"` //入学时间
HighestGraduationTime string `json:"highestgraduationtime"` //毕业时间
HighestAcademicDegree int `json:"highestacademicdegree"` //学位(0:无;1:学士;2:硕士;3:博士)int
//第一学历
FirstGraduationSchool string `json:"firstschool"` //毕业学校
FirstEducation int `json:"firsteducation"` //学历(1:初中及以下;2:中专;3:高中;4:中技;5:高技;6:函数专科;7:大学专科;8:函数本科;9:大学本科;10:硕士研究生;11:博士研究生;12:专家、教授)int
FirstSubject string `json:"firstsubject"` //专业
FirstAdmissionTime string `json:"firstadmissiontime"` //入学时间
FirstGraduationTime string `json:"firstgraduationtime"` //毕业时间
FirstAcademicDegree int `json:"firstacademicdegree"` //学位(0:无;1:学士;2:硕士;3:博士)int
//紧急联系人表
//紧急联系人一
UrgentNameOne string `json:"urgentnameone"` //姓名
UrgentRelationshipOne string `json:"urgentrelationshipone"` //与紧急联系人
UrgentMobilephoneOne string `json:"urgentmobilephoneone"` //联系电话
//紧急联系人二
UrgentNameTwo string `json:"urgentnametwo"` //姓名
UrgentRelationshipTwo string `json:"urgentrelationshiptwo"` //与紧急联系人
UrgentMobilephoneTwo string `json:"urgentmobilephonetwo"` //联系电话
//员工家属表
MemberOfFamily []memberOfFamily `json:"memberoffamily"` //家庭成员
//集团外工作履历
WorkHistoryList []workHistoryAry `json:"workhistorylist"` //工作履历
//集团内工作履历
InsideWorkHistory []insideHistory `json:"insideworkhistory"` //工作履历
}
//人员档案详情
type staffArchivesCont struct {
models.ManCont
BirthdayTime string `json:"birthdaytime"` //生日
IdCardStartTimeData string `json:"idcardstarttimedata"` //身份证有效期开始时间
IdCardEndTimeData string `json:"idcardendtimedata"` //身份证有效期结束时间
EntrydateTime string `json:"entrydatetime"` //入职日期
PlanformaldateTime string `json:"planformaldatetime"` //预计转正日期
DoubleWorkerList []DoubleWorkerCont `json:"doubleworkerlist"`
EducationalExperience []educatExp `json:"educationalexperience"` //教育经历
EmergencyContact []emergencyContact `json:"emergencycontact"` //紧急联系人
MemberOfFamily []memberOfFamily `json:"memberoffamily"` //家庭成员
WorkHistoryList []workHistoryAry `json:"workhistorylist"` //工作履历
InsideWorkHistory []insideHistory `json:"groupworkhistorylist"` //集团内工作履历
IdStr string `json:"idstr"`
CompanyName string `json:"companyname"` //公司名称
MainDeparmentName string `json:"maindeparmentname" ` //主部门
AdminOrgName string `json:"adminorgname"` //主岗位
PositionName string `json:"positionname"` //职位
JobClassName string `json:"jobclassname"` //职务分类
JobIdName string `json:"jobidname"` //职务
PoliticalOutlookName string `json:"politicaloutlookname"` //政治面貌
}
//双职工
type DoubleWorkerCont struct {
Id string `json:"id"`
Number string `json:"number"` //工号
Name string `json:"name"` //姓名
Company string `json:"company"` //公司
Department string `json:"department"` //分厂(部室)
Position string `json:"position"` //职位(岗位)
Mobilephone string `json:"mobilephone"` //联系电话
}
type DoubleWorkerInFo struct {
Number string `json:"number"` //工号
Name string `json:"name"` //姓名
Company string `json:"company"` //公司
Department string `json:"department"` //分厂(部室)
Position string `json:"position"` //职位(岗位)
Mobilephone string `json:"mobilephone"` //联系电话
}
type educatExp struct {
educationalExperience
AcademicDegreeId int `json:"academicdegreeid"` //学位(0:无;1:学士;2:硕士;3:博士)
LevelId int `json:"levelid"` //学历类型(1:普通;2:第一学历;3:最高学历)
Id string `json:"id"`
}
//工作履历
type workHistoryAry struct {
Company string `json:"company"` //公司
Department string `json:"department"` //部门
Position string `json:"fposition"` //职务
EntryTime string `json:"entrytime"` //入职时间
LeaveDate string `json:"leavedate"` //离职日期
Witness string `json:"witness"` //证明人
WitnessTel string `json:"witnesstel"` //证明人电话
Remarks string `json:"remarks"` //备注
}
//判断是否需要编辑工作履历
type judgeWorkHistory struct {
Company string `json:"company"` //公司
Department string `json:"department"` //部门
Position string `json:"position"` //职务
}
//编辑双职工状态
type eidtWorkState struct {
Id string `json:"id"`
State int `json:"state"`
IsDel int `json:"isdel"`
}
//编辑员工参数
type eitePersonnel struct {
Id string `json:"id"`
//员工主表
// Number string `json:"number"` //工号1
// Password string `json:"password"` //密码1
Name string `json:"name"` //姓名1
Icon string `json:"icon"` //头像
HireType int `json:"hiretype"` //1雇佣类型(1:雇佣入职;2:再入职;3:返聘)
EmpType int `json:"emptype"` //用工关系(1:实习生;2:待分配;3:试用员工;4:正式员工;5:停薪留职;6:退休;7:辞退;8:离职;9:应聘人员)
Company int64 `json:"company"` //公司
MainDepartment int64 `json:"maindepartment"` //主部门
Department []string `json:"department"` //分厂(部室)
AdminOrg int64 `json:"adminorg"` //工段
Position int64 `json:"position"` //职位(岗位)1
// JobName int64 `json:"jobname"` //职务
PositionGrade int64 `json:"positiongrade"` //入职等级
//员工副表
Passportno string `json:"passportno"` //护照号码
Globalroaming string `json:"globalroaming"` //国际区号
IDCardNo string `json:"idcardno"` //身份证号码
IDCardStartTime string `json:"idcardnostarttime"` //身份证有效期开始
IDCardEndTime string `json:"idcardnoendtime"` //身份证有效期结束
IDCardAddress string `json:"idcardnoaddress"` //身份证地址
IDCardIsSued string `json:"idcardissued"` //身份证签发机关
Mobilephone string `json:"mobilephone"` //联系电话
Email string `json:"email"` //电子邮件
Gender int `json:"gender"` //性别
Birthday string `json:"birthday"` //生日
Nation string `json:"nation"` //民族
NativePlace string `json:"nativeplace"` //籍贯
Health int `json:"health"` //健康状况(1:良好;2:一般;3:较弱,4:有生理缺陷;5:残废
Maritalstatus int `json:"maritalstatus"` //婚姻状况(1:未婚;2:已婚;3:丧偶;4:离异)
CurrentResidence string `json:"currentresidence"` //现居地
WorkingDate string `json:"workingdate"` //参加工作日期
EntryDate string `json:"entrydate"` //入职日期
ProbationPeriod int `json:"probationperiod"` //试用期(月)
ConfirmationDate string `json:"confirmationdate"` //转正日期
Constellation int `json:"constellation"` //星座(1:白羊座;2:金牛座;3:双子座;4:巨蟹座;5:狮子座;6:处女座;7:天枰座;8:天蝎座;9:射手座;10:摩羯座;11:水瓶座;12:双鱼座)
PoliticalOutlook int `json:"politicaloutlook"` //政治面貌(1:群众;2:无党派;3:台盟会员;4:九三社员;5:致公党员;6:农工党员;7:民进会员;8:民建会员;9:民盟盟员;10:民革会员,11:共青团员;12:预备党员;13:中共党员)
Isveterans int `json:"isveterans"` //是否为退役军人(1:是;2:否)
Veteransnumber string `json:"veteransnumber"` //退役证编号
Iisdoubleworker int `json:"isdoubleworker"` //是否双职工(1:是;2:否)
DoubleWorkerList []DoubleWorkerInFo `json:"doubleworkerlist"` //双职工列表
}
//添加紧急联系人
type addEmergencyContact struct {
Id string `json:"id"`
List []emergencyContact `json:"list"`
}
//添加家庭成员
type addFamilyPeople struct {
Id string `json:"id"`
List []memberOfFamily `json:"list"`
}
//添加教育经历
type addExpToSchool struct {
Id string `json:"id"`
List []educationalExperience `json:"list"`
}
//编辑教育经历
type editExpToSchool struct {
Id string `json:"id"`
educationalExperience
}
//添加工作履历
type addWorkHistory struct {
Id string `json:"id"`
List []workHistoryAry `json:"list"`
}
//编辑教育经历
type editWorkHistory struct {
Id string `json:"id"`
workHistoryAry
}
//集团内部工作履历
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:员工初始化;)
}
//编辑集团工作履历
type eidtInsideHistoryWork struct {
Id string `json:"id"`
insideHistoryerMy
}

113
api/version1/personnelapi/types.go

@ -0,0 +1,113 @@
package personnelapi
//添加员工参数
type addKingdeePersonneles struct {
Number string `json:"fnumber"` //工号1
Name string `json:"name"` //姓名1
Icon string `json:"icon"` //头像
HireType string `json:"hiretype"` //1雇佣类型(1:雇佣入职;2:再入职;3:返聘)int
EmpType string `json:"emptype"` //用工关系(1:实习生;2:待分配;3:试用员工;4:正式员工;5:停薪留职;6:退休;7:辞退;8:离职) int
Company string `json:"company"` //公司
MainDepartment string `json:"maindepartment"` //主部门
Department []string `json:"department"` //分厂(部室)
AdminOrg string `json:"adminorg"` //工段
Position string `json:"fposition"` //职位(岗位)1
JobName string `json:"jobname"` //职务
PositionGrade string `json:"positiongrade"` //入职等级 int64
//员工副表
Passportno string `json:"passportno"` //护照号码
Globalroaming string `json:"globalroaming"` //国际区号
IDCardNo string `json:"idcardno"` //身份证号码
IDCardStartTime string `json:"idcardstartdate"` //身份证有效期开始
IDCardEndTime string `json:"idcardenddate"` //身份证有效期结束
IDCardAddress string `json:"idcardaddress"` //身份证地址
IDCardIsSued string `json:"idcardissued"` //身份证签发机关
Mobilephone string `json:"mobilephone"` //联系电话
Email string `json:"email"` //电子邮件
Gender string `json:"gender"` //性别 int
Birthday string `json:"birthday"` //生日
Nation string `json:"nation"` //民族
NativePlace string `json:"nativeplace"` //籍贯
Health string `json:"health"` //健康状况(1:良好;2:一般;3:较弱,4:有生理缺陷;5:残废 int
Maritalstatus string `json:"maritalstatus"` //婚姻状况(1:未婚;2:已婚;3:丧偶;4:离异) int
CurrentResidence string `json:"currentresidence"` //现居地
WorkingDate string `json:"workingdate"` //参加工作日期
EntryDate string `json:"entrydate"` //入职日期
ProbationPeriod string `json:"probationperiod"` //试用期(月)int
ConfirmationDate string `json:"confirmationdate"` //转正日期
Constellation string `json:"constellation"` //星座(1:白羊座;2:金牛座;3:双子座;4:巨蟹座;5:狮子座;6:处女座;7:天枰座;8:天蝎座;9:射手座;10:摩羯座;11:水瓶座;12:双鱼座) int
PoliticalOutlook string `json:"politicaloutlook"` //政治面貌(1:群众; 2:无党派;3:台盟会员;4:九三社员;5:致公党员;6:农工党员;7:民进会员;8:民建会员;9:民盟盟员;10:民革会员,11:共青团员;12:预备党员;13:中共党员) int
//退役军人
Isveterans string `json:"isveterans"` //是否为退役军人(1:是;2:否) int
Veteransnumber string `json:"veteransnumber"` //退役证编号
//双职工表
//是否为双职工
Iisdoubleworker string `json:"isdoubleworker"` //是否双职工(1:是;2:否) int
SpouseName string `json:"spousename"` //配偶姓名
SpouseCompany string `json:"spousecompany"` //配偶所在公司
SpouseDepartment string `json:"spousedepartment"` //配偶所在部门
SpousePosition string `json:"spouseposition"` //配偶所在岗位
SpouseTel string `json:"spousetel"` //配偶联系方式
//教育经历表
//最高学历
HighestGraduationSchool string `json:"highestschool"` //毕业学校
HighestEducation string `json:"highesteducation"` //学历(1:初中及以下;2:中专;3:高中;4:中技;5:高技;6:函数专科;7:大学专科;8:函数本科;9:大学本科;10:硕士研究生;11:博士研究生;12:专家、教授)int
HighestSubject string `json:"highestsubject"` //专业
HighestAdmissionTime string `json:"highestadmissiontime"` //入学时间
HighestGraduationTime string `json:"highestgraduationtime"` //毕业时间
HighestAcademicDegree string `json:"highestacademicdegree"` //学位(0:无;1:学士;2:硕士;3:博士)int
//第一学历
FirstGraduationSchool string `json:"firstschool"` //毕业学校
FirstEducation string `json:"firsteducation"` //学历(1:初中及以下;2:中专;3:高中;4:中技;5:高技;6:函数专科;7:大学专科;8:函数本科;9:大学本科;10:硕士研究生;11:博士研究生;12:专家、教授)int
FirstSubject string `json:"firstsubject"` //专业
FirstAdmissionTime string `json:"firstadmissiontime"` //入学时间
FirstGraduationTime string `json:"firstgraduationtime"` //毕业时间
FirstAcademicDegree string `json:"firstacademicdegree"` //学位(0:无;1:学士;2:硕士;3:博士)int
//紧急联系人表
//紧急联系人一
UrgentNameOne string `json:"urgentnameone"` //姓名
UrgentRelationshipOne string `json:"urgentrelationshipone"` //与紧急联系人
UrgentMobilephoneOne string `json:"urgentmobilephoneone"` //联系电话
//紧急联系人二
UrgentNameTwo string `json:"urgentnametwo"` //姓名
UrgentRelationshipTwo string `json:"urgentrelationshiptwo"` //与紧急联系人
UrgentMobilephoneTwo string `json:"urgentmobilephonetwo"` //联系电话
//员工家属表
MemberOfFamily []memberOfFamilyes `json:"memberoffamily"` //家庭成员
//集团外工作履历
WorkHistoryList []workHistoryAry `json:"workhistorylist"` //工作履历
//集团内工作履历
InsideWorkHistory []insideHistoryer `json:"insideworkhistory"` //工作履历
}
//家庭成员
type memberOfFamilyes struct {
emergencyContact
Company string `json:"company"` //公司
Department string `json:"department"` //分厂(部室)
Position string `json:"fposition"` //职位(岗位)
PoliticalOutlook string `json:"politicaloutlook"` //政治面貌(1:群众;2:无党派;3:台盟会员;4:九三社员;5:致公党员;6:农工党员;7:民进会员;8:民建会员;9:民盟盟员;10:民革会员,11:共青团员;12:预备党员;13:中共党员) int
IdStr string `json:"idstr"`
}
//集团内部工作履历
type insideHistoryer struct {
Group string `json:"group"` //集团
Company string `json:"company"` //公司
Department string `json:"department"` //部室
Workshop string `json:"workshop"` //二级部门或车间
WorkshopSection string `json:"grop"` //`json:"workshopsection"` //工段
Position string `json:"fposition"` //职位
GradePositions int64 `json:"gradepositions"` //职等
StartTime string `json:"starttime"` //开始日期
EndTime string `json:"endtime"` //结束日期
ChangeType string `json:"changetype"` //变动类型(1:预入职;2:雇佣入职;3:转正;4:晋升;5:降级;6:职等调整;7:调动调入;8:跨公司调动调入;9:借调;10:平调;11:兼职;12:预离职;13:离职;14:退休;15:返聘;16:员工初始化;)
AssignType string `json:"assigntype"`
// Grop string `json:"grop"` //工段
}

305
api/version1/shiyan/shiyan.go

@ -0,0 +1,305 @@
package shiyan
import (
"fmt"
"hr_server/middleware/snowflake"
"hr_server/models"
"hr_server/overall"
"hr_server/overall/overallhandle"
"time"
"github.com/gin-gonic/gin"
// "github.com/golang-migrate/migrate/v4/database/snowflake"
)
func (s *ShiYan) ShiyanCont(c *gin.Context) {
// var requestData Jieshou
// c.ShouldBindJSON(&requestData)
// if requestData.Time == "" {
// requestData.Time = overallhandle.UnixTimeToDay(time.Now().Unix(), 11)
// }
// entryData, _ := overallhandle.DateToTimeStamp(fmt.Sprintf("%v 00:00:00", requestData.Time))
// planformalData := overallhandle.GetFutureMonthTime(entryData, requestData.ProbationPeriod, 2)
// timeStr := overallhandle.UnixTimeToDay(planformalData, 11)
number := overallhandle.TableNumber()
out := overallhandle.MapOut()
out["time"] = number
fmt.Printf("Number ----->%v\n", number)
// out["time"] = requestData.Time
// out["entryData"] = entryData
// out["timeStr"] = timeStr
var eitePersonnel models.Personnel
eiteCont := overallhandle.MapOut()
eiteCont["role"] = 58
eiteCont["eite_time"] = time.Now().Unix()
eiteErr := eitePersonnel.EiteCont("`role` = ''", eiteCont)
overallhandle.Result(0, eiteErr, c)
}
//人员迁移
func (s *ShiYan) PersonnelMigration(c *gin.Context) {
var oldManCount int64
err := overall.CONSTANT_DB_Master.Model(&models.WorkMan{}).Where("wm_group = 3").Pluck("COALESCE(COUNT(wm_id), 0) as countid", &oldManCount).Error
if err != nil {
overallhandle.Result(1, err, c, "没有要迁移的人员!")
return
}
//分片
var pian int64 = 0
pian = oldManCount / 100
if oldManCount%100 > 0 {
pian++
}
var writePeople peopleQianyi
for i := 1; int64(i) <= pian+1; i++ {
synPro.Add(1)
go writePeople.writeUser(i, 100)
// if i > 1 {
// break
// }
}
synPro.Wait()
readDataMap, allUser := writePeople.readMyDayData()
outMap := overallhandle.MapOut()
outMap["count"] = len(readDataMap)
outMap["list"] = readDataMap
outMap["allUser"] = allUser
overallhandle.Result(0, outMap, c)
}
//分片写入人员
func (p *peopleQianyi) writeUser(page, pagesize int) {
// p.mutext.Lock()
// defer p.mutext.Unlock()
offsetVal := overallhandle.LimitPage(page, pagesize)
var oldUser []models.PersonalDetails
err := overall.CONSTANT_DB_Master.Model(&models.WorkMan{}).Select("worker_man.*,wmd.*").Joins("left join worker_man_data as wmd on wmd.wmd_key = worker_man.wm_key").Where("wm_group = 3").Limit(pagesize).Offset(offsetVal).Find(&oldUser).Error
if err != nil {
return
}
// jsonVal, _ := json.Marshal(oldUser)
fmt.Printf("page=======>%v=====>%v\n", page, offsetVal)
//员工主表
var staffAry []models.Personnel //主资料库
var staffAttributeAry []models.PersonnelContent //人物属性库
for _, v := range oldUser {
if len(v.Number) > 4 {
company, adminOrg, positionId, deparment := getUserOrgSchool(v.Group, v.DepartmentId, v.WorkshopId, v.PostId)
var staffInfo models.Personnel
staffInfo.Number = v.Number //员工工号
staffInfo.Name = v.Name //姓名
staffInfo.HireClass = 1 //雇佣类型(1:雇佣入职;2:再入职;)
staffInfo.Position = positionId //职位
// //获取职务信息
jobCont, jobErr := getJobInfo(positionId)
if jobErr == nil {
staffInfo.PositionLevel = jobCont.Dutid //职位等级
staffInfo.JobClass = jobCont.Jobid //职务分类
}
staffInfo.AdminOrg = adminOrg //所属行政组织
staffInfo.Company = company //入职公司
staffInfo.EmpType = 4 //用工关系(1:实习生;2:待分配;3:试用员工;4:正式员工;5:停薪留职;6:退休;7:辞退;8:离职)
staffInfo.Deparment = deparment //部门
staffInfo.Time = time.Now().Unix()
staffInfo.EiteTime = time.Now().Unix()
// staffInfo.PositionGrade = v.PositionGrade //入职职等
staffInfo.Icon = v.Icon //头像
// staffInfo.Password = v.Password
staffInfo.Wechat = v.WechatId
staffInfo.WorkWechat = v.WorkWechatId
weChatOpenId := v.WechatId
if v.WorkWechatId != "" {
weChatOpenId = v.WorkWechatId
}
//获取微信头像
wechatCont, _ := GetWorkWechatDuiZhao(weChatOpenId)
staffInfo.Icon = wechatCont.Avatar //头像
staffInfo.Password = v.Password //密码
staffInfo.State = v.State
staffInfo.Key = v.Key
staffAry = append(staffAry, staffInfo)
var staffAttribute models.PersonnelContent
staffAttribute.Number = v.Number
staffAttribute.Idcardno = v.CertificatesNum
staffAttribute.Mobilephone = v.Tel
staffAttribute.Gender = v.Gender
staffAttribute.Birthday = v.Birthday
// staffAttribute.Myfolk = contData.Nation
// staffAttribute.Nativeplace = contData.NativePlace
staffAttribute.Health = 1
staffAttribute.Maritalstatus = 1
staffAttribute.Currentresidence = v.Addrest
staffAttribute.Time = time.Now().Unix()
staffAttribute.Constellation = 1
staffAttribute.Isdoubleworker = 2
staffAttribute.Isveterans = 2
// staffAttribute.Veteransnumber = contData.Veteransnumber
staffAttribute.Jobstartdate = time.Now().Unix()
staffAttribute.Entrydate = v.EntryTime
staffAttribute.Probationperiod = 3
staffAttribute.Planformaldate = time.Now().Unix()
staffAttribute.PoliticalOutlook = 1
staffAttributeAry = append(staffAttributeAry, staffAttribute)
}
// p.dataMap = append(p.dataMap, staffInfo)
// p.userAll = append(p.userAll, staffAttribute)
// break
}
if len(staffAry) > 0 {
addErrMaster := overall.CONSTANT_DB_HR.Model(&models.Personnel{}).Create(&staffAry).Error
if addErrMaster == nil {
if len(staffAttributeAry) > 0 {
overall.CONSTANT_DB_HR.Model(&models.PersonnelContent{}).Create(&staffAttributeAry)
}
}
}
// fmt.Printf("%v\n", staffAry)
synPro.Done()
}
//获取企业微信对照表
func GetWorkWechatDuiZhao(openid string) (userInfoStruct models.WechatUsers, isTrue bool) {
isTrue = false
myErr := overall.CONSTANT_DB_Wechat.Where("userid = ?", openid).First(&userInfoStruct).Error
if myErr == nil {
isTrue = true
}
return
}
//获取人员组织架构信息
func getUserOrgSchool(group, depart, workid, position int64) (gro, org, positionId int64, department string) {
groupAry := map[int64]int64{3: 2}
for gi, gv := range groupAry {
if gi == group {
gro = gv
break
}
}
//部门对照
//部门
var buMen string
// departAry := map[int64]string{
// 11: "3",
// 12: "4",
// 9: "5",
// 14: "6",
// 13: "7",
// 15: "8",
// 5: "9",
// 6: "10",
// 8: "11",
// 2: "13",
// 1: "14",
// 3: "15",
// 16: "16",
// 17: "17",
// 39: "19",
// 50: "20",
// 7: "12,41",
// 4: "12,42",
// }
departAry := map[int64]string{
11: "3",
12: "4",
9: "5",
14: "6",
13: "7",
15: "8",
5: "9",
6: "10",
8: "11",
2: "13",
1: "14",
3: "15",
16: "16",
17: "17",
39: "19",
50: "20",
7: "41",
4: "42",
}
for di, dv := range departAry {
if depart == di {
buMen = dv
break
}
}
_, org = getOrgSchool(workid)
// departId, org := getOrgSchool(workid)
// if departId != 0 {
// buMen = fmt.Sprintf("%v,%v", buMen, departId)
// }
department = buMen
positionId = getHrPosition(position)
return
}
//获取组织架构对照
func getOrgSchool(id int64) (deparmentId, orgId int64) {
var orgInfo outOrgCont
err := overall.CONSTANT_DB_HR.Model(&models.AdministrativeOrganization{}).Select("id,organization_type,superior").Where("schoole = ?", id).First(&orgInfo).Error
if err != nil {
deparmentId = 0
orgId = 0
return
}
if orgInfo.OrganizationType == 5 {
var suoOrgInfo models.AdministrativeOrganization
whereAry := overallhandle.MapOut()
whereAry["id"] = orgInfo.Superior
supErr := suoOrgInfo.GetCont(whereAry)
if supErr == nil {
deparmentId = suoOrgInfo.Id
}
}
orgId = orgInfo.Id
return
}
//获取hr系统中的职务
func getHrPosition(posId int64) int64 {
var id int64
err := overall.CONSTANT_DB_HR.Model(&models.Position{}).Select("id").Where("`school` = ?", posId).First(&id).Error
if err == nil {
return id
}
return 0
}
//获取职务相关属性
func getJobInfo(jobId int64) (cont jobAttber, err error) {
var positionInfo models.Position
// err = overall.CONSTANT_DB_HR.Table(fmt.Sprintf("%s p", positionInfo.TableName())).Select("p.id,p.number,p.name,p.person_in_charge,d.id as dutid,d.name as dutname,d.number as dutnumber,j.id as jobid,j.name as jobname").Joins("left join duties as d on d.id = p.duties").Joins("left join job_class as j on j.id = d.job_type").Where("`p`.`id` = ?", jobId).First(&cont).Error
err = overall.CONSTANT_DB_HR.Model(&positionInfo).Select("position.id,position.number,position.name,position.person_in_charge,d.id as dutid,d.name as dutname,d.number as dutnumber,j.id as jobid,j.name as jobname").Joins("left join duties as d on d.id = position.duties").Joins("left join job_class as j on j.id = d.job_type").Where("`position`.`id` = ?", jobId).First(&cont).Error
return
}
//视图操作
func (s *ShiYan) Shitu(c *gin.Context) {
// var shituList []ShituType
// err := overall.CONSTANT_DB_HR.Limit(20).Offset(21).Find(&shituList)
// fmt.Printf("%v-----------%v\n", err, shituList)
out := overallhandle.MapOut()
node, err := snowflake.NewWorker(1)
fmt.Printf("node--------->%v\n", err)
out["node"] = node.GetId()
out["err "] = err
overallhandle.Result(0, out, c)
}

78
api/version1/shiyan/type.go

@ -0,0 +1,78 @@
package shiyan
import (
"hr_server/models"
"hr_server/overall/overallhandle"
"sync"
"github.com/gin-gonic/gin"
)
var synPro = sync.WaitGroup{}
//人员API
type ShiYan struct{}
//入口
func (s *ShiYan) Index(c *gin.Context) {
outputCont := overallhandle.MapOut()
outputCont["index"] = "实验API"
overallhandle.Result(0, outputCont, c)
}
type Jieshou struct {
Time string `json:"time"`
ProbationPeriod int `json:"probationperiod"` //试用期(月)
}
//输出知行学院的人员信息
type schoolUser struct {
models.WorkMan
}
//输出迁移组织架构
type outOrgCont struct {
Id int64 `json:"id" gorm:"primaryKey;column:id;type:bigint(20) unsigned;not null;comment:Id;index"`
Superior int64 `json:"superior" gorm:"column:superior;type:bigint(20) unsigned;default:0;not null;comment:上级ID"`
OrganizationType int64 `json:"organizationtype" gorm:"column:organization_type;type:bigint(20) unsigned;default:0;not null;comment:行政组织类型"`
}
type peopleQianyi struct {
dataMap []models.Personnel
userAll []models.PersonnelContent
mutext sync.RWMutex
}
//读取锁数据
func (d *peopleQianyi) readMyDayData() ([]models.Personnel, []models.PersonnelContent) {
d.mutext.RLock()
defer d.mutext.RUnlock()
return d.dataMap, d.userAll
}
//职务相关
type jobAttber 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(255) unsigned;default:'';not null;comment:编号"`
Name string `json:"name" gorm:"column:name;type:varchar(255) unsigned;default:'';not null;comment:名称"`
PersonInCharge int `json:"personincharge" gorm:"column:person_in_charge;type:tinyint(1) unsigned;default:0;not null;comment:是否为本部门负责人"`
Dutid int64 `json:"dutid" gorm:"column:dutid;type:bigint(20) unsigned;default:0;not null;comment:职务Id"`
Dutname string `json:"dutname" gorm:"column:dutname;type:varchar(255) unsigned;default:'';not null;comment:职务名称"`
DutNumber string `json:"dutnumber" gorm:"column:dutnumber;type:varchar(255) unsigned;default:'';not null;comment:职务编号"`
Jobid int64 `json:"jobid" gorm:"column:jobid;type:bigint(20) unsigned;default:0;not null;comment:职务分类Id"`
JobName string `json:"jobname" gorm:"column:jobname;type:varchar(255) unsigned;default:'';not null;comment:职务分类名称"`
}
type ShituType 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:行政编码"`
Name string `json:"name" gorm:"column:name;type:varchar(255) unsigned;default:'';not null;comment:组织名称"`
Superior int64 `json:"superior" gorm:"column:superior;type:bigint(20) unsigned;default:0;not null;comment:上级ID"`
TypeName string `json:"typename" gorm:"column:typename;type:varchar(255) unsigned;default:'';not null;comment:类型名称"`
Level int64 `json:"level" gorm:"column:level;type:int(5) unsigned;default:1;not null;comment:级别"`
State int `json:"state" gorm:"column:state;type:int(1) unsigned;default:1;not null;comment:状态(1:启用;2:禁用;3:删除)"`
}
func (ShituType *ShituType) TableName() string {
return "orglist"
}

19
apirouter/dockingjindie/jindie.go

@ -0,0 +1,19 @@
package dockingjindie
import (
jindiedocking "hr_server/api/jindie_docking"
"github.com/gin-gonic/gin"
)
//授权
func (p *DockingJindieApiRouter) InitRouterGroup(route *gin.RouterGroup) {
apiRouter := route.Group("dockjindie")
var apiHandle = jindiedocking.AppApiInlet.DockJinDieApi
{
apiRouter.GET("", apiHandle.Index) //入口
apiRouter.POST("", apiHandle.Index) //入口
apiRouter.POST("dockkingdeeapi", apiHandle.DockKingdeeApi) //接口实验
}
}

3
apirouter/dockingjindie/type.go

@ -0,0 +1,3 @@
package dockingjindie
type DockingJindieApiRouter struct{}

19
apirouter/empowerrote/empowerroter.go

@ -0,0 +1,19 @@
package empowerrote
import (
"hr_server/api/empower"
"github.com/gin-gonic/gin"
)
//授权
func (p *EmpowerApiRouter) InitRouterGroup(route *gin.RouterGroup) {
apiRouter := route.Group("empower")
var apiHandle = empower.AppApiInlet.Authorize
{
apiRouter.GET("", apiHandle.Index) //入口
apiRouter.POST("", apiHandle.Index) //入口
apiRouter.POST("gaintoken", apiHandle.GainToken) //获取token
}
}

3
apirouter/empowerrote/type.go

@ -0,0 +1,3 @@
package empowerrote
type EmpowerApiRouter struct{}

17
apirouter/inlet.go

@ -1,11 +1,24 @@
package apirouter
import "hr_server/apirouter/organization"
import (
"hr_server/apirouter/dockingjindie"
"hr_server/apirouter/empowerrote"
"hr_server/apirouter/organization"
"hr_server/apirouter/permit"
"hr_server/apirouter/personnel"
"hr_server/apirouter/shiyanrouter"
)
//路由入口
type RouterGroup struct {
OrganizationApi organization.OrganizationRoute //组织架构
OrganizationApi organization.OrganizationRoute //组织架构
PermitPowerApi permit.PermitPower //权限相关操作
PersonnelRoute personnel.PersonnelRoute //人员管理
PersonnelRouteKingdee personnel.PersonnelRouteKingdee //人员管理Kingdee
ShiyanApiRRouter shiyanrouter.ShiyanApiRouter
EmpowerApiRouter empowerrote.EmpowerApiRouter
KingdeeApiRouter dockingjindie.DockingJindieApiRouter
}
var RouterGroupInlet = new(RouterGroup)

11
apirouter/organization/organization_group.go

@ -37,11 +37,22 @@ func (o *OrganizationRoute) InitRouterGroup(route *gin.RouterGroup) {
apiRouter.POST("addgovcont", apiHandle.AddGovCont) //添加行政组织
apiRouter.POST("eitegovcont", apiHandle.EiteGovCont) //编辑行政组织
apiRouter.POST("eitegovstateordel", apiHandle.EiteGovStateOrDel) //编辑行政组织状态或删除
apiRouter.POST("govthree", apiHandle.GovThree) //行政组织树
//职位(岗位)
apiRouter.POST("positionlist", apiHandle.PositionList) //职位(岗位)列表
apiRouter.POST("getpositioncont", apiHandle.GetPositionCont) //获取职位(岗位)
apiRouter.POST("addpositioncont", apiHandle.AddPositionCont) //添加职位(岗位)
apiRouter.POST("eitepositioncont", apiHandle.EitePositionCont) //编辑职位(岗位)
apiRouter.POST("eitepositionstateordel", apiHandle.EitePositionStateOrDel) //编辑职位(岗位)状态或删除
apiRouter.POST("getpositionrole", apiHandle.GetPositionRole) //岗位(职位)配权 GetPositionRole
//班组
apiRouter.POST("teamcontlist", apiHandle.TeamContList) //班组列表
apiRouter.POST("getteamcont", apiHandle.GetTeamCont) //获取班组
apiRouter.POST("addteamcont", apiHandle.AddTeamCont) //添加班组
apiRouter.POST("eiteteamcont", apiHandle.EiteTeamCont) //编辑班组
// apiRouter.POST("delteamcont", apiHandle.DelTeamCont) //删除班组
apiRouter.POST("eidtdelteamcont", apiHandle.EidtDelTeamCont) //编辑班组状态或删除
}
}

20
apirouter/permit/permit.go

@ -0,0 +1,20 @@
package permit
import (
"hr_server/api/version1"
"github.com/gin-gonic/gin"
)
//组织架构
func (p *PermitPower) InitRouterGroup(route *gin.RouterGroup) {
apiRouter := route.Group("permit")
var apiHandle = version1.AppApiInlet.PermitPowerApi
{
apiRouter.GET("", apiHandle.Index) //入口
apiRouter.POST("", apiHandle.Index) //入口
apiRouter.POST("permitlist", apiHandle.PermitPowerList) //权限列表
apiRouter.POST("positionallotment", apiHandle.PositionAllotment) //岗位(职位)配权 GetPositionRole
}
}

4
apirouter/permit/type.go

@ -0,0 +1,4 @@
package permit
//权限相关操作
type PermitPower struct{}

99
apirouter/personnel/people.go

@ -0,0 +1,99 @@
package personnel
import (
"hr_server/api/version1"
"github.com/gin-gonic/gin"
)
//员工档案
func (p *PersonnelRoute) InitRouterGroup(route *gin.RouterGroup) {
apiRouter := route.Group("staff")
var apiHandle = version1.AppApiInlet.StaffApi
{
apiRouter.GET("", apiHandle.Index) //入口
apiRouter.POST("", apiHandle.Index) //入口
apiRouter.POST("stafflist", apiHandle.StaffList) //人员列表
apiRouter.POST("addstaff", apiHandle.AddStaff) //添加人员档案
apiRouter.POST("allocationofrights", apiHandle.AllocationOfRights) //分配权限
apiRouter.POST("archiveslist", apiHandle.ArchivesList) //人员列表(新)
apiRouter.POST("archivescont", apiHandle.ArchivesCon) //个人档案
apiRouter.POST("kingdeehr", apiHandle.NewKingdee) //对接金蝶HR系统
//双职工
apiRouter.POST("doubleworkerlist", apiHandle.DoubleWorkerList) //双职工列表
apiRouter.POST("adddoubleworker", apiHandle.AddDoubleWorkerApi) //添加双职工
apiRouter.POST("eidtdoubleworker", apiHandle.EidtDoubleWorkerApi) //编辑双职工
apiRouter.POST("eidtdoubleworkerstate", apiHandle.EidtDoubleWorkerState) //编辑双职工状态
//员工资料
apiRouter.POST("eidtstaffcont", apiHandle.EidtStaffCont) //编辑员工资料
//紧急联系人
apiRouter.POST("emergencycontactlist", apiHandle.EmergencyContactList) //紧急联系人列表
apiRouter.POST("addemercycall", apiHandle.AddEmercyCall) //添加紧急联系人
apiRouter.POST("editemercycall", apiHandle.EditEmercyCall) //编辑紧急联系人
apiRouter.POST("editemercycallstate", apiHandle.EditEmercyCallState) //编辑紧急联系人状态
//家庭成员
apiRouter.POST("familymemberslist", apiHandle.FamilyMemBersList) //家庭成员列表
apiRouter.POST("addfamilymembers", apiHandle.AddFamilyMembers) //添加家庭成员
apiRouter.POST("editfamilymembers", apiHandle.EditFamilyMembers) //编辑家庭成员
apiRouter.POST("editfamilymemberssatte", apiHandle.EditFamilyMembersSatte) //编辑家庭成员状态
//教育经历
apiRouter.POST("personneleducationlist", apiHandle.PersonnelEducationList) //教育经历列表
apiRouter.POST("addeducationalexperience", apiHandle.AddEducationalExperience) //添加教育经历
apiRouter.POST("editeducationalexperience", apiHandle.EditEducationalExperience) //编辑教育经历
apiRouter.POST("editeduexpstate", apiHandle.EditEduExpState) //编辑教育经历状态
//工作履历
apiRouter.POST("workhistorylist", apiHandle.WorkHistoryList) //工作履历列表
apiRouter.POST("addworkhistorycont", apiHandle.AddWorkHistoryCont) //添加工作履历
apiRouter.POST("editworkhistorycont", apiHandle.EditWorkHistoryCont) //编辑工作履历
apiRouter.POST("editworkhistorystate", apiHandle.EditWorkHistoryState) //编辑工作履历状态
//集团工作履历
apiRouter.POST("insideworkhistorylist", apiHandle.InsideWorkHistoryList) //集团工作履历列表
apiRouter.POST("addinsidehistory", apiHandle.AddInsideHistory) //添加集团工作履历
apiRouter.POST("eidtinsidehistoryworkcont", apiHandle.EidtInsideHistoryWorkCont) //编辑集团工作履历
apiRouter.POST("editordelinsideworkhistorystate", apiHandle.EditOrDelInsideWorkHistoryState) //编辑集团工作履历状态
}
}
//员工档案
func (p *PersonnelRouteKingdee) InitRouterGroup(route *gin.RouterGroup) {
apiRouter := route.Group("staffkingdee")
var apiHandle = version1.AppApiInlet.StaffApi
{
apiRouter.GET("", apiHandle.Index) //入口
apiRouter.POST("", apiHandle.Index) //入口
apiRouter.POST("stafflist", apiHandle.StaffList) //人员列表
apiRouter.POST("addstaff", apiHandle.AddStaff) //添加人员档案
apiRouter.POST("allocationofrights", apiHandle.AllocationOfRights) //分配权限
apiRouter.POST("archiveslist", apiHandle.ArchivesList) //人员列表(新)
apiRouter.POST("archivescont", apiHandle.ArchivesCon) //个人档案
apiRouter.POST("kingdeehr", apiHandle.NewKingdee) //对接金蝶HR系统
//双职工
apiRouter.POST("adddoubleworker", apiHandle.AddDoubleWorkerApi) //添加双职工
apiRouter.POST("eidtdoubleworker", apiHandle.EidtDoubleWorkerApi) //编辑双职工
apiRouter.POST("eidtdoubleworkerstate", apiHandle.EidtDoubleWorkerState) //编辑双职工状态
//员工资料
apiRouter.POST("eidtstaffcont", apiHandle.EidtStaffCont) //编辑员工资料
//紧急联系人
apiRouter.POST("addemercycall", apiHandle.AddEmercyCall) //添加紧急联系人
apiRouter.POST("editemercycall", apiHandle.EditEmercyCall) //编辑紧急联系人
apiRouter.POST("editemercycallstate", apiHandle.EditEmercyCallState) //编辑紧急联系人状态
//家庭成员
apiRouter.POST("addfamilymembers", apiHandle.AddFamilyMembers) //添加家庭成员
apiRouter.POST("editfamilymembers", apiHandle.EditFamilyMembers) //编辑家庭成员
apiRouter.POST("editfamilymemberssatte", apiHandle.EditFamilyMembersSatte) //编辑家庭成员状态
//教育经历
apiRouter.POST("addeducationalexperience", apiHandle.AddEducationalExperience) //添加教育经历
apiRouter.POST("editeducationalexperience", apiHandle.EditEducationalExperience) //编辑教育经历
apiRouter.POST("editeduexpstate", apiHandle.EditEduExpState) //编辑教育经历状态
//工作履历
apiRouter.POST("addworkhistorycont", apiHandle.AddWorkHistoryCont) //添加工作履历
apiRouter.POST("editworkhistorycont", apiHandle.EditWorkHistoryCont) //编辑工作履历
apiRouter.POST("editworkhistorystate", apiHandle.EditWorkHistoryState) //编辑工作履历状态
//集团工作履历
apiRouter.POST("insideworkhistorylist", apiHandle.InsideWorkHistoryList) //集团工作履历列表
apiRouter.POST("addinsidehistory", apiHandle.AddInsideHistory) //添加集团工作履历
apiRouter.POST("eidtinsidehistoryworkcont", apiHandle.EidtInsideHistoryWorkCont) //编辑集团工作履历
apiRouter.POST("editordelinsideworkhistorystate", apiHandle.EditOrDelInsideWorkHistoryState) //编辑集团工作履历状态
}
}

5
apirouter/personnel/type.go

@ -0,0 +1,5 @@
package personnel
//人员管理方面
type PersonnelRoute struct{}
type PersonnelRouteKingdee struct{}

20
apirouter/shiyanrouter/shiyan.go

@ -0,0 +1,20 @@
package shiyanrouter
import (
"hr_server/api/version1"
"github.com/gin-gonic/gin"
)
//组织架构
func (p *ShiyanApiRouter) InitRouterGroup(route *gin.RouterGroup) {
apiRouter := route.Group("shiyan")
var apiHandle = version1.AppApiInlet.ShiyanApi
{
apiRouter.GET("", apiHandle.Index) //入口
apiRouter.POST("", apiHandle.Index) //入口
apiRouter.POST("shiyan", apiHandle.ShiyanCont) //人员列表
apiRouter.POST("personnelmigration", apiHandle.PersonnelMigration) //人员迁移
apiRouter.POST("shitu", apiHandle.Shitu)
}
}

3
apirouter/shiyanrouter/type.go

@ -0,0 +1,3 @@
package shiyanrouter
type ShiyanApiRouter struct{}

9
config/configApp/appConfig.yaml

@ -1,6 +1,11 @@
#App主配置
appsetup:
port: 9999 #服务端口
port: 39168 #服务端口
readtime: 3600 #请求的读取操作在超时前的最大持续时间
writetime : 3600 #回复的写入操作在超时前的最大持续时间
writetime : 3600 #回复的写入操作在超时前的最大持续时间
appkey: 'heng_xin_gao_ke_AppKey' #应用程序密钥
password: '123456789' #系统默认密码
prefix: 'HXJT' #系统字段前缀
logconfig:
path: 'log' #日志保存地址

15
config/configApp/server.go

@ -3,11 +3,20 @@ package configApp
//服务基础配置
type Server struct {
Appsetup appsetup `mapstructure:"appsetup" json:"appsetup" yaml:"appsetup"`
Logsetup logsetup `mapstructure:"logconfig" json:"logconfig" yaml:"logconfig"`
}
//服务配置详情
type appsetup struct {
Port int `mapstructure:"port" json:"port" yaml:"port"`
Readtime int `mapstructure:"readtime" json:"readtime" yaml:"readtime"`
Writetime int `mapstructure:"writetime" json:"writetime" yaml:"writetime"`
Port int `mapstructure:"port" json:"port" yaml:"port"`
Readtime int `mapstructure:"readtime" json:"readtime" yaml:"readtime"`
Writetime int `mapstructure:"writetime" json:"writetime" yaml:"writetime"`
AppKey string `mapstructure:"appkey" json:"appkey" yaml:"appkey"`
DefaultPassword string `mapstructure:"password" json:"password" yaml:"password"`
PreFix string `mapstructure:"prefix" json:"prefix" yaml:"prefix"`
}
//日志配置
type logsetup struct {
Path string `mapstructure:"path" json:"path" yaml:"path"`
}

5
config/configDatabase/database.go

@ -11,8 +11,9 @@ 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数据库
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数据库
}
type MasterMysqlSetUp struct {

13
config/configDatabase/database.yaml

@ -28,6 +28,19 @@ wechat:
gorm_log: false #是否开启gorm日志
#HR数据库
hrdatabase:
url_path: '127.0.0.1' #数据库地址
port: 3306 #数据库端口
charset: 'utf8mb4' #数据库编码方式
parseTime: 'True' #是否自动转换时间
loc: 'Local' #时区
name: 'human_resources_jindie' #数据库名称
username: 'root' #数据库用户民
password: 'root' #数据库密码
max_idle_conns: 100 #最大空闲数量
max_open_conns: 1500 #最大打开数量
gorm_log: true #是否开启gorm日志
#HR数据库
hrdatabasejin:
url_path: '127.0.0.1' #数据库地址
port: 3306 #数据库端口
charset: 'utf8mb4' #数据库编码方式

21
config/configJson/org.json

@ -0,0 +1,21 @@
{
"group":[
{
"old":3,
"new":2
}
],
"department":[
{
"newgroup":2,
"old":1,
"new":14
},
{
"newgroup":2,
"old":2,
"new":13
}
],
"workshopsection":[]
}

4
config/configNosql/redis.go

@ -10,6 +10,10 @@ import (
type RedisSetUp struct {
MasterRedis RedisConfitSetUp `mapstructure:"master" json:"master" yaml:"master"` //主数据库
MasterRedis1 RedisConfitSetUp `mapstructure:"master1" json:"master1" yaml:"master1"` //主数据库
MasterRedis2 RedisConfitSetUp `mapstructure:"master2" json:"master1" yaml:"master2"` //主数据库
MasterRedis3 RedisConfitSetUp `mapstructure:"master3" json:"master1" yaml:"master3"` //主数据库
MasterRedis4 RedisConfitSetUp `mapstructure:"master4" json:"master1" yaml:"master4"` //主数据库
MasterRedis5 RedisConfitSetUp `mapstructure:"master5" json:"master1" yaml:"master5"` //主数据库
}
type RedisConfitSetUp struct {

11
config_server/configApp/appConfig.yaml

@ -0,0 +1,11 @@
#App主配置
appsetup:
port: 39168 #服务端口
readtime: 3600 #请求的读取操作在超时前的最大持续时间
writetime : 3600 #回复的写入操作在超时前的最大持续时间
appkey: 'heng_xin_gao_ke_AppKey' #应用程序密钥
password: '123456789' #系统默认密码
prefix: 'HXJT' #系统字段前缀
logconfig:
path: 'log' #日志保存地址

22
config_server/configApp/server.go

@ -0,0 +1,22 @@
package configApp
//服务基础配置
type Server struct {
Appsetup appsetup `mapstructure:"appsetup" json:"appsetup" yaml:"appsetup"`
Logsetup logsetup `mapstructure:"logconfig" json:"logconfig" yaml:"logconfig"`
}
//服务配置详情
type appsetup struct {
Port int `mapstructure:"port" json:"port" yaml:"port"`
Readtime int `mapstructure:"readtime" json:"readtime" yaml:"readtime"`
Writetime int `mapstructure:"writetime" json:"writetime" yaml:"writetime"`
AppKey string `mapstructure:"appkey" json:"appkey" yaml:"appkey"`
DefaultPassword string `mapstructure:"password" json:"password" yaml:"password"`
PreFix string `mapstructure:"prefix" json:"prefix" yaml:"prefix"`
}
//日志配置
type logsetup struct {
Path string `mapstructure:"path" json:"path" yaml:"path"`
}

72
config_server/configDatabase/database.go

@ -0,0 +1,72 @@
package configDatabase
import (
"fmt"
"gorm.io/driver/mysql"
"gorm.io/gorm"
"gorm.io/gorm/logger"
)
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数据库
}
type MasterMysqlSetUp struct {
UrlPath string `mapstructure:"url_path" json:"url_path" yaml:"url_path"` // 服务器地址
Port int `mapstructure:"port" json:"port" yaml:"port"` // 端口
Charset string `mapstructure:"charset" json:"charset" yaml:"charset"` // 编码方式
ParseTime bool `mapstructure:"parseTime" json:"parseTime" yaml:"parseTime"` // 是否自动转换时间
Loc string `mapstructure:"loc" json:"loc" yaml:"loc"` // 时区
Name string `mapstructure:"name" json:"name" yaml:"name"` // 数据库名称
UserName string `mapstructure:"username" json:"username" yaml:"username"` // 账号
PassWord string `mapstructure:"password" json:"password" yaml:"password"` // 密码
MaxIdleConns int `mapstructure:"max_idle_conns" json:"max_idle_conns" yaml:"max_idle_conns"` // 最大空闲数
MaxOpenConns int `mapstructure:"max_open_conns" json:"max_open_conns" yaml:"max_open_conns"` // 最大链接数
GormLog bool `mapstructure:"gorm_log" json:"gorm_log" yaml:"gorm_log"` // 是否开启Gorm全局日志
}
func (m *MasterMysqlSetUp) SqlDsn() (dsnStr string) {
dsnStr = fmt.Sprintf("%v:%v@tcp(%v:%v)/%v?charset=%v", m.UserName, m.PassWord, m.UrlPath, m.Port, m.Name, m.Charset)
if m.ParseTime == true {
dsnStr = fmt.Sprintf("%v:%v@tcp(%v:%v)/%v?charset=%v&parseTime=%v&loc=%v", m.UserName, m.PassWord, m.UrlPath, m.Port, m.Name, m.Charset, m.ParseTime, m.Loc)
}
return
}
func (m *MasterMysqlSetUp) OpenSql() *gorm.DB {
sqlConfig := mysql.Config{
DSN: m.SqlDsn(), // DSN
DefaultStringSize: 255, // string 类型字段的默认长度
DisableDatetimePrecision: true, // 禁用 datetime 精度,MySQL 5.6 之前的数据库不支持
DontSupportRenameIndex: true, // 重命名索引时采用删除并新建的方式,MySQL 5.7 之前的数据库和 MariaDB 不支持重命名索引
DontSupportRenameColumn: true, // 用 `change` 重命名列,MySQL 8 之前的数据库和 MariaDB 不支持重命名列
SkipInitializeWithVersion: false, // 根据版本自动配置
}
if m.GormLog == true {
if opDb, err := gorm.Open(mysql.New(sqlConfig), &gorm.Config{
Logger: logger.Default.LogMode(logger.Info),
}); err != nil {
return nil
} else {
sqlDb, _ := opDb.DB()
sqlDb.SetMaxIdleConns(m.MaxIdleConns)
sqlDb.SetMaxOpenConns(m.MaxOpenConns)
return opDb
}
} else {
if opDb, err := gorm.Open(mysql.New(sqlConfig)); err != nil {
return nil
} else {
sqlDb, _ := opDb.DB()
sqlDb.SetMaxIdleConns(m.MaxIdleConns)
sqlDb.SetMaxOpenConns(m.MaxOpenConns)
return opDb
}
}
}

54
config_server/configDatabase/database.yaml

@ -0,0 +1,54 @@
#数据库配置
#主数据库
master:
url_path: '127.0.0.1' #数据库地址
port: 3306 #数据库端口
charset: 'utf8mb4' #数据库编码方式
parseTime: 'True' #是否自动转换时间
loc: 'Local' #时区
name: 'hengxingaoke_tes' #数据库名称
username: 'hengxingaoke_tes' #数据库用户民
password: 'rjwi58B6zYCHMbGZ' #数据库密码
max_idle_conns: 100 #最大空闲数量
max_open_conns: 1500 #最大打开数量
gorm_log: false #是否开启gorm日志
#微信数据库
wechat:
url_path: '127.0.0.1' #数据库地址
port: 3306 #数据库端口
charset: 'utf8mb4' #数据库编码方式
parseTime: 'True' #是否自动转换时间
loc: 'Local' #时区
name: 'wechatuser' #数据库名称
username: 'wechatuser' #数据库用户民
password: 'ESEYc527J5AAdfka' #数据库密码
max_idle_conns: 100 #最大空闲数量
max_open_conns: 1500 #最大打开数量
gorm_log: false #是否开启gorm日志
#HR数据库
hrdatabase:
url_path: '127.0.0.1' #数据库地址
port: 3306 #数据库端口
charset: 'utf8mb4' #数据库编码方式
parseTime: 'True' #是否自动转换时间
loc: 'Local' #时区
name: 'hr_new' #数据库名称
username: 'hr_new' #数据库用户民
password: 'AnknKiXiXaxNrw78' #数据库密码
max_idle_conns: 100 #最大空闲数量
max_open_conns: 1500 #最大打开数量
gorm_log: false #是否开启gorm日志
#HR数据库
hrdatabasejin:
url_path: '127.0.0.1' #数据库地址
port: 3306 #数据库端口
charset: 'utf8mb4' #数据库编码方式
parseTime: 'True' #是否自动转换时间
loc: 'Local' #时区
name: 'human_resources' #数据库名称
username: 'human_resources' #数据库用户民
password: 'Pinw2dyLNfemtp3z' #数据库密码
max_idle_conns: 100 #最大空闲数量
max_open_conns: 1500 #最大打开数量
gorm_log: false #是否开启gorm日志

21
config_server/configJson/org.json

@ -0,0 +1,21 @@
{
"group":[
{
"old":3,
"new":2
}
],
"department":[
{
"newgroup":2,
"old":1,
"new":14
},
{
"newgroup":2,
"old":2,
"new":13
}
],
"workshopsection":[]
}

41
config_server/configNosql/redis.go

@ -0,0 +1,41 @@
package confignosql
import (
"context"
"fmt"
"github.com/go-redis/redis/v8"
)
type RedisSetUp struct {
MasterRedis RedisConfitSetUp `mapstructure:"master" json:"master" yaml:"master"` //主数据库
MasterRedis1 RedisConfitSetUp `mapstructure:"master1" json:"master1" yaml:"master1"` //主数据库
MasterRedis2 RedisConfitSetUp `mapstructure:"master2" json:"master1" yaml:"master2"` //主数据库
MasterRedis3 RedisConfitSetUp `mapstructure:"master3" json:"master1" yaml:"master3"` //主数据库
MasterRedis4 RedisConfitSetUp `mapstructure:"master4" json:"master1" yaml:"master4"` //主数据库
MasterRedis5 RedisConfitSetUp `mapstructure:"master5" json:"master1" yaml:"master5"` //主数据库
}
type RedisConfitSetUp struct {
UrlPath string `mapstructure:"url_path" json:"url_path" yaml:"url_path"` // 服务器地址
Port int `mapstructure:"port" json:"port" yaml:"port"` // 端口
Name int `mapstructure:"name" json:"name" yaml:"name"` // 数据库名称
PassWord string `mapstructure:"password" json:"password" yaml:"password"` // 密码
}
func (r *RedisConfitSetUp) OpenRedis() *redis.Client {
address := fmt.Sprintf("%v:%v", r.UrlPath, r.Port)
fmt.Printf("开启%v Redis库 %v\n", address, r.Name)
redisClient := redis.NewClient(&redis.Options{
Addr: address,
Password: r.PassWord,
DB: r.Name,
})
pingLink, err := redisClient.Ping(context.Background()).Result()
if err != nil {
fmt.Printf("%v Redis链接失败!原因:%v\n", r.Name, err)
} else {
fmt.Printf("%v Redis链接成功!=====>%v\n", r.Name, pingLink)
}
return redisClient
}

41
config_server/configNosql/redis.yaml

@ -0,0 +1,41 @@
#Redis配置文件
master:
url_path: '127.0.0.1'
port: 6379 #数据库端口
password: ""
name: 0
#Redis配置文件
master1:
url_path: '127.0.0.1'
port: 6379 #数据库端口
password: ""
name: 1
#Redis配置文件
master2:
url_path: '127.0.0.1'
port: 6379 #数据库端口
password: ""
name: 2
#Redis配置文件
master3:
url_path: '127.0.0.1'
port: 6379 #数据库端口
password: ""
name: 3
#Redis配置文件
master4:
url_path: '127.0.0.1'
port: 6379 #数据库端口
password: ""
name: 4
#Redis配置文件
master5:
url_path: '127.0.0.1'
port: 6379 #数据库端口
password: ""
name: 5

3
go.mod

@ -6,7 +6,9 @@ require (
github.com/fsnotify/fsnotify v1.5.1
github.com/gin-gonic/gin v1.7.7
github.com/go-redis/redis/v8 v8.11.5
github.com/mitchellh/mapstructure v1.4.3
github.com/mozillazg/go-pinyin v0.19.0
github.com/robfig/cron/v3 v3.0.1
github.com/spf13/viper v1.10.1
gorm.io/driver/mysql v1.3.3
gorm.io/gorm v1.23.4
@ -28,7 +30,6 @@ require (
github.com/leodido/go-urn v1.2.1 // indirect
github.com/magiconair/properties v1.8.5 // indirect
github.com/mattn/go-isatty v0.0.14 // indirect
github.com/mitchellh/mapstructure v1.4.3 // indirect
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.2 // indirect
github.com/onsi/gomega v1.19.0 // indirect

2
go.sum

@ -81,6 +81,8 @@ github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE
github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs=
github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro=
github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc=
github.com/rogpeppe/go-internal v1.8.0 h1:FCbCCtXNOY3UtUuHUYaghJg4y7Fd14rXifAYUAtL9R8=
github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE=

380
grocerystore/redis.go

@ -0,0 +1,380 @@
package grocerystore
import (
"context"
"fmt"
"hr_server/overall"
"time"
"github.com/go-redis/redis/v8"
)
//redis 基础设定
type RedisStoreType struct {
Expiration time.Duration
PreKey string
Context context.Context
RedisDb *redis.Client
}
//启动redis
func RunRedis(redisClient *redis.Client) *RedisStoreType {
var redisStoreType RedisStoreType
redisStoreType.Expiration = time.Second * 300
redisStoreType.PreKey = fmt.Sprintf("%v:", overall.CONSTANT_CONFIG.Appsetup.PreFix)
redisStoreType.Context = context.Background()
redisStoreType.RedisDb = redisClient
return &redisStoreType
}
//设置键前缀
func (r *RedisStoreType) SetRedisPrefix(prefix string) {
r.PreKey = prefix
}
//设置过期时间
func (r *RedisStoreType) SetRedisTime(timeDate int64) {
r.Expiration = time.Second * time.Duration(timeDate)
}
//设置字符串
func (r *RedisStoreType) Set(key string, value string) bool {
err := r.RedisDb.Set(r.Context, r.PreKey+key, value, r.Expiration).Err()
if err != nil {
return false
}
return true
}
//获取字符串
func (r *RedisStoreType) Get(key string) (bool, string) {
err := r.RedisDb.Get(r.Context, r.PreKey+key)
if err.Err() != nil {
return false, ""
}
return true, err.Val()
}
//删除键
func (r *RedisStoreType) DelKey(key string) bool {
err := r.RedisDb.Del(r.Context, r.PreKey+key).Err()
if err != nil {
return false
}
return true
}
//哈希操作
/*
获取单个哈希键值
@hashName 集合名称
@hashKey 哈希键
callback
errs 状态
hashVal 获得值
*/
func (r *RedisStoreType) HashGet(hashName, hashKey string) (errs bool, hashVal string) {
err := r.RedisDb.HGet(r.Context, r.PreKey+hashName, hashKey)
if err.Err() != nil {
return false, ""
}
return true, err.Val()
}
/*
为哈希表中的字段赋值 单一设置
@hashName 集合名称
@hashKey 哈希键
@hashVal 要添加的值
*/
func (r *RedisStoreType) HashSet(hashName, hashKey, hashVal string) bool {
err := r.RedisDb.HSet(r.Context, r.PreKey+hashName, hashKey, hashVal).Err()
if err != nil {
return false
}
if r.Expiration == 0 {
r.RedisDb.Persist(r.Context, r.PreKey+hashName)
} else {
r.RedisDb.PExpire(r.Context, r.PreKey+hashName, r.Expiration)
}
// global.GVA_REDIS.PExpire(r.Context, r.PreKey+hashName, r.Expiration)
return true
}
/*
同时将多个 field-value (字段-)对设置到哈希表中
@hashName 集合名称
@hashVal 要添加的键与值
*/
func (r *RedisStoreType) HashMsetAdd(hashName string, hashVal map[string]interface{}) bool {
// rdb := RedisInit()
err := r.RedisDb.HMSet(r.Context, r.PreKey+hashName, hashVal).Err()
// fmt.Printf("错误sss=========》%v=====2====》%v\n", err, hashVal)
// err := rdb.HMSet(ctx, "userfg", hashVal).Err()
if err != nil {
return false
}
if r.Expiration == 0 {
r.RedisDb.Persist(r.Context, r.PreKey+hashName)
} else {
r.RedisDb.PExpire(r.Context, r.PreKey+hashName, r.Expiration)
}
return true
}
func (r *RedisStoreType) HashMsetAddAry(hashName string, hashVal []map[string]interface{}) bool {
// rdb := RedisInit()
err := r.RedisDb.HMSet(r.Context, r.PreKey+hashName, hashVal).Err()
// err := rdb.HMSet(ctx, "userfg", hashVal).Err()
if err != nil {
return false
}
if r.Expiration == 0 {
r.RedisDb.Persist(r.Context, r.PreKey+hashName)
} else {
r.RedisDb.PExpire(r.Context, r.PreKey+hashName, r.Expiration)
}
// global.GVA_REDIS.PExpire(r.Context, r.PreKey+hashName, r.Expiration)
// fmt.Printf("错误sss=========》%v\n", hashVal)
return true
}
/*
返回哈希表中所有的字段和值
@hashName 集合名称
@hashKey 哈希键
*/
func (r *RedisStoreType) HashGetAll(hashName string) (map[string]string, bool) {
// rdb := RedisInit()
// fmt.Printf("strKEy:===>%v\n", r.PreKey+hashName)
val, err := r.RedisDb.HGetAll(r.Context, r.PreKey+hashName).Result()
if err != nil {
return val, false
}
if len(val) == 0 {
return val, false
}
return val, true
}
//Redis 列表(List)
/**
Linsert 命令用于在列表的元素前或者后插入元素当指定元素不存在于列表中时不执行任何操作
当列表不存在时被视为空列表不执行任何操作
如果 key 不是列表类型返回一个错误
@key 列表
@op 插入状态 (1:在pivot之后2在pivot之前)
@pivot 定位值
@value 要插入值
*/
func (r *RedisStoreType) Linsert(key string, op int, pivot, value interface{}) (int64, bool) {
BeforeOrAfter := "BEFORE"
if op != 1 {
BeforeOrAfter = "AFTER"
}
linsert, linsertErr := r.RedisDb.LInsert(r.Context, key, BeforeOrAfter, pivot, value).Result()
if linsertErr != nil {
return 0, false
}
return linsert, true
}
/**
Lindex 命令用于通过索引获取列表中的元素你也可以使用负数下标 -1 表示列表的最后一个元素 -2 表示列表的倒数第二个元素以此类推
@key 列表
@index 索引
*/
func (r *RedisStoreType) Lindex(key string, index int64) (val string, err error) {
val, err = r.RedisDb.LIndex(r.Context, key, index).Result()
return
}
/**
Llen 命令用于返回列表的长度 如果列表 key 不存在 key 被解释为一个空列表返回 0 如果 key 不是列表类型返回一个错误
@key 列表
*/
func (r *RedisStoreType) Llen(key string) (val int64, err error) {
val, err = r.RedisDb.LLen(r.Context, key).Result()
return
}
/**
Lpop 命令用于移除并返回列表的第一个元素
@key 列表
*/
func (r *RedisStoreType) Lpop(key string) (val string, err error) {
val, err = r.RedisDb.LPop(r.Context, key).Result()
return
}
/**
Lpush 命令将一个或多个值插入到列表头部 如果 key 不存在一个空列表会被创建并执行 LPUSH 操作 key 存在但不是列表类型时返回一个错误
@key 列表
@value 要插入的字符串
*/
func (r *RedisStoreType) Lpush(key string, value ...interface{}) (val int64, err error) {
val, err = r.RedisDb.LPush(r.Context, key, value).Result()
return
}
/**
Lpushx 将一个值插入到已存在的列表头部列表不存在时操作无效
@key 列表
@value 要插入的字符串
*/
func (r *RedisStoreType) Lpushx(key, value string) (val int64, err error) {
val, err = r.RedisDb.LPushX(r.Context, key, value).Result()
return
}
/**
Lrange 返回列表中指定区间内的元素区间以偏移量 START END 指定 其中 0 表示列表的第一个元素 1 表示列表的第二个元素以此类推 你也可以使用负数下标 -1 表示列表的最后一个元素 -2 表示列表的倒数第二个元素以此类推
@key 列表
@start 起始值
@stop 结束值
*/
func (r *RedisStoreType) Lrange(key string, start, stop int64) (val []string, err error) {
val, err = r.RedisDb.LRange(r.Context, key, start, stop).Result()
return
}
/**
Lrem 根据参数 COUNT 的值移除列表中与参数 VALUE 相等的元素
COUNT 的值可以是以下几种
count > 0 : 从表头开始向表尾搜索移除与 VALUE 相等的元素数量为 COUNT
count < 0 : 从表尾开始向表头搜索移除与 VALUE 相等的元素数量为 COUNT 的绝对值
count = 0 : 移除表中所有与 VALUE 相等的值
@start = COUNT
@key 列表
*/
func (r *RedisStoreType) Lrem(key string, start int64, value ...interface{}) (val int64, err error) {
val, err = r.RedisDb.LRem(r.Context, key, start, value).Result()
return
}
/**
Redis Lset 通过索引来设置元素的值
当索引参数超出范围或对一个空列表进行 LSET 返回一个错误
@key 列表
@indexes 索引值
*/
func (r *RedisStoreType) Lset(key string, indexes int64, value ...interface{}) (val string, err error) {
val, err = r.RedisDb.LSet(r.Context, key, indexes, value).Result()
return
}
/**
Ltrim 对一个列表进行修剪(trim)就是说让列表只保留指定区间内的元素不在指定区间之内的元素都将被删除
下标 0 表示列表的第一个元素 1 表示列表的第二个元素以此类推 你也可以使用负数下标 -1 表示列表的最后一个元素 -2 表示列表的倒数第二个元素以此类推
@key 列表
@start 起始值
@stop 结束值
*/
func (r *RedisStoreType) Ltrim(key string, start, stop int64) (val string, err error) {
val, err = r.RedisDb.LTrim(r.Context, key, start, stop).Result()
return
}
/**
Rpop 命令用于移除列表的最后一个元素返回值为移除的元素
@key 列表
*/
func (r *RedisStoreType) Rpop(key string) (val string, err error) {
val, err = r.RedisDb.RPop(r.Context, key).Result()
return
}
/**
Rpoplpush 命令用于移除列表的最后一个元素并将该元素添加到另一个列表并返回
@sourceKey 源列表
@newKey 目标列表
*/
func (r *RedisStoreType) Rpoplpush(sourceKey, newKey string) (val string, err error) {
val, err = r.RedisDb.RPopLPush(r.Context, sourceKey, newKey).Result()
return
}
/**
Rpush 命令用于将一个或多个值插入到列表的尾部(最右边)
如果列表不存在一个空列表会被创建并执行 RPUSH 操作 当列表存在但不是列表类型时返回一个错误
@key 列表
@value 要插入的字符串
*/
func (r *RedisStoreType) Rpush(key string, value ...interface{}) (val int64, err error) {
val, err = r.RedisDb.RPush(r.Context, key, value).Result()
return
}
/**
Rpushx 命令用于将一个值插入到已存在的列表尾部(最右边)如果列表不存在操作无效
@key 列表
@value 要插入的字符串
*/
func (r *RedisStoreType) Rpushx(key string, value ...interface{}) (val int64, err error) {
val, err = r.RedisDb.RPushX(r.Context, key, value).Result()
return
}
/**
Blpop 命令移出并获取列表的第一个元素 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止
@key 列表
*/
func (r *RedisStoreType) Blpop(key string) (val []string, err error) {
val, err = r.RedisDb.BLPop(r.Context, r.Expiration, key).Result()
return
}
/**
Brpop 命令移出并获取列表的最后一个元素 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止
@key 列表
*/
func (r *RedisStoreType) Brpop(key string) (val []string, err error) {
val, err = r.RedisDb.BRPop(r.Context, r.Expiration, key).Result()
return
}
/**
Brpoplpush 命令从列表中取出最后一个元素并插入到另外一个列表的头部 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止
@source 源列表
@destination 目标列表
*/
func (r *RedisStoreType) Brpoplpush(source, destination string) (val string, err error) {
val, err = r.RedisDb.BRPopLPush(r.Context, source, destination, r.Expiration).Result()
return
}
/*
Redis (key)
Redis 键命令用于管理 redis 的键
*/
/*
Redis SCAN 命令
Redis Scan 命令用于迭代数据库中的数据库键
SCAN 命令是一个基于游标的迭代器每次被调用之后 都会向用户返回一个新的游标 用户在下次迭代时需要使用这个新游标作为 SCAN 命令的游标参数 以此来延续之前的迭代过程
SCAN 返回一个包含两个元素的数组 第一个元素是用于进行下一次迭代的新游标 而第二个元素则是一个数组 这个数组中包含了所有被迭代的元素如果新游标返回 0 表示迭代已结束
相关命令
SSCAN 命令用于迭代集合键中的元素
HSCAN 命令用于迭代哈希键中的键值对
ZSCAN 命令用于迭代有序集合中的元素包括元素成员和元素分值
*/
func (r *RedisStoreType) Scan(cursor uint64, match string, count int64) (keys []string, cursores uint64, err error) {
keys, cursores, err = r.RedisDb.Scan(r.Context, cursor, match, count).Result()
return
}
/*
*Keys 命令用于查找所有符合给定模式 pattern key
*/
func (r *RedisStoreType) Keys(key string) (val []string, err error) {
val, err = r.RedisDb.Keys(r.Context, key).Result()
return
}

BIN
hr_server.exe

Binary file not shown.

173
identification/authentication.go

@ -0,0 +1,173 @@
package identification
import (
"fmt"
"hr_server/grocerystore"
"hr_server/models"
"hr_server/overall"
"hr_server/overall/overallhandle"
"github.com/gin-gonic/gin"
"github.com/mitchellh/mapstructure"
)
//验证器
func Validator() gin.HandlerFunc {
return func(c *gin.Context) {
userToken := c.Request.Header.Get("token")
randomNumber := c.Request.Header.Get("number")
ContentType := c.Request.Header.Get("Content-Type")
Origin := c.Request.Header.Get("Origin")
userAgent := c.Request.Header.Get("User-Agent")
if ContentType == "" || userToken == "" || userAgent == "" || randomNumber == "" {
iii := overallhandle.MapOut()
iii["ContentType"] = ContentType
iii["userToken"] = userToken
iii["userAgent"] = userAgent
iii["Origin"] = Origin
iii["randomNumber"] = randomNumber
overallhandle.Result(2001, "请输入关键信息数据!", c)
c.Abort()
return
}
//设定redis Key名称
redisKey := fmt.Sprintf("Authentication:ApiAuthent_%v", userToken)
redisClient := grocerystore.RunRedis(overall.CONSTANT_REDIS3)
tokenInfo, isTrue := redisClient.HashGetAll(redisKey)
if isTrue != true {
iii := overallhandle.MapOut()
iii["ContentType"] = ContentType
iii["userToken"] = userToken
iii["userAgent"] = userAgent
iii["Origin"] = Origin
iii["randomNumber"] = randomNumber
iii["redisKey"] = redisKey
iii["isTrue"] = isTrue
overallhandle.Result(2002, "您的指令不正确!或已经超时!请重新获取指令!", c)
c.Abort()
return
}
var validator ValidatorType
identityErr := mapstructure.Decode(tokenInfo, &validator)
if identityErr != nil {
overallhandle.Result(2003, "对不起!身份验证失败!", c)
c.Abort()
return
}
//密码加密
var passWordMd5 overallhandle.Md5Encryption
passWordMd5.Md5EncryptionInit(validator.PassWord)
passWordMd5Str := passWordMd5.Md5EncryptionAlgorithm()
var empowerUser models.EmpowerUser
userErr := empowerUser.GetCont(map[string]interface{}{"userkey": validator.UserKey, "password": passWordMd5Str}, "verification_code")
if userErr != nil {
overallhandle.Result(2000, userErr, c)
return
}
//头文件加密
//ContentType
var ContentTypeMd5 overallhandle.Md5Encryption
ContentTypeMd5.Md5EncryptionInit(ContentType)
if empowerUser.VerificationCode != "" {
ContentTypeMd5.AppKey = empowerUser.VerificationCode
}
fmt.Printf("ContentTypeMd5Str ----->%v\n", ContentTypeMd5)
ContentTypeMd5Str := ContentTypeMd5.Md5EncryptionAlgorithm()
//Origin
var OriginMd5 overallhandle.Md5Encryption
OriginMd5.Md5EncryptionInit(Origin)
if empowerUser.VerificationCode != "" {
OriginMd5.AppKey = empowerUser.VerificationCode
}
originMd5Str := OriginMd5.Md5EncryptionAlgorithm()
//userAgent
var userAgentMd5 overallhandle.Md5Encryption
userAgentMd5.Md5EncryptionInit(userAgent)
if empowerUser.VerificationCode != "" {
userAgentMd5.AppKey = empowerUser.VerificationCode
}
userAgentMd5Str := userAgentMd5.Md5EncryptionAlgorithm()
//随机数加密
var randomNumberMd5 overallhandle.Md5Encryption
randomNumberMd5.Md5EncryptionInit(validator.Number)
if empowerUser.VerificationCode != "" {
randomNumberMd5.AppKey = empowerUser.VerificationCode
}
numberMd5 := randomNumberMd5.Md5EncryptionAlgorithm()
//用户名加密
var userKeyMd5 overallhandle.Md5Encryption
userKeyMd5.Md5EncryptionInit(validator.UserKey)
if empowerUser.VerificationCode != "" {
userKeyMd5.AppKey = empowerUser.VerificationCode
}
userKeyMd5Str := userKeyMd5.Md5EncryptionAlgorithm()
clearCodeToken := fmt.Sprintf("%v-%v-%v-%v-%v-%v", ContentTypeMd5Str, originMd5Str, userAgentMd5Str, numberMd5, userKeyMd5Str, passWordMd5Str)
fmt.Printf("redisKey---->ContentTypeMd5Str:%v-originMd5Str:%v-userAgentMd5Str:%v-numberMd5:%v-userKeyMd5Str:%v-passwordMd5Str:%v\n", ContentTypeMd5Str, originMd5Str, userAgentMd5Str, numberMd5, userKeyMd5Str, passWordMd5Str)
//token 加密
var tokenMd5 overallhandle.Md5Encryption
tokenMd5.Md5EncryptionInit(clearCodeToken)
if empowerUser.VerificationCode != "" {
tokenMd5.AppKey = empowerUser.VerificationCode
}
fmt.Printf("tokenMd5Appk ----->%v\n", tokenMd5)
tokenMd5Str := tokenMd5.Md5EncryptionAlgorithm()
clearTokenStr := fmt.Sprintf("%v-%v", tokenMd5Str, numberMd5)
var clearTokenMd5 overallhandle.Md5Encryption
clearTokenMd5.Md5EncryptionInit(clearTokenStr)
if empowerUser.VerificationCode != "" {
clearTokenMd5.AppKey = empowerUser.VerificationCode
}
clearTokenMd5Str := clearTokenMd5.Md5EncryptionAlgorithm()
//提交Token转化
submitTokenStr := fmt.Sprintf("%v-%v", userToken, randomNumber)
var submitTokenMd5 overallhandle.Md5Encryption
submitTokenMd5.Md5EncryptionInit(submitTokenStr)
if empowerUser.VerificationCode != "" {
submitTokenMd5.AppKey = empowerUser.VerificationCode
}
submitTokenMd5Str := submitTokenMd5.Md5EncryptionAlgorithm()
if submitTokenMd5Str != clearTokenMd5Str {
sss := overallhandle.MapOut()
sss["numberMd5"] = numberMd5
sss["submitTokenMd5Str"] = submitTokenMd5Str
sss["clearTokenMd5Str"] = clearTokenMd5Str
sss["tokenMd5Str"] = tokenMd5Str
sss["clearCodeToken"] = clearCodeToken
sss["submitTokenStr"] = submitTokenStr
sss["clearTokenStr"] = clearTokenStr
sss["userToken"] = userToken
// tokenMd5Str, numberMd5
// overallhandle.Result(2004, "对不起!非法令牌!不可访问系统", c)
overallhandle.Result(2004, sss, c, "对不起!非法令牌!不可访问系统")
c.Abort()
return
}
c.Next()
}
}
//拦截器
func Interceptor() gin.HandlerFunc {
return func(c *gin.Context) {
}
}

8
identification/type.go

@ -0,0 +1,8 @@
package identification
//验证器结构
type ValidatorType struct {
Number string `json:"number"` //随机数
UserKey string `json:"userkey"` //用户名
PassWord string `json:"password"` //密码
}

7
initialization/databaseinit/mysql.go

@ -30,4 +30,11 @@ func LoadDatabase() {
} else {
fmt.Printf("%v数据库开启成功!\n", sqlConfig.HrMysql.Name)
}
//开启Hr数据库
overall.CONSTANT_DB_HR_Jin = sqlConfig.HrMysqlJin.OpenSql()
if overall.CONSTANT_DB_HR == nil {
fmt.Printf("%v数据库开启失败!\n", sqlConfig.HrMysqlJin.Name)
} else {
fmt.Printf("%v数据库开启成功!\n", sqlConfig.HrMysqlJin.Name)
}
}

4
initialization/nosql/redis.go

@ -12,4 +12,8 @@ func LoadRedis() {
initialization.RunViper(&redisConfig, overall.ConfigRedisConstant)
overall.CONSTANT_REDIS0 = redisConfig.MasterRedis.OpenRedis()
overall.CONSTANT_REDIS1 = redisConfig.MasterRedis1.OpenRedis()
overall.CONSTANT_REDIS2 = redisConfig.MasterRedis2.OpenRedis()
overall.CONSTANT_REDIS3 = redisConfig.MasterRedis3.OpenRedis()
overall.CONSTANT_REDIS4 = redisConfig.MasterRedis4.OpenRedis()
overall.CONSTANT_REDIS5 = redisConfig.MasterRedis5.OpenRedis()
}

39
initialization/route/route_entry.go

@ -2,6 +2,7 @@ package route
import (
"hr_server/apirouter"
"hr_server/identification"
"github.com/gin-gonic/gin"
)
@ -23,10 +24,44 @@ func InitialRouter() *gin.Engine {
c.JSON(0, "通讯成功!")
})
}
//注册路由
//定义路由实例
//获取验证信息
empowerApi := apirouter.RouterGroupInlet.EmpowerApiRouter
//实验
shhiyanApi := apirouter.RouterGroupInlet.ShiyanApiRRouter
//组织架构
organizationApi := apirouter.RouterGroupInlet.OrganizationApi //组织架构
//权限相关操作
permitPowerApi := apirouter.RouterGroupInlet.PermitPowerApi
//人员档案
staffApi := apirouter.RouterGroupInlet.PersonnelRoute
staffApiFuben := apirouter.RouterGroupInlet.PersonnelRouteKingdee
//金蝶对接接口
jinDieDockingApi := apirouter.RouterGroupInlet.KingdeeApiRouter
{
organizationApi.InitRouterGroup(appLoadRouterGroup)
shhiyanApi.InitRouterGroup(appLoadRouterGroup) //实验
empowerApi.InitRouterGroup(appLoadRouterGroup) //获取token
organizationApi.InitRouterGroup(appLoadRouterGroup) //组织架构
jinDieDockingApi.InitRouterGroup(appLoadRouterGroup) //金蝶对接接口
staffApi.InitRouterGroup(appLoadRouterGroup) //人员档案
}
//身份验证
Authentication := router.Group("")
Authentication.Use(identification.Validator()).Use(identification.Interceptor())
{
permitPowerApi.InitRouterGroup(Authentication) //权限相关操作
staffApiFuben.InitRouterGroup(Authentication) //人员档案
}
return router
}

501
log/202206/20220603.log

File diff suppressed because one or more lines are too long

980
log/202206/20220604.log

File diff suppressed because one or more lines are too long

35
log/202206/20220605.log

File diff suppressed because one or more lines are too long

15
log/202206/20220606.log

File diff suppressed because one or more lines are too long

83
log/202206/20220607.log

File diff suppressed because one or more lines are too long

504
log/202206/20220608.log

File diff suppressed because one or more lines are too long

23
log/202206/20220609.log

File diff suppressed because one or more lines are too long

502
log/202206/20220616.log

File diff suppressed because one or more lines are too long

525
log/202206/20220617.log

File diff suppressed because one or more lines are too long

525
log/202206/20220618.log

File diff suppressed because one or more lines are too long

35
log/202206/20220619.log

File diff suppressed because one or more lines are too long

15
log/202206/20220620.log

File diff suppressed because one or more lines are too long

31
log/202206/20220621.log

File diff suppressed because one or more lines are too long

509
log/202206/20220622.log

File diff suppressed because one or more lines are too long

2013
log/202206/20220623.log

File diff suppressed because one or more lines are too long

15
log/202206/20220624.log

File diff suppressed because one or more lines are too long

16
log/202206/20220625.log

File diff suppressed because one or more lines are too long

15
log/202206/20220626.log

File diff suppressed because one or more lines are too long

15
log/202206/20220627.log

File diff suppressed because one or more lines are too long

15
log/202206/20220628.log

File diff suppressed because one or more lines are too long

15
log/202206/20220629.log

File diff suppressed because one or more lines are too long

3
log/202206/20220630.log

File diff suppressed because one or more lines are too long

12
log/202207/20220701.log

File diff suppressed because one or more lines are too long

15
log/202207/20220702.log

File diff suppressed because one or more lines are too long

3
log/202207/20220703.log

File diff suppressed because one or more lines are too long

5
main.go

@ -4,12 +4,17 @@ import (
"hr_server/initialization/app"
"hr_server/initialization/databaseinit"
"hr_server/initialization/nosql"
"hr_server/scheduledtask"
)
func main() {
// gin.SetMode(gin.ReleaseMode)
// gin.DefaultWriter = ioutil.Discard
//加载数据库
databaseinit.LoadDatabase()
//加载Redis
nosql.LoadRedis()
//启动定时任务
scheduledtask.TimeTask()
app.RunItem()
}

38
middleware/snowflake/snowflake.go

@ -0,0 +1,38 @@
package snowflake
import (
"errors"
"time"
)
//雪花算法
func NewWorker(workerId int64) (*Worker, error) {
if workerId < 0 || workerId > workerMax {
return nil, errors.New("工作机器的ID超出范围!")
}
// 生成一个新节点
return &Worker{
timestamp: 0,
workerId: workerId,
number: 0,
}, nil
}
func (w *Worker) GetId() int64 {
w.mu.Lock()
defer w.mu.Unlock()
now := time.Now().UnixNano() / 1e6
if w.timestamp == now {
w.number++
if w.number > numberMax {
for now <= w.timestamp {
now = time.Now().UnixNano() / 1e6
}
}
} else {
w.number = 0
w.timestamp = now
}
ID := int64((now-startTime)<<timeShift | (w.workerId << workerShift) | (w.number))
return ID
}

21
middleware/snowflake/type.go

@ -0,0 +1,21 @@
package snowflake
import "sync"
//雪花算法
const (
workerBits uint8 = 10
numberBits uint8 = 12
workerMax int64 = -1 ^ (-1 << workerBits)
numberMax int64 = -1 ^ (-1 << numberBits)
timeShift uint8 = workerBits + numberBits
workerShift uint8 = numberBits
startTime int64 = 1655827200000 // 如果在程序跑了一段时间修改了epoch这个值 可能会导致生成相同的ID
)
type Worker struct {
mu sync.Mutex
timestamp int64
workerId int64
number int64
}

16
models/administrative_organization.go

@ -16,6 +16,10 @@ type AdministrativeOrganization 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:int(1) unsigned;default:1;not null;comment:状态(1:启用;2:禁用;3:删除)"`
WechatOrganizationId int64 `json:"wechatorganizationid" gorm:"column:wechat_organization_id;type:bigint(20) unsigned;default:0;not null;comment:微信组织架构对照码"`
SuperiorSun string `json:"superiorsun" gorm:"column:superior_sun;type:mediumtext;comment:级联ID"`
Schoole int64 `json:"schoole" gorm:"column:schoole;type:bigint(20) unsigned;default:0;not null;comment:原知行学院对照码"`
KingdeeId string `json:"kingdeeid" gorm:"column:kingdeeid;type:varchar(255) unsigned;default:'';comment:金蝶对照ID"`
IsPower int `json:"ispower" gorm:"column:ispower;type:int(1) unsigned;default:2;not null;comment:是否为实权部门"`
}
func (AdministrativeOrganization *AdministrativeOrganization) TableName() string {
@ -23,13 +27,13 @@ func (AdministrativeOrganization *AdministrativeOrganization) TableName() string
}
//编辑行政组织内容
func (cont *AdministrativeOrganization) EiteCont(whereMap map[string]interface{}, saveData map[string]interface{}) (err error) {
func (cont *AdministrativeOrganization) EiteCont(whereMap interface{}, saveData interface{}) (err error) {
err = overall.CONSTANT_DB_HR.Model(&cont).Where(whereMap).Updates(saveData).Error
return
}
//获取行政组织内容
func (cont *AdministrativeOrganization) GetCont(whereMap map[string]interface{}, field ...string) (err error) {
func (cont *AdministrativeOrganization) GetCont(whereMap interface{}, field ...string) (err error) {
gormDb := overall.CONSTANT_DB_HR.Model(&cont)
if len(field) > 0 {
fieldStr := strings.Join(field, ",")
@ -41,7 +45,13 @@ func (cont *AdministrativeOrganization) GetCont(whereMap map[string]interface{},
}
//根据条件获取总数
func (cont *AdministrativeOrganization) CountCont(whereMap map[string]interface{}) (countId int64) {
func (cont *AdministrativeOrganization) CountCont(whereMap interface{}) (countId int64) {
overall.CONSTANT_DB_HR.Model(&cont).Where(whereMap).Count(&countId)
return
}
//读取全部信息
func (cont *AdministrativeOrganization) ContMap(whereMap interface{}) (countAry []AdministrativeOrganization) {
overall.CONSTANT_DB_HR.Model(&cont).Where(whereMap).Find(&countAry)
return
}

11
models/administrative_organization_type.go

@ -7,11 +7,12 @@ import (
//行政组织类型
type AdministrativeOrganizationType 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:类型名称"`
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:删除)"`
Level int64 `json:"level" gorm:"column:level;type:int(5) unsigned;default:1;not null;comment:级别"`
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:类型名称"`
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:删除)"`
Level int64 `json:"level" gorm:"column:level;type:int(5) unsigned;default:1;not null;comment:级别"`
KingdeeId string `json:"kingdeeid" gorm:"column:kingdeeid;type:varchar(255) unsigned;default:'';comment:金蝶对照ID"`
}
func (AdministrativeOrganizationType *AdministrativeOrganizationType) TableName() string {

42
models/double_worker.go

@ -0,0 +1,42 @@
package models
import (
"hr_server/overall"
"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"`
Name string `json:"name" gorm:"column:name;type:varchar(255) unsigned;default:'';not null;comment:姓名"`
Company string `json:"company" gorm:"column:company;type:varchar(255) unsigned;default:'';not null;comment:所在公司"`
Department string `json:"department" gorm:"column:department;type:varchar(255) unsigned;default:'';not null;comment:所在部门"`
Position string `json:"position" gorm:"column:position;type:varchar(255) unsigned;default:'';not null;comment:所在岗位"`
Tel string `json:"tel" gorm:"column:tel;type:varchar(255) unsigned;default:'';not null;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: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"`
}
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 {
fieldStr := strings.Join(field, ",")
gormDb = gormDb.Select(fieldStr)
}
gormDb = gormDb.Where(whereMap)
err = gormDb.First(&cont).Error
return
}

33
models/duties.go

@ -1,16 +1,21 @@
package models
import "hr_server/overall"
import (
"hr_server/overall"
"strings"
)
//职务
type Duties 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:职务名称"`
JobType int64 `json:"jobtype" gorm:"column:job_type;type:bigint(20) unsigned;default:0;not null;comment:归属职务类型"`
Weight int64 `json:"weight" gorm:"column:weight;type:bigint(20) unsigned;default:1;not null;comment:权重"`
Time int64 `json:"time" gorm:"column:time;type:bigint(20) unsigned;default:0;not null;comment:创建时间"`
Number string `json:"number" gorm:"column:number;type:varchar(50) unsigned;default:'';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"`
Name string `json:"name" gorm:"column:name;type:varchar(255) unsigned;default:'';not null;comment:职务名称"`
JobType int64 `json:"jobtype" gorm:"column:job_type;type:bigint(20) unsigned;default:0;not null;comment:归属职务类型"`
Weight int64 `json:"weight" gorm:"column:weight;type:bigint(20) unsigned;default:1;not null;comment:权重"`
Time int64 `json:"time" gorm:"column:time;type:bigint(20) unsigned;default:0;not null;comment:创建时间"`
Number string `json:"number" gorm:"column:number;type:varchar(50) unsigned;default:'';not null;comment:编码"`
State int `json:"state" gorm:"column:state;type:int(1) unsigned;default:1;not null;comment:状态(1:启用;2:禁用;3:删除)"`
KingdeeId string `json:"kingdeeid" gorm:"column:kingdeeid;type:varchar(255) unsigned;default:'';comment:金蝶对照ID"`
KingdeeNum string `json:"kingdeenum" gorm:"column:kingdeenum;type:varchar(255) unsigned;default:'';comment:金蝶对照编码"`
}
func (Duties *Duties) TableName() string {
@ -22,3 +27,15 @@ func (Duties *Duties) EiteCont(whereMap map[string]interface{}, saveData map[str
err = overall.CONSTANT_DB_HR.Model(&Duties).Where(whereMap).Updates(saveData).Error
return
}
//获取详细内容
func (cont *Duties) 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
}

37
models/duties_class_leve.go

@ -0,0 +1,37 @@
package models
import (
"hr_server/overall"
"strings"
)
//职务信息及类别、等级视图
type DutiesClassLeve struct {
Id int64 `json:"id" gorm:"primaryKey;column:d_id;type:bigint(20) unsigned;not null;comment:Id;index"`
Name string `json:"name" gorm:"column:d_name;type:varchar(255) unsigned;default:'';not null;comment:职务名称"`
Weight int64 `json:"weight" gorm:"column:d_weight;type:bigint(20) unsigned;default:1;not null;comment:权重"`
Number string `json:"number" gorm:"column:d_num;type:varchar(50) unsigned;default:'';not null;comment:编码"`
State int `json:"state" gorm:"column:d_state;type:int(1) unsigned;default:1;not null;comment:状态(1:启用;2:禁用;3:删除)"`
KingdeeId string `json:"kingdeeid" gorm:"column:d_king;type:varchar(255) unsigned;default:'';comment:金蝶对照ID"`
ClassId int64 `json:"classid" gorm:"column:c_id;type:bigint(20) unsigned;not null;comment:Id;index"` //职务分类Id
ClassName string `json:"classname" gorm:"column:c_name;type:varchar(255) unsigned;default:'';not null;comment:职务分类名称"`
// LeveId int64 `json:"leveid" gorm:"column:l_id;type:bigint(20) unsigned;not null;comment:Id;index"` //职务等级Id
// LeveNumber string `json:"levenumber" gorm:"column:l_num;type:varchar(50) unsigned;default:'';not null;comment:等级编号"`
// LeveName string `json:"levename" gorm:"column:l_name;type:varchar(255) unsigned;default:'';not null;comment:等级名称"`
}
func (DutiesClassLeve *DutiesClassLeve) TableName() string {
return "duties_class_leve"
}
//获取详细内容
func (cont *DutiesClassLeve) 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
}

46
models/emergency_contact.go

@ -0,0 +1,46 @@
package models
import (
"hr_server/overall"
"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"`
Name string `json:"name" gorm:"column:name;type:varchar(255) unsigned;default:'';not null;comment:紧急联系人姓名"`
Relationship string `json:"relationship" gorm:"column:relationship;type:varchar(255) unsigned;default:'';not null;comment:与紧急联系人关系"`
Tel string `json:"tel" gorm:"column:tel;type:varchar(255) unsigned;default:'';not null;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: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"`
}
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 {
fieldStr := strings.Join(field, ",")
gormDb = gormDb.Select(fieldStr)
}
gormDb = gormDb.Where(whereMap)
err = gormDb.First(&cont).Error
return
}
//根据条件获取总数
func (cont *EmergencyContact) CountCont(whereMap interface{}) (countId int64) {
overall.CONSTANT_DB_HR.Model(&cont).Where(whereMap).Count(&countId)
return
}

46
models/empoweruser.go

@ -0,0 +1,46 @@
package models
import (
"hr_server/overall"
"strings"
)
//授权账户
type EmpowerUser struct {
Id int64 `json:"id" gorm:"primaryKey;column:id;type:bigint(20) unsigned;not null;comment:Id;index"`
UserKey string `json:"userkey" gorm:"column:userkey;type:varchar(255) unsigned;not null;comment:账户"`
Password string `json:"password" gorm:"column:password;type:varchar(255) unsigned;default:'';not null;comment:密码"`
Name string `json:"name" gorm:"column:name;type:varchar(255) unsigned;default:'';not null;comment:使用人(组织)名称"`
State int `json:"state" gorm:"column:state;type:tinyint(1) unsigned;default:1;not null;comment:状态(1:启用;2:禁用;3:删除)`
Time int64 `json:"addtime" gorm:"column:addtime;type:bigint(20) unsigned;default:0;not null;comment:写入时间"`
EiteTime int64 `json:"eitetime" gorm:"column:eitetime;type:bigint(20) unsigned;default:0;not null;comment:编辑时间"`
VerificationCode string `json:"verificationcode" gorm:"column:verification_code;type:mediumtext unsigned;comment:身份识别码"`
}
func (Position *EmpowerUser) TableName() string {
return "empoweruser"
}
//编辑职务分类内容
func (cont *EmpowerUser) EiteCont(whereMap interface{}, saveData map[string]interface{}) (err error) {
err = overall.CONSTANT_DB_HR.Model(&cont).Where(whereMap).Updates(saveData).Error
return
}
//获取行政组织内容
func (cont *EmpowerUser) 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 *EmpowerUser) CountCont(whereMap interface{}) (countId int64) {
overall.CONSTANT_DB_HR.Model(&cont).Where(whereMap).Count(&countId)
return
}

46
models/family_members.go

@ -0,0 +1,46 @@
package models
import (
"hr_server/overall"
"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:员工工号"`
Relationship string `json:"relationship" gorm:"column:relation;type:varchar(255) unsigned;default:'';not null;comment:亲属关系"`
Name string `json:"name" gorm:"column:name;type:varchar(255) unsigned;default:'';not null;comment:姓名"`
Company string `json:"company" gorm:"column:company;type:varchar(255) unsigned;default:'';not null;comment:所在公司"`
Deparment string `json:"deparment" gorm:"column:deparment;type:varchar(255) unsigned;default:'';not null;comment:所在部门"`
Postnme string `json:"postnme" gorm:"column:postnme;type:varchar(255) unsigned;default:'';not null;comment:所在岗位"`
Tel string `json:"tel" gorm:"column:tel;type:varchar(255) unsigned;default:'';not null;comment:紧急联系人电话"`
PoliticalOutlook int `json:"politicaloutlook" gorm:"column:political_outlook;type:int(3) unsigned;default:1;not null;comment:政治面貌(1:群众;2:无党派;3:台盟会员;4:九三社员;5:致公党员;6:农工党员;7:民进会员;8:民建会员;9:民盟盟员;10:民革会员,11:共青团员;12:预备党员;13:中共党员)"`
Time int64 `json:"time" gorm:"column:time;type:bigint(20) unsigned;default:0;not null;comment:创建时间"`
Key int64 `json:"key" gorm:"column:key;type:bigint(50) unsigned;default:0;not null;comment:key"`
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:政治面貌汉字说明"`
}
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 {
fieldStr := strings.Join(field, ",")
gormDb = gormDb.Select(fieldStr)
}
gormDb = gormDb.Where(whereMap)
err = gormDb.First(&cont).Error
return
}

48
models/inside_work_history.go

@ -0,0 +1,48 @@
package models
import (
"hr_server/overall"
"strings"
)
//集团内部工作经历
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:兼职"`
}
func (InsideWorkHistory *InsideWorkHistory) TableName() string {
return "inside_work_history"
}
//编辑集团内部工作经历内容
func (cont *InsideWorkHistory) EditCont(whereMap map[string]interface{}, saveData map[string]interface{}) (err error) {
err = overall.CONSTANT_DB_HR.Model(&cont).Where(whereMap).Updates(saveData).Error
return
}
//获取详细内容
func (cont *InsideWorkHistory) 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
}

39
models/inside_work_view.go

@ -0,0 +1,39 @@
package models
import (
"hr_server/overall"
"strings"
)
type InsideWorkView struct {
InsideWorkHistory
GroupNumber string `json:"groupnumber" gorm:"column:g_number;type:varchar(50) unsigned;default:'';not null;comment:行政编码"`
GroupName string `json:"groupname" gorm:"column:g_name;type:varchar(255) unsigned;default:'';not null;comment:组织名称"`
CompanyNumber string `json:"companynumber" gorm:"column:c_number;type:varchar(50) unsigned;default:'';not null;comment:行政编码"`
CompanyName string `json:"companyname" gorm:"column:c_name;type:varchar(255) unsigned;default:'';not null;comment:组织名称"`
DepartmentNumber string `json:"departmentnumber" gorm:"column:d_number;type:varchar(50) unsigned;default:'';not null;comment:行政编码"`
DepartmentName string `json:"departmentname" gorm:"column:d_name;type:varchar(255) unsigned;default:'';not null;comment:组织名称"`
WorkShopNumber string `json:"workshopnumber" gorm:"column:ws_number;type:varchar(50) unsigned;default:'';not null;comment:行政编码"`
WorkShopName string `json:"workshopname" gorm:"column:ws_name;type:varchar(255) unsigned;default:'';not null;comment:组织名称"`
SectionNumber string `json:"sectionnumber" gorm:"column:w_number;type:varchar(50) unsigned;default:'';not null;comment:行政编码"`
SectionName string `json:"sectionnasectionme" gorm:"column:w_name;type:varchar(255) unsigned;default:'';not null;comment:组织名称"`
PostJobNumber string `json:"postjobnumber" gorm:"column:p_number;type:varchar(50) unsigned;default:'';not null;comment:职位编码"`
PostJobName string `json:"postjobname" gorm:"column:p_name;type:varchar(255) unsigned;default:'';not null;comment:职位名称"`
TeamName string `json:"teamname" gorm:"column:r_name;type:varchar(255) unsigned;default:'';not null;comment:班组名称"`
}
func (InsideWorkView *InsideWorkView) TableName() string {
return "inside_work_view"
}
//获取详细内容
func (cont *InsideWorkView) 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
}

27
models/job_class.go

@ -1,13 +1,18 @@
package models
import "hr_server/overall"
import (
"hr_server/overall"
"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:职务分类名称"`
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"`
Name string `json:"name" gorm:"column:name;type:varchar(255) unsigned;default:'';not null;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:删除)"`
KingdeeId string `json:"kingdeeid" gorm:"column:kingdeeid;type:varchar(255) unsigned;default:'';comment:金蝶对照ID"`
KingdeeNum string `json:"kingdeenum" gorm:"column:kingdeenum;type:varchar(255) unsigned;default:'';comment:金蝶对照编码"`
}
func (JobClass *JobClass) TableName() string {
@ -19,3 +24,15 @@ func (JobClass *JobClass) EiteJobClassCont(whereMap map[string]interface{}, save
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 {
fieldStr := strings.Join(field, ",")
gormDb = gormDb.Select(fieldStr)
}
gormDb = gormDb.Where(whereMap)
err = gormDb.First(&cont).Error
return
}

Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save