enterprise/server/service/staff_user.go

189 lines
6.5 KiB
Go

package service
import (
"encoding/json"
"enterprise/common/config"
"enterprise/common/dao"
"enterprise/common/model"
"enterprise/server/api"
"enterprise/server/session"
"git.u8t.cn/open/gosdk/qyweixin"
"github.com/google/uuid"
log "github.com/sirupsen/logrus"
"github.com/smbrave/goutil"
"github.com/spf13/cast"
"time"
)
type StaffUser struct {
}
func NewStaffUser() *StaffUser {
return &StaffUser{}
}
func (s *StaffUser) Login(sess *session.AdminSession, req *api.StaffLoginReq) interface{} {
host := sess.GetHeader().Host
log.Infof("login host[%s] req[%s]", host, goutil.EncodeJSON(req))
corp, err := dao.NewCorpDao().GetByHost(host)
session.CheckDBError(err)
session.CheckNilError(corp, "企业不存在的域名")
user, err := dao.NewStaffUserDao().GetByUsername(corp.Id, req.Username)
session.CheckDBError(err)
session.CheckNilError(user, "企业用户不存在")
if user.Password == "" || user.Password != req.Password {
panic("密码错误")
}
token := new(model.StaffToken)
token.UserId = user.Id
token.ExpireTime = time.Now().Unix() + 86400
token.Token = uuid.New().String()
_, err = dao.NewStaffTokenDao().Create(token)
session.CheckDBError(err)
data := token.ToLogin()
data["username"] = user.Username
data["realname"] = user.Realname
return data
}
func (s *StaffUser) List(sess *session.AdminSession, req *api.StaffListReq) (int64, interface{}) {
staffs, total, err := dao.NewStaffUserDao().Query(req.Page, req.Size, sess.GetCorpId(), cast.ToInt(req.Status), req.Username, req.Realname, req.Phone, req.Idno)
session.CheckDBError(err)
items := make([]*api.StaffUser, 0)
corpStaffConfig := cast.ToSlice(config.GetCorpConfig(sess.GetCorpId(), "staff_config", nil))
for _, st := range staffs {
i := new(api.StaffUser)
i.From(st)
calculator, _ := dao.NewSalaryCalculatorDao().Get(cast.ToInt64(i.SalaryCalculator))
if calculator != nil {
i.SalaryCalculatorName = calculator.Name
}
// config
var staffConfig map[string]interface{}
json.Unmarshal([]byte(st.Config), &staffConfig)
config := make([]map[string]interface{}, 0)
for _, kv := range corpStaffConfig {
obj := cast.ToStringMap(kv)
obj["value"] = cast.ToString(staffConfig[cast.ToString(obj["key"])])
config = append(config, obj)
}
i.Config = config
items = append(items, i)
}
return total, items
}
func (s *StaffUser) Create(sess *session.AdminSession, req *api.StaffCreateReq) {
staffUser, err := dao.NewStaffUserDao().GetByUsername(sess.GetAdmin().CorpId, req.Username)
session.CheckDBError(err)
if staffUser != nil {
panic("用户已存在")
}
hrAssiant := s.getHrAssiant(sess.GetCorpId())
staffInfo, err := hrAssiant.GetStaffInfo(req.Username)
if err != nil {
log.Warnf("getstaff info username[%s] error :%s", req.Username, err.Error())
}
staffUser = new(model.StaffUser)
if staffInfo != nil {
staffUser.Realname = staffInfo.RealName
staffUser.Phone = staffInfo.Phone
staffUser.Idno = staffInfo.Idno
staffUser.EntryDate = staffInfo.EntryDate
staffUser.OfficialDate = staffInfo.OfficialDate
}
staffUser.CorpId = sess.GetAdmin().CorpId
staffUser.Username = req.Username
staffUser.Status = model.StaffUserStatusOnline
_, err = dao.NewStaffUserDao().Create(staffUser)
session.CheckDBError(err)
}
func (s *StaffUser) Update(sess *session.AdminSession, req *api.StaffUpdateReq) {
staffUser, err := dao.NewStaffUserDao().Get(cast.ToInt64(req.Id))
session.CheckDBError(err)
session.CheckNilError(staffUser, "用户不存在")
hrAssiant := s.getHrAssiant(sess.GetCorpId())
staffInfo, err := hrAssiant.GetStaffInfo(req.Username)
if err != nil {
log.Warnf("getstaff info username[%s] error :%s", req.Username, err.Error())
}
if staffInfo != nil {
staffUser.Realname = goutil.If(staffUser.Realname == "", staffInfo.RealName, staffUser.Realname)
staffUser.Phone = goutil.If(staffUser.Phone == "", staffInfo.Phone, staffUser.Phone)
staffUser.Idno = goutil.If(staffUser.Idno == "", staffInfo.Idno, staffUser.Idno)
staffUser.OfficialDate = goutil.If(staffUser.OfficialDate == "" || staffUser.OfficialDate == "NaN-NaN-NaN", staffInfo.OfficialDate, staffUser.OfficialDate)
staffUser.EntryDate = goutil.If(staffUser.EntryDate == "" || staffUser.EntryDate == "NaN-NaN-NaN", staffInfo.EntryDate, staffUser.EntryDate)
}
staffUser.Username = goutil.If(req.Username != "", req.Username, staffUser.Username)
staffUser.Realname = goutil.If(req.Realname != "", req.Realname, staffUser.Realname)
staffUser.Phone = goutil.If(req.Phone != "", req.Phone, staffUser.Phone)
staffUser.Idno = goutil.If(req.Idno != "", req.Idno, staffUser.Idno)
staffUser.EntryDate = goutil.If(req.EntryDate != "" && req.EntryDate != "NaN-NaN-NaN", req.EntryDate, staffUser.EntryDate)
staffUser.OfficialDate = goutil.If(req.OfficialDate != "" && req.OfficialDate != "NaN-NaN-NaN", req.OfficialDate, staffUser.OfficialDate)
staffSalary := staffUser.GetSalary()
staffSalary.Base = goutil.If(req.SalaryBase != "", req.SalaryBase, staffSalary.Base)
staffSalary.Target = goutil.If(req.SalaryTarget != "", req.SalaryTarget, staffSalary.Target)
staffSalary.Calculator = goutil.If(req.SalaryCalculator != "", req.SalaryCalculator, staffSalary.Calculator)
staffUser.Salary = goutil.EncodeJSON(staffSalary)
staffPayee := staffUser.GetPayee()
staffPayee.BankName = goutil.If(req.PayeeBankName != "", req.PayeeBankName, staffPayee.BankName)
staffPayee.BankCard = goutil.If(req.PayeeBankCard != "", req.PayeeBankCard, staffPayee.BankCard)
staffPayee.AlipayUid = goutil.If(req.PayeeAlipayUid != "", req.PayeeAlipayUid, staffPayee.AlipayUid)
staffUser.Payee = goutil.EncodeJSON(staffPayee)
//状态处理
if req.Status != "" {
status := cast.ToInt(req.Status)
staffUser.Status = goutil.If(req.Status != "", cast.ToInt(req.Status), staffUser.Status)
if status == model.StaffUserStatusOffline {
staffUser.LeaveDate = goutil.If(req.LeaveDate != "", req.LeaveDate, staffUser.LeaveDate)
} else {
staffUser.LeaveDate = ""
}
}
if len(req.Config) != 0 {
var cfg map[string]interface{}
json.Unmarshal([]byte(staffUser.Config), &cfg)
for k, v := range req.Config {
cfg[k] = v
}
staffUser.Config = goutil.EncodeJSON(cfg)
}
err = dao.NewStaffUserDao().Update(staffUser)
session.CheckDBError(err)
}
func (s *StaffUser) getHrAssiant(corpId int64) *qyweixin.AppHr {
corp, err := dao.NewCorpDao().Get(corpId)
session.CheckDBError(err)
session.CheckNilError(corp, "企业不存在")
corpCfg := corp.GetConfig()
hrAssiant := qyweixin.NewAppHr(&qyweixin.AppConfig{
Corpid: corpCfg.CorpId,
Secret: corpCfg.EnterpriseSecret,
Agent: corpCfg.EnterpriseAgent,
})
return hrAssiant
}