Browse Source

编写与金蝶基础资料对照

v1.1_dev
超级管理员 4 years ago
parent
commit
cda0bef37e
  1. 56
      202206/20220602.log
  2. 80
      202206/20220603.log
  3. 32
      README.md
  4. 115
      api/empower/authorize/empower.go
  5. 35
      api/empower/authorize/type.go
  6. 9
      api/empower/inlet.go
  7. 629
      api/jindie_docking/dockingorganization/controller.go
  8. 24
      api/jindie_docking/dockingorganization/getposturl.go
  9. 53
      api/jindie_docking/dockingorganization/type.go
  10. 9
      api/jindie_docking/inlet.go
  11. 18
      api/version1/administrativeorganization/position.go
  12. 8
      api/version1/personnelapi/staff.go
  13. 1
      api/version1/personnelapi/type.go
  14. 8
      api/version1/shiyan/shiyan.go
  15. 14
      api/version1/shiyan/type.go
  16. 19
      apirouter/dockingjindie/jindie.go
  17. 3
      apirouter/dockingjindie/type.go
  18. 19
      apirouter/empowerrote/empowerroter.go
  19. 3
      apirouter/empowerrote/type.go
  20. 4
      apirouter/inlet.go
  21. 1
      apirouter/organization/organization_group.go
  22. 1
      apirouter/permit/permit.go
  23. 1
      apirouter/shiyanrouter/shiyan.go
  24. 5
      config/configApp/appConfig.yaml
  25. 7
      config/configApp/server.go
  26. 1
      config/configDatabase/database.go
  27. 13
      config/configDatabase/database.yaml
  28. 4
      config/configNosql/redis.go
  29. 7
      config_server/configApp/appConfig.yaml
  30. 9
      config_server/configApp/server.go
  31. 6
      config_server/configDatabase/database.yaml
  32. 21
      config_server/configJson/org.json
  33. 4
      config_server/configNosql/redis.go
  34. 3
      go.mod
  35. 4
      go.sum
  36. 380
      grocerystore/redis.go
  37. BIN
      hr_server.exe
  38. 128
      identification/authentication.go
  39. 8
      identification/type.go
  40. 7
      initialization/databaseinit/mysql.go
  41. 4
      initialization/nosql/redis.go
  42. 39
      initialization/route/route_entry.go
  43. 149
      log/202206/20220602.log
  44. 2
      log/202206/20220603.log
  45. 3
      main.go
  46. 2
      models/administrative_organization.go
  47. 1
      models/administrative_organization_type.go
  48. 19
      models/duties.go
  49. 46
      models/empoweruser.go
  50. 19
      models/job_class.go
  51. 1
      models/personnel.go
  52. 1
      models/position.go
  53. 1
      overall/app_config_const.go
  54. 1
      overall/app_constant.go
  55. 1
      overall/overallhandle/errorcode.go
  56. 71
      overall/overallhandle/log.go
  57. 63
      overall/overallhandle/overall_handle.go
  58. 64
      scheduledtask/time_task.go

56
202206/20220602.log

@ -0,0 +1,56 @@
[Trace] 2022/06/02 13:32:27 log.go:69: [准备启动定时任务]
[Trace] 2022/06/02 13:32:27 log.go:69: [定时任务启动成功]
[Trace] 2022/06/02 13:33:27 log.go:69: [准备启动定时任务]
[Trace] 2022/06/02 13:33:27 log.go:69: [定时任务启动成功]
[Trace] 2022/06/02 13:36:19 log.go:69: [准备启动定时任务]
[Trace] 2022/06/02 13:36:19 log.go:69: [定时任务启动成功]
[Trace] 2022/06/02 13:37:32 log.go:69: [准备启动定时任务]
[Trace] 2022/06/02 13:37:32 log.go:69: [定时任务启动成功]
[Trace] 2022/06/02 13:39:03 log.go:69: [准备启动定时任务]
[Trace] 2022/06/02 13:39:03 log.go:69: [定时任务启动成功]
[Trace] 2022/06/02 13:50:42 log.go:69: [准备启动定时任务]
[Trace] 2022/06/02 13:50:42 log.go:69: [定时任务启动成功]
[Trace] 2022/06/02 13:56:45 log.go:69: [准备启动定时任务]
[Trace] 2022/06/02 13:56:45 log.go:69: [定时任务启动成功]
[Trace] 2022/06/02 13:59:04 log.go:69: [准备启动定时任务]
[Trace] 2022/06/02 13:59:04 log.go:69: [定时任务启动成功]
[Trace] 2022/06/02 13:59:52 log.go:69: [准备启动定时任务]
[Trace] 2022/06/02 13:59:52 log.go:69: [定时任务启动成功]
[Trace] 2022/06/02 14:00:37 log.go:69: [准备启动定时任务]
[Trace] 2022/06/02 14:00:37 log.go:69: [定时任务启动成功]
[Trace] 2022/06/02 14:01:56 log.go:69: [准备启动定时任务]
[Trace] 2022/06/02 14:01:56 log.go:69: [定时任务启动成功]
[Trace] 2022/06/02 14:02:14 log.go:69: [准备启动定时任务]
[Trace] 2022/06/02 14:02:14 log.go:69: [定时任务启动成功]
[Trace] 2022/06/02 14:10:05 log.go:69: [准备启动定时任务]
[Trace] 2022/06/02 14:10:05 log.go:69: [定时任务启动成功]
[Trace] 2022/06/02 14:13:35 log.go:69: [准备启动定时任务]
[Trace] 2022/06/02 14:13:35 log.go:69: [定时任务启动成功]
[Trace] 2022/06/02 14:14:58 log.go:69: [准备启动定时任务]
[Trace] 2022/06/02 14:14:58 log.go:69: [定时任务启动成功]
[Trace] 2022/06/02 14:15:21 log.go:69: [准备启动定时任务]
[Trace] 2022/06/02 14:15:21 log.go:69: [定时任务启动成功]
[Trace] 2022/06/02 14:16:42 log.go:69: [准备启动定时任务]
[Trace] 2022/06/02 14:16:42 log.go:69: [定时任务启动成功]
[Trace] 2022/06/02 14:35:41 log.go:69: [准备启动定时任务]
[Trace] 2022/06/02 14:35:41 log.go:69: [定时任务启动成功]
[Trace] 2022/06/02 14:38:12 log.go:69: [准备启动定时任务]
[Trace] 2022/06/02 14:38:12 log.go:69: [定时任务启动成功]
[Trace] 2022/06/02 14:43:29 log.go:69: [准备启动定时任务]
[Trace] 2022/06/02 14:43:29 log.go:69: [定时任务启动成功]
[Trace] 2022/06/02 14:46:30 log.go:69: [准备启动定时任务]
[Trace] 2022/06/02 14:46:30 log.go:69: [定时任务启动成功]
[Trace] 2022/06/02 15:01:21 log.go:69: [准备启动定时任务]
[Trace] 2022/06/02 15:01:21 log.go:69: [定时任务启动成功]
[Trace] 2022/06/02 15:06:38 [准备启动定时任务]
[Trace] 2022/06/02 15:06:38 [定时任务启动成功]
[Trace] 2022/06/02 15:11:37 [准备启动定时任务]
[Trace] 2022/06/02 15:11:37 [定时任务启动成功]
[Trace] 2022/06/02 15:39:12 [准备启动定时任务]
[Trace] 2022/06/02 15:39:12 [定时任务启动成功]
[Trace] 2022/06/02 15:40:39 [准备启动定时任务]
[Trace] 2022/06/02 15:40:39 [定时任务启动成功]
[Trace] 2022/06/02 16:21:42 [准备启动定时任务]
[Trace] 2022/06/02 16:21:42 [定时任务启动成功]
[Trace] 2022/06/02 16:25:47 [准备启动定时任务]
[Trace] 2022/06/02 16:25:47 [定时任务启动成功]

80
202206/20220603.log

@ -0,0 +1,80 @@
[Trace] 2022/06/03 08:23:16 [准备启动定时任务]
[Trace] 2022/06/03 08:23:16 [定时任务启动成功]
[Trace] 2022/06/03 08:27:06 [准备启动定时任务]
[Trace] 2022/06/03 08:27:06 [定时任务启动成功]
[Trace] 2022/06/03 08:28:31 [准备启动定时任务]
[Trace] 2022/06/03 08:28:31 [定时任务启动成功]
[Trace] 2022/06/03 09:30:37 [准备启动定时任务]
[Trace] 2022/06/03 09:30:37 [定时任务启动成功]
[Trace] 2022/06/03 13:26:50 [准备启动定时任务]
[Trace] 2022/06/03 13:26:50 [定时任务启动成功]
[Trace] 2022/06/03 13:45:41 [准备启动定时任务]
[Trace] 2022/06/03 13:45:41 [定时任务启动成功]
[Trace] 2022/06/03 13:54:16 [准备启动定时任务]
[Trace] 2022/06/03 13:54:16 [定时任务启动成功]
[Trace] 2022/06/03 14:03:18 [准备启动定时任务]
[Trace] 2022/06/03 14:03:18 [定时任务启动成功]
[Trace] 2022/06/03 14:10:29 [准备启动定时任务]
[Trace] 2022/06/03 14:10:29 [定时任务启动成功]
[Trace] 2022/06/03 14:13:15 [准备启动定时任务]
[Trace] 2022/06/03 14:13:15 [定时任务启动成功]
[Trace] 2022/06/03 14:15:08 [准备启动定时任务]
[Trace] 2022/06/03 14:15:08 [定时任务启动成功]
[Trace] 2022/06/03 14:18:26 [准备启动定时任务]
[Trace] 2022/06/03 14:18:26 [定时任务启动成功]
[Trace] 2022/06/03 14:19:40 [准备启动定时任务]
[Trace] 2022/06/03 14:19:40 [定时任务启动成功]
[Trace] 2022/06/03 14:21:11 [准备启动定时任务]
[Trace] 2022/06/03 14:21:11 [定时任务启动成功]
[Trace] 2022/06/03 14:22:30 [准备启动定时任务]
[Trace] 2022/06/03 14:22:30 [定时任务启动成功]
[Trace] 2022/06/03 14:23:33 [准备启动定时任务]
[Trace] 2022/06/03 14:23:33 [定时任务启动成功]
[Trace] 2022/06/03 14:25:01 [准备启动定时任务]
[Trace] 2022/06/03 14:25:01 [定时任务启动成功]
[Trace] 2022/06/03 14:37:46 [准备启动定时任务]
[Trace] 2022/06/03 14:37:46 [定时任务启动成功]
[Trace] 2022/06/03 14:40:09 [准备启动定时任务]
[Trace] 2022/06/03 14:40:09 [定时任务启动成功]
[Trace] 2022/06/03 14:41:13 [准备启动定时任务]
[Trace] 2022/06/03 14:41:13 [定时任务启动成功]
[Trace] 2022/06/03 14:41:44 [准备启动定时任务]
[Trace] 2022/06/03 14:41:44 [定时任务启动成功]
[Trace] 2022/06/03 14:49:18 [准备启动定时任务]
[Trace] 2022/06/03 14:49:18 [定时任务启动成功]
[Trace] 2022/06/03 14:52:43 [准备启动定时任务]
[Trace] 2022/06/03 14:52:43 [定时任务启动成功]
[Trace] 2022/06/03 14:57:37 [准备启动定时任务]
[Trace] 2022/06/03 14:57:37 [定时任务启动成功]
[Trace] 2022/06/03 15:01:33 [准备启动定时任务]
[Trace] 2022/06/03 15:01:33 [定时任务启动成功]
[Trace] 2022/06/03 15:05:13 [准备启动定时任务]
[Trace] 2022/06/03 15:05:13 [定时任务启动成功]
[Trace] 2022/06/03 15:05:49 [准备启动定时任务]
[Trace] 2022/06/03 15:05:49 [定时任务启动成功]
[Trace] 2022/06/03 15:07:58 [准备启动定时任务]
[Trace] 2022/06/03 15:07:58 [定时任务启动成功]
[Trace] 2022/06/03 15:08:34 [准备启动定时任务]
[Trace] 2022/06/03 15:08:34 [定时任务启动成功]
[Trace] 2022/06/03 15:09:21 [准备启动定时任务]
[Trace] 2022/06/03 15:09:21 [定时任务启动成功]
[Trace] 2022/06/03 15:10:32 [准备启动定时任务]
[Trace] 2022/06/03 15:10:32 [定时任务启动成功]
[Trace] 2022/06/03 15:12:14 [准备启动定时任务]
[Trace] 2022/06/03 15:12:14 [定时任务启动成功]
[Trace] 2022/06/03 15:13:12 [准备启动定时任务]
[Trace] 2022/06/03 15:13:12 [定时任务启动成功]
[Trace] 2022/06/03 15:13:58 [准备启动定时任务]
[Trace] 2022/06/03 15:13:58 [定时任务启动成功]
[Trace] 2022/06/03 15:20:22 [准备启动定时任务]
[Trace] 2022/06/03 15:20:22 [定时任务启动成功]
[Trace] 2022/06/03 16:00:49 -------------------------------------------------------------------------------
[Trace] 2022/06/03 16:00:49 [准备启动定时任务]
[Trace] 2022/06/03 16:00:49 -------------------------------------------------------------------------------
[Trace] 2022/06/03 16:00:49 -------------------------------------------------------------------------------
[Trace] 2022/06/03 16:00:49 [定时任务启动成功]
[Trace] 2022/06/03 16:00:49 -------------------------------------------------------------------------------
[Trace] 2022/06/03 16:01:48 -------------------------------------------------------------------------------
[Trace] 2022/06/03 16:01:48 [准备启动定时任务]
[Trace] 2022/06/03 16:01:48 -------------------------------------------------------------------------------
[Trace] 2022/06/03 16:01:48 [定时任务启动成功]

