123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464 |
- package services
- import (
- "archive/zip"
- "bytes"
- "fmt"
- "strings"
- "xugu_license/internal/api"
- "xugu_license/internal/global"
- "xugu_license/internal/models"
- "xugu_license/internal/module/email"
- "xugu_license/internal/module/license"
- "xugu_license/internal/utils"
- "github.com/pkg/errors"
- )
- func DistributeOALicenseServices(OperatorUniqueID, OaRequestId string, UserUniqueIDs, UserAccounts, UserNames, EmailArray []string) (error, []string) {
- // //检测OARequest是否以及分发过给用户
- // existUsers, err := checkDistributeToUser(OaRequestId, UserUniqueIDs, UserNames)
- // if err != nil {
- // global.Logger.Errorln("license分发请求检测是否已发放给用户失败 %s", err.Error())
- // return err, nil
- // }
- // //返回以及分发过的用户列表
- // if len(existUsers) != 0 {
- // return nil, existUsers
- // }
- // fmt.Println("DistributeOALicenseServices : ")
- // //获取一个申请单的多个license信息
- // LicInfos, _, err := models.GetOALicenseInfo(1, 1, "", "", "", OaRequestId)
- // if err != nil {
- // return err, nil
- // }
- // //将分发的lic信息插入lic分发用户表中
- // for _, licInfo := range *LicInfos {
- // for userIdx, userUID := range UserUniqueIDs {
- // //如果lic1为空则报错
- // if licInfo.GenrateInfo.Lic1.String == "" {
- // global.Logger.Errorln("DistributeOALicenseServices : license生成信息为空 ")
- // return errors.New("license生成信息为空"), nil
- // }
- // err = models.InsertlicenseRecordByUserRow(OaRequestId, licInfo.LicInfo.UniqueID.String, userUID, UserAccounts[userIdx], OperatorUniqueID)
- // if err != nil {
- // global.Logger.Errorln("DistributeOALicenseServices: 数据库插入失败: ", err.Error())
- // return err, nil
- // }
- // }
- // }
- // //发送邮件
- // //邮箱不空则发送
- // //将一个申请单的多个license信息用邮箱发送
- // if len(EmailArray) == 0 {
- // return nil, nil
- // }
- // //将licenses里的lic串们打包在zip里
- // // 1. 创建 ZIP 文件并存储在内存中
- // // var buffer bytes.Buffer
- // // zipWriter := zip.NewWriter(&buffer)
- // // for _, lic := range *LicInfos {
- // // // 将数据添加到 ZIP 中
- // // file1, err := zipWriter.Create("file1.txt")
- // // if err != nil {
- // // global.Logger.Errorln(err)
- // // }
- // // _, err = file1.Write(lic)
- // // if err != nil {
- // // global.Logger.Errorln(err)
- // // }
- // // }
- // // file2, err := zipWriter.Create("file2.txt")
- // // if err != nil {
- // // global.Logger.Errorln(err)
- // // }
- // // _, err = file2.Write(data2)
- // // if err != nil {
- // // global.Logger.Errorln(err)
- // // }
- // fmt.Println("EmailArray : ", EmailArray)
- // emails := strings.Join(EmailArray, ",")
- // if !strings.Contains(emails, "@") {
- // return nil, nil
- // }
- // for _, lic := range *LicInfos {
- // if lic.GenrateInfo.Lic1.String == "" {
- // global.Logger.Errorln("DistributeOALicenseServices : license生成信息为空 ")
- // return errors.New("license生成信息为空"), nil
- // }
- // //组装邮件
- // em, err := email.BuildEmail(&lic, EmailArray, lic.GenrateInfo.Lic1.String, lic.GenrateInfo.Lic2.String)
- // if err != nil {
- // global.Logger.Errorln("邮件生成失败", err.Error())
- // return err, nil
- // }
- // //发送邮件
- // err = email.SendEmail(em)
- // if err != nil {
- // global.Logger.Errorln("邮件发送失败", err.Error())
- // return err, nil
- // }
- // //将分发的lic信息插入lic分发邮箱表中
- // err = models.InsertlicenseRecordByEmailRow(OaRequestId, lic.LicInfo.UniqueID.String, emails, OperatorUniqueID)
- // if err != nil {
- // global.Logger.Errorln("数据库插入失败: ", err.Error())
- // return err, nil
- // }
- // }
- return nil, nil
- }
- func DistributeLicenseToUserServices(OperatorUniqueID string, OaRequestId int64, UserUniqueIDs, UserAccounts, UserNames []string) (error, []string) {
- //检测支撑库数据与oa是否一致
- err, checkInfo := CheckOaLicInfoRequest(OaRequestId)
- if err != nil {
- return err, nil
- }
- if checkInfo {
- return errors.Errorf("本地数据与oa数据不一致,请刷新页面"), nil
- }
- //检测OARequest是否以及分发过给用户
- existUsers, err := checkDistributeToUser(OaRequestId, UserUniqueIDs, UserNames)
- if err != nil {
- global.Logger.Errorln("license分发请求检测是否已发放给用户失败 %s", err.Error())
- return err, nil
- }
- //返回以及分发过的用户列表
- if len(existUsers) != 0 {
- return nil, existUsers
- }
- fmt.Println("DistributeOALicenseServices : ")
- //获取一个申请单的多个license信息
- LicInfos, _, err := models.GetOALicenseInfo(1, 1, "", "", "", OaRequestId)
- if err != nil {
- return err, nil
- }
- //将分发的lic信息插入lic分发用户表中
- for _, licInfo := range *LicInfos {
- for userIdx, userUID := range UserUniqueIDs {
- //如果lic1为空则报错
- if licInfo.GenrateInfo.Lic1.String == "" {
- global.Logger.Errorln("DistributeOALicenseServices : license生成信息为空 ")
- return errors.New("license生成信息为空"), nil
- }
- err = models.InsertlicenseRecordByUserRow(OaRequestId, licInfo.LicInfo.UniqueID.String, userUID, UserAccounts[userIdx], OperatorUniqueID)
- if err != nil {
- global.Logger.Errorln("DistributeOALicenseServices: 数据库插入失败: ", err.Error())
- return err, nil
- }
- }
- }
- return nil, nil
- }
- func DistributeLicenseToEmailServices(OperatorUniqueID string, OaRequestId int64, UserUniqueIDs, UserAccounts, UserNames, EmailArray []string) (error, []string) {
- //发送邮件
- //邮箱不空则发送
- //将一个申请单的多个license信息用邮箱发送
- //检测支撑库数据与oa是否一致
- err, checkInfo := CheckOaLicInfoRequest(OaRequestId)
- if err != nil {
- return err, nil
- }
- if checkInfo {
- return errors.Errorf("本地数据与oa数据不一致,请刷新页面"), nil
- }
- if len(EmailArray) == 0 {
- return nil, nil
- }
- //获取一个申请单的多个license信息
- LicInfos, _, err := models.GetOALicenseInfo(1, 1, "", "", "", OaRequestId)
- if err != nil {
- return err, nil
- }
- //将licenses里的lic串们打包在zip里
- //1. 创建 ZIP 文件并存储在内存中
- var buffer bytes.Buffer
- zipWriter := zip.NewWriter(&buffer)
- for i, lic := range *LicInfos {
- ii := i + 1
- num := 1
- filetestName := fmt.Sprintf("%d_%s_license_%djd_%d", ii, lic.LicInfo.OAGLXMName.String, lic.LicInfo.OANodeCount.Int64, num)
- num++
- // 将数据添加到 ZIP 中
- file1, err := zipWriter.Create(fmt.Sprintf(filetestName+"_%s.dat", lic.LicInfo.OAMainMAC.String))
- if err != nil {
- global.Logger.Errorln(err)
- return err, nil
- }
- if lic.GenrateInfo.Lic1.Valid {
- _, err = file1.Write([]byte(lic.GenrateInfo.Lic1.String))
- if err != nil {
- global.Logger.Errorln(err)
- return err, nil
- }
- }
- if lic.GenrateInfo.Lic2.Valid {
- if err != nil {
- global.Logger.Errorln(err)
- return err, nil
- }
- file2, err := zipWriter.Create(fmt.Sprintf(filetestName+"_%s", lic.LicInfo.OASecondMAC.String))
- if err != nil {
- global.Logger.Errorln(err)
- return err, nil
- }
- _, err = file2.Write([]byte(lic.GenrateInfo.Lic2.String))
- if err != nil {
- global.Logger.Errorln(err)
- return err, nil
- }
- }
- }
- // 关闭 zip.Writer
- if err := zipWriter.Close(); err != nil {
- global.Logger.Errorln(err)
- }
- // 将 ZIP 内容转换为 []byte
- zipBytes := buffer.Bytes()
- fmt.Println("EmailArray : ", EmailArray)
- emails := strings.Join(EmailArray, ",")
- if !strings.Contains(emails, "@") {
- return nil, nil
- }
- // if lic.GenrateInfo.Lic1.String == "" {
- // global.Logger.Errorln("DistributeOALicenseServices : license生成信息为空 ")
- // return errors.New("license生成信息为空"), nil
- // }
- lic := &(*LicInfos)[0]
- //组装邮件
- em, err := email.BuildEmail(lic, EmailArray, zipBytes, "")
- if err != nil {
- global.Logger.Errorln("邮件生成失败", err.Error())
- return err, nil
- }
- //发送邮件
- err = email.SendEmail(em)
- if err != nil {
- global.Logger.Errorln("邮件发送失败", err.Error())
- return err, nil
- }
- for _, lic := range *LicInfos {
- //将分发的lic信息插入lic分发邮箱表中
- err = models.InsertlicenseRecordByEmailRow(OaRequestId, lic.LicInfo.UniqueID.String, emails, OperatorUniqueID)
- if err != nil {
- global.Logger.Errorln("数据库插入失败: ", err.Error())
- return err, nil
- }
- }
- // for _, lic := range *LicInfos {
- // if lic.GenrateInfo.Lic1.String == "" {
- // global.Logger.Errorln("DistributeOALicenseServices : license生成信息为空 ")
- // return errors.New("license生成信息为空"), nil
- // }
- // //组装邮件
- // em, err := email.BuildEmail(&lic, EmailArray, lic.GenrateInfo.Lic1.String, lic.GenrateInfo.Lic2.String)
- // if err != nil {
- // global.Logger.Errorln("邮件生成失败", err.Error())
- // return err, nil
- // }
- // //发送邮件
- // err = email.SendEmail(em)
- // if err != nil {
- // global.Logger.Errorln("邮件发送失败", err.Error())
- // return err, nil
- // }
- // //将分发的lic信息插入lic分发邮箱表中
- // err = models.InsertlicenseRecordByEmailRow(OaRequestId, lic.LicInfo.UniqueID.String, emails, OperatorUniqueID)
- // if err != nil {
- // global.Logger.Errorln("数据库插入失败: ", err.Error())
- // return err, nil
- // }
- // }
- return nil, nil
- }
- // 生成license
- func GenerateOALicenseStrServices(request api.GenerateLicenseStrRequest) (error, bool) {
- if request.OARequestId != 0 {
- //一个OARequestId会有多条数据UniqueID
- OALics, _, err := models.GetOALicenseInfo(0, 0, "", "", "", request.OARequestId)
- if err != nil || OALics == nil {
- global.Logger.Errorln("LicenseInfo数据查询失败: ", err.Error())
- return errors.Errorf("LicenseInfo数据查询失败 : %v", err.Error()), false
- }
- //校验license信息是否与oa一致
- var isCheck bool
- for _, license := range *OALics {
- //检测该数据是否与oa库数据库一致 //todo
- isCheckTmp, err := models.CheckLicenseInfoInOADB(&license.LicInfo)
- if err != nil {
- global.Logger.Errorln("LicenseInfo数据对比oa库 校验失败: ", err.Error())
- return errors.Errorf("LicenseInfo数据对比oa库 校验失败 %v", err.Error()), false
- }
- if isCheckTmp {
- global.Logger.Errorf("\nLicenseInfo数据对比oa库 不一致: %v\n", license.LicInfo.UniqueID)
- isCheck = isCheckTmp
- err = models.UpdatelicenseInfoRow(license)
- if err != nil {
- return err, false
- }
- }
- }
- //不一致则返回
- if isCheck {
- return nil, true
- }
- //生成license,已生成的不管
- for _, v := range *OALics {
- if v.GenrateInfo.LicenseFlage.String == "未生成" || v.GenrateInfo.LicenseFlage.String == "已失效" {
- err := generateLicenseStrSub(utils.ToString(v.LicInfo.UniqueID))
- if err != nil {
- global.Logger.Errorf("请联系管理员, LicenseInfo%v生成失败: %v\n", v.LicInfo.UniqueID, err.Error())
- return errors.Errorf("请联系管理员, LicenseInfo%v生成失败: %v\n", v.LicInfo.UniqueID, err.Error()), false
- }
- }
- }
- return nil, false
- }
- return errors.Errorf("License申请单为空"), false
- }
- func generateLicenseStrSub(UniqueID string) error {
- var applications *[]models.OALicenseInfo
- var err error
- if UniqueID != "" {
- applications, _, err = models.GetOALicenseInfo(0, 1, "", UniqueID, "", 0)
- if err != nil {
- global.Logger.Errorln("LicenseInfo数据查询失败: ", err.Error())
- // c.JSON(http.StatusBadRequest, gin.H{"error": fmt.Sprintf("数据查询失败: ", err.Error())})
- return errors.Errorf("LicenseInfo数据查询失败: %v", err.Error())
- }
- }
- //fmt.Printf("applications%#v\n", applications)
- //生成副主节点license
- if applications == nil {
- global.Logger.Errorln("LicenseInfo数据生成失败 ,数据查询为空 ")
- //c.JSON(http.StatusBadRequest, gin.H{"error": fmt.Sprintf("LicenseInfo数据生成失败 ,数据查询为空: ", err.Error())})
- return errors.Errorf("LicenseInfo数据生成失败 ,数据查询为空 ")
- }
- for _, lic := range *applications {
- if !lic.LicInfo.OAMainMAC.Valid {
- return errors.Errorf("LicenseInfo数据生成失败 , %s 有集群 主mac地址缺失 ", lic.LicInfo.OAProductName.String)
- }
- }
- pj := license.ProjectInfo{
- ProjectName: utils.ToString((*applications)[0].LicInfo.OAProductName),
- UserName: utils.ToString((*applications)[0].LicInfo.OAProductVersion),
- UserAddr: "未填写",
- SerialNumber: "未填写",
- }
- ei := license.EnvironmentInfo{
- CpuSN: "未填写",
- BaseboardSN: "未填写",
- MacAddr: utils.ToString((*applications)[0].LicInfo.OAMainMAC),
- DiskID: "未填写",
- IPAddr: "未填写",
- }
- LicType := utils.SwitchLicenseType(utils.ToString((*applications)[0].LicInfo.OAProductVersion))
- lI := license.LicenseInfo{
- GenDate: "2024-07-15",
- ExpireDate: "9999-12-31",
- LicenseType: LicType,
- LicenseVersion: 1,
- HardType: 3,
- }
- //这里调用的是license模块中的生成license的方法
- //res := false
- fmt.Println("res是 : ", global.Cfg.App.IsGenerate)
- if global.Cfg.App.IsGenerate {
- licStr := license.GenerateLicense(pj, ei, lI)
- //生成副主节点license
- if (*applications)[0].LicInfo.OASecondMAC.String != "" {
- var licStr2 []byte
- ei.MacAddr = (*applications)[0].LicInfo.OASecondMAC.String
- licStr2 = license.GenerateLicense(pj, ei, lI)
- err = models.UpdateOALicenseStr(utils.ToString((*applications)[0].LicInfo.UniqueID), licStr, licStr2)
- if err != nil {
- global.Logger.Errorln("LicenseInfo2生成插入失败: ", err.Error())
- // c.JSON(http.StatusBadRequest, gin.H{"error": fmt.Sprintf("数据查询失败: ", err.Error())})
- return errors.Errorf("LicenseInfo2生成插入失败:%s", err.Error())
- }
- } else {
- //插入到数据库
- err = models.UpdateOALicenseStr(utils.ToString((*applications)[0].LicInfo.UniqueID), licStr, nil)
- if err != nil {
- global.Logger.Errorln("LicenseInfo生成插入失败: ", err.Error())
- // c.JSON(http.StatusBadRequest, gin.H{"error": fmt.Sprintf("数据查询失败: ", err.Error())})
- return errors.Errorf("LicenseInfo生成插入失败: %s", err.Error())
- }
- }
- } else {
- if (*applications)[0].LicInfo.OASecondMAC.String != "" {
- // var licStr2 []byte
- // ei.MacAddr = applications[0].SecondaryMasterMacAddress
- // licStr2 = license.GenerateLicense(pj, ei, lI)
- err = models.UpdateOALicenseStr(utils.ToString((*applications)[0].LicInfo.UniqueID), []byte("b4j6z4rE2IfG1av0wIPT7YnvyGZFHxwIBikMGjgCLQILR0xsT1NHiuzoi+Dqq+bmiNDEiuPyitDVgdvlRmYbFAk+MAAGASlPTkdMbE9"), []byte("b4j6z4rE2IfG1av0wIPT7YnvyGZFHxwIBikMGjgCLQILR0xsT1NHiuzoi+Dqq+bmiNDEiuPyitDVgdvlRmYbFAk+MAAGASlPTkdMbE9"))
- if err != nil {
- global.Logger.Errorln("LicenseInfo生成插入失败: ", err.Error())
- // c.JSON(http.StatusBadRequest, gin.H{"error": fmt.Sprintf("数据查询失败: ", err.Error())})
- return errors.Errorf("LicenseInfo生成插入失败:: ", err.Error())
- }
- } else {
- //fmt.Println("licStr licStr2", licStr, licStr2)
- //插入到数据库
- err = models.UpdateOALicenseStr(utils.ToString((*applications)[0].LicInfo.UniqueID), []byte("b4j6z4rE2IfG1av0wIPT7YnvyGZFHxwIBikMGjgCLQILR0xsT1NHiuzoi+Dqq+bmiNDEiuPyitDVgdvlRmYbFAk+MAAGASlPTkdMbE9"), nil)
- if err != nil {
- global.Logger.Errorln("LicenseInfo2生成插入失败: ", err.Error())
- // c.JSON(http.StatusBadRequest, gin.H{"error": fmt.Sprintf("数据查询失败: ", err.Error())})
- return errors.Errorf("LicenseInfo2生成插入失败:: ", err.Error())
- }
- }
- }
- //---------------------
- return nil
- }
|