fonchain-fiee/pkg/service/exam/user.go

1184 lines
32 KiB
Go
Raw Normal View History

2025-02-19 06:24:15 +00:00
package exam
import (
"context"
"dubbo.apache.org/dubbo-go/v3/common/logger"
"errors"
"fmt"
"github.com/fonchain_enterprise/fonchain-main/api/account"
"github.com/fonchain_enterprise/fonchain-main/api/exam"
"github.com/fonchain_enterprise/fonchain-main/api/rule"
"github.com/fonchain_enterprise/fonchain-main/pkg/cache"
"github.com/fonchain_enterprise/fonchain-main/pkg/config"
"github.com/fonchain_enterprise/fonchain-main/pkg/e"
"github.com/fonchain_enterprise/fonchain-main/pkg/model"
examModel "github.com/fonchain_enterprise/fonchain-main/pkg/model/exam"
"github.com/fonchain_enterprise/fonchain-main/pkg/model/login"
"github.com/fonchain_enterprise/fonchain-main/pkg/model/union"
"github.com/fonchain_enterprise/fonchain-main/pkg/serializer"
"github.com/fonchain_enterprise/fonchain-main/pkg/service"
accountService "github.com/fonchain_enterprise/fonchain-main/pkg/service/account"
shopService "github.com/fonchain_enterprise/fonchain-main/pkg/service/shop"
"github.com/fonchain_enterprise/fonchain-main/pkg/utils"
"github.com/fonchain_enterprise/fonchain-main/pkg/utils/secret"
"github.com/gin-gonic/gin"
"github.com/gin-gonic/gin/binding"
"github.com/jinzhu/copier"
"strconv"
"time"
)
func SendExamMsg(c *gin.Context) {
var req account.SendMsgRequest
if err := c.ShouldBindBodyWith(&req, binding.JSON); err != nil {
service.Error(c, e.InvalidParams, err)
return
}
req.Domain = "fontree"
req.SignNo = 199306
isExist, err := IsRegister(req.TelNum)
if isExist == true {
_, err = service.AccountProvider.SendMsg(context.Background(), &req)
if err != nil {
service.Error(c, e.Error, err)
return
}
} else {
_, err = service.AccountProvider.SendMsgRegister(context.Background(), &req)
if err != nil {
service.Error(c, e.Error, err)
return
}
}
service.ResponseMsg(c, e.SUCCESS, serializer.Response{
Status: e.Ok,
})
return
}
func IsRegister(telNum string) (bool, error) {
userByTelReq := account.UserByTelRequest{
Tel: telNum,
}
// 查询是否有账号
userByTelRes, err := service.AccountProvider.UserByTel(context.Background(), &userByTelReq)
if err != nil {
return false, err
}
return userByTelRes.IsExist, err
}
func isRegisterErr(err error, request *account.RequestStatus) bool {
if err != nil && (request == nil || request.ID == 0) {
return true
}
return false
}
func UserExamRegister(c *gin.Context) {
req := new(examModel.UserExamLogin)
if err := c.ShouldBind(req); err != nil {
logger.Errorf("UserExamRegister ShouldBind err", err)
service.ResponseMsg(c, e.SUCCESS, serializer.Response{
Msg: err.Error(),
Status: e.Failed,
})
return
}
// 验证验证码
//onlyCheckMsgReq := account.CheckMsgRequest{
// TelNum: req.TelNum,
// Code: req.MsgCode,
//}
//
//_, err := service.AccountProvider.OnlyCheckMsg(context.Background(), &onlyCheckMsgReq)
//if err != nil {
// service.ResponseMsg(c, e.SUCCESS, serializer.Response{
// Msg: "注册信息缺失",
// Status: e.Failed,
// })
// return
//}
userInfo := new(exam.UserInfo)
_ = copier.CopyWithOption(&userInfo, req, copier.Option{IgnoreEmpty: false})
if userInfo.Avatar == "" {
req.Avatar = "https://dci-file-new.bj.bcebos.com/fonchain-main/test/runtime/image/avatar/40/b8ed6fea-6662-416d-8bb3-1fd8a8197061.jpg"
}
if userInfo.Name == "" || userInfo.TelNum == "" || userInfo.JoinInTime == "" || userInfo.JobNum == "" || userInfo.DepartmentName == "" || userInfo.PositionName == "" {
service.ResponseMsg(c, e.SUCCESS, serializer.Response{
Msg: "注册信息缺失",
Status: e.Failed,
})
return
}
tempNick := req.Name
//账号服务
registerRequest := account.RegistRequest{
NickName: "访客" + tempNick,
TelNum: req.TelNum,
Password: tempNick + "fontree",
Extend: &account.Extend{},
}
res, err := service.AccountProvider.RegisterOrExist(c, &registerRequest)
fmt.Println("============== Register ==============")
fmt.Printf("Register = %+v\n", res.ID, res.Status)
fmt.Printf("Register err = %+v\n", err)
fmt.Println("============== Register ==============")
if err != nil {
service.ResponseMsg(c, e.SUCCESS, serializer.Response{
Msg: "管理系统信息注册失败",
Status: e.Failed,
Mark: err.Error(),
})
return
}
userInfo.ErpUserId = strconv.FormatUint(res.ID, 10)
shopUserInfoRes, err := accountService.ShopRegisterOnlyTel(c, userInfo)
if err != nil {
service.ResponseMsg(c, e.SUCCESS, serializer.Response{
Msg: err.Error(),
Status: e.Failed,
})
return
}
userInfo.ShopUserId = strconv.FormatUint(shopUserInfoRes.ID, 10)
_, err = service.GrpcExamClientImpl.SaveUser(context.Background(), userInfo)
if err != nil {
service.ResponseMsg(c, e.SUCCESS, serializer.Response{
Msg: err.Error(),
Status: e.Failed,
})
return
}
userInfoRequest := new(exam.UserInfoRequest)
userInfoRequest.TelNum = req.TelNum
retUserInfo, err := service.GrpcExamClientImpl.GetUserInfo(context.Background(), userInfoRequest)
if err != nil {
service.ResponseMsg(c, e.SUCCESS, serializer.Response{
Msg: err.Error(),
Status: e.Failed,
})
return
}
_ = retUserInfo
loginRequest := account.LoginRequest{
TelNum: req.TelNum,
Domain: "fontree",
Code: req.MsgCode,
}
erpUser, err := service.AccountProvider.Login(context.Background(), &loginRequest)
if err != nil {
service.ResponseMsg(c, e.SUCCESS, serializer.Response{
Msg: err.Error(),
Status: e.Failed,
})
return
}
if erpUser.AccountInfo.ID == 0 {
service.ResponseMsg(c, e.SUCCESS, serializer.Response{
Msg: "验证码校验失败",
Status: e.Failed,
})
return
}
//获取用户的岗位信息
uReq := rule.RulesRequest{
AccountID: erpUser.AccountInfo.ID,
}
qres, err1 := service.RuleProvider.UserInfo(c, &uReq)
if err1 != nil {
service.Error(c, e.Error, err1)
return
}
accountInfo := &union.AccountInfo{
ID: erpUser.AccountInfo.ID,
Account: erpUser.AccountInfo.Account,
NickName: erpUser.AccountInfo.NickName,
Domain: erpUser.AccountInfo.Domain,
TelNum: erpUser.AccountInfo.TelNum,
Status: erpUser.AccountInfo.Status,
Avatar: erpUser.AccountInfo.Avatar,
CreatedAt: erpUser.AccountInfo.CreateAt,
IsNeedChange: erpUser.AccountInfo.IsNeedChange,
EnterDate: erpUser.AccountInfo.EnterDate,
WorkYear: erpUser.AccountInfo.WorkYear,
IsAdmin: qres.IsAdmin,
PositionUsers: qres.PositionUsers,
JumpTo: erpUser.AccountInfo.Extend.JumpTo,
DepartmentName: "",
JobNum: erpUser.AccountInfo.JobNum,
BirthDate: erpUser.AccountInfo.BirthDate,
Age: erpUser.AccountInfo.Age,
Sex: erpUser.AccountInfo.Sex,
Title: erpUser.AccountInfo.Title,
IDNum: erpUser.AccountInfo.IDNum,
MailAccount: erpUser.AccountInfo.MailAccount,
Train: erpUser.AccountInfo.Train,
Certificate: erpUser.AccountInfo.Certificate,
}
if accountInfo.DepartmentName == "" {
accountInfo.DepartmentName = retUserInfo.DepartmentName
}
if accountInfo.JobNum == "" {
accountInfo.JobNum = retUserInfo.JobNum
}
if accountInfo.EnterDate == "" {
accountInfo.EnterDate = retUserInfo.JoinInTime
}
code := "xxx"
if len(qres.PositionUsers) >= 1 {
accountInfo.DepartmentName = qres.PositionUsers[0].DepartmentName
code = secret.GetPositionCode(qres.PositionUsers[0].PositionName)
}
token, err := secret.CombineSecret(code, accountInfo.DepartmentName, erpUser.Token)
if err != nil {
service.Error(c, e.Error, err)
return
}
resInfo := &union.Login{
Token: token,
RefreshToken: erpUser.RefreshToken,
AccountInfo: accountInfo,
}
service.ResponseMsg(c, e.SUCCESS, serializer.Response{
Data: resInfo,
Status: e.Ok,
})
}
func UserExamRegisterV1(c *gin.Context) {
req := new(examModel.UserExamLogin)
if err := c.ShouldBind(req); err != nil {
logger.Errorf("UserExamRegister ShouldBind err", err)
service.ResponseMsg(c, e.SUCCESS, serializer.Response{
Msg: err.Error(),
Status: e.Failed,
})
return
}
// 验证验证码
onlyCheckMsgReq := account.CheckMsgRequest{
TelNum: req.TelNum,
Code: req.MsgCode,
}
_, err := service.AccountProvider.OnlyCheckMsg(context.Background(), &onlyCheckMsgReq)
if err != nil {
service.ResponseMsg(c, e.SUCCESS, serializer.Response{
Msg: "注册信息缺失",
Status: e.Failed,
})
return
}
userInfo := new(exam.UserInfo)
_ = copier.CopyWithOption(&userInfo, req, copier.Option{IgnoreEmpty: false})
if userInfo.Avatar == "" {
req.Avatar = "https://dci-file-new.bj.bcebos.com/fonchain-main/test/runtime/image/avatar/40/b8ed6fea-6662-416d-8bb3-1fd8a8197061.jpg"
}
if userInfo.Name == "" || userInfo.TelNum == "" || userInfo.JoinInTime == "" || userInfo.JobNum == "" || userInfo.DepartmentName == "" || userInfo.PositionName == "" {
service.ResponseMsg(c, e.SUCCESS, serializer.Response{
Msg: "注册信息缺失",
Status: e.Failed,
})
return
}
userByTelReq := account.UserByTelRequest{
Tel: req.TelNum,
}
userByTelRes, err := service.AccountProvider.UserByTel(context.Background(), &userByTelReq)
if err != nil {
service.ResponseMsg(c, e.SUCCESS, serializer.Response{
Msg: err.Error(),
Status: e.Failed,
})
return
}
if userByTelRes.IsExist == false {
tempNick := req.Name
//账号服务
registerRequest := account.RegistRequest{
NickName: "访客" + tempNick,
TelNum: req.TelNum,
Password: tempNick + "fontree",
Extend: &account.Extend{},
}
res, err := service.AccountProvider.Register(c, &registerRequest)
if err != nil {
service.ResponseMsg(c, e.SUCCESS, serializer.Response{
Msg: err.Error(),
Status: e.Failed,
})
return
}
userInfo.ErpUserId = strconv.FormatUint(res.ID, 10)
} else {
userInfo.ErpUserId = strconv.FormatUint(userByTelRes.Info.ID, 10)
}
shopUserInfoRes, err := accountService.ShopRegisterOnlyTel(c, userInfo)
if err != nil {
service.ResponseMsg(c, e.SUCCESS, serializer.Response{
Msg: err.Error(),
Status: e.Failed,
})
return
}
userInfo.ShopUserId = strconv.FormatUint(shopUserInfoRes.ID, 10)
_, err = service.GrpcExamClientImpl.SaveUser(context.Background(), userInfo)
if err != nil {
service.ResponseMsg(c, e.SUCCESS, serializer.Response{
Msg: err.Error(),
Status: e.Failed,
})
return
}
loginRequest := account.LoginRequest{
TelNum: req.TelNum,
Domain: "fontree",
Code: req.MsgCode,
}
erpUser, err := service.AccountProvider.Login(context.Background(), &loginRequest)
if err != nil {
service.ResponseMsg(c, e.SUCCESS, serializer.Response{
Msg: err.Error(),
Status: e.Failed,
})
return
}
if erpUser.AccountInfo.ID == 0 {
service.ResponseMsg(c, e.SUCCESS, serializer.Response{
Msg: "验证码校验失败",
Status: e.Failed,
})
return
}
//获取用户的岗位信息
uReq := rule.RulesRequest{
AccountID: erpUser.AccountInfo.ID,
}
qres, err1 := service.RuleProvider.UserInfo(c, &uReq)
if err1 != nil {
service.Error(c, e.Error, err1)
return
}
accountInfo := &union.AccountInfo{
ID: erpUser.AccountInfo.ID,
Account: erpUser.AccountInfo.Account,
NickName: erpUser.AccountInfo.NickName,
Domain: erpUser.AccountInfo.Domain,
TelNum: erpUser.AccountInfo.TelNum,
Status: erpUser.AccountInfo.Status,
Avatar: erpUser.AccountInfo.Avatar,
CreatedAt: erpUser.AccountInfo.CreateAt,
IsNeedChange: erpUser.AccountInfo.IsNeedChange,
EnterDate: erpUser.AccountInfo.EnterDate,
WorkYear: erpUser.AccountInfo.WorkYear,
IsAdmin: qres.IsAdmin,
PositionUsers: qres.PositionUsers,
JumpTo: erpUser.AccountInfo.Extend.JumpTo,
DepartmentName: "",
JobNum: erpUser.AccountInfo.JobNum,
BirthDate: erpUser.AccountInfo.BirthDate,
Age: erpUser.AccountInfo.Age,
Sex: erpUser.AccountInfo.Sex,
Title: erpUser.AccountInfo.Title,
IDNum: erpUser.AccountInfo.IDNum,
MailAccount: erpUser.AccountInfo.MailAccount,
Train: erpUser.AccountInfo.Train,
Certificate: erpUser.AccountInfo.Certificate,
}
code := "xxx"
if len(qres.PositionUsers) >= 1 {
accountInfo.DepartmentName = qres.PositionUsers[0].DepartmentName
code = secret.GetPositionCode(qres.PositionUsers[0].PositionName)
}
token, err := secret.CombineSecret(code, accountInfo.DepartmentName, erpUser.Token)
if err != nil {
service.Error(c, e.Error, err)
return
}
resInfo := &union.Login{
Token: token,
RefreshToken: erpUser.RefreshToken,
AccountInfo: accountInfo,
}
service.ResponseMsg(c, e.SUCCESS, serializer.Response{
Data: resInfo,
Status: e.Ok,
})
}
func UserExamLogin(c *gin.Context) {
req := new(examModel.UserExamLogin)
if err := c.ShouldBind(req); err != nil {
logger.Errorf("UserExamLogin ShouldBind err", err)
service.ResponseMsg(c, e.SUCCESS, serializer.Response{
Msg: err.Error(),
Status: e.Failed,
})
return
}
userInfoRequest := new(exam.UserInfoRequest)
userInfoRequest.TelNum = req.TelNum
//examUser, examErr := service.GrpcExamClientImpl.GetUserInfo(context.Background(), userInfoRequest)
//if examErr != nil {
// fmt.Println("[==================== examErr ==============================}")
// fmt.Println("UserExamLogin GetUserInfo err := ", examErr)
// fmt.Println("[==================== examErr ==============================}")
// service.ResponseMsg(c, e.SUCCESS, serializer.Response{
// Msg: examErr.Error(),
// Status: e.Failed,
// })
// return
//}
loginRequest := account.LoginRequest{
TelNum: req.TelNum,
Domain: "fontree",
Code: req.MsgCode,
}
erpUser, err := service.AccountProvider.Login(context.Background(), &loginRequest)
if err != nil {
service.ResponseMsg(c, e.SUCCESS, serializer.Response{
Msg: err.Error(),
Status: e.Failed,
})
return
}
if erpUser.AccountInfo.ID == 0 {
service.ResponseMsg(c, e.SUCCESS, serializer.Response{
Msg: "验证码校验失败",
Status: e.Failed,
})
return
}
//获取用户的岗位信息
uReq := rule.RulesRequest{
AccountID: erpUser.AccountInfo.ID,
}
qres, err1 := service.RuleProvider.UserInfo(c, &uReq)
if err1 != nil {
service.Error(c, e.Error, err1)
return
}
accountInfo := &union.AccountInfo{
ID: erpUser.AccountInfo.ID,
Account: erpUser.AccountInfo.Account,
NickName: erpUser.AccountInfo.NickName,
Domain: erpUser.AccountInfo.Domain,
TelNum: erpUser.AccountInfo.TelNum,
Status: erpUser.AccountInfo.Status,
Avatar: erpUser.AccountInfo.Avatar,
CreatedAt: erpUser.AccountInfo.CreateAt,
IsNeedChange: erpUser.AccountInfo.IsNeedChange,
EnterDate: erpUser.AccountInfo.EnterDate,
WorkYear: erpUser.AccountInfo.WorkYear,
IsAdmin: qres.IsAdmin,
PositionUsers: qres.PositionUsers,
JumpTo: erpUser.AccountInfo.Extend.JumpTo,
DepartmentName: "",
JobNum: erpUser.AccountInfo.JobNum,
BirthDate: erpUser.AccountInfo.BirthDate,
Age: erpUser.AccountInfo.Age,
Sex: erpUser.AccountInfo.Sex,
Title: erpUser.AccountInfo.Title,
IDNum: erpUser.AccountInfo.IDNum,
MailAccount: erpUser.AccountInfo.MailAccount,
Train: erpUser.AccountInfo.Train,
Certificate: erpUser.AccountInfo.Certificate,
}
//if accountInfo.PositionUsers == nil {
// accountInfo.PositionUsers = make([]*rule.PositionUser, 0)
// accountInfo.PositionUsers = append(accountInfo.PositionUsers, &rule.PositionUser{
// PositionName: examUser.PositionName,
// DepartmentName: examUser.DepartmentName,
// })
//}
//
//if accountInfo.DepartmentName == "" {
// accountInfo.DepartmentName = examUser.DepartmentName
//}
//
//if accountInfo.JobNum == "" {
// accountInfo.JobNum = examUser.JobNum
//}
//
//if accountInfo.EnterDate == "" {
// accountInfo.EnterDate = examUser.JoinInTime
//}
code := "xxx"
if len(qres.PositionUsers) >= 1 {
accountInfo.DepartmentName = qres.PositionUsers[0].DepartmentName
code = secret.GetPositionCode(qres.PositionUsers[0].PositionName)
}
token, err := secret.CombineSecret(code, accountInfo.DepartmentName, erpUser.Token)
if err != nil {
service.Error(c, e.Error, err)
return
}
resInfo := &union.Login{
Token: token,
RefreshToken: erpUser.RefreshToken,
AccountInfo: accountInfo,
}
service.ResponseMsg(c, e.SUCCESS, serializer.Response{
Data: resInfo,
Status: e.Ok,
})
}
func GetAllUserInfo(c *gin.Context) {
req := new(exam.AllUserInfoRequest)
if err := c.ShouldBind(req); err != nil {
logger.Errorf("GetAllUserInfo ShouldBind err", err)
service.ResponseMsg(c, e.SUCCESS, serializer.Response{
Msg: err.Error(),
Status: e.Failed,
})
return
}
res, err := service.GrpcExamClientImpl.GetAllUserInfo(context.Background(), req)
if err != nil {
service.ResponseMsg(c, e.SUCCESS, serializer.Response{
Msg: err.Error(),
Status: e.Failed,
})
return
}
service.ResponseMsg(c, e.SUCCESS, serializer.Response{
Data: res,
Status: e.Ok,
})
}
func SaveUserAnswerHis(c *gin.Context) {
req := new(exam.UserExamInfo)
if err := c.ShouldBind(req); err != nil {
logger.Errorf("SaveUserAnswerHis ShouldBind err", err)
service.ResponseMsg(c, e.SUCCESS, serializer.Response{
Msg: err.Error(),
Status: e.Failed,
})
return
}
if req.UserUUID == "" {
userInfo := login.GetUserInfoFromC(c)
req.UserUUID = strconv.FormatUint(userInfo.ID, 10)
}
lockKey := fmt.Sprintf("save_answer_his_%v_%v", req.UserUUID, req.ExamUUID)
reply := cache.RedisClient.SetNX(lockKey, 0, 3*time.Second)
if !reply.Val() {
service.Error(c, e.Error, nil, e.ErrorCreateApproval)
return
}
res, err := service.GrpcExamClientImpl.SaveUserAnswerHis(context.Background(), req)
if err != nil {
service.ResponseMsg(c, e.SUCCESS, serializer.Response{
Msg: err.Error(),
Status: e.Failed,
})
return
}
updateErpUser := new(account.UpdateRequest)
isUpdateErpUser := false
if res.Collections != nil {
updateGift := new(exam.SaveUserGiftHisRequest)
for i := 0; i < len(res.Collections); i++ {
//_, _ = shopService.AutoWipedOutPosition(c, res.Collections[i].TelNum)
//_, _ = shopService.AutoWipedOut(c, res.Collections[i].TelNum)
//
//updateGift.SaveUserGiftHis = append(updateGift.SaveUserGiftHis, &exam.SaveUserGiftHis{
// CollectionID: res.Collections[i].CollectionID,
// UserGiftHisUUID: res.Collections[i].UserGiftHisUUID,
// GiftCode: "https://common.szjixun.cn/api/image/qr/url?url=123123123",
//})
}
if len(updateGift.SaveUserGiftHis) > 0 {
// 更新考试系统 礼品状态
_, err = service.GrpcExamClientImpl.SaveUserGiftHis(context.Background(), updateGift)
if err != nil {
service.ResponseMsg(c, e.SUCCESS, serializer.Response{
Msg: err.Error(),
Status: e.Failed,
})
return
}
}
}
if res.Video != nil {
isUpdateErpUser = true
updateErpUser.TrainVideos = append(updateErpUser.TrainVideos, &account.TrainVideo{
TrainUUID: res.Video.TrainUUID,
Video: res.Video.Video,
TrainDesc: res.Video.TrainDesc,
})
id, _ := strconv.Atoi(res.ErpUserId)
updateErpUser.ID = uint64(id)
}
// 更新管理系统用户信息
if isUpdateErpUser {
updateErpUser.Operator = &account.Operator{Name: "考试系统"}
_, err = service.AccountProvider.Update(context.Background(), updateErpUser)
if err != nil {
service.ResponseMsg(c, e.SUCCESS, serializer.Response{
Msg: err.Error(),
Status: e.Failed,
})
return
}
}
service.ResponseMsg(c, e.SUCCESS, serializer.Response{
Data: res,
Status: e.Ok,
})
}
func SaveUserTrainHis(c *gin.Context) {
req := new(exam.UserExamInfo)
if err := c.ShouldBind(req); err != nil {
logger.Errorf("SaveUserTrainHis ShouldBind err", err)
service.ResponseMsg(c, e.SUCCESS, serializer.Response{
Msg: err.Error(),
Status: e.Failed,
})
return
}
if req.UserUUID == "" {
userInfo := login.GetUserInfoFromC(c)
req.UserUUID = strconv.FormatUint(userInfo.ID, 10)
}
res, err := service.GrpcExamClientImpl.SaveUserTrainHis(context.Background(), req)
if err != nil {
service.ResponseMsg(c, e.SUCCESS, serializer.Response{
Msg: err.Error(),
Status: e.Failed,
})
return
}
service.ResponseMsg(c, e.SUCCESS, serializer.Response{
Data: res,
Status: e.Ok,
})
}
func UserHisInfo(c *gin.Context) {
req := new(exam.InfoRequest)
if err := c.ShouldBind(req); err != nil {
logger.Errorf("UserHisInfo ShouldBind err", err)
service.ResponseMsg(c, e.SUCCESS, serializer.Response{
Msg: err.Error(),
Status: e.Failed,
})
return
}
if req.UserUUID == "" {
userInfo := login.GetUserInfoFromC(c)
req.UserUUID = strconv.FormatUint(userInfo.ID, 10)
}
res, err := service.GrpcExamClientImpl.UserHisInfo(context.Background(), req)
if err != nil {
service.ResponseMsg(c, e.Failed, serializer.Response{
Msg: "获取考试失败",
Status: e.Failed,
})
return
}
service.ResponseMsg(c, e.SUCCESS, serializer.Response{
Data: res,
Status: e.Ok,
})
}
func SaveUserHis(c *gin.Context) {
req := new(exam.UserExamInfo)
if err := c.ShouldBind(req); err != nil {
logger.Errorf("SaveUserAnswerHis ShouldBind err", err)
service.ResponseMsg(c, e.SUCCESS, serializer.Response{
Msg: err.Error(),
Status: e.Failed,
})
return
}
if req.UserUUID == "" {
userInfo := login.GetUserInfoFromC(c)
req.UserUUID = strconv.FormatUint(userInfo.ID, 10)
}
lockKey := fmt.Sprintf("save_answer_his_%v_%v", req.UserUUID, req.ExamUUID)
reply := cache.RedisClient.SetNX(lockKey, 0, 3*time.Second)
if !reply.Val() {
service.Error(c, e.Error, nil, e.ErrorCreateApproval)
return
}
res, err := service.GrpcExamClientImpl.SaveUserHis(context.Background(), req)
if err != nil {
service.ResponseMsg(c, e.SUCCESS, serializer.Response{
Msg: err.Error(),
Status: e.Failed,
})
return
}
fmt.Println("-======== ======= SaveUserHis ===================================")
if res.Collections != nil {
for i := 0; i < len(res.Collections); i++ {
fmt.Printf("Collections %+v\n", res.Collections)
}
}
fmt.Printf("res.Video %+v\n", res.Video)
fmt.Printf("res.ErpUserId %+v\n", res.ErpUserId)
fmt.Println("-======== ======= SaveUserHis ===================================")
updateErpUser := new(account.UpdateRequest)
isUpdateErpUser := false
if res.Collections != nil {
updateGift := new(exam.SaveUserGiftHisRequest)
for i := 0; i < len(res.Collections); i++ {
// TODO 礼品发放 以及 用户证书更新
if res.Collections[i].Name == "持岗证" {
pic, _ := shopService.ExamAutoWipedOutPosition(c, res.Collections[len(res.Collections)-len(res.Collections)].TelNum)
updateGift.SaveUserGiftHis = append(updateGift.SaveUserGiftHis, &exam.SaveUserGiftHis{
CollectionID: res.Collections[len(res.Collections)-len(res.Collections)].CollectionID,
UserGiftHisUUID: res.Collections[len(res.Collections)-len(res.Collections)].UserGiftHisUUID,
GiftCode: pic,
})
}
if res.Collections[i].Name == "年货" {
code, _ := shopService.ExamAutoWipedOut(c, res.Collections[len(res.Collections)-1].TelNum)
updateGift.SaveUserGiftHis = append(updateGift.SaveUserGiftHis, &exam.SaveUserGiftHis{
CollectionID: res.Collections[len(res.Collections)-1].CollectionID,
UserGiftHisUUID: res.Collections[len(res.Collections)-1].UserGiftHisUUID,
GiftCode: code,
})
}
}
if len(updateGift.SaveUserGiftHis) > 0 {
// 更新考试系统 礼品状态
_, err = service.GrpcExamClientImpl.SaveUserGiftHis(context.Background(), updateGift)
if err != nil {
service.ResponseMsg(c, e.SUCCESS, serializer.Response{
Data: res.UserExamInfo,
Msg: err.Error() + " 保存礼品信息",
Status: e.Failed,
})
return
}
}
updateErpUser.Certificate = "https://cdns.fontree.cn/fonchain-main/prod/image/127/avatar/24c62aa7-73ae-4d53-a9cf-adc93df0e1d5.png"
}
if res.Video != nil || updateErpUser.Certificate != "" {
isUpdateErpUser = true
updateErpUser.TrainVideos = append(updateErpUser.TrainVideos, &account.TrainVideo{
TrainUUID: res.Video.TrainUUID,
Video: res.Video.Video,
TrainDesc: res.Video.TrainDesc,
})
id, _ := strconv.Atoi(res.ErpUserId)
updateErpUser.ID = uint64(id)
}
// 更新管理系统用户信息
if isUpdateErpUser {
updateErpUser.Operator = &account.Operator{Name: "考试系统"}
_, err = service.AccountProvider.Update(context.Background(), updateErpUser)
if err != nil {
service.ResponseMsg(c, e.SUCCESS, serializer.Response{
Data: res.UserExamInfo,
Msg: err.Error() + " 更新ERP用户",
Status: e.Ok,
})
return
}
}
service.ResponseMsg(c, e.SUCCESS, serializer.Response{
Data: res.UserExamInfo,
Status: e.Ok,
})
}
func GetExamUserInfo(c *gin.Context) {
req := new(exam.InfoRequest)
if err := c.ShouldBind(req); err != nil {
logger.Errorf("UserHisInfo ShouldBind err", err)
service.ResponseMsg(c, e.SUCCESS, serializer.Response{
Msg: err.Error(),
Status: e.Failed,
})
return
}
res, err := service.GrpcExamClientImpl.GetExamUserInfo(context.Background(), req)
if err != nil {
service.ResponseMsg(c, e.SUCCESS, serializer.Response{
Msg: err.Error(),
Status: e.Failed,
})
return
}
for i := 0; i < len(res.ExamUserInfo); i++ {
if res.ExamUserInfo[i].Name == "" {
erpUserInfoReq := new(account.InfoRequest)
erpUserId, _ := strconv.Atoi(res.ExamUserInfo[i].ErpUserId)
erpUserInfoReq.ID = uint64(erpUserId)
erpUserInfoReq.Domain = "fontree"
logger.Info(" GetExamUserInfo 获取用户信息 : ", res.ExamUserInfo[i].ErpUserId)
logger.Info(" GetExamUserInfo 获取用户信息 : ", erpUserInfoReq.Domain)
erpUserInfoRes, err := service.AccountProvider.Info(context.Background(), erpUserInfoReq)
if err != nil {
//service.ResponseMsg(c, e.SUCCESS, serializer.Response{
// Msg: "获取用户信息失败",
// Status: e.Failed,
//})
//return
logger.Infof(" GetExamUserInfo 获取用户信息 : %+v\n", erpUserInfoRes.Info)
}
res.ExamUserInfo[i].Name = erpUserInfoRes.Info.NickName
}
}
service.ResponseMsg(c, e.SUCCESS, serializer.Response{
Data: res,
Status: e.Ok,
})
}
func FuzzyQueryUser(c *gin.Context) {
req := new(exam.FuzzyQueryUserRequest)
if err := c.ShouldBindBodyWith(&req, binding.JSON); err != nil {
service.ResponseMsg(c, e.SUCCESS, serializer.Response{
Msg: err.Error(),
Status: e.Failed,
})
return
}
if req.NickName != "" {
//var queryOaUser oa_model.QueryOaUser
//queryOaUser.NickName = req.NickName
//queryOaUser.TelNum = req.NickName
//queryOaUser.JobNum = req.NickName
//queryOaUser.Page = 1
//queryOaUser.PageSize = 100
//
//oaUsers, _, err := es.QueryAccountInfoEs(es.OaIndex, queryOaUser)
//if err != nil {
// service.ResponseMsg(c, e.SUCCESS, serializer.Response{
// Msg: err.Error(),
// Status: e.Failed,
// })
// return
//}
var accountReq account.ListRequest
accountReq.Key = req.NickName
users, err := service.AccountProvider.List(context.Background(), &accountReq)
if err != nil {
service.Error(c, e.Error, err)
return
}
//获取所有的用户id
var id []int64
for _, v := range users.Data {
id = append(id, int64(v.ID))
}
if len(id) == 0 {
res := new(exam.FuzzyQueryUserResponse)
service.ResponseMsg(c, e.SUCCESS, serializer.Response{
Data: res,
Status: e.Ok,
})
return
}
fmt.Println("id值为:", id)
req.Id = id
}
res, err := service.GrpcExamClientImpl.FuzzyQueryUser(context.Background(), req)
if err != nil {
service.ResponseMsg(c, e.SUCCESS, serializer.Response{
Msg: err.Error(),
Status: e.Failed,
})
return
}
for i := 0; i < len(res.ExamUserInfo); i++ {
if res.ExamUserInfo[i].Name == "" {
erpUserInfoReq := new(account.InfoRequest)
erpUserId, _ := strconv.Atoi(res.ExamUserInfo[i].ErpUserId)
erpUserInfoReq.ID = uint64(erpUserId)
erpUserInfoReq.Domain = "fontree"
logger.Info(" GetExamUserInfo 获取用户信息 : ", res.ExamUserInfo[i].ErpUserId)
logger.Info(" GetExamUserInfo 获取用户信息 : ", erpUserInfoReq.Domain)
erpUserInfoRes, err := service.AccountProvider.Info(context.Background(), erpUserInfoReq)
if err != nil {
//service.ResponseMsg(c, e.SUCCESS, serializer.Response{
// Msg: "获取用户信息失败",
// Status: e.Failed,
//})
//return
logger.Infof(" GetExamUserInfo 获取用户信息 : %+v\n", erpUserInfoRes.Info)
}
if erpUserInfoRes != nil {
if erpUserInfoRes.Info != nil {
res.ExamUserInfo[i].Name = erpUserInfoRes.Info.NickName
}
}
}
}
service.ResponseMsg(c, e.SUCCESS, serializer.Response{
Data: res,
Status: e.Ok,
})
}
func ExportExcel(c *gin.Context) {
req := new(exam.FuzzyQueryUserRequest)
if err := c.ShouldBindBodyWith(&req, binding.JSON); err != nil {
service.ResponseMsg(c, e.SUCCESS, serializer.Response{
Msg: err.Error(),
Status: e.Failed,
})
return
}
if req.NickName != "" {
var accountReq account.ListRequest
accountReq.Key = req.NickName
users, err := service.AccountProvider.List(context.Background(), &accountReq)
if err != nil {
service.Error(c, e.Error, err)
return
}
//获取所有的用户id
var id []int64
for _, v := range users.Data {
id = append(id, int64(v.ID))
}
if len(id) == 0 {
res := new(exam.FuzzyQueryUserResponse)
service.ResponseMsg(c, e.SUCCESS, serializer.Response{
Data: res,
Status: e.Ok,
})
return
}
fmt.Println("id值为:", id)
req.Id = id
}
req.ExportNo = 1
res, err := service.GrpcExamClientImpl.FuzzyQueryUser(context.Background(), req)
if err != nil {
service.ResponseMsg(c, e.SUCCESS, serializer.Response{
Msg: err.Error(),
Status: e.Failed,
})
return
}
for i := 0; i < len(res.ExamUserInfo); i++ {
if res.ExamUserInfo[i].Name == "" {
erpUserInfoReq := new(account.InfoRequest)
erpUserId, _ := strconv.Atoi(res.ExamUserInfo[i].ErpUserId)
erpUserInfoReq.ID = uint64(erpUserId)
erpUserInfoReq.Domain = "fontree"
logger.Info(" GetExamUserInfo 获取用户信息 : ", res.ExamUserInfo[i].ErpUserId)
logger.Info(" GetExamUserInfo 获取用户信息 : ", erpUserInfoReq.Domain)
erpUserInfoRes, err := service.AccountProvider.Info(context.Background(), erpUserInfoReq)
if err != nil {
//service.ResponseMsg(c, e.SUCCESS, serializer.Response{
// Msg: "获取用户信息失败",
// Status: e.Failed,
//})
//return
logger.Infof(" GetExamUserInfo 获取用户信息 : %+v\n", erpUserInfoRes.Info)
}
if erpUserInfoRes != nil {
if erpUserInfoRes.Info != nil {
res.ExamUserInfo[i].Name = erpUserInfoRes.Info.NickName
}
}
}
}
if len(res.ExamUserInfo) == 0 {
service.ResponseQuickMsg(c, e.Failed, errors.New("无可导出数据").Error(), nil)
return
}
columns := []string{"姓名", "考试时间", "视频时长(秒)", "考试结果"}
var data []interface{}
// 添加数据行
for _, examUserInfo := range res.ExamUserInfo {
var info []string
info = append(info, examUserInfo.Name)
info = append(info, examUserInfo.ExamFinishAt)
info = append(info, strconv.FormatFloat(float64(examUserInfo.VideoDuration), 'f', -1, 32))
if examUserInfo.IsPass == 1 {
info = append(info, "未完成")
} else if examUserInfo.IsPass == 2 {
info = append(info, "未通过")
} else if examUserInfo.IsPass == 3 {
info = append(info, "通过")
} else {
info = append(info, "出错")
}
data = append(data, &info)
}
// 获取当前日期
timeFormat := time.Now().Format("20060102")
filePath := "./runtime/" + res.ExamName + timeFormat + ".xlsx"
_, err = utils.ToExcelByType(columns, data, "slice", filePath)
if err != nil {
fmt.Println("err", err)
service.ResponseQuickMsg(c, e.Failed, errors.New("转换为excel类型出错").Error(), nil)
return
}
var httpType string
if config.IsHttps {
httpType = model.HttpsType
} else {
httpType = model.HttpType
}
path := "%s%s/static/" + res.ExamName + timeFormat + ".xlsx"
var exportUrl string = fmt.Sprintf(path, httpType, c.Request.Host)
fmt.Println("exportUrl", exportUrl)
res.ExportUrl = exportUrl
service.ResponseMsg(c, e.SUCCESS, serializer.Response{
Data: res,
Status: e.Ok,
})
}