32
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,6 +41,18 @@
| `overall` | 全局对象 | 全局对象|
| `middleware` | 中间件 | 中间件 |
## 加密规则
```
1、分解步骤
one = md5(CodeString)+md5(AppKey)
two = md5(one)+AppKey
therr = md5(two)
2、合并
md5(md5(md5(CodeString)+md5(AppKey))+AppKey)
```
## Log
```
2022.04.19 建立人员信息相关数据模型

115
api/empower/authorize/empower.go

@ -0,0 +1,115 @@
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, userErr, c)
return
}
//获取随机数
randCode := strconv.FormatInt(overallhandle.TableNumber(), 10)
//头文件加密
//ContentType
var ContentTypeMd5 overallhandle.Md5Encryption
if empowerUser.VerificationCode != "" {
ContentTypeMd5.AppKey = empowerUser.VerificationCode
}
ContentTypeMd5.Md5EncryptionInit(ContentType)
ContentTypeMd5Str := ContentTypeMd5.Md5EncryptionAlgorithm()
//Origin
var OriginMd5 overallhandle.Md5Encryption
if empowerUser.VerificationCode != "" {
OriginMd5.AppKey = empowerUser.VerificationCode
}
OriginMd5.Md5EncryptionInit(Origin)
originMd5Str := OriginMd5.Md5EncryptionAlgorithm()
//userAgent
var userAgentMd5 overallhandle.Md5Encryption
if empowerUser.VerificationCode != "" {
userAgentMd5.AppKey = empowerUser.VerificationCode
}
userAgentMd5.Md5EncryptionInit(userAgent)
userAgentMd5Str := userAgentMd5.Md5EncryptionAlgorithm()
//随机数加密
var randomNumberMd5 overallhandle.Md5Encryption
if empowerUser.VerificationCode != "" {
randomNumberMd5.AppKey = empowerUser.VerificationCode
}
randomNumberMd5.Md5EncryptionInit(randCode)
numberMd5 := randomNumberMd5.Md5EncryptionAlgorithm()
//用户名加密
var userKeyMd5 overallhandle.Md5Encryption
if empowerUser.VerificationCode != "" {
userKeyMd5.AppKey = empowerUser.VerificationCode
}
userKeyMd5.Md5EncryptionInit(requestData.UserNumber)
userKeyMd5Str := userKeyMd5.Md5EncryptionAlgorithm()
clearCodeToken := fmt.Sprintf("%v-%v-%v-%v-%v-%v", ContentTypeMd5Str, originMd5Str, userAgentMd5Str, numberMd5, userKeyMd5Str, passwordMd5Str)
fmt.Printf("redisKey---->%v-%v-%v-%v-%v-%v", ContentTypeMd5Str, originMd5Str, userAgentMd5Str, numberMd5, userKeyMd5Str, passwordMd5Str)
//token 加密
var tokenMd5 overallhandle.Md5Encryption
tokenMd5.Md5EncryptionInit(clearCodeToken)
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)
}

35
api/empower/authorize/type.go

@ -0,0 +1,35 @@
package authorize
import (
"hr_server/overall/overallhandle"
"github.com/gin-gonic/gin"
)
type EmpowerApi struct{}
//入口
func (e *EmpowerApi) Index(c *gin.Context) {
outputCont := overallhandle.MapOut()
outputCont["index"] = "组织管理入口"
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)

629
api/jindie_docking/dockingorganization/controller.go

@ -0,0 +1,629 @@
package dockingorganization
import (
"encoding/json"
"fmt"
"hr_server/models"
"hr_server/overall"
"hr_server/overall/overallhandle"
"time"
"github.com/gin-gonic/gin"
)
//接口实验
func (d *DockingJinDieApi) DockKingdeeApi(c *gin.Context) {
// GetOrgType()
// JobClass()
// DutiesContrast()
// OrgAdmin()
Position()
outMap := overallhandle.MapOut()
overallhandle.Result(0, outMap, c)
}
//行政组织类型
func GetOrgType() {
var orgContAry []orgClass
sendUrl := fmt.Sprintf("%v/person/adminUnitType", overall.DockingKingdeeUrl)
respBody, err := GetUrl(sendUrl)
if err != nil {
overallhandle.WriteLog("e", "未能获取到行政组织类型!", err)
}
err = json.Unmarshal(respBody, &orgContAry)
if err != nil {
overallhandle.WriteLog("e", "行政组织类型映射错误!", err)
}
overallhandle.WriteLog("i", orgContAry)
if len(orgContAry) < 0 {
overallhandle.WriteLog("e", "未能获取到行政组织类型!", orgContAry)
return
}
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)
}
err = json.Unmarshal(respBody, &jobClassInfo)
if err != nil {
overallhandle.WriteLog("e", "职务类型映射错误!", err)
}
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)
}
err = json.Unmarshal(respBody, &jobInfo)
if err != nil {
overallhandle.WriteLog("e", "职务映射错误!", err)
}
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)
}
err = json.Unmarshal(respBody, &orgInfo)
if err != nil {
overallhandle.WriteLog("e", "职务映射错误!", err)
}
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
}
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()
parentContCorre.EiteCont(map[string]interface{}{"id": parentContCorre.Id}, 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)
}
err = json.Unmarshal(respBody, &orgInfo)
if err != nil {
overallhandle.WriteLog("e", "职位映射错误!", err)
}
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)
}
//判断该项是否存在
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
}
//获取行政组织
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
if orgOldErr == nil {
positCont.PersonInCharge = orgOldCont.PersonInCharge
positCont.School = orgOldCont.School
}
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
}

53
api/jindie_docking/dockingorganization/type.go

@ -0,0 +1,53 @@
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"`
}

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)

18
api/version1/administrativeorganization/position.go

