hr assiant
This commit is contained in:
parent
4a454e1275
commit
8cd07e9033
|
@ -12,9 +12,10 @@ func main() {
|
||||||
config.LoadServerConfig()
|
config.LoadServerConfig()
|
||||||
global.InitGlobal()
|
global.InitGlobal()
|
||||||
|
|
||||||
if err := worker.Init(); err != nil {
|
worker.SyncStaffInfo()
|
||||||
panic(err)
|
//if err := worker.Init(); err != nil {
|
||||||
}
|
// panic(err)
|
||||||
|
//}
|
||||||
if err := server.Start(); err != nil {
|
if err := server.Start(); err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
|
|
|
@ -41,7 +41,6 @@ type QyWeixin struct {
|
||||||
CheckinAgent string `toml:"checkin_agent"`
|
CheckinAgent string `toml:"checkin_agent"`
|
||||||
CheckinSecret string `toml:"checkin_secret"`
|
CheckinSecret string `toml:"checkin_secret"`
|
||||||
CheckinGroup string `toml:"checkin_group"`
|
CheckinGroup string `toml:"checkin_group"`
|
||||||
CheckinPayTitle string `toml:"checkin_pay_title"`
|
|
||||||
CheckinPayThresold float64 `toml:"checkin_pay_thresold"`
|
CheckinPayThresold float64 `toml:"checkin_pay_thresold"`
|
||||||
|
|
||||||
EnterpriseAgent string `toml:"enterprise_agent"`
|
EnterpriseAgent string `toml:"enterprise_agent"`
|
||||||
|
|
|
@ -0,0 +1,84 @@
|
||||||
|
package dao
|
||||||
|
|
||||||
|
import (
|
||||||
|
"enterprise/common/model"
|
||||||
|
"gorm.io/gorm"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
type StaffInfoDao struct {
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewStaffInfoDao() *StaffInfoDao {
|
||||||
|
return &StaffInfoDao{}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (d *StaffInfoDao) TableName() string {
|
||||||
|
return "staff_info"
|
||||||
|
}
|
||||||
|
|
||||||
|
func (d *StaffInfoDao) Create(o *model.StaffInfo) (int64, error) {
|
||||||
|
o.CreateTime = time.Now().Unix()
|
||||||
|
res := GetDB().Table(d.TableName()).Create(o)
|
||||||
|
return o.Id, res.Error
|
||||||
|
}
|
||||||
|
|
||||||
|
func (d *StaffInfoDao) Update(o *model.StaffInfo) error {
|
||||||
|
o.UpdateTime = time.Now().Unix()
|
||||||
|
tx := GetDB().Table(d.TableName())
|
||||||
|
res := tx.Save(o)
|
||||||
|
return res.Error
|
||||||
|
}
|
||||||
|
|
||||||
|
func (d *StaffInfoDao) Delete(id int64) error {
|
||||||
|
res := GetDB().Table(d.TableName()).Delete(&model.StaffInfo{}, id)
|
||||||
|
return res.Error
|
||||||
|
}
|
||||||
|
|
||||||
|
func (d *StaffInfoDao) Get(id int64) (*model.StaffInfo, error) {
|
||||||
|
var u model.StaffInfo
|
||||||
|
tx := GetDB().Table(d.TableName())
|
||||||
|
tx = tx.Where("id = ?", id)
|
||||||
|
res := tx.First(&u)
|
||||||
|
if res.Error == gorm.ErrRecordNotFound {
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
if res.Error != nil {
|
||||||
|
return nil, res.Error
|
||||||
|
}
|
||||||
|
return &u, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (d *StaffInfoDao) GetByUsername(username string) (*model.StaffInfo, error) {
|
||||||
|
var u model.StaffInfo
|
||||||
|
tx := GetDB().Table(d.TableName())
|
||||||
|
tx = tx.Where("username = ?", username)
|
||||||
|
res := tx.First(&u)
|
||||||
|
if res.Error == gorm.ErrRecordNotFound {
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
if res.Error != nil {
|
||||||
|
return nil, res.Error
|
||||||
|
}
|
||||||
|
return &u, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (d *StaffInfoDao) Query(status int) ([]*model.StaffInfo, error) {
|
||||||
|
var u []*model.StaffInfo
|
||||||
|
tx := GetDB().Table(d.TableName())
|
||||||
|
if status != 0 {
|
||||||
|
tx = tx.Where("status = ?", status)
|
||||||
|
}
|
||||||
|
|
||||||
|
res := tx.Find(&u)
|
||||||
|
if res.Error == gorm.ErrRecordNotFound {
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
if res.Error != nil {
|
||||||
|
return nil, res.Error
|
||||||
|
}
|
||||||
|
return u, nil
|
||||||
|
}
|
|
@ -64,3 +64,22 @@ func (d *UserConfigDao) GetByUsername(username string) (*model.UserConfig, error
|
||||||
}
|
}
|
||||||
return &u, nil
|
return &u, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (d *UserConfigDao) Query(status int) ([]*model.UserConfig, error) {
|
||||||
|
var u []*model.UserConfig
|
||||||
|
tx := GetDB().Table(d.TableName())
|
||||||
|
|
||||||
|
if status != 0 {
|
||||||
|
tx = tx.Where("status = ?", status)
|
||||||
|
}
|
||||||
|
|
||||||
|
res := tx.Find(&u)
|
||||||
|
if res.Error == gorm.ErrRecordNotFound {
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
if res.Error != nil {
|
||||||
|
return nil, res.Error
|
||||||
|
}
|
||||||
|
return u, nil
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,22 @@
|
||||||
|
package model
|
||||||
|
|
||||||
|
var (
|
||||||
|
StaffInfoStatusNormal = 1
|
||||||
|
StaffInfoStatusDisable = 2
|
||||||
|
)
|
||||||
|
|
||||||
|
type StaffInfo struct {
|
||||||
|
Id int64
|
||||||
|
Username string
|
||||||
|
Realname string
|
||||||
|
Phone string
|
||||||
|
Idno string
|
||||||
|
Salary string
|
||||||
|
EntryDate string
|
||||||
|
OfficialDate string
|
||||||
|
BirthDate string
|
||||||
|
BankName string
|
||||||
|
BankCard string
|
||||||
|
CreateTime int64
|
||||||
|
UpdateTime int64
|
||||||
|
}
|
|
@ -8,11 +8,16 @@ var (
|
||||||
CheckinOndutyMoney = "checkin.onduty.money"
|
CheckinOndutyMoney = "checkin.onduty.money"
|
||||||
CheckinOffdutyMoney = "checkin.offduty.money"
|
CheckinOffdutyMoney = "checkin.offduty.money"
|
||||||
)
|
)
|
||||||
|
var (
|
||||||
|
UserConfigStatusNormal = 1
|
||||||
|
UserConfigStatusDisable = 2
|
||||||
|
)
|
||||||
|
|
||||||
type UserConfig struct {
|
type UserConfig struct {
|
||||||
Id int64
|
Id int64
|
||||||
Username string
|
Username string
|
||||||
Config string
|
Config string
|
||||||
|
Status int
|
||||||
CreateTime int64
|
CreateTime int64
|
||||||
UpdateTime int64
|
UpdateTime int64
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,7 +3,6 @@ package weixin
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
butil "enterprise/base/util"
|
butil "enterprise/base/util"
|
||||||
"errors"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
log "github.com/sirupsen/logrus"
|
log "github.com/sirupsen/logrus"
|
||||||
"github.com/spf13/cast"
|
"github.com/spf13/cast"
|
||||||
|
@ -15,6 +14,7 @@ var (
|
||||||
urlGetCheckinRlue = "https://qyapi.weixin.qq.com/cgi-bin/checkin/getcorpcheckinoption"
|
urlGetCheckinRlue = "https://qyapi.weixin.qq.com/cgi-bin/checkin/getcorpcheckinoption"
|
||||||
urlGetCheckinData = "https://qyapi.weixin.qq.com/cgi-bin/checkin/getcheckindata"
|
urlGetCheckinData = "https://qyapi.weixin.qq.com/cgi-bin/checkin/getcheckindata"
|
||||||
urlConvertOpenid = "https://qyapi.weixin.qq.com/cgi-bin/user/convert_to_openid"
|
urlConvertOpenid = "https://qyapi.weixin.qq.com/cgi-bin/user/convert_to_openid"
|
||||||
|
urlGetUser = "https://qyapi.weixin.qq.com/cgi-bin/user/get"
|
||||||
)
|
)
|
||||||
|
|
||||||
type QyWeixin struct {
|
type QyWeixin struct {
|
||||||
|
@ -25,6 +25,11 @@ type QyWeixin struct {
|
||||||
tokenExpire int64
|
tokenExpire int64
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type UserInfo struct {
|
||||||
|
UserId string
|
||||||
|
RealName string
|
||||||
|
}
|
||||||
|
|
||||||
func NewQyWeixin(corpId, secret, agent string) *QyWeixin {
|
func NewQyWeixin(corpId, secret, agent string) *QyWeixin {
|
||||||
return &QyWeixin{
|
return &QyWeixin{
|
||||||
CorpId: corpId,
|
CorpId: corpId,
|
||||||
|
@ -41,6 +46,19 @@ func (q *QyWeixin) GetToken() string {
|
||||||
return q.Token
|
return q.Token
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (q *QyWeixin) GetResult(rspBody []byte) (map[string]interface{}, error) {
|
||||||
|
result := make(map[string]interface{})
|
||||||
|
if err := json.Unmarshal(rspBody, &result); err != nil {
|
||||||
|
log.Errorf("result[%s] error :%s", string(rspBody), err.Error())
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if cast.ToInt(result["errcode"]) != 0 {
|
||||||
|
log.Errorf("result[%s] error ", string(rspBody))
|
||||||
|
return nil, fmt.Errorf("%d:%s", cast.ToInt(result["errcode"]), cast.ToString(result["errmsg"]))
|
||||||
|
}
|
||||||
|
return result, nil
|
||||||
|
}
|
||||||
|
|
||||||
func (q *QyWeixin) GetOpenid(userid string) (string, error) {
|
func (q *QyWeixin) GetOpenid(userid string) (string, error) {
|
||||||
if err := q.refreshToken(); err != nil {
|
if err := q.refreshToken(); err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
|
@ -51,18 +69,36 @@ func (q *QyWeixin) GetOpenid(userid string) (string, error) {
|
||||||
log.Errorf("httpPost url[%s] error :%s", reqUrl, err.Error())
|
log.Errorf("httpPost url[%s] error :%s", reqUrl, err.Error())
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
result := make(map[string]interface{})
|
result, err := q.GetResult(rspBody)
|
||||||
if err := json.Unmarshal(rspBody, &result); err != nil {
|
if err != nil {
|
||||||
log.Errorf("http url[%s] result[%s] error :%s", reqUrl, string(rspBody), err.Error())
|
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
if cast.ToInt(result["errcode"]) != 0 {
|
|
||||||
log.Errorf("http url[%s] result[%s] error ", reqUrl, string(rspBody))
|
|
||||||
return "", errors.New(string(rspBody))
|
|
||||||
}
|
|
||||||
return cast.ToString(result["openid"]), nil
|
return cast.ToString(result["openid"]), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (q *QyWeixin) GetUserInfo(userid string) (*UserInfo, error) {
|
||||||
|
if err := q.refreshToken(); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
reqUrl := fmt.Sprintf("%s?access_token=%s&userid=%s", urlGetUser, q.GetToken(), userid)
|
||||||
|
rspBody, err := butil.HttpGet(reqUrl, nil)
|
||||||
|
if err != nil {
|
||||||
|
log.Errorf("httpPost url[%s] error :%s", reqUrl, err.Error())
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
result, err := q.GetResult(rspBody)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
userInfo := new(UserInfo)
|
||||||
|
userInfo.UserId = userid
|
||||||
|
userInfo.RealName = cast.ToString(result["name"])
|
||||||
|
|
||||||
|
return userInfo, nil
|
||||||
|
}
|
||||||
|
|
||||||
func (q *QyWeixin) refreshToken() error {
|
func (q *QyWeixin) refreshToken() error {
|
||||||
if time.Now().Unix() <= q.tokenExpire-600 {
|
if time.Now().Unix() <= q.tokenExpire-600 {
|
||||||
return nil
|
return nil
|
||||||
|
@ -74,15 +110,10 @@ func (q *QyWeixin) refreshToken() error {
|
||||||
log.Errorf("http url[%s] error :%s", reqUrl, err.Error())
|
log.Errorf("http url[%s] error :%s", reqUrl, err.Error())
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
result := make(map[string]interface{})
|
result, err := q.GetResult(rspBody)
|
||||||
if err := json.Unmarshal(rspBody, &result); err != nil {
|
if err != nil {
|
||||||
log.Errorf("http url[%s] result[%s] error :%s", reqUrl, string(rspBody), err.Error())
|
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
if cast.ToInt(result["errcode"]) != 0 {
|
|
||||||
log.Errorf("http url[%s] result[%s] error ", reqUrl, string(rspBody))
|
|
||||||
return errors.New(string(rspBody))
|
|
||||||
}
|
|
||||||
|
|
||||||
q.Token = cast.ToString(result["access_token"])
|
q.Token = cast.ToString(result["access_token"])
|
||||||
q.tokenExpire = time.Now().Unix() + cast.ToInt64(result["expires_in"])
|
q.tokenExpire = time.Now().Unix() + cast.ToInt64(result["expires_in"])
|
||||||
|
|
|
@ -0,0 +1,116 @@
|
||||||
|
package weixin
|
||||||
|
|
||||||
|
import (
|
||||||
|
butil "enterprise/base/util"
|
||||||
|
"fmt"
|
||||||
|
log "github.com/sirupsen/logrus"
|
||||||
|
"github.com/smbrave/goutil"
|
||||||
|
"github.com/spf13/cast"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
urlQyWeixinHrGetAllField = "https://qyapi.weixin.qq.com/cgi-bin/hr/get_fields"
|
||||||
|
urlQyWeixinHrGetStaffInfo = "https://qyapi.weixin.qq.com/cgi-bin/hr/get_staff_info"
|
||||||
|
)
|
||||||
|
|
||||||
|
type QyWeixinHR struct {
|
||||||
|
QyWeixin
|
||||||
|
}
|
||||||
|
|
||||||
|
type StaffInfo struct {
|
||||||
|
UserName string
|
||||||
|
RealName string
|
||||||
|
Phone string
|
||||||
|
Idno string
|
||||||
|
Salary float64
|
||||||
|
Stock float64
|
||||||
|
EntryDate string
|
||||||
|
BirthDate string
|
||||||
|
OfficialDate string
|
||||||
|
BankName string
|
||||||
|
BankCard string
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewQyWeixinHR(corpId, secret, agent string) *QyWeixinHR {
|
||||||
|
return &QyWeixinHR{
|
||||||
|
QyWeixin: QyWeixin{
|
||||||
|
CorpId: corpId,
|
||||||
|
Secret: secret,
|
||||||
|
Agent: agent,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (h *QyWeixinHR) GetStaffInfo(userId string) (*StaffInfo, error) {
|
||||||
|
reqUrl := fmt.Sprintf("%s?access_token=%s", urlQyWeixinHrGetStaffInfo, h.GetToken())
|
||||||
|
reqBody := make(map[string]interface{})
|
||||||
|
reqBody["userid"] = userId
|
||||||
|
reqBody["get_all"] = true
|
||||||
|
rspBody, err := butil.HttpPostJson(reqUrl, nil, []byte(goutil.EncodeJSON(reqBody)))
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
staff := new(StaffInfo)
|
||||||
|
result, err := h.GetResult(rspBody)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
fieldMap := make(map[string]map[string]interface{})
|
||||||
|
for _, fieldInfo := range cast.ToSlice(result["field_info"]) {
|
||||||
|
fi := cast.ToStringMap(fieldInfo)
|
||||||
|
fieldMap[cast.ToString(fi["fieldid"])] = fi
|
||||||
|
}
|
||||||
|
|
||||||
|
userInfo, err := h.GetUserInfo(userId)
|
||||||
|
if err != nil {
|
||||||
|
log.Errorf("GetUserInfo error:%s", err.Error())
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
staff.UserName = userId
|
||||||
|
staff.RealName = userInfo.RealName
|
||||||
|
staff.Salary = cast.ToFloat64(h.getFieldValue(fieldMap["20001"]))
|
||||||
|
staff.Stock = cast.ToFloat64(h.getFieldValue(fieldMap["20002"]))
|
||||||
|
staff.Phone = cast.ToString(h.getFieldValue(fieldMap["17003"]))
|
||||||
|
staff.Idno = cast.ToString(h.getFieldValue(fieldMap["11015"]))
|
||||||
|
staff.BankName = cast.ToString(h.getFieldValue(fieldMap["13001"]))
|
||||||
|
staff.BankCard = cast.ToString(h.getFieldValue(fieldMap["13002"]))
|
||||||
|
staff.EntryDate = time.Unix(cast.ToInt64(h.getFieldValue(fieldMap["12018"])), 0).Format("2006-01-02")
|
||||||
|
staff.BirthDate = time.Unix(cast.ToInt64(h.getFieldValue(fieldMap["11005"])), 0).Format("2006-01-02")
|
||||||
|
staff.OfficialDate = time.Unix(cast.ToInt64(h.getFieldValue(fieldMap["12023"])), 0).Format("2006-01-02")
|
||||||
|
|
||||||
|
//fmt.Println(goutil.EncodeJSON(staff))
|
||||||
|
return staff, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (h *QyWeixinHR) getFieldValue(fieldInfo map[string]interface{}) string {
|
||||||
|
valueType := cast.ToInt(fieldInfo["value_type"])
|
||||||
|
if valueType == 1 {
|
||||||
|
return cast.ToString(fieldInfo["value_string"])
|
||||||
|
} else if valueType == 2 {
|
||||||
|
return cast.ToString(fieldInfo["value_uint64"])
|
||||||
|
} else if valueType == 3 {
|
||||||
|
return cast.ToString(fieldInfo["value_uint32"])
|
||||||
|
} else if valueType == 4 {
|
||||||
|
return cast.ToString(fieldInfo["value_int64"])
|
||||||
|
} else if valueType == 5 {
|
||||||
|
moble := cast.ToStringMap(fieldInfo["value_mobile"])
|
||||||
|
return cast.ToString(moble["value_mobile"])
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
func (h *QyWeixinHR) GetAllField() ([]byte, error) {
|
||||||
|
reqUrl := fmt.Sprintf("%s?access_token=%s", urlQyWeixinHrGetAllField, h.GetToken())
|
||||||
|
rspBody, err := butil.HttpGet(reqUrl, nil)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
result, err := h.GetResult(rspBody)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
fmt.Println(goutil.EncodeJSONIndent(result))
|
||||||
|
return rspBody, err
|
||||||
|
}
|
|
@ -0,0 +1,439 @@
|
||||||
|
{
|
||||||
|
"errcode": 0,
|
||||||
|
"errmsg": "ok",
|
||||||
|
"group_list": [{
|
||||||
|
"field_list": [{
|
||||||
|
"field_name": "出生日期",
|
||||||
|
"field_type": 3,
|
||||||
|
"fieldid": 11005,
|
||||||
|
"is_must": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"field_name": "年龄",
|
||||||
|
"field_type": 1,
|
||||||
|
"fieldid": 11006,
|
||||||
|
"is_must": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"field_name": "籍贯",
|
||||||
|
"field_type": 2,
|
||||||
|
"fieldid": 11007,
|
||||||
|
"is_must": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"field_name": "民族",
|
||||||
|
"field_type": 2,
|
||||||
|
"fieldid": 11008,
|
||||||
|
"is_must": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"field_name": "婚姻状况",
|
||||||
|
"field_type": 2,
|
||||||
|
"fieldid": 11009,
|
||||||
|
"is_must": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"field_name": "政治面貌",
|
||||||
|
"field_type": 2,
|
||||||
|
"fieldid": 11010,
|
||||||
|
"is_must": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"field_name": "首次参加工作日期",
|
||||||
|
"field_type": 3,
|
||||||
|
"fieldid": 11011,
|
||||||
|
"is_must": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"field_name": "社会工龄",
|
||||||
|
"field_type": 1,
|
||||||
|
"fieldid": 11012,
|
||||||
|
"is_must": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"field_name": "工龄区间",
|
||||||
|
"field_type": 2,
|
||||||
|
"fieldid": 11013,
|
||||||
|
"is_must": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"field_name": "身份证号码",
|
||||||
|
"field_type": 1,
|
||||||
|
"fieldid": 11015,
|
||||||
|
"is_must": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"field_name": "户口类型",
|
||||||
|
"field_type": 2,
|
||||||
|
"fieldid": 11017,
|
||||||
|
"is_must": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"field_name": "现居住地址",
|
||||||
|
"field_type": 1,
|
||||||
|
"fieldid": 11020,
|
||||||
|
"is_must": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"field_name": "社保账号",
|
||||||
|
"field_type": 1,
|
||||||
|
"fieldid": 11021,
|
||||||
|
"is_must": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"field_name": "公积金账号",
|
||||||
|
"field_type": 1,
|
||||||
|
"fieldid": 11022,
|
||||||
|
"is_must": false
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"group_id": 1001,
|
||||||
|
"group_name": "个人信息"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"field_list": [{
|
||||||
|
"field_name": "工号",
|
||||||
|
"field_type": 1,
|
||||||
|
"fieldid": 12024,
|
||||||
|
"is_must": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"field_name": "员工类型",
|
||||||
|
"field_type": 2,
|
||||||
|
"fieldid": 12003,
|
||||||
|
"is_must": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"field_name": "员工状态",
|
||||||
|
"field_type": 2,
|
||||||
|
"fieldid": 12004,
|
||||||
|
"is_must": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"field_name": "入职日期",
|
||||||
|
"field_type": 3,
|
||||||
|
"fieldid": 12018,
|
||||||
|
"is_must": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"field_name": "试用期",
|
||||||
|
"field_type": 2,
|
||||||
|
"fieldid": 12021,
|
||||||
|
"is_must": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"field_name": "转正日期",
|
||||||
|
"field_type": 3,
|
||||||
|
"fieldid": 12023,
|
||||||
|
"is_must": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"field_name": "职位",
|
||||||
|
"field_type": 2,
|
||||||
|
"fieldid": 12010,
|
||||||
|
"is_must": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"field_name": "职级",
|
||||||
|
"field_type": 2,
|
||||||
|
"fieldid": 12011,
|
||||||
|
"is_must": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"field_name": "办公地点",
|
||||||
|
"field_type": 2,
|
||||||
|
"fieldid": 12014,
|
||||||
|
"is_must": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"field_name": "座位号",
|
||||||
|
"field_type": 1,
|
||||||
|
"fieldid": 12015,
|
||||||
|
"is_must": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"field_name": "招聘类型",
|
||||||
|
"field_type": 1,
|
||||||
|
"fieldid": 12016,
|
||||||
|
"is_must": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"field_name": "司龄",
|
||||||
|
"field_type": 1,
|
||||||
|
"fieldid": 12019,
|
||||||
|
"is_must": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"field_name": "司龄区间",
|
||||||
|
"field_type": 2,
|
||||||
|
"fieldid": 12020,
|
||||||
|
"is_must": false
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"group_id": 1002,
|
||||||
|
"group_name": "在职信息"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"field_list": [{
|
||||||
|
"field_name": "开户行",
|
||||||
|
"field_type": 1,
|
||||||
|
"fieldid": 13001,
|
||||||
|
"is_must": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"field_name": "银行卡号",
|
||||||
|
"field_type": 1,
|
||||||
|
"fieldid": 13002,
|
||||||
|
"is_must": false
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"group_id": 1003,
|
||||||
|
"group_name": "银行卡信息"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"field_list": [{
|
||||||
|
"field_name": "学历",
|
||||||
|
"field_type": 2,
|
||||||
|
"fieldid": 14001,
|
||||||
|
"is_must": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"field_name": "毕业院校",
|
||||||
|
"field_type": 1,
|
||||||
|
"fieldid": 14002,
|
||||||
|
"is_must": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"field_name": "入学时间",
|
||||||
|
"field_type": 3,
|
||||||
|
"fieldid": 14003,
|
||||||
|
"is_must": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"field_name": "毕业时间",
|
||||||
|
"field_type": 3,
|
||||||
|
"fieldid": 14004,
|
||||||
|
"is_must": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"field_name": "专业",
|
||||||
|
"field_type": 1,
|
||||||
|
"fieldid": 14005,
|
||||||
|
"is_must": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"field_name": "学位",
|
||||||
|
"field_type": 2,
|
||||||
|
"fieldid": 14006,
|
||||||
|
"is_must": false
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"group_id": 1004,
|
||||||
|
"group_name": "教育经历"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"field_list": [{
|
||||||
|
"field_name": "前公司",
|
||||||
|
"field_type": 1,
|
||||||
|
"fieldid": 15001,
|
||||||
|
"is_must": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"field_name": "前公司部门",
|
||||||
|
"field_type": 1,
|
||||||
|
"fieldid": 15002,
|
||||||
|
"is_must": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"field_name": "前公司职位",
|
||||||
|
"field_type": 1,
|
||||||
|
"fieldid": 15003,
|
||||||
|
"is_must": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"field_name": "开始日期",
|
||||||
|
"field_type": 3,
|
||||||
|
"fieldid": 15004,
|
||||||
|
"is_must": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"field_name": "结束日期",
|
||||||
|
"field_type": 3,
|
||||||
|
"fieldid": 15005,
|
||||||
|
"is_must": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"field_name": "工作描述",
|
||||||
|
"field_type": 1,
|
||||||
|
"fieldid": 15006,
|
||||||
|
"is_must": false
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"group_id": 1005,
|
||||||
|
"group_name": "工作经历"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"field_list": [{
|
||||||
|
"field_name": "紧急联系人姓名",
|
||||||
|
"field_type": 1,
|
||||||
|
"fieldid": 17001,
|
||||||
|
"is_must": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"field_name": "紧急联系人关系",
|
||||||
|
"field_type": 2,
|
||||||
|
"fieldid": 17002,
|
||||||
|
"is_must": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"field_name": "紧急联系人手机",
|
||||||
|
"field_type": 1,
|
||||||
|
"fieldid": 17003,
|
||||||
|
"is_must": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"field_name": "紧急联系人住址",
|
||||||
|
"field_type": 1,
|
||||||
|
"fieldid": 17004,
|
||||||
|
"is_must": false
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"group_id": 1006,
|
||||||
|
"group_name": "紧急联系人"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"field_list": [{
|
||||||
|
"field_name": "家人姓名",
|
||||||
|
"field_type": 1,
|
||||||
|
"fieldid": 16001,
|
||||||
|
"is_must": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"field_name": "家人关系",
|
||||||
|
"field_type": 2,
|
||||||
|
"fieldid": 16002,
|
||||||
|
"is_must": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"field_name": "家人手机",
|
||||||
|
"field_type": 1,
|
||||||
|
"fieldid": 16003,
|
||||||
|
"is_must": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"field_name": "家人住址",
|
||||||
|
"field_type": 1,
|
||||||
|
"fieldid": 16004,
|
||||||
|
"is_must": false
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"group_id": 1007,
|
||||||
|
"group_name": "家庭成员"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"field_list": [{
|
||||||
|
"field_name": "合同公司",
|
||||||
|
"field_type": 1,
|
||||||
|
"fieldid": 18001,
|
||||||
|
"is_must": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"field_name": "合同类型",
|
||||||
|
"field_type": 2,
|
||||||
|
"fieldid": 18002,
|
||||||
|
"is_must": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"field_name": "合同起始日",
|
||||||
|
"field_type": 3,
|
||||||
|
"fieldid": 18003,
|
||||||
|
"is_must": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"field_name": "合同到期日",
|
||||||
|
"field_type": 3,
|
||||||
|
"fieldid": 18004,
|
||||||
|
"is_must": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"field_name": "续签次数",
|
||||||
|
"field_type": 1,
|
||||||
|
"fieldid": 18007,
|
||||||
|
"is_must": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"field_name": "合同附件",
|
||||||
|
"field_type": 6,
|
||||||
|
"fieldid": 18008,
|
||||||
|
"is_must": false
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"group_id": 1008,
|
||||||
|
"group_name": "合同记录"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"field_list": [{
|
||||||
|
"field_name": "员工照片",
|
||||||
|
"field_type": 4,
|
||||||
|
"fieldid": 19001,
|
||||||
|
"is_must": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"field_name": "身份证人像面",
|
||||||
|
"field_type": 4,
|
||||||
|
"fieldid": 19002,
|
||||||
|
"is_must": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"field_name": "身份证国徽面",
|
||||||
|
"field_type": 4,
|
||||||
|
"fieldid": 19003,
|
||||||
|
"is_must": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"field_name": "学位证书",
|
||||||
|
"field_type": 4,
|
||||||
|
"fieldid": 19004,
|
||||||
|
"is_must": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"field_name": "毕业证书",
|
||||||
|
"field_type": 4,
|
||||||
|
"fieldid": 19005,
|
||||||
|
"is_must": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"field_name": "前公司离职证明",
|
||||||
|
"field_type": 4,
|
||||||
|
"fieldid": 19006,
|
||||||
|
"is_must": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"field_name": "奖励证明",
|
||||||
|
"field_type": 4,
|
||||||
|
"fieldid": 19007,
|
||||||
|
"is_must": false
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"group_id": 1009,
|
||||||
|
"group_name": "材料附件"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"field_list": [{
|
||||||
|
"field_name": "基本工资",
|
||||||
|
"field_type": 1,
|
||||||
|
"fieldid": 20001,
|
||||||
|
"is_must": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"field_name": "奋斗股",
|
||||||
|
"field_type": 1,
|
||||||
|
"fieldid": 20002,
|
||||||
|
"is_must": false
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"group_id": 10001,
|
||||||
|
"group_name": "薪酬福利"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
|
@ -27,7 +27,6 @@ approve_agent = "3010040"
|
||||||
checkin_agent = "3010011"
|
checkin_agent = "3010011"
|
||||||
checkin_secret = "6ljYNGt4DonZLmr9SCtgkTlOvtqmsOchBrTWwGl_GpU"
|
checkin_secret = "6ljYNGt4DonZLmr9SCtgkTlOvtqmsOchBrTWwGl_GpU"
|
||||||
checkin_group = "1,2"
|
checkin_group = "1,2"
|
||||||
checkin_pay_title = "工作餐补贴"
|
|
||||||
checkin_pay_thresold = 11
|
checkin_pay_thresold = 11
|
||||||
pay_secret = "JCGsxntR4E7wrEEQvWGr8_wdKtRlw48n-W6zd8lbwc4"
|
pay_secret = "JCGsxntR4E7wrEEQvWGr8_wdKtRlw48n-W6zd8lbwc4"
|
||||||
pay_agent = "3010046"
|
pay_agent = "3010046"
|
||||||
|
|
|
@ -26,7 +26,6 @@ approve_secret = "xJOClC5V2pPon1azgrAzf5kq1TB72xZ3ScR7O5G3lQo"
|
||||||
checkin_agent = "3010011"
|
checkin_agent = "3010011"
|
||||||
checkin_secret = "6ljYNGt4DonZLmr9SCtgkTlOvtqmsOchBrTWwGl_GpU"
|
checkin_secret = "6ljYNGt4DonZLmr9SCtgkTlOvtqmsOchBrTWwGl_GpU"
|
||||||
checkin_group = "1,2"
|
checkin_group = "1,2"
|
||||||
checkin_pay_title = "工作餐补贴"
|
|
||||||
checkin_pay_thresold = 11
|
checkin_pay_thresold = 11
|
||||||
pay_secret = "JCGsxntR4E7wrEEQvWGr8_wdKtRlw48n-W6zd8lbwc4"
|
pay_secret = "JCGsxntR4E7wrEEQvWGr8_wdKtRlw48n-W6zd8lbwc4"
|
||||||
pay_agent = "3010046"
|
pay_agent = "3010046"
|
||||||
|
|
|
@ -0,0 +1,3 @@
|
||||||
|
package service
|
||||||
|
|
||||||
|
type HrAssiant struct{}
|
|
@ -0,0 +1,56 @@
|
||||||
|
package worker
|
||||||
|
|
||||||
|
import (
|
||||||
|
"enterprise/common/config"
|
||||||
|
"enterprise/common/dao"
|
||||||
|
"enterprise/common/model"
|
||||||
|
"enterprise/common/weixin"
|
||||||
|
log "github.com/sirupsen/logrus"
|
||||||
|
"github.com/spf13/cast"
|
||||||
|
)
|
||||||
|
|
||||||
|
func SyncStaffInfo() {
|
||||||
|
cfg := config.GetConfig()
|
||||||
|
hrAssiant := weixin.NewQyWeixinHR(cfg.QyWeixin.Corpid, cfg.QyWeixin.HrSecret, cfg.QyWeixin.HrSecret)
|
||||||
|
|
||||||
|
userConfigs, err := dao.NewUserConfigDao().Query(model.UserConfigStatusNormal)
|
||||||
|
if err != nil {
|
||||||
|
log.Errorf("query staff db error :%s", err.Error())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
for _, user := range userConfigs {
|
||||||
|
staffInfo, err := hrAssiant.GetStaffInfo(user.Username)
|
||||||
|
if err != nil {
|
||||||
|
log.Errorf("getstaff info username[%s] error :%s", user.Username, err.Error())
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
staff, err := dao.NewStaffInfoDao().GetByUsername(user.Username)
|
||||||
|
if err != nil {
|
||||||
|
log.Errorf("db error :%s", err.Error())
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if staff == nil {
|
||||||
|
staff = new(model.StaffInfo)
|
||||||
|
}
|
||||||
|
staff.Username = staffInfo.UserName
|
||||||
|
staff.Realname = staffInfo.RealName
|
||||||
|
staff.Phone = staffInfo.Phone
|
||||||
|
staff.Idno = staffInfo.Idno
|
||||||
|
staff.Salary = cast.ToString(staffInfo.Salary)
|
||||||
|
staff.EntryDate = staffInfo.EntryDate
|
||||||
|
staff.OfficialDate = staffInfo.OfficialDate
|
||||||
|
staff.BirthDate = staffInfo.BirthDate
|
||||||
|
staff.BankName = staffInfo.BankName
|
||||||
|
staff.BankCard = staffInfo.BankCard
|
||||||
|
|
||||||
|
if staff.Id == 0 {
|
||||||
|
_, err = dao.NewStaffInfoDao().Create(staff)
|
||||||
|
} else {
|
||||||
|
err = dao.NewStaffInfoDao().Update(staff)
|
||||||
|
}
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
log.Errorf("db error :%s", err.Error())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -20,6 +20,10 @@ func Init() error {
|
||||||
go SyncCheckin(time.Now().Format("2006-01-02"))
|
go SyncCheckin(time.Now().Format("2006-01-02"))
|
||||||
})
|
})
|
||||||
|
|
||||||
|
cron.Every(1).Day().At("03:00").Do(func() {
|
||||||
|
go SyncStaffInfo()
|
||||||
|
})
|
||||||
|
|
||||||
cron.StartAsync()
|
cron.StartAsync()
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue