58 changed files with 2222 additions and 80 deletions
@ -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 [定时任务启动成功] |
|||
@ -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 [定时任务启动成功] |
|||
@ -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) |
|||
} |
|||
@ -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"` //密码
|
|||
} |
|||
@ -0,0 +1,9 @@ |
|||
package empower |
|||
|
|||
import "hr_server/api/empower/authorize" |
|||
|
|||
type ApiInlet struct { |
|||
Authorize authorize.EmpowerApi |
|||
} |
|||
|
|||
var AppApiInlet = new(ApiInlet) |
|||
@ -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) |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
|||
@ -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 |
|||
} |
|||
@ -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"` |
|||
} |
|||
@ -0,0 +1,9 @@ |
|||
package jindiedocking |
|||
|
|||
import "hr_server/api/jindie_docking/dockingorganization" |
|||
|
|||
type ApiInlet struct { |
|||
DockJinDieApi dockingorganization.DockingJinDieApi |
|||
} |
|||
|
|||
var AppApiInlet = new(ApiInlet) |
|||
@ -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) //接口实验
|
|||
} |
|||
} |
|||
@ -0,0 +1,3 @@ |
|||
package dockingjindie |
|||
|
|||
type DockingJindieApiRouter struct{} |
|||
@ -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
|
|||
} |
|||
} |
|||
@ -0,0 +1,3 @@ |
|||
package empowerrote |
|||
|
|||
type EmpowerApiRouter struct{} |
|||
@ -1,8 +1,11 @@ |
|||
|
|||
#App主配置 |
|||
appsetup: |
|||
port: 9999 #服务端口 |
|||
port: 39168 #服务端口 |
|||
readtime: 3600 #请求的读取操作在超时前的最大持续时间 |
|||
writetime : 3600 #回复的写入操作在超时前的最大持续时间 |
|||
appkey: 'heng_xin_gao_ke_AppKey' #应用程序密钥 |
|||
password: '123456789' #系统默认密码 |
|||
password: '123456789' #系统默认密码 |
|||
prefix: 'HXJT' #系统字段前缀 |
|||
logconfig: |
|||
path: 'log' #日志保存地址 |
|||
@ -1,6 +1,11 @@ |
|||
|
|||
#App主配置 |
|||
appsetup: |
|||
port: 9999 #服务端口 |
|||
port: 39168 #服务端口 |
|||
readtime: 3600 #请求的读取操作在超时前的最大持续时间 |
|||
writetime : 3600 #回复的写入操作在超时前的最大持续时间 |
|||
writetime : 3600 #回复的写入操作在超时前的最大持续时间 |
|||
appkey: 'heng_xin_gao_ke_AppKey' #应用程序密钥 |
|||
password: '123456789' #系统默认密码 |
|||
prefix: 'HXJT' #系统字段前缀 |
|||
logconfig: |
|||
path: 'log' #日志保存地址 |
|||
@ -0,0 +1,21 @@ |
|||
{ |
|||
"group":[ |
|||
{ |
|||
"old":3, |
|||
"new":2 |
|||
} |
|||
], |
|||
"department":[ |
|||
{ |
|||
"newgroup":2, |
|||
"old":1, |
|||
"new":14 |
|||
}, |
|||
{ |
|||
"newgroup":2, |
|||
"old":2, |
|||
"new":13 |
|||
} |
|||
], |
|||
"workshopsection":[] |
|||
} |
|||
@ -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 |
|||
} |
|||
Binary file not shown.
@ -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) { |
|||
|
|||
} |
|||
} |
|||
@ -0,0 +1,8 @@ |
|||
package identification |
|||
|
|||
//验证器结构
|
|||
type ValidatorType struct { |
|||
Number string `json:"number"` //随机数
|
|||
UserKey string `json:"userkey"` //用户名
|
|||
PassWord string `json:"password"` //密码
|
|||
} |
|||
@ -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 [结束执行职务类型对照] |
|||
File diff suppressed because one or more lines are too long
@ -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 |
|||
} |
|||
@ -1,14 +1,15 @@ |
|||
package overallhandle |
|||
|
|||
var ErrorCodeMsg = map[int]string{ |
|||
0: "成功", |
|||
1: "", |
|||
100: "提交的数据格式错误!", |
|||
101: "提交的数据不能为空!", |
|||
103: "该数据已经存在!请不要重复添加", |
|||
104: "数据写入失败!", |
|||
105: "数据查询失败!", |
|||
106: "编辑失败!", |
|||
107: "未能查询到数据!", |
|||
108: "删除失败", |
|||
0: "成功", |
|||
1: "", |
|||
100: "提交的数据格式错误!", |
|||
101: "提交的数据不能为空!", |
|||
103: "该数据已经存在!请不要重复添加", |
|||
104: "数据写入失败!", |
|||
105: "数据查询失败!", |
|||
106: "编辑失败!", |
|||
107: "未能查询到数据!", |
|||
108: "删除失败", |
|||
2000: "账户或密码错误!", |
|||
} |
|||
|
|||
@ -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 |
|||
} |
|||
@ -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…
Reference in new issue