license_cache.go 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257
  1. package license_cache
  2. // import (
  3. // "database/sql"
  4. // "fmt"
  5. // "sort"
  6. // "sync"
  7. // "time"
  8. // )
  9. // type CacheLicenseInfo struct {
  10. // ID sql.NullInt32 `json:"id"`
  11. // UniqueID sql.NullString `json:"unique_id"`
  12. // OARequestID sql.NullInt64 `json:"oa_request_id"`
  13. // OARequestName sql.NullString `json:"oa_request_name"`
  14. // OARequestNameNew sql.NullString `json:"oa_request_name_new"`
  15. // OARequestNameHTMLNew sql.NullString `json:"oa_request_name_html_new"`
  16. // OAGLXMId sql.NullInt64 `json:"oa_glxmid"`
  17. // OAGLXMName sql.NullString `json:"oa_glxmname"`
  18. // OASQSJ sql.NullTime `json:"oa_sqsj"`
  19. // OASalespersonName sql.NullString `json:"oa_salesperson_name"`
  20. // OAXSJSYX sql.NullString `json:"oa_xsjsyx"`
  21. // OAOperationsPersonName sql.NullString `json:"oa_operations_person_name"`
  22. // OAJFJSYX sql.NullString `json:"oa_jfjsyx"`
  23. // OASYDW sql.NullString `json:"oa_sydw"`
  24. // OAXMXXMS sql.NullString `json:"oa_xmxxms"`
  25. // OAJDS sql.NullInt64 `json:"oa_jds"`
  26. // OANodeCount sql.NullInt64 `json:"oa_node_count"`
  27. // OAProductCode sql.NullString `json:"oa_product_code"`
  28. // OAProductName sql.NullString `json:"oa_product_name"`
  29. // OAProductVersion sql.NullString `json:"oa_product_version"`
  30. // OACPU sql.NullString `json:"oa_cpu"`
  31. // OAOperatingSystem sql.NullString `json:"oa_operating_system"`
  32. // OAMainMAC sql.NullString `json:"oa_main_mac"`
  33. // OASecondMAC sql.NullString `json:"oa_second_mac"`
  34. // OACreationDate sql.NullString `json:"oa_creation_date"`
  35. // OACreationTime sql.NullString `json:"oa_creation_time"`
  36. // OALastOperateDate sql.NullString `json:"oa_last_operate_date"`
  37. // OALastOperateTime sql.NullString `json:"oa_last_operate_time"`
  38. // CaptureTime sql.NullTime `json:"capture_time"`
  39. // DelTime sql.NullTime `json:"del_time"`
  40. // LastOperateTime sql.NullTime `json:"last_operate_time"`
  41. // // Fields from License_generate_Info table
  42. // LicenseID sql.NullInt32 `json:"license_id"`
  43. // LicenseUniqueID sql.NullString `json:"license_unique_id"`
  44. // LicenseFlage sql.NullString `json:"license_flage"`
  45. // Lic1 sql.NullString `json:"lic1"`
  46. // Lic2 sql.NullString `json:"lic2"`
  47. // CreatorGenerate sql.NullString `json:"creator_generate"`
  48. // }
  49. // type Cache struct {
  50. // mutex sync.RWMutex
  51. // data map[int64][]CacheLicenseInfo
  52. // total int
  53. // lastLoad time.Time
  54. // }
  55. // // NewCache 初始化缓存
  56. // func NewCache() *Cache {
  57. // return &Cache{
  58. // data: make(map[int64][]CacheLicenseInfo),
  59. // total: 0,
  60. // lastLoad: time.Now(),
  61. // }
  62. // }
  63. // func (c *Cache) GetTotal() int {
  64. // return c.total
  65. // }
  66. // func (c *Cache) GetData() map[int64][]CacheLicenseInfo {
  67. // return c.data
  68. // }
  69. // // 刷新缓存
  70. // func (c *Cache) RefreshCache(db *sql.DB, startTime, endTime time.Time, offset, limit int) error {
  71. // c.data = make(map[int64][]CacheLicenseInfo)
  72. // if err := c.LoadDataFromDB(db, startTime, endTime, offset, limit); err != nil {
  73. // return err
  74. // }
  75. // return nil
  76. // }
  77. // // LoadDataFromDB 从数据库加载数据
  78. // /* SELECT
  79. // la.ID, la.Unique_ID, la.OA_REQUESTID, la.OA_REQUESTNAME, la.OA_REQUESTNAMENEW,
  80. // la.OA_REQUESTNAMEHTMLNEW,
  81. // la.OA_GLXMID ,la.OA_GLXMNAME,
  82. // la.OA_SQSJ, la.OA_SALESPERSONNAME, la.OA_XSJSYX,
  83. // la.OA_OPERATIONSPERSONNAME, la.OA_JFJSYX, la.OA_SYDW, la.OA_XMXXMS, la.OA_JDS,
  84. // la.OA_NODECOUNT, la.OA_PRODUCTCODE, la.OA_PRODUCTNAME, la.OA_PRODUCTVERSION,
  85. // la.OA_CPU, la.OA_OPERATINGSYSTEM, la.OA_MAINMAC, la.OA_SECONDMAC, la.OA_CREATIONDATE,
  86. // la.OA_CREATIONTIME, la.OA_LASTOPERATEDATE, la.OA_LASTOPERATETIME, la.capture_Time,
  87. // la.del_Time, la.LAST_OPERATE_TIME,
  88. // li.ID AS License_ID, li.License_UniqueID, li.License_Flage, li.lic1, li.lic2, li.Creator_generate
  89. // FROM
  90. // target_OA_license la
  91. // INNER JOIN
  92. // License_generate_Info li
  93. // ON
  94. // la.Unique_ID = li.License_UniqueID
  95. // WHERE TO_TIMESTAMP(la.OA_CREATIONDATE || ' ' || la.OA_CREATIONTIME, 'YYYY-MM-DD HH24:MI:SS') > TO_TIMESTAMP(?, 'YYYY-MM-DD HH24:MI:SS')
  96. // and la.del_Time IS NULL
  97. // LIMIT ? OFFSET ?*/
  98. // func (c *Cache) LoadDataFromDB(db *sql.DB, startTime, endTime time.Time, offset, limit int) error {
  99. // c.mutex.Lock()
  100. // defer c.mutex.Unlock()
  101. // query := `
  102. // SELECT la.ID, la.Unique_ID, la.OA_REQUESTID, la.OA_REQUESTNAME, la.OA_REQUESTNAMENEW,
  103. // la.OA_REQUESTNAMEHTMLNEW,
  104. // la.OA_GLXMID ,la.OA_GLXMNAME,
  105. // la.OA_SQSJ, la.OA_SALESPERSONNAME, la.OA_XSJSYX,
  106. // la.OA_OPERATIONSPERSONNAME, la.OA_JFJSYX, la.OA_SYDW, la.OA_XMXXMS, la.OA_JDS,
  107. // la.OA_NODECOUNT, la.OA_PRODUCTCODE, la.OA_PRODUCTNAME, la.OA_PRODUCTVERSION,
  108. // la.OA_CPU, la.OA_OPERATINGSYSTEM, la.OA_MAINMAC, la.OA_SECONDMAC, la.OA_CREATIONDATE,
  109. // la.OA_CREATIONTIME, la.OA_LASTOPERATEDATE, la.OA_LASTOPERATETIME, la.capture_Time,
  110. // la.del_Time, la.LAST_OPERATE_TIME,
  111. // li.ID AS License_ID, li.License_UniqueID, li.License_Flage, li.lic1, li.lic2, li.Creator_generate
  112. // FROM SYSDBA.TARGET_OA_LICENSE la
  113. // INNER JOIN
  114. // License_generate_Info li
  115. // ON
  116. // la.Unique_ID = li.License_UniqueID
  117. // WHERE OA_REQUESTID IN(SELECT OA_REQUESTID FROM (SELECT DISTINCT OA_REQUESTID FROM TARGET_OA_LICENSE) a
  118. // WHERE ROWNUM BETWEEN ? AND ?)
  119. // AND la.del_Time IS NULL
  120. // `
  121. // rows, err := db.Query(query, offset, limit)
  122. // if err != nil {
  123. // return err
  124. // }
  125. // defer rows.Close()
  126. // for rows.Next() {
  127. // var record CacheLicenseInfo
  128. // err := rows.Scan(
  129. // &record.ID,
  130. // &record.UniqueID,
  131. // &record.OARequestID,
  132. // &record.OARequestName,
  133. // &record.OARequestNameNew,
  134. // &record.OARequestNameHTMLNew,
  135. // &record.OAGLXMId,
  136. // &record.OAGLXMName,
  137. // &record.OASQSJ,
  138. // &record.OASalespersonName,
  139. // &record.OAXSJSYX,
  140. // &record.OAOperationsPersonName,
  141. // &record.OAJFJSYX,
  142. // &record.OASYDW,
  143. // &record.OAXMXXMS,
  144. // &record.OAJDS,
  145. // &record.OANodeCount,
  146. // &record.OAProductCode,
  147. // &record.OAProductName,
  148. // &record.OAProductVersion,
  149. // &record.OACPU,
  150. // &record.OAOperatingSystem,
  151. // &record.OAMainMAC,
  152. // &record.OASecondMAC,
  153. // &record.OACreationDate,
  154. // &record.OACreationTime,
  155. // &record.OALastOperateDate,
  156. // &record.OALastOperateTime,
  157. // &record.CaptureTime,
  158. // &record.DelTime,
  159. // &record.LastOperateTime,
  160. // // Fields from License_generate_Info table
  161. // &record.LicenseID,
  162. // &record.LicenseUniqueID,
  163. // &record.LicenseFlage,
  164. // &record.Lic1,
  165. // &record.Lic2,
  166. // &record.CreatorGenerate,
  167. // )
  168. // if err != nil {
  169. // return err
  170. // }
  171. // oaRequestID := record.OARequestID.Int64
  172. // c.data[oaRequestID] = append(c.data[oaRequestID], record)
  173. // c.total++
  174. // }
  175. // fmt.Println("data records loaded:", c.data)
  176. // c.lastLoad = time.Now()
  177. // return nil
  178. // }
  179. // // GetPaginatedData 获取分页数据并按 OALastOperateDate 和 OALastOperateTime 排序
  180. // func (c *Cache) GetPaginatedData(page, pageSize int) (map[int64][]CacheLicenseInfo, error) {
  181. // c.mutex.RLock()
  182. // defer c.mutex.RUnlock()
  183. // if c.total == 0 {
  184. // return nil, fmt.Errorf("cache is empty")
  185. // }
  186. // allRecords := make([]CacheLicenseInfo, 0, c.total)
  187. // for _, records := range c.data {
  188. // allRecords = append(allRecords, records...)
  189. // }
  190. // sort.SliceStable(allRecords, func(i, j int) bool {
  191. // if allRecords[i].OALastOperateDate.String != allRecords[j].OALastOperateDate.String {
  192. // return allRecords[i].OALastOperateDate.String < allRecords[j].OALastOperateDate.String
  193. // }
  194. // return allRecords[i].OALastOperateTime.String < allRecords[j].OALastOperateTime.String
  195. // })
  196. // start := (page - 1) * pageSize
  197. // if start >= len(allRecords) {
  198. // return nil, fmt.Errorf("page out of range")
  199. // }
  200. // end := start + pageSize
  201. // if end > len(allRecords) {
  202. // end = len(allRecords)
  203. // }
  204. // result := [][]CacheLicenseInfo{}
  205. // groupMap := make(map[int64][]CacheLicenseInfo)
  206. // for _, record := range allRecords[start:end] {
  207. // groupMap[record.OARequestID.Int64] = append(groupMap[record.OARequestID.Int64], record)
  208. // }
  209. // for _, group := range groupMap {
  210. // result = append(result, group)
  211. // }
  212. // return groupMap, nil
  213. // }
  214. // // EnsureDataAvailability 确保缓存中有足够的数据
  215. // func (c *Cache) EnsureDataAvailability(db *sql.DB, page, pageSize int, startTime, endTime time.Time) error {
  216. // c.mutex.RLock()
  217. // needLoad := (page-1)*pageSize >= c.total
  218. // c.mutex.RUnlock()
  219. // if needLoad {
  220. // offset := c.total
  221. // limit := pageSize * 2
  222. // err := c.LoadDataFromDB(db, startTime, endTime, offset, limit)
  223. // if err != nil {
  224. // return err
  225. // }
  226. // }
  227. // return nil
  228. // }