@ -332,9 +332,9 @@ func (o *OrganizationApi) EitePositionStateOrDel(c *gin.Context) {
//获取职位权限配置清单
func (o *OrganizationApi) GetPositionRole(c *gin.Context) {
var requestData overallhandle.GetId
err := c.ShouldBindJSON(requestData)
err := c.ShouldBindJSON(&requestData)
if err != nil {
overallhandle.Result(100, err, c)
overallhandle.Result(100, requestData, c)
return
}
if requestData.Id == 0 && requestData.IdStr == "" {
@ -350,7 +350,7 @@ func (o *OrganizationApi) GetPositionRole(c *gin.Context) {
where := overallhandle.MapOut()
var positionRole models.Position
where["id"] = requestData.Id
inFoErr := positionRole.GetCont(positionRole, "menu_permit", "button_permit")
inFoErr := positionRole.GetCont(where, "menu_permit", "button_permit")
if inFoErr != nil {
overallhandle.Result(105, requestData, c)
return
@ -362,8 +362,8 @@ func (o *OrganizationApi) GetPositionRole(c *gin.Context) {
//遍历确权
func GetMenuOperation(menuStr, menuOperStr string) (isTrue bool, sendData []powerConfigList) {
isTrue = false
var menuStrMap []string
var menuOperStrMap []string
var menuStrMap []int64
var menuOperStrMap []int64
json.Unmarshal([]byte(menuStr), &menuStrMap)
json.Unmarshal([]byte(menuOperStr), &menuOperStrMap)
@ -373,13 +373,13 @@ func GetMenuOperation(menuStr, menuOperStr string) (isTrue bool, sendData []powe
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 []string) []powerConfigList {
func GetMenuPowerThree(jurisd int, parentId int64, threeData []models.SystemMenu, menuStrMap, menuOperStrMap []int64) []powerConfigList {
// treeList := []SystemMenuThree{}
treeListPower := []powerConfigList{}
for _, v := range threeData {
@ -387,7 +387,7 @@ func GetMenuPowerThree(jurisd int, parentId int64, threeData []models.SystemMenu
var powerConfigCont powerConfigList
powerConfigCont.Id = v.Id
powerConfigCont.Title = v.Title
powerConfigCont.IsTrue = overallhandle.JudeInArray(v.Id, menuStrMap)
powerConfigCont.IsTrue = overallhandle.JudgeInMap(v.Id, menuStrMap)
child := GetMenuPowerThree(jurisd, v.Id, threeData, menuStrMap, menuOperStrMap)
powerConfigCont.Child = child
isTrue, menuOper := MenuOperation(jurisd, v.Id)
@ -397,7 +397,7 @@ func GetMenuPowerThree(jurisd int, parentId int64, threeData []models.SystemMenu
var operCont powerCont
operCont.Id = oper_val.OperId
operCont.Title = oper_val.OperTitle
operCont.IsTrue = overallhandle.JudeInArray(oper_val.OperId, menuOperStrMap)
operCont.IsTrue = overallhandle.JudgeInMap(oper_val.OperId, menuOperStrMap)
operList = append(operList, operCont)
}
powerConfigCont.MenuOperation = operList

8
api/version1/personnelapi/staff.go

@ -54,7 +54,7 @@ func (s *StaffApi) StaffList(c *gin.Context) {
if requestData.Role != "" {
gormDb = gormDb.Where("FIND_IN_SET(?,p.`role`)", requestData.Role)
}
gormDb = gormDb.Where("p.state = 1")
var total int64
totalErr := gormDb.Count(&total).Error
if totalErr != nil {
@ -64,6 +64,9 @@ func (s *StaffApi) StaffList(c *gin.Context) {
errGorm := gormDb.Order("p.company ASC,p.deparment ASC,p.admin_org ASC,p.position ASC").Limit(requestData.PageSize).Offset(overallhandle.LimitPage(requestData.Page, requestData.PageSize)).Find(&positionAry).Error
fmt.Printf("%v\n", positionAry)
for i, v := range positionAry {
positionAry[i].KeyStr = strconv.FormatInt(positionAry[i].Key, 10)
var getSpur models.Position
getWhe := overallhandle.MapOut()
getWhe["id"] = v.Position
@ -80,7 +83,8 @@ func (s *StaffApi) StaffList(c *gin.Context) {
departmentAry := strings.Split(v.Deparment, ",")
if len(departmentAry) > 0 {
var departCont []getDepartmentInfo
departErr := overall.CONSTANT_DB_HR.Model(&models.AdministrativeOrganization{}).Select("id,number,name").Where("`id` IN ?", departmentAry).Order("`organization_type` ASC").Find(&departCont)
departErr := overall.CONSTANT_DB_HR.Model(&models.AdministrativeOrganization{}).Select("id,number,name").Where("`id` IN ?", departmentAry).Order("`organization_type` ASC").Find(&departCont).Error
if departErr == nil {
var departNameAry []string
for _, d_v := range departCont {

1
api/version1/personnelapi/type.go

@ -48,6 +48,7 @@ type peopleOutList struct {
CompanyName string `json:"companyname"` //公司名称
DeparmentName string `json:"deparmentname"` //部门名称
PositionName string `json:"positionname"` //职位
KeyStr string `json:"keystr"` //职位
}
//获取部门细腻些

8
api/version1/shiyan/shiyan.go

@ -284,3 +284,11 @@ func getJobInfo(jobId int64) (cont jobAttber, err 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)
overallhandle.Result(0, shituList, c)
}

14
api/version1/shiyan/type.go

@ -62,3 +62,17 @@ type jobAttber struct {
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{}

4
apirouter/inlet.go

@ -1,6 +1,8 @@
package apirouter
import (
"hr_server/apirouter/dockingjindie"
"hr_server/apirouter/empowerrote"
"hr_server/apirouter/organization"
"hr_server/apirouter/permit"
"hr_server/apirouter/personnel"
@ -14,6 +16,8 @@ type RouterGroup struct {
PermitPowerApi permit.PermitPower //权限相关操作
PersonnelRoute personnel.PersonnelRoute //人员管理
ShiyanApiRRouter shiyanrouter.ShiyanApiRouter
EmpowerApiRouter empowerrote.EmpowerApiRouter
KingdeeApiRouter dockingjindie.DockingJindieApiRouter
}
var RouterGroupInlet = new(RouterGroup)

1
apirouter/organization/organization_group.go

@ -45,5 +45,6 @@ func (o *OrganizationRoute) InitRouterGroup(route *gin.RouterGroup) {
apiRouter.POST("addpositioncont", apiHandle.AddPositionCont) //添加职位(岗位)
apiRouter.POST("eitepositioncont", apiHandle.EitePositionCont) //编辑职位(岗位)
apiRouter.POST("eitepositionstateordel", apiHandle.EitePositionStateOrDel) //编辑职位(岗位)状态或删除
apiRouter.POST("getpositionrole", apiHandle.GetPositionRole) //岗位(职位)配权 GetPositionRole
}
}

1
apirouter/permit/permit.go

@ -15,5 +15,6 @@ func (p *PermitPower) InitRouterGroup(route *gin.RouterGroup) {
apiRouter.POST("", apiHandle.Index) //入口
apiRouter.POST("permitlist", apiHandle.PermitPowerList) //权限列表
apiRouter.POST("positionallotment", apiHandle.PositionAllotment) //岗位(职位)配权 GetPositionRole
}
}

1
apirouter/shiyanrouter/shiyan.go

@ -15,5 +15,6 @@ func (p *ShiyanApiRouter) InitRouterGroup(route *gin.RouterGroup) {
apiRouter.POST("", apiHandle.Index) //入口
apiRouter.POST("shiyan", apiHandle.ShiyanCont) //人员列表
apiRouter.POST("personnelmigration", apiHandle.PersonnelMigration) //人员迁移
apiRouter.POST("shitu", apiHandle.Shitu)
}
}

5
config/configApp/appConfig.yaml

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

7
config/configApp/server.go

@ -3,6 +3,7 @@ package configApp
//服务基础配置
type Server struct {
Appsetup appsetup `mapstructure:"appsetup" json:"appsetup" yaml:"appsetup"`
Logsetup logsetup `mapstructure:"logconfig" json:"logconfig" yaml:"logconfig"`
}
//服务配置详情
@ -12,4 +13,10 @@ type appsetup struct {
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"`
}

1
config/configDatabase/database.go

@ -13,6 +13,7 @@ type MysqlSetUp struct {
//其他数据库依次添加
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' #数据库编码方式

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 {

7
config_server/configApp/appConfig.yaml

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

9
config_server/configApp/server.go

@ -3,6 +3,7 @@ package configApp
//服务基础配置
type Server struct {
Appsetup appsetup `mapstructure:"appsetup" json:"appsetup" yaml:"appsetup"`
Logsetup logsetup `mapstructure:"logconfig" json:"logconfig" yaml:"logconfig"`
}
//服务配置详情
@ -10,4 +11,12 @@ 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"`
}

6
config_server/configDatabase/database.yaml

@ -9,7 +9,7 @@ master:
loc: 'Local' #时区
name: 'hengxingaoke_tes' #数据库名称
username: 'hengxingaoke_tes' #数据库用户民
password: 'JsTt6iTpkZ85wDnF' #数据库密码
password: 'rjwi58B6zYCHMbGZ' #数据库密码
max_idle_conns: 100 #最大空闲数量
max_open_conns: 1500 #最大打开数量
gorm_log: false #是否开启gorm日志
@ -22,7 +22,7 @@ wechat:
loc: 'Local' #时区
name: 'wechatuser' #数据库名称
username: 'wechatuser' #数据库用户民
password: '8jrFG2AzpJPxs88m' #数据库密码
password: 'ESEYc527J5AAdfka' #数据库密码
max_idle_conns: 100 #最大空闲数量
max_open_conns: 1500 #最大打开数量
gorm_log: false #是否开启gorm日志
@ -35,7 +35,7 @@ hrdatabase:
loc: 'Local' #时区
name: 'human_resources' #数据库名称
username: 'human_resources' #数据库用户民
password: 'hn4FaeBtePdnw2K6' #数据库密码
password: 'Pinw2dyLNfemtp3z' #数据库密码
max_idle_conns: 100 #最大空闲数量
max_open_conns: 1500 #最大打开数量
gorm_log: true #是否开启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":[]
}

4
config_server/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 {

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

4
go.sum

@ -81,6 +81,10 @@ 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.0 h1:kQ6Cb7aHOHTSzNVNEhmp8EcWKLb4CbiMW9h9VyIhO4E=
github.com/robfig/cron/v3 v3.0.0/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro=
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.

128
identification/authentication.go

@ -0,0 +1,128 @@
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 == "" || Origin == "" || 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 {
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
if empowerUser.VerificationCode != "" {
ContentTypeMd5.AppKey = empowerUser.VerificationCode
}
ContentTypeMd5.Md5EncryptionInit(ContentType)
ContentTypeMd5Str := ContentTypeMd5.Md5EncryptionAlgorithm()
//Origin
var OriginMd5 overallhandle.Md5Encryption
if empowerUser.VerificationCode != "" {
OriginMd5.AppKey = empowerUser.VerificationCode
}
OriginMd5.Md5EncryptionInit(Origin)
originMd5Str := OriginMd5.Md5EncryptionAlgorithm()
//userAgent
var userAgentMd5 overallhandle.Md5Encryption
if empowerUser.VerificationCode != "" {
userAgentMd5.AppKey = empowerUser.VerificationCode
}
userAgentMd5.Md5EncryptionInit(userAgent)
userAgentMd5Str := userAgentMd5.Md5EncryptionAlgorithm()
//随机数加密
var randomNumberMd5 overallhandle.Md5Encryption
if empowerUser.VerificationCode != "" {
randomNumberMd5.AppKey = empowerUser.VerificationCode
}
randomNumberMd5.Md5EncryptionInit(validator.Number)
numberMd5 := randomNumberMd5.Md5EncryptionAlgorithm()
//用户名加密
var userKeyMd5 overallhandle.Md5Encryption
if empowerUser.VerificationCode != "" {
userKeyMd5.AppKey = empowerUser.VerificationCode
}
userKeyMd5.Md5EncryptionInit(validator.UserKey)
userKeyMd5Str := userKeyMd5.Md5EncryptionAlgorithm()
clearCodeToken := fmt.Sprintf("%v-%v-%v-%v-%v-%v", ContentTypeMd5Str, originMd5Str, userAgentMd5Str, numberMd5, userKeyMd5Str, passWordMd5Str)
//token 加密
var tokenMd5 overallhandle.Md5Encryption
tokenMd5.Md5EncryptionInit(clearCodeToken)
tokenMd5Str := tokenMd5.Md5EncryptionAlgorithm()
clearTokenStr := fmt.Sprintf("%v-%v", tokenMd5Str, numberMd5)
var clearTokenMd5 overallhandle.Md5Encryption
clearTokenMd5.Md5EncryptionInit(clearTokenStr)
clearTokenMd5Str := clearTokenMd5.Md5EncryptionAlgorithm()
//提交Token转化
submitTokenStr := fmt.Sprintf("%v-%v", userToken, randomNumber)
var submitTokenMd5 overallhandle.Md5Encryption
submitTokenMd5.Md5EncryptionInit(submitTokenStr)
submitTokenMd5Str := submitTokenMd5.Md5EncryptionAlgorithm()
if submitTokenMd5Str != clearTokenMd5Str {
overallhandle.Result(2004, "对不起!非法令牌!不可访问系统", 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,26 +24,38 @@ func InitialRouter() *gin.Engine {
c.JSON(0, "通讯成功!")
})
}
//人员档案
shhiyanApi := apirouter.RouterGroupInlet.ShiyanApiRRouter
{
shhiyanApi.InitRouterGroup(appLoadRouterGroup)
}
//注册路由
//定义路由实例
//获取验证信息
empowerApi := apirouter.RouterGroupInlet.EmpowerApiRouter
//实验
shhiyanApi := apirouter.RouterGroupInlet.ShiyanApiRRouter
//组织架构
organizationApi := apirouter.RouterGroupInlet.OrganizationApi //组织架构
{
organizationApi.InitRouterGroup(appLoadRouterGroup)
}
//权限相关操作
permitPowerApi := apirouter.RouterGroupInlet.PermitPowerApi
{
permitPowerApi.InitRouterGroup(appLoadRouterGroup)
}
//人员档案
staffApi := apirouter.RouterGroupInlet.PersonnelRoute
//金蝶对接接口
jinDieDockingApi := apirouter.RouterGroupInlet.KingdeeApiRouter
{
staffApi.InitRouterGroup(appLoadRouterGroup)
empowerApi.InitRouterGroup(appLoadRouterGroup) //获取token
organizationApi.InitRouterGroup(appLoadRouterGroup) //组织架构
jinDieDockingApi.InitRouterGroup(appLoadRouterGroup) //金蝶对接接口
}
//身份验证
Authentication := router.Group("")
Authentication.Use(identification.Validator()).Use(identification.Interceptor())
{
shhiyanApi.InitRouterGroup(Authentication) //实验
permitPowerApi.InitRouterGroup(Authentication) //权限相关操作
staffApi.InitRouterGroup(Authentication) //人员档案
}
return router
}

149
log/202206/20220602.log

@ -0,0 +1,149 @@
[Info] 2022/06/02 15:40:59 [[{{ArIAAAAERv73eoRQ 高管} } {{ArIAAAAERwP3eoRQ 中层正职} } {{ArIAAAAERwb3eoRQ 中层副职} } {{ArIAAAAERwn3eoRQ 中层助理} } {{ArIAAAAERwz3eoRQ 基层管理} } {{ArIAAAAERw/3eoRQ 执行人员} } {{ArIAAAAERxL3eoRQ 临时工} } {{ArIAAAAER/X3eoRQ 测试} }]]
[Add] 2022/06/02 15:40:59 [职务类型写入成功! <nil> {1 高管 1654155659 1 ArIAAAAERv73eoRQ }]
[Add] 2022/06/02 15:40:59 [职务类型写入成功! <nil> {2 中层正职 1654155659 1 ArIAAAAERwP3eoRQ }]
[Add] 2022/06/02 15:40:59 [职务类型写入成功! <nil> {3 中层副职 1654155659 1 ArIAAAAERwb3eoRQ }]
[Add] 2022/06/02 15:40:59 [职务类型写入成功! <nil> {4 中层助理 1654155659 1 ArIAAAAERwn3eoRQ }]
[Add] 2022/06/02 15:40:59 [职务类型写入成功! <nil> {5 基层管理 1654155659 1 ArIAAAAERwz3eoRQ }]
[Add] 2022/06/02 15:40:59 [职务类型写入成功! <nil> {6 执行人员 1654155659 1 ArIAAAAERw/3eoRQ }]
[Add] 2022/06/02 15:40:59 [职务类型写入成功! <nil> {7 临时工 1654155659 1 ArIAAAAERxL3eoRQ }]
[Add] 2022/06/02 15:40:59 [职务类型写入成功! <nil> {8 测试 1654155659 1 ArIAAAAER/X3eoRQ }]
[Info] 2022/06/02 15:41:39 [[{{ArIAAAAERv73eoRQ 高管} } {{ArIAAAAERwP3eoRQ 中层正职} } {{ArIAAAAERwb3eoRQ 中层副职} } {{ArIAAAAERwn3eoRQ 中层助理} } {{ArIAAAAERwz3eoRQ 基层管理} } {{ArIAAAAERw/3eoRQ 执行人员} } {{ArIAAAAERxL3eoRQ 临时工} } {{ArIAAAAER/X3eoRQ 测试} }]]
[Info] 2022/06/02 16:21:53 [[{{{ArIAAAAEOuW4hF0d 生产操作工} 56} ArIAAAAERw/3eoRQ} {{{ArIAAAAEOt+4hF0d 仪表工} 54} ArIAAAAERw/3eoRQ} {{{ArIAAAAEOuK4hF0d 临时工} 55} ArIAAAAERxL3eoRQ} {{{ArIAAAAEOui4hF0d 组长} 57} ArIAAAAERw/3eoRQ} {{{ArIAAAAEOuu4hF0d 技工} 58} ArIAAAAERw/3eoRQ} {{{ArIAAAAEOu64hF0d 保卫班长} 59} ArIAAAAERwz3eoRQ} {{{ArIAAAAEOvG4hF0d 帮厨} 60} ArIAAAAERw/3eoRQ} {{{ArIAAAAEOvS4hF0d 保洁员} 61} ArIAAAAERw/3eoRQ} {{{ArIAAAAEOve4hF0d 业务员} 62} ArIAAAAERw/3eoRQ} {{{ArIAAAAEOvq4hF0d 技术员助理} 63} ArIAAAAERw/3eoRQ} {{{ArIAAAAEOjq4hF0d 董事长} 001} ArIAAAAERv73eoRQ} {{{ArIAAAAEOj24hF0d 副董事长} 002} ArIAAAAERv73eoRQ} {{{ArIAAAAEOkC4hF0d 总经理} 01} ArIAAAAERv73eoRQ} {{{ArIAAAAEOkO4hF0d 第一副总经理} 02} ArIAAAAERv73eoRQ} {{{ArIAAAAEOka4hF0d 常务副总经理} 03} ArIAAAAERv73eoRQ} {{{ArIAAAAEOkm4hF0d 副总经理} 04} ArIAAAAERv73eoRQ} {{{ArIAAAAEOky4hF0d 总工程师} 05} ArIAAAAERv73eoRQ} {{{ArIAAAAEOk+4hF0d 总经济师} 06} ArIAAAAERv73eoRQ} {{{ArIAAAAEOlK4hF0d 财务总监} 07} ArIAAAAERv73eoRQ} {{{ArIAAAAEOlW4hF0d 总经理助理} 08} ArIAAAAERwP3eoRQ} {{{ArIAAAAEOli4hF0d 副总工程师} 09} ArIAAAAERwP3eoRQ} {{{ArIAAAAEOlu4hF0d 厂长} 10} ArIAAAAERwP3eoRQ} {{{ArIAAAAEOl64hF0d 部长} 11} ArIAAAAERwP3eoRQ} {{{ArIAAAAEOmG4hF0d 主任} 12} ArIAAAAERwP3eoRQ} {{{ArIAAAAEOmS4hF0d 副厂长} 13} ArIAAAAERwb3eoRQ} {{{ArIAAAAEOme4hF0d 副部长} 14} ArIAAAAERwb3eoRQ} {{{ArIAAAAEOmq4hF0d 副主任} 15} ArIAAAAERwb3eoRQ} {{{ArIAAAAEOm24hF0d 厂长助理} 16} ArIAAAAERwn3eoRQ} {{{ArIAAAAEOnC4hF0d 部长助理} 17} ArIAAAAERwn3eoRQ} {{{ArIAAAAEOnO4hF0d 主任助理} 18} ArIAAAAERwn3eoRQ} {{{ArIAAAAEOna4hF0d 主管工程师} 19} ArIAAAAERwn3eoRQ} {{{ArIAAAAEOnm4hF0d 车间主任} 20} ArIAAAAERwn3eoRQ} {{{ArIAAAAEOny4hF0d 车间副主任} 21} ArIAAAAERwn3eoRQ} {{{ArIAAAAEOn+4hF0d 科长} 22} ArIAAAAERwz3eoRQ} {{{ArIAAAAEOoK4hF0d 炉长} 23} ArIAAAAERwz3eoRQ} {{{ArIAAAAEOoW4hF0d 主管} 24} ArIAAAAERwz3eoRQ} {{{ArIAAAAEOoi4hF0d 三大员} 25} ArIAAAAERwz3eoRQ} {{{ArIAAAAEOou4hF0d 值长} 26} ArIAAAAERwz3eoRQ} {{{ArIAAAAEOo64hF0d 副值长} 27} ArIAAAAERwz3eoRQ} {{{ArIAAAAEOpG4hF0d 工段长} 28} ArIAAAAERwz3eoRQ} {{{ArIAAAAEOpS4hF0d 班长} 29} ArIAAAAERwz3eoRQ} {{{ArIAAAAEOpe4hF0d 副班长} 30} ArIAAAAERwz3eoRQ} {{{ArIAAAAEOpq4hF0d 车队队长} 31} ArIAAAAERwz3eoRQ} {{{ArIAAAAEOp24hF0d 车队副队长} 32} ArIAAAAERwz3eoRQ} {{{ArIAAAAEOqC4hF0d 车队副班长} 33} ArIAAAAERwz3eoRQ} {{{ArIAAAAEOqO4hF0d 保卫队长} 34} ArIAAAAERwz3eoRQ} {{{ArIAAAAEOqa4hF0d 保卫副队长} 35} ArIAAAAERwz3eoRQ} {{{ArIAAAAEOqm4hF0d 专工} 36} ArIAAAAERwz3eoRQ} {{{ArIAAAAEOqy4hF0d 技术人员} 37} ArIAAAAERwz3eoRQ} {{{ArIAAAAEOq+4hF0d 技师} 38} ArIAAAAERw/3eoRQ} {{{ArIAAAAEOrK4hF0d 维修工} 39} ArIAAAAERw/3eoRQ} {{{ArIAAAAEOrW4hF0d 科员} 40} ArIAAAAERw/3eoRQ} {{{ArIAAAAEOri4hF0d 队员} 41} ArIAAAAERw/3eoRQ} {{{ArIAAAAEOru4hF0d 小车司机} 42} ArIAAAAERw/3eoRQ} {{{ArIAAAAEOr64hF0d 厨师} 43} ArIAAAAERw/3eoRQ} {{{ArIAAAAEOsG4hF0d 面点师} 44} ArIAAAAERw/3eoRQ} {{{ArIAAAAEOsS4hF0d 服务员} 45} ArIAAAAERw/3eoRQ} {{{ArIAAAAEOse4hF0d 主操} 46} ArIAAAAERw/3eoRQ} {{{ArIAAAAEOsq4hF0d 副操} 47} ArIAAAAERw/3eoRQ} {{{ArIAAAAEOs24hF0d 工程车司机} 48} ArIAAAAERw/3eoRQ} {{{ArIAAAAEOtC4hF0d 管理员} 49} ArIAAAAERw/3eoRQ} {{{ArIAAAAEOtO4hF0d 电工} 50} ArIAAAAERw/3eoRQ} {{{ArIAAAAEOta4hF0d 化验员} 51} ArIAAAAERw/3eoRQ} {{{ArIAAAAEOtm4hF0d 计量员} 52} ArIAAAAERw/3eoRQ} {{{ArIAAAAEOty4hF0d 采样工} 53} ArIAAAAERw/3eoRQ}]]
[Info] 2022/06/02 16:25:52 [[{{{ArIAAAAEOuW4hF0d 生产操作工} 56} ArIAAAAERw/3eoRQ} {{{ArIAAAAEOt+4hF0d 仪表工} 54} ArIAAAAERw/3eoRQ} {{{ArIAAAAEOuK4hF0d 临时工} 55} ArIAAAAERxL3eoRQ} {{{ArIAAAAEOui4hF0d 组长} 57} ArIAAAAERw/3eoRQ} {{{ArIAAAAEOuu4hF0d 技工} 58} ArIAAAAERw/3eoRQ} {{{ArIAAAAEOu64hF0d 保卫班长} 59} ArIAAAAERwz3eoRQ} {{{ArIAAAAEOvG4hF0d 帮厨} 60} ArIAAAAERw/3eoRQ} {{{ArIAAAAEOvS4hF0d 保洁员} 61} ArIAAAAERw/3eoRQ} {{{ArIAAAAEOve4hF0d 业务员} 62} ArIAAAAERw/3eoRQ} {{{ArIAAAAEOvq4hF0d 技术员助理} 63} ArIAAAAERw/3eoRQ} {{{ArIAAAAEOjq4hF0d 董事长} 001} ArIAAAAERv73eoRQ} {{{ArIAAAAEOj24hF0d 副董事长} 002} ArIAAAAERv73eoRQ} {{{ArIAAAAEOkC4hF0d 总经理} 01} ArIAAAAERv73eoRQ} {{{ArIAAAAEOkO4hF0d 第一副总经理} 02} ArIAAAAERv73eoRQ} {{{ArIAAAAEOka4hF0d 常务副总经理} 03} ArIAAAAERv73eoRQ} {{{ArIAAAAEOkm4hF0d 副总经理} 04} ArIAAAAERv73eoRQ} {{{ArIAAAAEOky4hF0d 总工程师} 05} ArIAAAAERv73eoRQ} {{{ArIAAAAEOk+4hF0d 总经济师} 06} ArIAAAAERv73eoRQ} {{{ArIAAAAEOlK4hF0d 财务总监} 07} ArIAAAAERv73eoRQ} {{{ArIAAAAEOlW4hF0d 总经理助理} 08} ArIAAAAERwP3eoRQ} {{{ArIAAAAEOli4hF0d 副总工程师} 09} ArIAAAAERwP3eoRQ} {{{ArIAAAAEOlu4hF0d 厂长} 10} ArIAAAAERwP3eoRQ} {{{ArIAAAAEOl64hF0d 部长} 11} ArIAAAAERwP3eoRQ} {{{ArIAAAAEOmG4hF0d 主任} 12} ArIAAAAERwP3eoRQ} {{{ArIAAAAEOmS4hF0d 副厂长} 13} ArIAAAAERwb3eoRQ} {{{ArIAAAAEOme4hF0d 副部长} 14} ArIAAAAERwb3eoRQ} {{{ArIAAAAEOmq4hF0d 副主任} 15} ArIAAAAERwb3eoRQ} {{{ArIAAAAEOm24hF0d 厂长助理} 16} ArIAAAAERwn3eoRQ} {{{ArIAAAAEOnC4hF0d 部长助理} 17} ArIAAAAERwn3eoRQ} {{{ArIAAAAEOnO4hF0d 主任助理} 18} ArIAAAAERwn3eoRQ} {{{ArIAAAAEOna4hF0d 主管工程师} 19} ArIAAAAERwn3eoRQ} {{{ArIAAAAEOnm4hF0d 车间主任} 20} ArIAAAAERwn3eoRQ} {{{ArIAAAAEOny4hF0d 车间副主任} 21} ArIAAAAERwn3eoRQ} {{{ArIAAAAEOn+4hF0d 科长} 22} ArIAAAAERwz3eoRQ} {{{ArIAAAAEOoK4hF0d 炉长} 23} ArIAAAAERwz3eoRQ} {{{ArIAAAAEOoW4hF0d 主管} 24} ArIAAAAERwz3eoRQ} {{{ArIAAAAEOoi4hF0d 三大员} 25} ArIAAAAERwz3eoRQ} {{{ArIAAAAEOou4hF0d 值长} 26} ArIAAAAERwz3eoRQ} {{{ArIAAAAEOo64hF0d 副值长} 27} ArIAAAAERwz3eoRQ} {{{ArIAAAAEOpG4hF0d 工段长} 28} ArIAAAAERwz3eoRQ} {{{ArIAAAAEOpS4hF0d 班长} 29} ArIAAAAERwz3eoRQ} {{{ArIAAAAEOpe4hF0d 副班长} 30} ArIAAAAERwz3eoRQ} {{{ArIAAAAEOpq4hF0d 车队队长} 31} ArIAAAAERwz3eoRQ} {{{ArIAAAAEOp24hF0d 车队副队长} 32} ArIAAAAERwz3eoRQ} {{{ArIAAAAEOqC4hF0d 车队副班长} 33} ArIAAAAERwz3eoRQ} {{{ArIAAAAEOqO4hF0d 保卫队长} 34} ArIAAAAERwz3eoRQ} {{{ArIAAAAEOqa4hF0d 保卫副队长} 35} ArIAAAAERwz3eoRQ} {{{ArIAAAAEOqm4hF0d 专工} 36} ArIAAAAERwz3eoRQ} {{{ArIAAAAEOqy4hF0d 技术人员} 37} ArIAAAAERwz3eoRQ} {{{ArIAAAAEOq+4hF0d 技师} 38} ArIAAAAERw/3eoRQ} {{{ArIAAAAEOrK4hF0d 维修工} 39} ArIAAAAERw/3eoRQ} {{{ArIAAAAEOrW4hF0d 科员} 40} ArIAAAAERw/3eoRQ} {{{ArIAAAAEOri4hF0d 队员} 41} ArIAAAAERw/3eoRQ} {{{ArIAAAAEOru4hF0d 小车司机} 42} ArIAAAAERw/3eoRQ} {{{ArIAAAAEOr64hF0d 厨师} 43} ArIAAAAERw/3eoRQ} {{{ArIAAAAEOsG4hF0d 面点师} 44} ArIAAAAERw/3eoRQ} {{{ArIAAAAEOsS4hF0d 服务员} 45} ArIAAAAERw/3eoRQ} {{{ArIAAAAEOse4hF0d 主操} 46} ArIAAAAERw/3eoRQ} {{{ArIAAAAEOsq4hF0d 副操} 47} ArIAAAAERw/3eoRQ} {{{ArIAAAAEOs24hF0d 工程车司机} 48} ArIAAAAERw/3eoRQ} {{{ArIAAAAEOtC4hF0d 管理员} 49} ArIAAAAERw/3eoRQ} {{{ArIAAAAEOtO4hF0d 电工} 50} ArIAAAAERw/3eoRQ} {{{ArIAAAAEOta4hF0d 化验员} 51} ArIAAAAERw/3eoRQ} {{{ArIAAAAEOtm4hF0d 计量员} 52} ArIAAAAERw/3eoRQ} {{{ArIAAAAEOty4hF0d 采样工} 53} ArIAAAAERw/3eoRQ}]]
[Add] 2022/06/02 16:25:52 [职务写入成功! <nil> {1 生产操作工 6 2 1654158352 ZW202204100003 1 ArIAAAAEOuW4hF0d 56}]
[Add] 2022/06/02 16:25:52 [职务写入成功! <nil> {2 仪表工 6 2 1654158352 ZW20220410002 1 ArIAAAAEOt+4hF0d 54}]
[Add] 2022/06/02 16:25:52 [职务写入成功! <nil> {3 临时工 7 1 1654158352 ZW202204110063 1 ArIAAAAEOuK4hF0d 55}]
[Add] 2022/06/02 16:25:52 [职务写入成功! <nil> {4 组长 6 2 1654158352 ZW202204100021 1 ArIAAAAEOui4hF0d 57}]
[Add] 2022/06/02 16:25:52 [职务写入成功! <nil> {5 技工 6 2 1654158352 ZW202204100002 1 ArIAAAAEOuu4hF0d 58}]
[Add] 2022/06/02 16:25:52 [职务写入成功! <nil> {6 保卫班长 5 3 1654158352 ZW202204100026 1 ArIAAAAEOu64hF0d 59}]
[Add] 2022/06/02 16:25:52 [职务写入成功! <nil> {7 帮厨 6 2 1654158352 ZW202204100022 1 ArIAAAAEOvG4hF0d 60}]
[Add] 2022/06/02 16:25:52 [职务写入成功! <nil> {8 保洁员 6 2 1654158352 ZW202204100023 1 ArIAAAAEOvS4hF0d 61}]
[Add] 2022/06/02 16:25:52 [职务写入成功! <nil> {9 业务员 6 2 1654158352 ZW202204100024 1 ArIAAAAEOve4hF0d 62}]
[Add] 2022/06/02 16:25:52 [职务写入成功! <nil> {10 技术员助理 6 2 1654158352 ZW202204100025 1 ArIAAAAEOvq4hF0d 63}]
[Add] 2022/06/02 16:25:52 [职务写入成功! <nil> {11 董事长 1 23 1654158352 ZW202204110062 1 ArIAAAAEOjq4hF0d 001}]
[Add] 2022/06/02 16:25:52 [职务写入成功! <nil> {12 副董事长 1 22 1654158352 ZW202204110061 1 ArIAAAAEOj24hF0d 002}]
[Add] 2022/06/02 16:25:52 [职务写入成功! <nil> {13 总经理 1 21 1654158352 ZW20220411006 1 ArIAAAAEOkC4hF0d 01}]
[Add] 2022/06/02 16:25:52 [职务写入成功! <nil> {14 第一副总经理 1 20 1654158352 ZW202204110059 1 ArIAAAAEOkO4hF0d 02}]
[Add] 2022/06/02 16:25:52 [职务写入成功! <nil> {15 常务副总经理 1 19 1654158352 ZW202204110058 1 ArIAAAAEOka4hF0d 03}]
[Add] 2022/06/02 16:25:52 [职务写入成功! <nil> {16 副总经理 1 18 1654158352 ZW202204110057 1 ArIAAAAEOkm4hF0d 04}]
[Add] 2022/06/02 16:25:52 [职务写入成功! <nil> {17 总工程师 1 17 1654158352 ZW202204110056 1 ArIAAAAEOky4hF0d 05}]
[Add] 2022/06/02 16:25:52 [职务写入成功! <nil> {18 总经济师 1 16 1654158352 ZW202204110055 1 ArIAAAAEOk+4hF0d 06}]
[Add] 2022/06/02 16:25:52 [职务写入成功! <nil> {19 财务总监 1 15 1654158352 ZW202204110054 1 ArIAAAAEOlK4hF0d 07}]
[Add] 2022/06/02 16:25:52 [职务写入成功! <nil> {20 总经理助理 2 14 1654158352 ZW202204110053 1 ArIAAAAEOlW4hF0d 08}]
[Add] 2022/06/02 16:25:52 [职务写入成功! <nil> {21 副总工程师 2 13 1654158352 ZW202204110052 1 ArIAAAAEOli4hF0d 09}]
[Add] 2022/06/02 16:25:52 [职务写入成功! <nil> {22 厂长 2 12 1654158352 ZW202204110051 1 ArIAAAAEOlu4hF0d 10}]
[Add] 2022/06/02 16:25:52 [职务写入成功! <nil> {23 部长 2 12 1654158352 ZW20220411005 1 ArIAAAAEOl64hF0d 11}]
[Add] 2022/06/02 16:25:52 [职务写入成功! <nil> {24 主任 2 12 1654158352 ZW202204110049 1 ArIAAAAEOmG4hF0d 12}]
[Add] 2022/06/02 16:25:52 [职务写入成功! <nil> {25 副厂长 3 11 1654158352 ZW202204110047 1 ArIAAAAEOmS4hF0d 13}]
[Add] 2022/06/02 16:25:52 [职务写入成功! <nil> {26 副部长 3 11 1654158352 ZW202204110046 1 ArIAAAAEOme4hF0d 14}]
[Add] 2022/06/02 16:25:52 [职务写入成功! <nil> {27 副主任 3 11 1654158352 ZW202204110045 1 ArIAAAAEOmq4hF0d 15}]
[Add] 2022/06/02 16:25:52 [职务写入成功! <nil> {28 厂长助理 4 10 1654158352 ZW202204110044 1 ArIAAAAEOm24hF0d 16}]
[Add] 2022/06/02 16:25:52 [职务写入成功! <nil> {29 部长助理 4 10 1654158352 ZW202204110043 1 ArIAAAAEOnC4hF0d 17}]
[Add] 2022/06/02 16:25:52 [职务写入成功! <nil> {30 主任助理 4 10 1654158352 ZW202204110042 1 ArIAAAAEOnO4hF0d 18}]
[Add] 2022/06/02 16:25:52 [职务写入成功! <nil> {31 主管工程师 4 10 1654158352 ZW202204110041 1 ArIAAAAEOna4hF0d 19}]
[Add] 2022/06/02 16:25:52 [职务写入成功! <nil> {32 车间主任 4 10 1654158352 ZW202204110048 1 ArIAAAAEOnm4hF0d 20}]
[Add] 2022/06/02 16:25:52 [职务写入成功! <nil> {33 车间副主任 4 10 1654158352 ZW20220411004 1 ArIAAAAEOny4hF0d 21}]
[Add] 2022/06/02 16:25:52 [职务写入成功! <nil> {34 科长 5 9 1654158352 ZW202204100039 1 ArIAAAAEOn+4hF0d 22}]
[Add] 2022/06/02 16:25:52 [职务写入成功! <nil> {35 炉长 5 4 1654158352 ZW202204100038 1 ArIAAAAEOoK4hF0d 23}]
[Add] 2022/06/02 16:25:52 [职务写入成功! <nil> {36 主管 5 8 1654158352 ZW202204100037 1 ArIAAAAEOoW4hF0d 24}]
[Add] 2022/06/02 16:25:52 [职务写入成功! <nil> {37 三大员 5 7 1654158352 ZW202204100036 1 ArIAAAAEOoi4hF0d 25}]
[Add] 2022/06/02 16:25:52 [职务写入成功! <nil> {38 值长 5 6 1654158352 ZW202204100035 1 ArIAAAAEOou4hF0d 26}]
[Add] 2022/06/02 16:25:52 [职务写入成功! <nil> {39 副值长 5 5 1654158352 ZW202204100034 1 ArIAAAAEOo64hF0d 27}]
[Add] 2022/06/02 16:25:52 [职务写入成功! <nil> {40 工段长 5 4 1654158352 ZW202204100033 1 ArIAAAAEOpG4hF0d 28}]
[Add] 2022/06/02 16:25:52 [职务写入成功! <nil> {41 班长 5 3 1654158352 ZW202204100032 1 ArIAAAAEOpS4hF0d 29}]
[Add] 2022/06/02 16:25:52 [职务写入成功! <nil> {42 副班长 5 3 1654158352 ZW202204100031 1 ArIAAAAEOpe4hF0d 30}]
[Add] 2022/06/02 16:25:52 [职务写入成功! <nil> {43 车队队长 5 3 1654158352 ZW20220410003 1 ArIAAAAEOpq4hF0d 31}]
[Add] 2022/06/02 16:25:52 [职务写入成功! <nil> {44 车队副队长 5 3 1654158352 ZW202204100029 1 ArIAAAAEOp24hF0d 32}]
[Add] 2022/06/02 16:25:52 [职务写入成功! <nil> {45 车队副班长 5 1 1654158352 1 ArIAAAAEOqC4hF0d 33}]
[Add] 2022/06/02 16:25:52 [职务写入成功! <nil> {46 保卫队长 5 3 1654158352 ZW202204100028 1 ArIAAAAEOqO4hF0d 34}]
[Add] 2022/06/02 16:25:52 [职务写入成功! <nil> {47 保卫副队长 5 3 1654158352 ZW202204100027 1 ArIAAAAEOqa4hF0d 35}]
[Add] 2022/06/02 16:25:52 [职务写入成功! <nil> {48 专工 5 6 1654158352 ZW202204190066 1 ArIAAAAEOqm4hF0d 36}]
[Add] 2022/06/02 16:25:52 [职务写入成功! <nil> {49 技术人员 5 6 1654158352 ZW202204190067 1 ArIAAAAEOqy4hF0d 37}]
[Add] 2022/06/02 16:25:52 [职务写入成功! <nil> {50 技师 6 2 1654158352 ZW202204100004 1 ArIAAAAEOq+4hF0d 38}]
[Add] 2022/06/02 16:25:52 [职务写入成功! <nil> {51 维修工 6 2 1654158352 ZW202204100005 1 ArIAAAAEOrK4hF0d 39}]
[Add] 2022/06/02 16:25:52 [职务写入成功! <nil> {52 科员 6 2 1654158352 ZW202204100006 1 ArIAAAAEOrW4hF0d 40}]
[Add] 2022/06/02 16:25:52 [职务写入成功! <nil> {53 队员 6 2 1654158352 ZW202204100007 1 ArIAAAAEOri4hF0d 41}]
[Add] 2022/06/02 16:25:52 [职务写入成功! <nil> {54 小车司机 6 2 1654158352 ZW202204100008 1 ArIAAAAEOru4hF0d 42}]
[Add] 2022/06/02 16:25:52 [职务写入成功! <nil> {55 厨师 6 2 1654158352 ZW202204100009 1 ArIAAAAEOr64hF0d 43}]
[Add] 2022/06/02 16:25:52 [职务写入成功! <nil> {56 面点师 6 2 1654158352 ZW20220410001 1 ArIAAAAEOsG4hF0d 44}]
[Add] 2022/06/02 16:25:52 [职务写入成功! <nil> {57 服务员 6 2 1654158352 ZW202204100011 1 ArIAAAAEOsS4hF0d 45}]
[Add] 2022/06/02 16:25:52 [职务写入成功! <nil> {58 主操 6 2 1654158352 ZW202204100012 1 ArIAAAAEOse4hF0d 46}]
[Add] 2022/06/02 16:25:52 [职务写入成功! <nil> {59 副操 6 2 1654158352 ZW202204100013 1 ArIAAAAEOsq4hF0d 47}]
[Add] 2022/06/02 16:25:52 [职务写入成功! <nil> {60 工程车司机 6 2 1654158352 ZW202204100014 1 ArIAAAAEOs24hF0d 48}]
[Add] 2022/06/02 16:25:52 [职务写入成功! <nil> {61 管理员 6 2 1654158352 ZW202204100015 1 ArIAAAAEOtC4hF0d 49}]
[Add] 2022/06/02 16:25:52 [职务写入成功! <nil> {62 电工 6 2 1654158352 ZW202204100016 1 ArIAAAAEOtO4hF0d 50}]
[Add] 2022/06/02 16:25:52 [职务写入成功! <nil> {63 化验员 6 2 1654158352 ZW202204100017 1 ArIAAAAEOta4hF0d 51}]
[Add] 2022/06/02 16:25:52 [职务写入成功! <nil> {64 计量员 6 2 1654158352 ZW202204100018 1 ArIAAAAEOtm4hF0d 52}]
[Add] 2022/06/02 16:25:52 [职务写入成功! <nil> {65 采样工 6 2 1654158352 ZW202204100019 1 ArIAAAAEOty4hF0d 53}]
[Info] 2022/06/02 16:28:33 [[{{{ArIAAAAEOuW4hF0d 生产操作工} 56} ArIAAAAERw/3eoRQ} {{{ArIAAAAEOt+4hF0d 仪表工} 54} ArIAAAAERw/3eoRQ} {{{ArIAAAAEOuK4hF0d 临时工} 55} ArIAAAAERxL3eoRQ} {{{ArIAAAAEOui4hF0d 组长} 57} ArIAAAAERw/3eoRQ} {{{ArIAAAAEOuu4hF0d 技工} 58} ArIAAAAERw/3eoRQ} {{{ArIAAAAEOu64hF0d 保卫班长} 59} ArIAAAAERwz3eoRQ} {{{ArIAAAAEOvG4hF0d 帮厨} 60} ArIAAAAERw/3eoRQ} {{{ArIAAAAEOvS4hF0d 保洁员} 61} ArIAAAAERw/3eoRQ} {{{ArIAAAAEOve4hF0d 业务员} 62} ArIAAAAERw/3eoRQ} {{{ArIAAAAEOvq4hF0d 技术员助理} 63} ArIAAAAERw/3eoRQ} {{{ArIAAAAEOjq4hF0d 董事长} 001} ArIAAAAERv73eoRQ} {{{ArIAAAAEOj24hF0d 副董事长} 002} ArIAAAAERv73eoRQ} {{{ArIAAAAEOkC4hF0d 总经理} 01} ArIAAAAERv73eoRQ} {{{ArIAAAAEOkO4hF0d 第一副总经理} 02} ArIAAAAERv73eoRQ} {{{ArIAAAAEOka4hF0d 常务副总经理} 03} ArIAAAAERv73eoRQ} {{{ArIAAAAEOkm4hF0d 副总经理} 04} ArIAAAAERv73eoRQ} {{{ArIAAAAEOky4hF0d 总工程师} 05} ArIAAAAERv73eoRQ} {{{ArIAAAAEOk+4hF0d 总经济师} 06} ArIAAAAERv73eoRQ} {{{ArIAAAAEOlK4hF0d 财务总监} 07} ArIAAAAERv73eoRQ} {{{ArIAAAAEOlW4hF0d 总经理助理} 08} ArIAAAAERwP3eoRQ} {{{ArIAAAAEOli4hF0d 副总工程师} 09} ArIAAAAERwP3eoRQ} {{{ArIAAAAEOlu4hF0d 厂长} 10} ArIAAAAERwP3eoRQ} {{{ArIAAAAEOl64hF0d 部长} 11} ArIAAAAERwP3eoRQ} {{{ArIAAAAEOmG4hF0d 主任} 12} ArIAAAAERwP3eoRQ} {{{ArIAAAAEOmS4hF0d 副厂长} 13} ArIAAAAERwb3eoRQ} {{{ArIAAAAEOme4hF0d 副部长} 14} ArIAAAAERwb3eoRQ} {{{ArIAAAAEOmq4hF0d 副主任} 15} ArIAAAAERwb3eoRQ} {{{ArIAAAAEOm24hF0d 厂长助理} 16} ArIAAAAERwn3eoRQ} {{{ArIAAAAEOnC4hF0d 部长助理} 17} ArIAAAAERwn3eoRQ} {{{ArIAAAAEOnO4hF0d 主任助理} 18} ArIAAAAERwn3eoRQ} {{{ArIAAAAEOna4hF0d 主管工程师} 19} ArIAAAAERwn3eoRQ} {{{ArIAAAAEOnm4hF0d 车间主任} 20} ArIAAAAERwn3eoRQ} {{{ArIAAAAEOny4hF0d 车间副主任} 21} ArIAAAAERwn3eoRQ} {{{ArIAAAAEOn+4hF0d 科长} 22} ArIAAAAERwz3eoRQ} {{{ArIAAAAEOoK4hF0d 炉长} 23} ArIAAAAERwz3eoRQ} {{{ArIAAAAEOoW4hF0d 主管} 24} ArIAAAAERwz3eoRQ} {{{ArIAAAAEOoi4hF0d 三大员} 25} ArIAAAAERwz3eoRQ} {{{ArIAAAAEOou4hF0d 值长} 26} ArIAAAAERwz3eoRQ} {{{ArIAAAAEOo64hF0d 副值长} 27} ArIAAAAERwz3eoRQ} {{{ArIAAAAEOpG4hF0d 工段长} 28} ArIAAAAERwz3eoRQ} {{{ArIAAAAEOpS4hF0d 班长} 29} ArIAAAAERwz3eoRQ} {{{ArIAAAAEOpe4hF0d 副班长} 30} ArIAAAAERwz3eoRQ} {{{ArIAAAAEOpq4hF0d 车队队长} 31} ArIAAAAERwz3eoRQ} {{{ArIAAAAEOp24hF0d 车队副队长} 32} ArIAAAAERwz3eoRQ} {{{ArIAAAAEOqC4hF0d 车队副班长} 33} ArIAAAAERwz3eoRQ} {{{ArIAAAAEOqO4hF0d 保卫队长} 34} ArIAAAAERwz3eoRQ} {{{ArIAAAAEOqa4hF0d 保卫副队长} 35} ArIAAAAERwz3eoRQ} {{{ArIAAAAEOqm4hF0d 专工} 36} ArIAAAAERwz3eoRQ} {{{ArIAAAAEOqy4hF0d 技术人员} 37} ArIAAAAERwz3eoRQ} {{{ArIAAAAEOq+4hF0d 技师} 38} ArIAAAAERw/3eoRQ} {{{ArIAAAAEOrK4hF0d 维修工} 39} ArIAAAAERw/3eoRQ} {{{ArIAAAAEOrW4hF0d 科员} 40} ArIAAAAERw/3eoRQ} {{{ArIAAAAEOri4hF0d 队员} 41} ArIAAAAERw/3eoRQ} {{{ArIAAAAEOru4hF0d 小车司机} 42} ArIAAAAERw/3eoRQ} {{{ArIAAAAEOr64hF0d 厨师} 43} ArIAAAAERw/3eoRQ} {{{ArIAAAAEOsG4hF0d 面点师} 44} ArIAAAAERw/3eoRQ} {{{ArIAAAAEOsS4hF0d 服务员} 45} ArIAAAAERw/3eoRQ} {{{ArIAAAAEOse4hF0d 主操} 46} ArIAAAAERw/3eoRQ} {{{ArIAAAAEOsq4hF0d 副操} 47} ArIAAAAERw/3eoRQ} {{{ArIAAAAEOs24hF0d 工程车司机} 48} ArIAAAAERw/3eoRQ} {{{ArIAAAAEOtC4hF0d 管理员} 49} ArIAAAAERw/3eoRQ} {{{ArIAAAAEOtO4hF0d 电工} 50} ArIAAAAERw/3eoRQ} {{{ArIAAAAEOta4hF0d 化验员} 51} ArIAAAAERw/3eoRQ} {{{ArIAAAAEOtm4hF0d 计量员} 52} ArIAAAAERw/3eoRQ} {{{ArIAAAAEOty4hF0d 采样工} 53} ArIAAAAERw/3eoRQ}]]
[Add] 2022/06/02 16:28:33 [职务写入成功! <nil> {66 生产操作工 6 1 1654158513 1 ArIAAAAEOuW4hF0d 56}]
[Edit] 2022/06/02 16:28:33 [职务更新成功! <nil> {{{ArIAAAAEOt+4hF0d 仪表工} 54} ArIAAAAERw/3eoRQ}]
[Edit] 2022/06/02 16:28:33 [职务更新成功! <nil> {{{ArIAAAAEOuK4hF0d 临时工} 55} ArIAAAAERxL3eoRQ}]
[Edit] 2022/06/02 16:28:33 [职务更新成功! <nil> {{{ArIAAAAEOui4hF0d 组长} 57} ArIAAAAERw/3eoRQ}]
[Edit] 2022/06/02 16:28:33 [职务更新成功! <nil> {{{ArIAAAAEOuu4hF0d 技工} 58} ArIAAAAERw/3eoRQ}]
[Edit] 2022/06/02 16:28:33 [职务更新成功! <nil> {{{ArIAAAAEOu64hF0d 保卫班长} 59} ArIAAAAERwz3eoRQ}]
[Edit] 2022/06/02 16:28:33 [职务更新成功! <nil> {{{ArIAAAAEOvG4hF0d 帮厨} 60} ArIAAAAERw/3eoRQ}]
[Edit] 2022/06/02 16:28:33 [职务更新成功! <nil> {{{ArIAAAAEOvS4hF0d 保洁员} 61} ArIAAAAERw/3eoRQ}]
[Edit] 2022/06/02 16:28:33 [职务更新成功! <nil> {{{ArIAAAAEOve4hF0d 业务员} 62} ArIAAAAERw/3eoRQ}]
[Edit] 2022/06/02 16:28:33 [职务更新成功! <nil> {{{ArIAAAAEOvq4hF0d 技术员助理} 63} ArIAAAAERw/3eoRQ}]
[Edit] 2022/06/02 16:28:33 [职务更新成功! <nil> {{{ArIAAAAEOjq4hF0d 董事长} 001} ArIAAAAERv73eoRQ}]
[Edit] 2022/06/02 16:28:33 [职务更新成功! <nil> {{{ArIAAAAEOj24hF0d 副董事长} 002} ArIAAAAERv73eoRQ}]
[Edit] 2022/06/02 16:28:33 [职务更新成功! <nil> {{{ArIAAAAEOkC4hF0d 总经理} 01} ArIAAAAERv73eoRQ}]
[Edit] 2022/06/02 16:28:33 [职务更新成功! <nil> {{{ArIAAAAEOkO4hF0d 第一副总经理} 02} ArIAAAAERv73eoRQ}]
[Edit] 2022/06/02 16:28:33 [职务更新成功! <nil> {{{ArIAAAAEOka4hF0d 常务副总经理} 03} ArIAAAAERv73eoRQ}]
[Edit] 2022/06/02 16:28:33 [职务更新成功! <nil> {{{ArIAAAAEOkm4hF0d 副总经理} 04} ArIAAAAERv73eoRQ}]
[Edit] 2022/06/02 16:28:33 [职务更新成功! <nil> {{{ArIAAAAEOky4hF0d 总工程师} 05} ArIAAAAERv73eoRQ}]
[Edit] 2022/06/02 16:28:33 [职务更新成功! <nil> {{{ArIAAAAEOk+4hF0d 总经济师} 06} ArIAAAAERv73eoRQ}]
[Edit] 2022/06/02 16:28:33 [职务更新成功! <nil> {{{ArIAAAAEOlK4hF0d 财务总监} 07} ArIAAAAERv73eoRQ}]
[Edit] 2022/06/02 16:28:33 [职务更新成功! <nil> {{{ArIAAAAEOlW4hF0d 总经理助理} 08} ArIAAAAERwP3eoRQ}]
[Edit] 2022/06/02 16:28:33 [职务更新成功! <nil> {{{ArIAAAAEOli4hF0d 副总工程师} 09} ArIAAAAERwP3eoRQ}]
[Edit] 2022/06/02 16:28:33 [职务更新成功! <nil> {{{ArIAAAAEOlu4hF0d 厂长} 10} ArIAAAAERwP3eoRQ}]
[Edit] 2022/06/02 16:28:33 [职务更新成功! <nil> {{{ArIAAAAEOl64hF0d 部长} 11} ArIAAAAERwP3eoRQ}]
[Edit] 2022/06/02 16:28:33 [职务更新成功! <nil> {{{ArIAAAAEOmG4hF0d 主任} 12} ArIAAAAERwP3eoRQ}]
[Edit] 2022/06/02 16:28:33 [职务更新成功! <nil> {{{ArIAAAAEOmS4hF0d 副厂长} 13} ArIAAAAERwb3eoRQ}]
[Edit] 2022/06/02 16:28:33 [职务更新成功! <nil> {{{ArIAAAAEOme4hF0d 副部长} 14} ArIAAAAERwb3eoRQ}]
[Edit] 2022/06/02 16:28:33 [职务更新成功! <nil> {{{ArIAAAAEOmq4hF0d 副主任} 15} ArIAAAAERwb3eoRQ}]
[Edit] 2022/06/02 16:28:33 [职务更新成功! <nil> {{{ArIAAAAEOm24hF0d 厂长助理} 16} ArIAAAAERwn3eoRQ}]
[Edit] 2022/06/02 16:28:33 [职务更新成功! <nil> {{{ArIAAAAEOnC4hF0d 部长助理} 17} ArIAAAAERwn3eoRQ}]
[Edit] 2022/06/02 16:28:33 [职务更新成功! <nil> {{{ArIAAAAEOnO4hF0d 主任助理} 18} ArIAAAAERwn3eoRQ}]
[Edit] 2022/06/02 16:28:33 [职务更新成功! <nil> {{{ArIAAAAEOna4hF0d 主管工程师} 19} ArIAAAAERwn3eoRQ}]
[Edit] 2022/06/02 16:28:33 [职务更新成功! <nil> {{{ArIAAAAEOnm4hF0d 车间主任} 20} ArIAAAAERwn3eoRQ}]
[Edit] 2022/06/02 16:28:33 [职务更新成功! <nil> {{{ArIAAAAEOny4hF0d 车间副主任} 21} ArIAAAAERwn3eoRQ}]
[Edit] 2022/06/02 16:28:33 [职务更新成功! <nil> {{{ArIAAAAEOn+4hF0d 科长} 22} ArIAAAAERwz3eoRQ}]
[Edit] 2022/06/02 16:28:33 [职务更新成功! <nil> {{{ArIAAAAEOoK4hF0d 炉长} 23} ArIAAAAERwz3eoRQ}]
[Edit] 2022/06/02 16:28:33 [职务更新成功! <nil> {{{ArIAAAAEOoW4hF0d 主管} 24} ArIAAAAERwz3eoRQ}]
[Edit] 2022/06/02 16:28:33 [职务更新成功! <nil> {{{ArIAAAAEOoi4hF0d 三大员} 25} ArIAAAAERwz3eoRQ}]
[Edit] 2022/06/02 16:28:33 [职务更新成功! <nil> {{{ArIAAAAEOou4hF0d 值长} 26} ArIAAAAERwz3eoRQ}]
[Edit] 2022/06/02 16:28:33 [职务更新成功! <nil> {{{ArIAAAAEOo64hF0d 副值长} 27} ArIAAAAERwz3eoRQ}]
[Edit] 2022/06/02 16:28:33 [职务更新成功! <nil> {{{ArIAAAAEOpG4hF0d 工段长} 28} ArIAAAAERwz3eoRQ}]
[Edit] 2022/06/02 16:28:33 [职务更新成功! <nil> {{{ArIAAAAEOpS4hF0d 班长} 29} ArIAAAAERwz3eoRQ}]
[Edit] 2022/06/02 16:28:33 [职务更新成功! <nil> {{{ArIAAAAEOpe4hF0d 副班长} 30} ArIAAAAERwz3eoRQ}]
[Edit] 2022/06/02 16:28:33 [职务更新成功! <nil> {{{ArIAAAAEOpq4hF0d 车队队长} 31} ArIAAAAERwz3eoRQ}]
[Edit] 2022/06/02 16:28:33 [职务更新成功! <nil> {{{ArIAAAAEOp24hF0d 车队副队长} 32} ArIAAAAERwz3eoRQ}]
[Edit] 2022/06/02 16:28:33 [职务更新成功! <nil> {{{ArIAAAAEOqC4hF0d 车队副班长} 33} ArIAAAAERwz3eoRQ}]
[Edit] 2022/06/02 16:28:33 [职务更新成功! <nil> {{{ArIAAAAEOqO4hF0d 保卫队长} 34} ArIAAAAERwz3eoRQ}]
[Edit] 2022/06/02 16:28:33 [职务更新成功! <nil> {{{ArIAAAAEOqa4hF0d 保卫副队长} 35} ArIAAAAERwz3eoRQ}]
[Edit] 2022/06/02 16:28:33 [职务更新成功! <nil> {{{ArIAAAAEOqm4hF0d 专工} 36} ArIAAAAERwz3eoRQ}]
[Edit] 2022/06/02 16:28:33 [职务更新成功! <nil> {{{ArIAAAAEOqy4hF0d 技术人员} 37} ArIAAAAERwz3eoRQ}]
[Edit] 2022/06/02 16:28:33 [职务更新成功! <nil> {{{ArIAAAAEOq+4hF0d 技师} 38} ArIAAAAERw/3eoRQ}]
[Edit] 2022/06/02 16:28:33 [职务更新成功! <nil> {{{ArIAAAAEOrK4hF0d 维修工} 39} ArIAAAAERw/3eoRQ}]
[Edit] 2022/06/02 16:28:33 [职务更新成功! <nil> {{{ArIAAAAEOrW4hF0d 科员} 40} ArIAAAAERw/3eoRQ}]
[Edit] 2022/06/02 16:28:33 [职务更新成功! <nil> {{{ArIAAAAEOri4hF0d 队员} 41} ArIAAAAERw/3eoRQ}]
[Edit] 2022/06/02 16:28:33 [职务更新成功! <nil> {{{ArIAAAAEOru4hF0d 小车司机} 42} ArIAAAAERw/3eoRQ}]
[Edit] 2022/06/02 16:28:33 [职务更新成功! <nil> {{{ArIAAAAEOr64hF0d 厨师} 43} ArIAAAAERw/3eoRQ}]
[Edit] 2022/06/02 16:28:33 [职务更新成功! <nil> {{{ArIAAAAEOsG4hF0d 面点师} 44} ArIAAAAERw/3eoRQ}]
[Edit] 2022/06/02 16:28:33 [职务更新成功! <nil> {{{ArIAAAAEOsS4hF0d 服务员} 45} ArIAAAAERw/3eoRQ}]
[Edit] 2022/06/02 16:28:33 [职务更新成功! <nil> {{{ArIAAAAEOse4hF0d 主操} 46} ArIAAAAERw/3eoRQ}]
[Edit] 2022/06/02 16:28:33 [职务更新成功! <nil> {{{ArIAAAAEOsq4hF0d 副操} 47} ArIAAAAERw/3eoRQ}]
[Edit] 2022/06/02 16:28:33 [职务更新成功! <nil> {{{ArIAAAAEOs24hF0d 工程车司机} 48} ArIAAAAERw/3eoRQ}]
[Edit] 2022/06/02 16:28:33 [职务更新成功! <nil> {{{ArIAAAAEOtC4hF0d 管理员} 49} ArIAAAAERw/3eoRQ}]
[Edit] 2022/06/02 16:28:33 [职务更新成功! <nil> {{{ArIAAAAEOtO4hF0d 电工} 50} ArIAAAAERw/3eoRQ}]
[Edit] 2022/06/02 16:28:33 [职务更新成功! <nil> {{{ArIAAAAEOta4hF0d 化验员} 51} ArIAAAAERw/3eoRQ}]
[Edit] 2022/06/02 16:28:33 [职务更新成功! <nil> {{{ArIAAAAEOtm4hF0d 计量员} 52} ArIAAAAERw/3eoRQ}]
[Edit] 2022/06/02 16:28:33 [职务更新成功! <nil> {{{ArIAAAAEOty4hF0d 采样工} 53} ArIAAAAERw/3eoRQ}]
[Trace] 2022/06/02 22:30:00 [开始执行行政组织类型对照]
[Info] 2022/06/02 22:30:00 [[{00000000-0000-0000-0000-00000000000162824988 集团} {00000000-0000-0000-0000-00000000000262824988 公司} {00000000-0000-0000-0000-00000000000362824988 部门} {ArIAAAAENi5igkmI 集团本部} {ArIAAAAENjFigkmI 二级部门} {ArIAAAAEPtpigkmI 车间} {ArIAAAAENitigkmI 子集团} {ArIAAAAENjRigkmI 工段}]]
[Trace] 2022/06/02 22:30:00 [结束执行行政组织类型对照]
[Trace] 2022/06/02 22:30:00 [开始执行职务类型对照]
[Info] 2022/06/02 22:30:00 [[{{ArIAAAAERv73eoRQ 高管} } {{ArIAAAAERwP3eoRQ 中层正职} } {{ArIAAAAERwb3eoRQ 中层副职} } {{ArIAAAAERwn3eoRQ 中层助理} } {{ArIAAAAERwz3eoRQ 基层管理} } {{ArIAAAAERw/3eoRQ 执行人员} } {{ArIAAAAERxL3eoRQ 临时工} } {{ArIAAAAER/X3eoRQ 测试} }]]
[Trace] 2022/06/02 22:30:00 [结束执行职务类型对照]

2
log/202206/20220603.log

File diff suppressed because one or more lines are too long

3
main.go

@ -4,6 +4,7 @@ import (
"hr_server/initialization/app"
"hr_server/initialization/databaseinit"
"hr_server/initialization/nosql"
"hr_server/scheduledtask"
)
func main() {
@ -11,5 +12,7 @@ func main() {
databaseinit.LoadDatabase()
//加载Redis
nosql.LoadRedis()
//启动定时任务
scheduledtask.TimeTask()
app.RunItem()
}

2
models/administrative_organization.go

@ -18,6 +18,8 @@ type AdministrativeOrganization struct {
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 {

1
models/administrative_organization_type.go

@ -12,6 +12,7 @@ type AdministrativeOrganizationType 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:删除)"`
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 {

19
models/duties.go

@ -1,6 +1,9 @@
package models
import "hr_server/overall"
import (
"hr_server/overall"
"strings"
)
//职务
type Duties struct {
@ -11,6 +14,8 @@ type Duties struct {
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
}

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
}

19
models/job_class.go

@ -1,6 +1,9 @@
package models
import "hr_server/overall"
import (
"hr_server/overall"
"strings"
)
//职务分类
type JobClass struct {
@ -8,6 +11,8 @@ type JobClass struct {
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
}

1
models/personnel.go

@ -28,6 +28,7 @@ type Personnel struct {
Password string `json:"password" gorm:"column:password;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:删除)`
Key int64 `json:"key" gorm:"column:key;type:bigint(50) unsigned;default:0;not null;comment:key"`
IsAdmin int `json:"isadmin" gorm:"column:is_admin;type:tinyint(1) unsigned;default:1;not null;comment:是否为管理员(1:不是;2:分公司;3:集团管理员;4:超级管`
}
func (Personnel *Personnel) TableName() string {

1
models/position.go

@ -20,6 +20,7 @@ type Position struct {
MenuPermit string `json:"menupermit" gorm:"column:menu_permit;type:longtext;comment:菜单许可证"`
ButtonPermit string `json:"buttonpermit" gorm:"column:button_permit;type:longtext;comment:按钮许可"`
School int64 `json:"school" gorm:"column:school;type:bigint(20) unsigned;default:0;not null;comment:部门"`
KingdeeId string `json:"kingdeeid" gorm:"column:kingdeeid;type:varchar(255) unsigned;default:'';comment:金蝶对照ID"`
}
func (Position *Position) TableName() string {

1
overall/app_config_const.go

@ -15,6 +15,7 @@ var (
CONSTANT_DB_Master *gorm.DB //主数据库
CONSTANT_DB_Wechat *gorm.DB //微信数据库
CONSTANT_DB_HR *gorm.DB //微信数据库
CONSTANT_DB_HR_Jin *gorm.DB //微信数据库
//Redis
CONSTANT_REDIS0 *redis.Client
CONSTANT_REDIS1 *redis.Client

1
overall/app_constant.go

@ -7,4 +7,5 @@ var (
ConfigRedisConstant = "./config/configNosql/redis.yaml"
EmployeeStatusIng = []int{1, 2, 3, 4, 5} //用工关系(1:实习生;2:待分配;3:试用员工;4:正式员工;5:停薪留职;6:退休;7:辞退;8:离职)
EmployeeStatusOld = []int{7, 8} //用工关系(1:实习生;2:待分配;3:试用员工;4:正式员工;5:停薪留职;6:退休;7:辞退;8:离职)
DockingKingdeeUrl = "http://36.134.44.40:18888"
)

1
overall/overallhandle/errorcode.go

@ -11,4 +11,5 @@ var ErrorCodeMsg = map[int]string{
106: "编辑失败!",
107: "未能查询到数据!",
108: "删除失败",
2000: "账户或密码错误!",
}

71
overall/overallhandle/log.go

@ -0,0 +1,71 @@
package overallhandle
import (
"fmt"
"hr_server/overall"
"log"
"os"
"time"
)
//日志相关操作
//判断文件夹是否存在,不存在得话就创建
/*
@path 日志文件夹
*/
func PathExists(path string) bool {
_, err := os.Stat(path)
// fmt.Printf("path----->%v\n", err)
if err == nil {
return true
}
if os.IsNotExist(err) {
mkdirErr := os.Mkdir(path, os.ModePerm)
if mkdirErr == nil {
return true
} else {
return false
}
}
return true
}
//写日志
func WriteLog(class string, errmsg ...any) {
// var ErrorLog *log.Logger
fileName := fmt.Sprintf("./%v/%v", overall.CONSTANT_CONFIG.Logsetup.Path, UnixTimeToDay(time.Now().Unix(), 21))
// fmt.Printf("fileName--->%v\n", fileName)
if PathExists(fileName) != true {
return
}
logFilePath := fmt.Sprintf("%v/%v.log", fileName, UnixTimeToDay(time.Now().Unix(), 20))
file, err := os.OpenFile(logFilePath, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0766)
if err != nil {
log.Fatalln("Failed to open error log file: ", err)
}
// fmt.Printf("logFilePath--->%v\n", logFilePath)
errLevel := "[Trace] "
switch class {
case "i":
errLevel = "[Info] "
case "w":
errLevel = "[Warning] "
case "e":
errLevel = "[Error] "
case "write":
errLevel = "[Write] "
case "add":
errLevel = "[Add] "
case "edit":
errLevel = "[Edit] "
case "del":
errLevel = "[Delete] "
default:
errLevel = "[Trace] "
}
loger := log.New(file, errLevel, log.Ldate|log.Ltime)
loger.SetFlags(log.Ldate | log.Ltime)
loger.Println(errmsg)
return
}

63
overall/overallhandle/overall_handle.go

@ -108,6 +108,8 @@ func UnixTimeToDay(timeStamp int64, timeType int) (dateStr string) {
dateStr = "1"
case 20:
timeTemplate = "20060102"
case 21:
timeTemplate = "200601"
default:
timeTemplate = "2006-01-02 15:04:05" //常规类型
}
@ -225,6 +227,39 @@ func GetGroupFramework(parentId string, father []int64) []int64 {
return father
}
//获取集团或第一实权部门
func GetGroupOrDepartPower(parentId int64, departId ...int64) int64 {
var orgCont models.AdministrativeOrganization
err := orgCont.GetCont(map[string]interface{}{"id": parentId}, "id", "organization_type", "superior", "ispower")
if err != nil {
return parentId
}
// jsonCCC, _ := json.Marshal(orgCont)
// fmt.Printf("orgCont------->%v\n", string(jsonCCC))
if len(departId) > 0 {
if orgCont.IsPower == 1 {
// fmt.Printf("orgCont---1---->%v---->%v\n", string(jsonCCC), orgCont.Id)
return orgCont.Id
}
return GetGroupOrDepartPower(orgCont.Superior, 1)
} else {
if orgCont.OrganizationType <= 2 {
// fmt.Printf("orgCont---2---->%v\n", string(jsonCCC))
return orgCont.Id
}
return GetGroupOrDepartPower(orgCont.Superior)
}
// if len(departId) > 0 {
// fmt.Printf("orgCont----4--->%v\n", orgCont.Superior)
// GetGroupOrDepartPower(orgCont.Superior, 1)
// } else {
// fmt.Printf("orgCont----5--->%v\n", orgCont.Superior)
// GetGroupOrDepartPower(orgCont.Superior)
// }
// fmt.Printf("orgCont----3--->%v\n", string(jsonCCC))
return orgCont.Id
}
//
// ZeroFillByStr
// @Description: 字符串补零
@ -411,6 +446,7 @@ func GetFutureMonthTime(timeStamp int64, futureTime, class int) (dateStr int64)
func StringIsInMap(str string, strAry []string) bool {
if len(strAry) > 0 {
for _, v := range strAry {
// fmt.Printf("id------>%v----->%v\n", str, strAry)
if v == str {
return true
}
@ -421,14 +457,27 @@ func StringIsInMap(str string, strAry []string) bool {
//判断值是否在数组中
func JudeInArray(id int64, ary []string) (isTrue bool) {
isTrue = false
for _, val := range ary {
valint64, err := strconv.ParseInt(val, 10, 64)
if err == nil {
if id == valint64 {
isTrue = true
// isTrue = false
// for _, val := range ary {
// valint64, err := strconv.ParseInt(val, 10, 64)
// if err == nil {
// if id == valint64 {
// isTrue = true
// }
// }
// }
idStr := strconv.FormatInt(id, 10)
isTrue = StringIsInMap(idStr, ary)
return
}
func JudgeInMap(id int64, ary []int64) bool {
if len(ary) > 0 {
for _, v := range ary {
if v == id {
return true
}
}
}
return
return false
}

64
scheduledtask/time_task.go

@ -0,0 +1,64 @@
package scheduledtask
import (
"fmt"
"hr_server/api/jindie_docking/dockingorganization"
"hr_server/overall/overallhandle"
"time"
"github.com/robfig/cron/v3"
)
/*
定时任务模块
跟随任务一起启动执行周期性任务操作
*/
func TimeTask() {
fmt.Println("------------准备启动定时任务--------------")
overallhandle.WriteLog("t", "准备启动定时任务")
go func() {
c := cron.New(cron.WithSeconds()) //声明定时任务启动器
fmt.Printf("time.UTC--->%v\n", time.Now())
/*
加载任务场景
AddFunc("任务时间格式","执行的任务")
*/
// c.AddFunc("10 * * * * *", func() {
c.AddFunc("0 30 22 * * *", func() {
// fmt.Printf("执行定时任务------>%v\n", time.Now())
overallhandle.WriteLog("t", "开始执行行政组织类型对照")
dockingorganization.GetOrgType()
overallhandle.WriteLog("t", "结束执行行政组织类型对照")
overallhandle.WriteLog("t", "开始执行职务类型对照")
dockingorganization.JobClass()
overallhandle.WriteLog("t", "结束执行职务类型对照")
}) //每天22时30分执行
// c.AddFunc("20 * * * * *", func() {
c.AddFunc("0 10 23 * * *", func() {
overallhandle.WriteLog("t", "开始执行职务对照")
dockingorganization.DutiesContrast()
overallhandle.WriteLog("t", "结束执行职务对照")
overallhandle.WriteLog("t", "开始执行行政组织对照")
dockingorganization.OrgAdmin()
overallhandle.WriteLog("t", "结束执行行政组织对照")
}) //每天23时10分执行
c.AddFunc("0 15 0 * * *", func() {
overallhandle.WriteLog("t", "开始执行职位对照")
dockingorganization.Position()
overallhandle.WriteLog("t", "结束执行职位对照")
}) //每天0时15分执行
//启动
c.Start()
//设定全部执行后,最后关闭定时任务
defer c.Stop()
select {}
}()
fmt.Printf("定时任务启动成功!TIME:%v\n", overallhandle.UnixTimeToDay(time.Now().Unix(), 50))
overallhandle.WriteLog("t", "定时任务启动成功")
}
Loading…
Cancel
Save