Procházet zdrojové kódy

feat(ocr): 添加更新渠道统计数据功能并优化查询方法

- 新增 updateStatistics 方法,用于更新所有渠道的统计数据
- 优化 getStatistics 方法,使用 Database 查询生成器直接执行 SQL 查询
- 在OcrDevicesController 中使用 Database 查询生成器优化查询性能
- 更新路由,添加 updateStatistics 接口
wui před 8 měsíci
rodič
revize
e39b350dfa

+ 68 - 6
app/Controllers/Http/OcrChannelController.ts

@@ -3,6 +3,10 @@ import PaginationService from 'App/Services/PaginationService'
 import OcrChannel from 'App/Models/OcrChannel'
 import { schema } from '@ioc:Adonis/Core/Validator'
 import { DateTime } from 'luxon'
+import OcrDevice from 'App/Models/OcrDevice'
+import OcrRecord from 'App/Models/OcrRecord'
+import * as console from 'node:console'
+import Database from '@ioc:Adonis/Lucid/Database'
 
 export default class OcrChannelController {
     private paginationService = new PaginationService(OcrChannel)
@@ -113,20 +117,20 @@ export default class OcrChannelController {
     public async getStatistics({ request, response }: HttpContextContract) {
         try {
             const name = request.input('name')
-            const query = OcrChannel.query()
+            let query = Database.from('ocr_channels')
 
             if (name) {
-                query.where('name', name)
+                query = query.where('name', name)
             }
 
             const sevenDaysAgo = DateTime.now().minus({ days: 7 }).startOf('day').toSQL()
             const data = await query
-                .where('createdAt', '>=', sevenDaysAgo)
-                .orderBy('createdAt', 'asc')
-                .select('createdAt', 'deviceNum', 'recordNum', 'scanNum')
+                .where('created_at', '>=', sevenDaysAgo)
+                .orderBy('created_at', 'asc')
+                .select('created_at', 'device_num as deviceNum', 'record_num as recordNum', 'scan_num as scanNum')
 
             const result = {
-                dates: data.map((item) => item.createdAt.toFormat('yyyy-MM-dd')),
+                dates: data.map((item) => DateTime.fromISO(item.created_at).toFormat('yyyy-MM-dd')),
                 deviceNum: data.map((item) => item.deviceNum),
                 recordNum: data.map((item) => item.recordNum),
                 scanNum: data.map((item) => item.scanNum)
@@ -166,4 +170,62 @@ export default class OcrChannelController {
             })
         }
     }
+
+    public async updateStatistics({ response }: HttpContextContract) {
+        try {
+            // 获取所有渠道
+            const channels = await OcrChannel.all()
+            const results: any[] = []
+
+            for (const channel of channels) {
+                // 使用Database查询生成器直接执行SQL查询
+
+                // 获取设备数量
+                const deviceCountResult = await Database.from('ocr_devices')
+                    .where('channel', channel.name)
+                    .count('* as total')
+                console.log('deviceCountResult', deviceCountResult)
+
+                // 获取记录数量
+                const recordCountResult = await Database.from('ocr_records')
+                    .where('channel', channel.name)
+                    .count('* as total')
+
+                // 获取扫描数量总和
+                const scanSumResult = await Database.from('ocr_devices')
+                    .where('channel', channel.name)
+                    .sum('scanned as total')
+                console.log('scanSumResult', scanSumResult)
+
+                // 确保数值正确转换为数字
+                const deviceNum = parseInt(deviceCountResult[0].total || '0', 10)
+                const recordNum = parseInt(recordCountResult[0].total || '0', 10)
+                const scanNum = parseInt(scanSumResult[0].total || '0', 10)
+
+                // 更新渠道数据
+                channel.deviceNum = deviceNum
+                channel.recordNum = recordNum
+                channel.scanNum = scanNum
+
+                await channel.save()
+                results.push({
+                    id: channel.id,
+                    name: channel.name,
+                    deviceNum: channel.deviceNum,
+                    recordNum: channel.recordNum,
+                    scanNum: channel.scanNum
+                })
+            }
+
+            return response.ok({
+                message: '所有渠道统计数据已更新',
+                data: results
+            })
+        } catch (error) {
+            return response.internalServerError({
+                message: '更新所有渠道统计数据时发生错误',
+                error: error.message
+            })
+        }
+    }
 }

+ 10 - 8
app/Controllers/Http/OcrDevicesController.ts

@@ -4,6 +4,8 @@ import { schema } from '@ioc:Adonis/Core/Validator'
 import OcrDevice from 'App/Models/OcrDevice'
 import OcrRecord from 'App/Models/OcrRecord'
 import { DateTime } from 'luxon'
+import * as console from 'node:console'
+import Database from '@ioc:Adonis/Lucid/Database'
 
 export default class OcrDevicesController {
     private paginationService = new PaginationService(OcrDevice)
@@ -149,11 +151,11 @@ export default class OcrDevicesController {
             for (const date of dates) {
                 const startDate = DateTime.fromFormat(date, 'yyyy-MM-dd').startOf('day').toSQL()
                 const endDate = DateTime.fromFormat(date, 'yyyy-MM-dd').endOf('day').toSQL()
-                const recordCount = await recordQuery
-                    .where('createdAt', '>=', startDate)
-                    .where('createdAt', '<=', endDate)
+                const recordCount = await Database.from('ocr_records')
+                    .where('created_at', '>=', startDate)
+                    .where('created_at', '<=', endDate)
                     .count('* as total')
-                dailyStats[date].total = Number(recordCount[0].$extras.total) || 0
+                dailyStats[date].total = Number(recordCount[0].total) || 0
             }
 
             // 转换为前端需要的数组格式
@@ -201,14 +203,14 @@ export default class OcrDevicesController {
             // 获取设备数据
             const deviceData = await deviceQuery.where('createdAt', '>=', today).select('scanned')
             // 获取OcrRecord数据
-            const recordCount = await recordQuery
-                .where('createdAt', '>=', today)
-                .where('createdAt', '<=', todayEnd)
+            const recordCount = await Database.from('ocr_records')
+                .where('created_at', '>=', today)
+                .where('created_at', '<=', todayEnd)
                 .count('* as total')
 
             // 计算今日统计数据
             const scanned = deviceData.reduce((acc, item) => acc + item.scanned, 0)
-            const total = Number(recordCount[0].$extras.total) || 0
+            const total = Number(recordCount[0].total) || 0
             const deviceCount = deviceData.length
 
             return response.ok({

+ 1 - 1
app/Models/OcrDevice.ts

@@ -28,5 +28,5 @@ export default class OcrDevice extends AppBaseModel {
     public scanned: number
 
     @column()
-    public ipAddress:string
+    public ipAddress: string
 }

+ 1 - 0
start/routes.ts

@@ -144,6 +144,7 @@ Route.group(() => {
             Route.post('/findApiChannel', 'OcrChannelController.findApiChannel')
             Route.post('/getStatistics', 'OcrChannelController.getStatistics')
             Route.post('/names', 'OcrChannelController.getChannelNames')
+            Route.post('/updateStatistics', 'OcrChannelController.updateStatistics')
         }).middleware('auth:api')
     }).prefix('/ocrChannel')