OALicenseInfo_services.go 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464
  1. package services
  2. import (
  3. "archive/zip"
  4. "bytes"
  5. "fmt"
  6. "strings"
  7. "xugu_license/internal/api"
  8. "xugu_license/internal/global"
  9. "xugu_license/internal/models"
  10. "xugu_license/internal/module/email"
  11. "xugu_license/internal/module/license"
  12. "xugu_license/internal/utils"
  13. "github.com/pkg/errors"
  14. )
  15. func DistributeOALicenseServices(OperatorUniqueID, OaRequestId string, UserUniqueIDs, UserAccounts, UserNames, EmailArray []string) (error, []string) {
  16. // //检测OARequest是否以及分发过给用户
  17. // existUsers, err := checkDistributeToUser(OaRequestId, UserUniqueIDs, UserNames)
  18. // if err != nil {
  19. // global.Logger.Errorln("license分发请求检测是否已发放给用户失败 %s", err.Error())
  20. // return err, nil
  21. // }
  22. // //返回以及分发过的用户列表
  23. // if len(existUsers) != 0 {
  24. // return nil, existUsers
  25. // }
  26. // fmt.Println("DistributeOALicenseServices : ")
  27. // //获取一个申请单的多个license信息
  28. // LicInfos, _, err := models.GetOALicenseInfo(1, 1, "", "", "", OaRequestId)
  29. // if err != nil {
  30. // return err, nil
  31. // }
  32. // //将分发的lic信息插入lic分发用户表中
  33. // for _, licInfo := range *LicInfos {
  34. // for userIdx, userUID := range UserUniqueIDs {
  35. // //如果lic1为空则报错
  36. // if licInfo.GenrateInfo.Lic1.String == "" {
  37. // global.Logger.Errorln("DistributeOALicenseServices : license生成信息为空 ")
  38. // return errors.New("license生成信息为空"), nil
  39. // }
  40. // err = models.InsertlicenseRecordByUserRow(OaRequestId, licInfo.LicInfo.UniqueID.String, userUID, UserAccounts[userIdx], OperatorUniqueID)
  41. // if err != nil {
  42. // global.Logger.Errorln("DistributeOALicenseServices: 数据库插入失败: ", err.Error())
  43. // return err, nil
  44. // }
  45. // }
  46. // }
  47. // //发送邮件
  48. // //邮箱不空则发送
  49. // //将一个申请单的多个license信息用邮箱发送
  50. // if len(EmailArray) == 0 {
  51. // return nil, nil
  52. // }
  53. // //将licenses里的lic串们打包在zip里
  54. // // 1. 创建 ZIP 文件并存储在内存中
  55. // // var buffer bytes.Buffer
  56. // // zipWriter := zip.NewWriter(&buffer)
  57. // // for _, lic := range *LicInfos {
  58. // // // 将数据添加到 ZIP 中
  59. // // file1, err := zipWriter.Create("file1.txt")
  60. // // if err != nil {
  61. // // global.Logger.Errorln(err)
  62. // // }
  63. // // _, err = file1.Write(lic)
  64. // // if err != nil {
  65. // // global.Logger.Errorln(err)
  66. // // }
  67. // // }
  68. // // file2, err := zipWriter.Create("file2.txt")
  69. // // if err != nil {
  70. // // global.Logger.Errorln(err)
  71. // // }
  72. // // _, err = file2.Write(data2)
  73. // // if err != nil {
  74. // // global.Logger.Errorln(err)
  75. // // }
  76. // fmt.Println("EmailArray : ", EmailArray)
  77. // emails := strings.Join(EmailArray, ",")
  78. // if !strings.Contains(emails, "@") {
  79. // return nil, nil
  80. // }
  81. // for _, lic := range *LicInfos {
  82. // if lic.GenrateInfo.Lic1.String == "" {
  83. // global.Logger.Errorln("DistributeOALicenseServices : license生成信息为空 ")
  84. // return errors.New("license生成信息为空"), nil
  85. // }
  86. // //组装邮件
  87. // em, err := email.BuildEmail(&lic, EmailArray, lic.GenrateInfo.Lic1.String, lic.GenrateInfo.Lic2.String)
  88. // if err != nil {
  89. // global.Logger.Errorln("邮件生成失败", err.Error())
  90. // return err, nil
  91. // }
  92. // //发送邮件
  93. // err = email.SendEmail(em)
  94. // if err != nil {
  95. // global.Logger.Errorln("邮件发送失败", err.Error())
  96. // return err, nil
  97. // }
  98. // //将分发的lic信息插入lic分发邮箱表中
  99. // err = models.InsertlicenseRecordByEmailRow(OaRequestId, lic.LicInfo.UniqueID.String, emails, OperatorUniqueID)
  100. // if err != nil {
  101. // global.Logger.Errorln("数据库插入失败: ", err.Error())
  102. // return err, nil
  103. // }
  104. // }
  105. return nil, nil
  106. }
  107. func DistributeLicenseToUserServices(OperatorUniqueID string, OaRequestId int64, UserUniqueIDs, UserAccounts, UserNames []string) (error, []string) {
  108. //检测支撑库数据与oa是否一致
  109. err, checkInfo := CheckOaLicInfoRequest(OaRequestId)
  110. if err != nil {
  111. return err, nil
  112. }
  113. if checkInfo {
  114. return errors.Errorf("本地数据与oa数据不一致,请刷新页面"), nil
  115. }
  116. //检测OARequest是否以及分发过给用户
  117. existUsers, err := checkDistributeToUser(OaRequestId, UserUniqueIDs, UserNames)
  118. if err != nil {
  119. global.Logger.Errorln("license分发请求检测是否已发放给用户失败 %s", err.Error())
  120. return err, nil
  121. }
  122. //返回以及分发过的用户列表
  123. if len(existUsers) != 0 {
  124. return nil, existUsers
  125. }
  126. fmt.Println("DistributeOALicenseServices : ")
  127. //获取一个申请单的多个license信息
  128. LicInfos, _, err := models.GetOALicenseInfo(1, 1, "", "", "", OaRequestId)
  129. if err != nil {
  130. return err, nil
  131. }
  132. //将分发的lic信息插入lic分发用户表中
  133. for _, licInfo := range *LicInfos {
  134. for userIdx, userUID := range UserUniqueIDs {
  135. //如果lic1为空则报错
  136. if licInfo.GenrateInfo.Lic1.String == "" {
  137. global.Logger.Errorln("DistributeOALicenseServices : license生成信息为空 ")
  138. return errors.New("license生成信息为空"), nil
  139. }
  140. err = models.InsertlicenseRecordByUserRow(OaRequestId, licInfo.LicInfo.UniqueID.String, userUID, UserAccounts[userIdx], OperatorUniqueID)
  141. if err != nil {
  142. global.Logger.Errorln("DistributeOALicenseServices: 数据库插入失败: ", err.Error())
  143. return err, nil
  144. }
  145. }
  146. }
  147. return nil, nil
  148. }
  149. func DistributeLicenseToEmailServices(OperatorUniqueID string, OaRequestId int64, UserUniqueIDs, UserAccounts, UserNames, EmailArray []string) (error, []string) {
  150. //发送邮件
  151. //邮箱不空则发送
  152. //将一个申请单的多个license信息用邮箱发送
  153. //检测支撑库数据与oa是否一致
  154. err, checkInfo := CheckOaLicInfoRequest(OaRequestId)
  155. if err != nil {
  156. return err, nil
  157. }
  158. if checkInfo {
  159. return errors.Errorf("本地数据与oa数据不一致,请刷新页面"), nil
  160. }
  161. if len(EmailArray) == 0 {
  162. return nil, nil
  163. }
  164. //获取一个申请单的多个license信息
  165. LicInfos, _, err := models.GetOALicenseInfo(1, 1, "", "", "", OaRequestId)
  166. if err != nil {
  167. return err, nil
  168. }
  169. //将licenses里的lic串们打包在zip里
  170. //1. 创建 ZIP 文件并存储在内存中
  171. var buffer bytes.Buffer
  172. zipWriter := zip.NewWriter(&buffer)
  173. for i, lic := range *LicInfos {
  174. ii := i + 1
  175. num := 1
  176. filetestName := fmt.Sprintf("%d_%s_license_%djd_%d", ii, lic.LicInfo.OAGLXMName.String, lic.LicInfo.OANodeCount.Int64, num)
  177. num++
  178. // 将数据添加到 ZIP 中
  179. file1, err := zipWriter.Create(fmt.Sprintf(filetestName+"_%s.dat", lic.LicInfo.OAMainMAC.String))
  180. if err != nil {
  181. global.Logger.Errorln(err)
  182. return err, nil
  183. }
  184. if lic.GenrateInfo.Lic1.Valid {
  185. _, err = file1.Write([]byte(lic.GenrateInfo.Lic1.String))
  186. if err != nil {
  187. global.Logger.Errorln(err)
  188. return err, nil
  189. }
  190. }
  191. if lic.GenrateInfo.Lic2.Valid {
  192. if err != nil {
  193. global.Logger.Errorln(err)
  194. return err, nil
  195. }
  196. file2, err := zipWriter.Create(fmt.Sprintf(filetestName+"_%s", lic.LicInfo.OASecondMAC.String))
  197. if err != nil {
  198. global.Logger.Errorln(err)
  199. return err, nil
  200. }
  201. _, err = file2.Write([]byte(lic.GenrateInfo.Lic2.String))
  202. if err != nil {
  203. global.Logger.Errorln(err)
  204. return err, nil
  205. }
  206. }
  207. }
  208. // 关闭 zip.Writer
  209. if err := zipWriter.Close(); err != nil {
  210. global.Logger.Errorln(err)
  211. }
  212. // 将 ZIP 内容转换为 []byte
  213. zipBytes := buffer.Bytes()
  214. fmt.Println("EmailArray : ", EmailArray)
  215. emails := strings.Join(EmailArray, ",")
  216. if !strings.Contains(emails, "@") {
  217. return nil, nil
  218. }
  219. // if lic.GenrateInfo.Lic1.String == "" {
  220. // global.Logger.Errorln("DistributeOALicenseServices : license生成信息为空 ")
  221. // return errors.New("license生成信息为空"), nil
  222. // }
  223. lic := &(*LicInfos)[0]
  224. //组装邮件
  225. em, err := email.BuildEmail(lic, EmailArray, zipBytes, "")
  226. if err != nil {
  227. global.Logger.Errorln("邮件生成失败", err.Error())
  228. return err, nil
  229. }
  230. //发送邮件
  231. err = email.SendEmail(em)
  232. if err != nil {
  233. global.Logger.Errorln("邮件发送失败", err.Error())
  234. return err, nil
  235. }
  236. for _, lic := range *LicInfos {
  237. //将分发的lic信息插入lic分发邮箱表中
  238. err = models.InsertlicenseRecordByEmailRow(OaRequestId, lic.LicInfo.UniqueID.String, emails, OperatorUniqueID)
  239. if err != nil {
  240. global.Logger.Errorln("数据库插入失败: ", err.Error())
  241. return err, nil
  242. }
  243. }
  244. // for _, lic := range *LicInfos {
  245. // if lic.GenrateInfo.Lic1.String == "" {
  246. // global.Logger.Errorln("DistributeOALicenseServices : license生成信息为空 ")
  247. // return errors.New("license生成信息为空"), nil
  248. // }
  249. // //组装邮件
  250. // em, err := email.BuildEmail(&lic, EmailArray, lic.GenrateInfo.Lic1.String, lic.GenrateInfo.Lic2.String)
  251. // if err != nil {
  252. // global.Logger.Errorln("邮件生成失败", err.Error())
  253. // return err, nil
  254. // }
  255. // //发送邮件
  256. // err = email.SendEmail(em)
  257. // if err != nil {
  258. // global.Logger.Errorln("邮件发送失败", err.Error())
  259. // return err, nil
  260. // }
  261. // //将分发的lic信息插入lic分发邮箱表中
  262. // err = models.InsertlicenseRecordByEmailRow(OaRequestId, lic.LicInfo.UniqueID.String, emails, OperatorUniqueID)
  263. // if err != nil {
  264. // global.Logger.Errorln("数据库插入失败: ", err.Error())
  265. // return err, nil
  266. // }
  267. // }
  268. return nil, nil
  269. }
  270. // 生成license
  271. func GenerateOALicenseStrServices(request api.GenerateLicenseStrRequest) (error, bool) {
  272. if request.OARequestId != 0 {
  273. //一个OARequestId会有多条数据UniqueID
  274. OALics, _, err := models.GetOALicenseInfo(0, 0, "", "", "", request.OARequestId)
  275. if err != nil || OALics == nil {
  276. global.Logger.Errorln("LicenseInfo数据查询失败: ", err.Error())
  277. return errors.Errorf("LicenseInfo数据查询失败 : %v", err.Error()), false
  278. }
  279. //校验license信息是否与oa一致
  280. var isCheck bool
  281. for _, license := range *OALics {
  282. //检测该数据是否与oa库数据库一致 //todo
  283. isCheckTmp, err := models.CheckLicenseInfoInOADB(&license.LicInfo)
  284. if err != nil {
  285. global.Logger.Errorln("LicenseInfo数据对比oa库 校验失败: ", err.Error())
  286. return errors.Errorf("LicenseInfo数据对比oa库 校验失败 %v", err.Error()), false
  287. }
  288. if isCheckTmp {
  289. global.Logger.Errorf("\nLicenseInfo数据对比oa库 不一致: %v\n", license.LicInfo.UniqueID)
  290. isCheck = isCheckTmp
  291. err = models.UpdatelicenseInfoRow(license)
  292. if err != nil {
  293. return err, false
  294. }
  295. }
  296. }
  297. //不一致则返回
  298. if isCheck {
  299. return nil, true
  300. }
  301. //生成license,已生成的不管
  302. for _, v := range *OALics {
  303. if v.GenrateInfo.LicenseFlage.String == "未生成" || v.GenrateInfo.LicenseFlage.String == "已失效" {
  304. err := generateLicenseStrSub(utils.ToString(v.LicInfo.UniqueID))
  305. if err != nil {
  306. global.Logger.Errorf("请联系管理员, LicenseInfo%v生成失败: %v\n", v.LicInfo.UniqueID, err.Error())
  307. return errors.Errorf("请联系管理员, LicenseInfo%v生成失败: %v\n", v.LicInfo.UniqueID, err.Error()), false
  308. }
  309. }
  310. }
  311. return nil, false
  312. }
  313. return errors.Errorf("License申请单为空"), false
  314. }
  315. func generateLicenseStrSub(UniqueID string) error {
  316. var applications *[]models.OALicenseInfo
  317. var err error
  318. if UniqueID != "" {
  319. applications, _, err = models.GetOALicenseInfo(0, 1, "", UniqueID, "", 0)
  320. if err != nil {
  321. global.Logger.Errorln("LicenseInfo数据查询失败: ", err.Error())
  322. // c.JSON(http.StatusBadRequest, gin.H{"error": fmt.Sprintf("数据查询失败: ", err.Error())})
  323. return errors.Errorf("LicenseInfo数据查询失败: %v", err.Error())
  324. }
  325. }
  326. //fmt.Printf("applications%#v\n", applications)
  327. //生成副主节点license
  328. if applications == nil {
  329. global.Logger.Errorln("LicenseInfo数据生成失败 ,数据查询为空 ")
  330. //c.JSON(http.StatusBadRequest, gin.H{"error": fmt.Sprintf("LicenseInfo数据生成失败 ,数据查询为空: ", err.Error())})
  331. return errors.Errorf("LicenseInfo数据生成失败 ,数据查询为空 ")
  332. }
  333. for _, lic := range *applications {
  334. if !lic.LicInfo.OAMainMAC.Valid {
  335. return errors.Errorf("LicenseInfo数据生成失败 , %s 有集群 主mac地址缺失 ", lic.LicInfo.OAProductName.String)
  336. }
  337. }
  338. pj := license.ProjectInfo{
  339. ProjectName: utils.ToString((*applications)[0].LicInfo.OAProductName),
  340. UserName: utils.ToString((*applications)[0].LicInfo.OAProductVersion),
  341. UserAddr: "未填写",
  342. SerialNumber: "未填写",
  343. }
  344. ei := license.EnvironmentInfo{
  345. CpuSN: "未填写",
  346. BaseboardSN: "未填写",
  347. MacAddr: utils.ToString((*applications)[0].LicInfo.OAMainMAC),
  348. DiskID: "未填写",
  349. IPAddr: "未填写",
  350. }
  351. LicType := utils.SwitchLicenseType(utils.ToString((*applications)[0].LicInfo.OAProductVersion))
  352. lI := license.LicenseInfo{
  353. GenDate: "2024-07-15",
  354. ExpireDate: "9999-12-31",
  355. LicenseType: LicType,
  356. LicenseVersion: 1,
  357. HardType: 3,
  358. }
  359. //这里调用的是license模块中的生成license的方法
  360. //res := false
  361. fmt.Println("res是 : ", global.Cfg.App.IsGenerate)
  362. if global.Cfg.App.IsGenerate {
  363. licStr := license.GenerateLicense(pj, ei, lI)
  364. //生成副主节点license
  365. if (*applications)[0].LicInfo.OASecondMAC.String != "" {
  366. var licStr2 []byte
  367. ei.MacAddr = (*applications)[0].LicInfo.OASecondMAC.String
  368. licStr2 = license.GenerateLicense(pj, ei, lI)
  369. err = models.UpdateOALicenseStr(utils.ToString((*applications)[0].LicInfo.UniqueID), licStr, licStr2)
  370. if err != nil {
  371. global.Logger.Errorln("LicenseInfo2生成插入失败: ", err.Error())
  372. // c.JSON(http.StatusBadRequest, gin.H{"error": fmt.Sprintf("数据查询失败: ", err.Error())})
  373. return errors.Errorf("LicenseInfo2生成插入失败:%s", err.Error())
  374. }
  375. } else {
  376. //插入到数据库
  377. err = models.UpdateOALicenseStr(utils.ToString((*applications)[0].LicInfo.UniqueID), licStr, nil)
  378. if err != nil {
  379. global.Logger.Errorln("LicenseInfo生成插入失败: ", err.Error())
  380. // c.JSON(http.StatusBadRequest, gin.H{"error": fmt.Sprintf("数据查询失败: ", err.Error())})
  381. return errors.Errorf("LicenseInfo生成插入失败: %s", err.Error())
  382. }
  383. }
  384. } else {
  385. if (*applications)[0].LicInfo.OASecondMAC.String != "" {
  386. // var licStr2 []byte
  387. // ei.MacAddr = applications[0].SecondaryMasterMacAddress
  388. // licStr2 = license.GenerateLicense(pj, ei, lI)
  389. err = models.UpdateOALicenseStr(utils.ToString((*applications)[0].LicInfo.UniqueID), []byte("b4j6z4rE2IfG1av0wIPT7YnvyGZFHxwIBikMGjgCLQILR0xsT1NHiuzoi+Dqq+bmiNDEiuPyitDVgdvlRmYbFAk+MAAGASlPTkdMbE9"), []byte("b4j6z4rE2IfG1av0wIPT7YnvyGZFHxwIBikMGjgCLQILR0xsT1NHiuzoi+Dqq+bmiNDEiuPyitDVgdvlRmYbFAk+MAAGASlPTkdMbE9"))
  390. if err != nil {
  391. global.Logger.Errorln("LicenseInfo生成插入失败: ", err.Error())
  392. // c.JSON(http.StatusBadRequest, gin.H{"error": fmt.Sprintf("数据查询失败: ", err.Error())})
  393. return errors.Errorf("LicenseInfo生成插入失败:: ", err.Error())
  394. }
  395. } else {
  396. //fmt.Println("licStr licStr2", licStr, licStr2)
  397. //插入到数据库
  398. err = models.UpdateOALicenseStr(utils.ToString((*applications)[0].LicInfo.UniqueID), []byte("b4j6z4rE2IfG1av0wIPT7YnvyGZFHxwIBikMGjgCLQILR0xsT1NHiuzoi+Dqq+bmiNDEiuPyitDVgdvlRmYbFAk+MAAGASlPTkdMbE9"), nil)
  399. if err != nil {
  400. global.Logger.Errorln("LicenseInfo2生成插入失败: ", err.Error())
  401. // c.JSON(http.StatusBadRequest, gin.H{"error": fmt.Sprintf("数据查询失败: ", err.Error())})
  402. return errors.Errorf("LicenseInfo2生成插入失败:: ", err.Error())
  403. }
  404. }
  405. }
  406. //---------------------
  407. return nil
  408. }