package license_cache // import ( // "database/sql" // "fmt" // "sort" // "sync" // "time" // ) // type CacheLicenseInfo struct { // ID sql.NullInt32 `json:"id"` // UniqueID sql.NullString `json:"unique_id"` // OARequestID sql.NullInt64 `json:"oa_request_id"` // OARequestName sql.NullString `json:"oa_request_name"` // OARequestNameNew sql.NullString `json:"oa_request_name_new"` // OARequestNameHTMLNew sql.NullString `json:"oa_request_name_html_new"` // OAGLXMId sql.NullInt64 `json:"oa_glxmid"` // OAGLXMName sql.NullString `json:"oa_glxmname"` // OASQSJ sql.NullTime `json:"oa_sqsj"` // OASalespersonName sql.NullString `json:"oa_salesperson_name"` // OAXSJSYX sql.NullString `json:"oa_xsjsyx"` // OAOperationsPersonName sql.NullString `json:"oa_operations_person_name"` // OAJFJSYX sql.NullString `json:"oa_jfjsyx"` // OASYDW sql.NullString `json:"oa_sydw"` // OAXMXXMS sql.NullString `json:"oa_xmxxms"` // OAJDS sql.NullInt64 `json:"oa_jds"` // OANodeCount sql.NullInt64 `json:"oa_node_count"` // OAProductCode sql.NullString `json:"oa_product_code"` // OAProductName sql.NullString `json:"oa_product_name"` // OAProductVersion sql.NullString `json:"oa_product_version"` // OACPU sql.NullString `json:"oa_cpu"` // OAOperatingSystem sql.NullString `json:"oa_operating_system"` // OAMainMAC sql.NullString `json:"oa_main_mac"` // OASecondMAC sql.NullString `json:"oa_second_mac"` // OACreationDate sql.NullString `json:"oa_creation_date"` // OACreationTime sql.NullString `json:"oa_creation_time"` // OALastOperateDate sql.NullString `json:"oa_last_operate_date"` // OALastOperateTime sql.NullString `json:"oa_last_operate_time"` // CaptureTime sql.NullTime `json:"capture_time"` // DelTime sql.NullTime `json:"del_time"` // LastOperateTime sql.NullTime `json:"last_operate_time"` // // Fields from License_generate_Info table // LicenseID sql.NullInt32 `json:"license_id"` // LicenseUniqueID sql.NullString `json:"license_unique_id"` // LicenseFlage sql.NullString `json:"license_flage"` // Lic1 sql.NullString `json:"lic1"` // Lic2 sql.NullString `json:"lic2"` // CreatorGenerate sql.NullString `json:"creator_generate"` // } // type Cache struct { // mutex sync.RWMutex // data map[int64][]CacheLicenseInfo // total int // lastLoad time.Time // } // // NewCache 初始化缓存 // func NewCache() *Cache { // return &Cache{ // data: make(map[int64][]CacheLicenseInfo), // total: 0, // lastLoad: time.Now(), // } // } // func (c *Cache) GetTotal() int { // return c.total // } // func (c *Cache) GetData() map[int64][]CacheLicenseInfo { // return c.data // } // // 刷新缓存 // func (c *Cache) RefreshCache(db *sql.DB, startTime, endTime time.Time, offset, limit int) error { // c.data = make(map[int64][]CacheLicenseInfo) // if err := c.LoadDataFromDB(db, startTime, endTime, offset, limit); err != nil { // return err // } // return nil // } // // LoadDataFromDB 从数据库加载数据 // /* SELECT // la.ID, la.Unique_ID, la.OA_REQUESTID, la.OA_REQUESTNAME, la.OA_REQUESTNAMENEW, // la.OA_REQUESTNAMEHTMLNEW, // la.OA_GLXMID ,la.OA_GLXMNAME, // la.OA_SQSJ, la.OA_SALESPERSONNAME, la.OA_XSJSYX, // la.OA_OPERATIONSPERSONNAME, la.OA_JFJSYX, la.OA_SYDW, la.OA_XMXXMS, la.OA_JDS, // la.OA_NODECOUNT, la.OA_PRODUCTCODE, la.OA_PRODUCTNAME, la.OA_PRODUCTVERSION, // la.OA_CPU, la.OA_OPERATINGSYSTEM, la.OA_MAINMAC, la.OA_SECONDMAC, la.OA_CREATIONDATE, // la.OA_CREATIONTIME, la.OA_LASTOPERATEDATE, la.OA_LASTOPERATETIME, la.capture_Time, // la.del_Time, la.LAST_OPERATE_TIME, // li.ID AS License_ID, li.License_UniqueID, li.License_Flage, li.lic1, li.lic2, li.Creator_generate // FROM // target_OA_license la // INNER JOIN // License_generate_Info li // ON // la.Unique_ID = li.License_UniqueID // WHERE TO_TIMESTAMP(la.OA_CREATIONDATE || ' ' || la.OA_CREATIONTIME, 'YYYY-MM-DD HH24:MI:SS') > TO_TIMESTAMP(?, 'YYYY-MM-DD HH24:MI:SS') // and la.del_Time IS NULL // LIMIT ? OFFSET ?*/ // func (c *Cache) LoadDataFromDB(db *sql.DB, startTime, endTime time.Time, offset, limit int) error { // c.mutex.Lock() // defer c.mutex.Unlock() // query := ` // SELECT la.ID, la.Unique_ID, la.OA_REQUESTID, la.OA_REQUESTNAME, la.OA_REQUESTNAMENEW, // la.OA_REQUESTNAMEHTMLNEW, // la.OA_GLXMID ,la.OA_GLXMNAME, // la.OA_SQSJ, la.OA_SALESPERSONNAME, la.OA_XSJSYX, // la.OA_OPERATIONSPERSONNAME, la.OA_JFJSYX, la.OA_SYDW, la.OA_XMXXMS, la.OA_JDS, // la.OA_NODECOUNT, la.OA_PRODUCTCODE, la.OA_PRODUCTNAME, la.OA_PRODUCTVERSION, // la.OA_CPU, la.OA_OPERATINGSYSTEM, la.OA_MAINMAC, la.OA_SECONDMAC, la.OA_CREATIONDATE, // la.OA_CREATIONTIME, la.OA_LASTOPERATEDATE, la.OA_LASTOPERATETIME, la.capture_Time, // la.del_Time, la.LAST_OPERATE_TIME, // li.ID AS License_ID, li.License_UniqueID, li.License_Flage, li.lic1, li.lic2, li.Creator_generate // FROM SYSDBA.TARGET_OA_LICENSE la // INNER JOIN // License_generate_Info li // ON // la.Unique_ID = li.License_UniqueID // WHERE OA_REQUESTID IN(SELECT OA_REQUESTID FROM (SELECT DISTINCT OA_REQUESTID FROM TARGET_OA_LICENSE) a // WHERE ROWNUM BETWEEN ? AND ?) // AND la.del_Time IS NULL // ` // rows, err := db.Query(query, offset, limit) // if err != nil { // return err // } // defer rows.Close() // for rows.Next() { // var record CacheLicenseInfo // err := rows.Scan( // &record.ID, // &record.UniqueID, // &record.OARequestID, // &record.OARequestName, // &record.OARequestNameNew, // &record.OARequestNameHTMLNew, // &record.OAGLXMId, // &record.OAGLXMName, // &record.OASQSJ, // &record.OASalespersonName, // &record.OAXSJSYX, // &record.OAOperationsPersonName, // &record.OAJFJSYX, // &record.OASYDW, // &record.OAXMXXMS, // &record.OAJDS, // &record.OANodeCount, // &record.OAProductCode, // &record.OAProductName, // &record.OAProductVersion, // &record.OACPU, // &record.OAOperatingSystem, // &record.OAMainMAC, // &record.OASecondMAC, // &record.OACreationDate, // &record.OACreationTime, // &record.OALastOperateDate, // &record.OALastOperateTime, // &record.CaptureTime, // &record.DelTime, // &record.LastOperateTime, // // Fields from License_generate_Info table // &record.LicenseID, // &record.LicenseUniqueID, // &record.LicenseFlage, // &record.Lic1, // &record.Lic2, // &record.CreatorGenerate, // ) // if err != nil { // return err // } // oaRequestID := record.OARequestID.Int64 // c.data[oaRequestID] = append(c.data[oaRequestID], record) // c.total++ // } // fmt.Println("data records loaded:", c.data) // c.lastLoad = time.Now() // return nil // } // // GetPaginatedData 获取分页数据并按 OALastOperateDate 和 OALastOperateTime 排序 // func (c *Cache) GetPaginatedData(page, pageSize int) (map[int64][]CacheLicenseInfo, error) { // c.mutex.RLock() // defer c.mutex.RUnlock() // if c.total == 0 { // return nil, fmt.Errorf("cache is empty") // } // allRecords := make([]CacheLicenseInfo, 0, c.total) // for _, records := range c.data { // allRecords = append(allRecords, records...) // } // sort.SliceStable(allRecords, func(i, j int) bool { // if allRecords[i].OALastOperateDate.String != allRecords[j].OALastOperateDate.String { // return allRecords[i].OALastOperateDate.String < allRecords[j].OALastOperateDate.String // } // return allRecords[i].OALastOperateTime.String < allRecords[j].OALastOperateTime.String // }) // start := (page - 1) * pageSize // if start >= len(allRecords) { // return nil, fmt.Errorf("page out of range") // } // end := start + pageSize // if end > len(allRecords) { // end = len(allRecords) // } // result := [][]CacheLicenseInfo{} // groupMap := make(map[int64][]CacheLicenseInfo) // for _, record := range allRecords[start:end] { // groupMap[record.OARequestID.Int64] = append(groupMap[record.OARequestID.Int64], record) // } // for _, group := range groupMap { // result = append(result, group) // } // return groupMap, nil // } // // EnsureDataAvailability 确保缓存中有足够的数据 // func (c *Cache) EnsureDataAvailability(db *sql.DB, page, pageSize int, startTime, endTime time.Time) error { // c.mutex.RLock() // needLoad := (page-1)*pageSize >= c.total // c.mutex.RUnlock() // if needLoad { // offset := c.total // limit := pageSize * 2 // err := c.LoadDataFromDB(db, startTime, endTime, offset, limit) // if err != nil { // return err // } // } // return nil // }