feat 删除测试代码
This commit is contained in:
1
src/components.d.ts
vendored
1
src/components.d.ts
vendored
@@ -13,7 +13,6 @@ declare module 'vue' {
|
||||
DeviceInfo: typeof import('./components/deviceInfo.vue')['default']
|
||||
FullscreenNav: typeof import('./components/FullscreenNav.vue')['default']
|
||||
HomeConstruction: typeof import('./components/home/construction.vue')['default']
|
||||
HomeDeviceFooter: typeof import('./components/home/deviceFooter.vue')['default']
|
||||
HomeHomeNav: typeof import('./components/home/homeNav.vue')['default']
|
||||
HomeList: typeof import('./components/home/list.vue')['default']
|
||||
HomeOverview: typeof import('./components/home/overview.vue')['default']
|
||||
|
||||
@@ -1,197 +0,0 @@
|
||||
<script setup lang="ts">
|
||||
import { onMounted } from 'vue'
|
||||
import { useDbStore } from '@/store/modules/db'
|
||||
import { useDeviceStore } from '@/store/modules/home'
|
||||
|
||||
const deviceStore = useDeviceStore()
|
||||
const dbStore = useDbStore()
|
||||
|
||||
onMounted(async () => {
|
||||
console.log('组件挂载时 初始化设备信息')
|
||||
deviceStore.initDevice()
|
||||
|
||||
await dbStore.loadProjects()
|
||||
console.log('projects:', dbStore.projects)
|
||||
|
||||
await dbStore.loadWorkRecords()
|
||||
console.log('workRecords:', dbStore.workRecords)
|
||||
|
||||
await dbStore.loadRtkTracks()
|
||||
console.log('rtkTracks:', dbStore.rtkTracks)
|
||||
|
||||
await dbStore.loadWarningRecords()
|
||||
console.log('warningRecords:', dbStore.warningRecords)
|
||||
})
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<view v-if="deviceStore.currentDevice" class="device-footer">
|
||||
<view class="device-info">
|
||||
<view class="device-main">
|
||||
<view class="device-icon">
|
||||
<wd-icon name="settings" size="20px" color="#3b82f6" />
|
||||
</view>
|
||||
<view class="device-detail">
|
||||
<text class="device-name">
|
||||
{{ deviceStore.currentDevice.brand }} {{ deviceStore.currentDevice.model }}
|
||||
</text>
|
||||
<text class="device-model">
|
||||
{{ deviceStore.osTypeName }} · {{ deviceStore.deviceTypeName }}
|
||||
</text>
|
||||
</view>
|
||||
</view>
|
||||
|
||||
<view class="device-status">
|
||||
<view class="status-indicator status-online" />
|
||||
<text class="status-text">
|
||||
已连接
|
||||
</text>
|
||||
</view>
|
||||
</view>
|
||||
|
||||
<view class="device-metrics">
|
||||
<view class="metric-item">
|
||||
<text class="metric-label">
|
||||
屏幕
|
||||
</text>
|
||||
<text class="metric-value">
|
||||
{{ deviceStore.currentDevice.windowWidth }} x {{ deviceStore.currentDevice.windowHeight }}
|
||||
</text>
|
||||
</view>
|
||||
|
||||
<view class="metric-item">
|
||||
<text class="metric-label">
|
||||
平台
|
||||
</text>
|
||||
<text class="metric-value">
|
||||
{{ deviceStore.currentDevice.platform }}
|
||||
</text>
|
||||
</view>
|
||||
</view>
|
||||
|
||||
<view class="device-id">
|
||||
<text class="id-label">
|
||||
设备ID:
|
||||
</text>
|
||||
<text class="id-value">
|
||||
{{ deviceStore.currentDevice.deviceId }}
|
||||
</text>
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<style scoped>
|
||||
.device-footer {
|
||||
background: #fff;
|
||||
border-radius: 12px;
|
||||
padding: 16px;
|
||||
margin-top: 12px;
|
||||
}
|
||||
|
||||
.device-info {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
margin-bottom: 12px;
|
||||
}
|
||||
|
||||
.device-main {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 12px;
|
||||
}
|
||||
|
||||
.device-icon {
|
||||
width: 40px;
|
||||
height: 40px;
|
||||
border-radius: 10px;
|
||||
background: #eff6ff;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.device-detail {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 2px;
|
||||
}
|
||||
|
||||
.device-name {
|
||||
font-size: 16px;
|
||||
font-weight: 600;
|
||||
color: #333;
|
||||
}
|
||||
|
||||
.device-model {
|
||||
font-size: 12px;
|
||||
color: #999;
|
||||
}
|
||||
|
||||
.device-status {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 6px;
|
||||
}
|
||||
|
||||
.status-indicator {
|
||||
width: 8px;
|
||||
height: 8px;
|
||||
border-radius: 50%;
|
||||
}
|
||||
|
||||
.status-online {
|
||||
background: #22c55e;
|
||||
}
|
||||
|
||||
.status-text {
|
||||
font-size: 12px;
|
||||
color: #666;
|
||||
}
|
||||
|
||||
.device-metrics {
|
||||
display: flex;
|
||||
gap: 16px;
|
||||
}
|
||||
|
||||
.metric-item {
|
||||
flex: 1;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 8px;
|
||||
}
|
||||
|
||||
.metric-label {
|
||||
font-size: 12px;
|
||||
color: #999;
|
||||
width: 35px;
|
||||
}
|
||||
|
||||
.metric-value {
|
||||
font-size: 12px;
|
||||
color: #666;
|
||||
}
|
||||
|
||||
.device-id {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 6px;
|
||||
margin-top: 12px;
|
||||
padding-top: 12px;
|
||||
border-top: 1px solid #f0f0f0;
|
||||
}
|
||||
|
||||
.id-label {
|
||||
font-size: 11px;
|
||||
color: #999;
|
||||
}
|
||||
|
||||
.id-value {
|
||||
font-size: 11px;
|
||||
color: #666;
|
||||
flex: 1;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
white-space: nowrap;
|
||||
}
|
||||
</style>
|
||||
@@ -32,6 +32,12 @@
|
||||
"<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>",
|
||||
"<uses-permission android:name=\"android.permission.ACCESS_FINE_LOCATION\"/>",
|
||||
"<uses-permission android:name=\"android.permission.ACCESS_COARSE_LOCATION\"/>",
|
||||
"<uses-permission android:name=\"android.permission.NEARBY_WIFI_DEVICES\"/>",
|
||||
"<uses-permission android:name=\"android.permission.BLUETOOTH\"/>",
|
||||
"<uses-permission android:name=\"android.permission.BLUETOOTH_ADMIN\"/>",
|
||||
"<uses-permission android:name=\"android.permission.BLUETOOTH_SCAN\"/>",
|
||||
"<uses-permission android:name=\"android.permission.BLUETOOTH_CONNECT\"/>",
|
||||
"<uses-permission android:name=\"android.permission.BLUETOOTH_ADVERTISE\"/>",
|
||||
"<uses-feature android:name=\"android.hardware.camera.autofocus\"/>",
|
||||
"<uses-permission android:name=\"android.permission.CAMERA\"/>",
|
||||
"<uses-permission android:name=\"android.permission.GET_ACCOUNTS\"/>",
|
||||
|
||||
@@ -16,10 +16,10 @@
|
||||
"navigationBarTitleText": "Road-Roller"
|
||||
},
|
||||
"pages": [
|
||||
// GENERATED BY UNI-PAGES, PLATFORM: H5 || APP
|
||||
// GENERATED BY UNI-PAGES, PLATFORM: APP
|
||||
{
|
||||
"path": "pages/Ahome/index",
|
||||
"type": "page",
|
||||
"type": "home",
|
||||
"layout": false,
|
||||
"style": {
|
||||
"navigationStyle": "custom"
|
||||
@@ -121,7 +121,7 @@
|
||||
"color": "@tabFontColor",
|
||||
"selectedColor": "@tabSelectedColor",
|
||||
"list": [
|
||||
// GENERATED BY UNI-PAGES, PLATFORM: H5 || APP
|
||||
// GENERATED BY UNI-PAGES, PLATFORM: APP
|
||||
{
|
||||
"pagePath": "pages/Ahome/index",
|
||||
"text": "首页",
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
<script setup lang="ts">
|
||||
definePage({
|
||||
type: 'home',
|
||||
layout: false,
|
||||
style: {
|
||||
navigationStyle: 'custom',
|
||||
@@ -24,9 +25,6 @@ definePage({
|
||||
<home-warning />
|
||||
</view>
|
||||
</view>
|
||||
|
||||
<!-- 当前设备信息 -->
|
||||
<home-deviceFooter />
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
@@ -2,18 +2,17 @@ import DB from '@/utils/sqlite'
|
||||
import { historyReportTableSql } from './historyReport'
|
||||
import { projectTableSql } from './project'
|
||||
import { rtkTrackTableSql } from './rtkTrack'
|
||||
import { seedAll, seedIfNeeded } from './seed'
|
||||
import { warningRecordTableSql } from './warningRecord'
|
||||
import { workRecordTableSql } from './workRecord'
|
||||
|
||||
export { historyReportTableSql } from './historyReport'
|
||||
export * as historyReportService from './historyReport'
|
||||
export { projectTableSql } from './project'
|
||||
// 导出所有 service 方法
|
||||
export * as projectService from './project'
|
||||
export { rtkTrackTableSql } from './rtkTrack'
|
||||
export * as rtkTrackService from './rtkTrack'
|
||||
export { seedAll } from './seed'
|
||||
|
||||
export { seedAll, seedIfNeeded } from './seed'
|
||||
export { warningRecordTableSql } from './warningRecord'
|
||||
export * as warningRecordService from './warningRecord'
|
||||
export { workRecordTableSql } from './workRecord'
|
||||
@@ -27,14 +26,68 @@ const tableSqls = [
|
||||
historyReportTableSql,
|
||||
]
|
||||
|
||||
/** 当前代码期望的各表字段(用于检测旧库结构) */
|
||||
const expectedColumns: Record<string, string[]> = {
|
||||
project: ['id', 'project_name', 'stake_range', 'total_area', 'status', 'created_at', 'updated_at'],
|
||||
work_record: ['id', 'project_id', 'start_time', 'end_time', 'compaction_area', 'pass_count', 'created_at'],
|
||||
rtk_track: ['id', 'work_record_id', 'latitude', 'longitude', 'speed', 'heading', 'steel_wheel_temp', 'compaction_value', 'created_at'],
|
||||
warning_record: ['id', 'project_id', 'device_name', 'exception_type', 'occurred_at', 'site_description', 'disposal_record', 'disposal_type', 'is_read', 'created_at'],
|
||||
history_report: ['id', 'project_id', 'report_name', 'device_id', 'construction_area', 'start_time', 'end_time', 'duration', 'compaction_area', 'pass_count', 'qualified_rate', 'avg_speed', 'avg_paving_temp', 'avg_compaction', 'exception_count', 'created_at'],
|
||||
}
|
||||
|
||||
/** 按外键依赖倒序删除 */
|
||||
const dropTableSqls = [
|
||||
'DROP TABLE IF EXISTS history_report',
|
||||
'DROP TABLE IF EXISTS warning_record',
|
||||
'DROP TABLE IF EXISTS rtk_track',
|
||||
'DROP TABLE IF EXISTS work_record',
|
||||
'DROP TABLE IF EXISTS project',
|
||||
]
|
||||
|
||||
async function getTableColumns(table: string): Promise<string[]> {
|
||||
const rows = await DB.selectSql(`PRAGMA table_info(${table})`)
|
||||
return (rows || []).map((row: { name: string }) => row.name)
|
||||
}
|
||||
|
||||
/** 任一表缺少期望字段则视为结构过期 */
|
||||
async function isSchemaOutdated(): Promise<boolean> {
|
||||
for (const [table, columns] of Object.entries(expectedColumns)) {
|
||||
const existing = await getTableColumns(table)
|
||||
if (!existing.length)
|
||||
return true
|
||||
const missing = columns.filter(col => !existing.includes(col))
|
||||
if (missing.length) {
|
||||
console.warn(`表 ${table} 缺少字段:`, missing.join(', '))
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
/** 重建全部表并重新灌入假数据 */
|
||||
async function resetDatabase() {
|
||||
console.warn('检测到表结构过期,正在重建数据库...')
|
||||
await DB.transaction(dropTableSqls)
|
||||
await DB.transaction(tableSqls)
|
||||
await seedAll()
|
||||
console.log('数据库重建完成')
|
||||
}
|
||||
|
||||
/**
|
||||
* 初始化数据库
|
||||
* 初始化数据库(建表 → 结构校验/重建 → 空表灌假数据)
|
||||
*/
|
||||
export async function initTables() {
|
||||
try {
|
||||
console.log('开始初始化数据库表...')
|
||||
await DB.transaction(tableSqls)
|
||||
|
||||
if (await isSchemaOutdated()) {
|
||||
await resetDatabase()
|
||||
return
|
||||
}
|
||||
|
||||
console.log('数据库表初始化成功')
|
||||
await seedIfNeeded()
|
||||
}
|
||||
catch (err) {
|
||||
console.error('数据库表初始化失败:', err)
|
||||
|
||||
@@ -231,3 +231,29 @@ export async function seedAll() {
|
||||
throw err
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 按需灌入假数据(表为空才插入,避免重复)
|
||||
*/
|
||||
export async function seedIfNeeded() {
|
||||
const projectCount = await DB.count('project')
|
||||
|
||||
// 全新库:灌入全部假数据
|
||||
if (projectCount === 0) {
|
||||
await seedAll()
|
||||
return
|
||||
}
|
||||
|
||||
// 已有项目但其它表为空:补种其余表(依赖已有 project / work_record id)
|
||||
if ((await DB.count('work_record')) === 0)
|
||||
await seedWorkRecord()
|
||||
|
||||
if ((await DB.count('rtk_track')) === 0)
|
||||
await seedRtkTrack()
|
||||
|
||||
if ((await DB.count('warning_record')) === 0)
|
||||
await seedWarningRecord()
|
||||
|
||||
if ((await DB.count('history_report')) === 0)
|
||||
await seedHistoryReport()
|
||||
}
|
||||
|
||||
@@ -13,121 +13,73 @@ import {
|
||||
workRecordService,
|
||||
} from '@/service'
|
||||
|
||||
/**
|
||||
* 本地库统一数据源
|
||||
*
|
||||
* 用法:
|
||||
* import { useDbStore } from '@/store/modules/db'
|
||||
* const db = useDbStore()
|
||||
* await db.loadAll()
|
||||
*
|
||||
* db.project // 项目表
|
||||
* db.work_record // 作业记录表
|
||||
* db.rtk_track // RTK 轨迹表
|
||||
* db.warning_record // 告警记录表
|
||||
* db.history_report // 历史报告表
|
||||
*/
|
||||
export const useDbStore = defineStore('db', () => {
|
||||
// --- State ---
|
||||
const projects = ref<Project[]>([])
|
||||
const workRecords = ref<WorkRecord[]>([])
|
||||
const rtkTracks = ref<RtkTrack[]>([])
|
||||
const warningRecords = ref<WarningRecord[]>([])
|
||||
const historyReports = ref<HistoryReport[]>([])
|
||||
const project = ref<Project[]>([])
|
||||
const work_record = ref<WorkRecord[]>([])
|
||||
const rtk_track = ref<RtkTrack[]>([])
|
||||
const warning_record = ref<WarningRecord[]>([])
|
||||
const history_report = ref<HistoryReport[]>([])
|
||||
|
||||
// --- Project ---
|
||||
async function loadProjects() {
|
||||
projects.value = await projectService.selectAll()
|
||||
/** 一次性加载所有表 */
|
||||
async function loadAll() {
|
||||
const [projects, workRecords, rtkTracks, warningRecords, historyReports] = await Promise.all([
|
||||
projectService.selectAll(),
|
||||
workRecordService.selectAll(),
|
||||
rtkTrackService.selectAll(),
|
||||
warningRecordService.selectAll(),
|
||||
historyReportService.selectAll(),
|
||||
])
|
||||
project.value = projects
|
||||
work_record.value = workRecords
|
||||
rtk_track.value = rtkTracks
|
||||
warning_record.value = warningRecords
|
||||
history_report.value = historyReports
|
||||
}
|
||||
|
||||
async function addProject(data: Project) {
|
||||
await projectService.insert(data)
|
||||
await loadProjects()
|
||||
/** 按项目筛选作业记录 */
|
||||
async function loadWorkRecordByProject(projectId: number) {
|
||||
work_record.value = await workRecordService.selectByProjectId(projectId)
|
||||
}
|
||||
|
||||
async function updateProject(id: number, data: Partial<Project>) {
|
||||
await projectService.update(id, data)
|
||||
await loadProjects()
|
||||
/** 按作业记录筛选轨迹 */
|
||||
async function loadRtkTrackByWorkRecord(workRecordId: number) {
|
||||
rtk_track.value = await rtkTrackService.selectByWorkRecordId(workRecordId)
|
||||
}
|
||||
|
||||
async function deleteProject(id: number) {
|
||||
await projectService.remove(id)
|
||||
await loadProjects()
|
||||
/** 按项目筛选告警 */
|
||||
async function loadWarningByProject(projectId: number) {
|
||||
warning_record.value = await warningRecordService.selectByProjectId(projectId)
|
||||
}
|
||||
|
||||
// --- WorkRecord ---
|
||||
async function loadWorkRecords() {
|
||||
workRecords.value = await workRecordService.selectAll()
|
||||
}
|
||||
|
||||
async function loadWorkRecordsByProject(projectId: number) {
|
||||
workRecords.value = await workRecordService.selectByProjectId(projectId)
|
||||
}
|
||||
|
||||
async function addWorkRecord(data: WorkRecord) {
|
||||
await workRecordService.insert(data)
|
||||
await loadWorkRecords()
|
||||
}
|
||||
|
||||
// --- RtkTrack ---
|
||||
async function loadRtkTracks() {
|
||||
rtkTracks.value = await rtkTrackService.selectAll()
|
||||
}
|
||||
|
||||
async function loadRtkTracksByWorkRecord(workRecordId: number) {
|
||||
rtkTracks.value = await rtkTrackService.selectByWorkRecordId(workRecordId)
|
||||
}
|
||||
|
||||
async function addRtkTrack(data: RtkTrack) {
|
||||
await rtkTrackService.insert(data)
|
||||
}
|
||||
|
||||
// --- WarningRecord ---
|
||||
async function loadWarningRecords() {
|
||||
warningRecords.value = await warningRecordService.selectAll()
|
||||
}
|
||||
|
||||
async function loadUnreadWarnings() {
|
||||
warningRecords.value = await warningRecordService.selectUnread()
|
||||
}
|
||||
|
||||
async function markWarningRead(id: number) {
|
||||
await warningRecordService.markRead(id)
|
||||
await loadWarningRecords()
|
||||
}
|
||||
|
||||
// --- HistoryReport ---
|
||||
async function loadHistoryReports() {
|
||||
historyReports.value = await historyReportService.selectAll()
|
||||
}
|
||||
|
||||
async function loadHistoryReportsByProject(projectId: number) {
|
||||
historyReports.value = await historyReportService.selectByProjectId(projectId)
|
||||
}
|
||||
|
||||
async function loadHistoryReportsByDevice(deviceId: string) {
|
||||
historyReports.value = await historyReportService.selectByDeviceId(deviceId)
|
||||
}
|
||||
|
||||
async function addHistoryReport(data: HistoryReport) {
|
||||
await historyReportService.insert(data)
|
||||
await loadHistoryReports()
|
||||
/** 按项目筛选历史报告 */
|
||||
async function loadHistoryReportByProject(projectId: number) {
|
||||
history_report.value = await historyReportService.selectByProjectId(projectId)
|
||||
}
|
||||
|
||||
return {
|
||||
// State
|
||||
projects,
|
||||
workRecords,
|
||||
rtkTracks,
|
||||
warningRecords,
|
||||
historyReports,
|
||||
// Project
|
||||
loadProjects,
|
||||
addProject,
|
||||
updateProject,
|
||||
deleteProject,
|
||||
// WorkRecord
|
||||
loadWorkRecords,
|
||||
loadWorkRecordsByProject,
|
||||
addWorkRecord,
|
||||
// RtkTrack
|
||||
loadRtkTracks,
|
||||
loadRtkTracksByWorkRecord,
|
||||
addRtkTrack,
|
||||
// WarningRecord
|
||||
loadWarningRecords,
|
||||
loadUnreadWarnings,
|
||||
markWarningRead,
|
||||
// HistoryReport
|
||||
loadHistoryReports,
|
||||
loadHistoryReportsByProject,
|
||||
loadHistoryReportsByDevice,
|
||||
addHistoryReport,
|
||||
project,
|
||||
work_record,
|
||||
rtk_track,
|
||||
warning_record,
|
||||
history_report,
|
||||
loadAll,
|
||||
loadWorkRecordByProject,
|
||||
loadRtkTrackByWorkRecord,
|
||||
loadWarningByProject,
|
||||
loadHistoryReportByProject,
|
||||
}
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user