From 54a5f966447c0f2381d8f3aa7fbeb98ee88c464b Mon Sep 17 00:00:00 2001 From: Ironsp <1522278303@qq.com> Date: Sun, 27 Sep 2026 15:21:39 +0800 Subject: [PATCH] =?UTF-8?q?feat=20=E8=81=94=E8=B0=83=E6=8A=A5=E5=91=8A?= =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pnpm-lock.yaml | 10 +- src/api/report/index.ts | 9 +- src/components/report/item.vue | 26 +--- src/composables/useProjectLifecycle.ts | 67 ++++++-- src/pages.json | 4 +- src/pages/report/detail/index.vue | 202 ++++++++++--------------- src/pages/report/index.vue | 139 ++++++++++++++--- 7 files changed, 271 insertions(+), 186 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a3fa1cc..b9ce278 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -3240,8 +3240,8 @@ packages: resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} engines: {node: '>=10'} - caniuse-lite@1.0.30001737: - resolution: {integrity: sha512-BiloLiXtQNrY5UyF0+1nSJLXUENuhka2pzy2Fx5pGxqavdrxSCW4U6Pn/PoG3Efspi2frRbHpBV2XsrPE6EDlw==} + caniuse-lite@1.0.30001812: + resolution: {integrity: sha512-qN+QNNBr93TCmFrmte0bBCjSDMuRvt78VlHT99qIGPszm4QsqCX8lnyWUFkHi8B7ZBAPq8SH+UqyXNy/odMdng==} ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} @@ -10260,7 +10260,7 @@ snapshots: autoprefixer@10.4.20(postcss@8.5.6): dependencies: browserslist: 4.25.3 - caniuse-lite: 1.0.30001737 + caniuse-lite: 1.0.30001812 fraction.js: 4.3.7 normalize-range: 0.1.2 picocolors: 1.1.1 @@ -10410,7 +10410,7 @@ snapshots: browserslist@4.25.3: dependencies: - caniuse-lite: 1.0.30001737 + caniuse-lite: 1.0.30001812 electron-to-chromium: 1.5.209 node-releases: 2.0.19 update-browserslist-db: 1.1.3(browserslist@4.25.3) @@ -10482,7 +10482,7 @@ snapshots: camelcase@6.3.0: {} - caniuse-lite@1.0.30001737: {} + caniuse-lite@1.0.30001812: {} ccount@2.0.1: {} diff --git a/src/api/report/index.ts b/src/api/report/index.ts index 78c8391..075b432 100644 --- a/src/api/report/index.ts +++ b/src/api/report/index.ts @@ -1,4 +1,4 @@ -import type { ApiResult, PageResult, ReportStatus } from '../types' +import type { ApiResult, ReportStatus } from '../types' import { request } from '../request' export interface ReportItem { @@ -70,11 +70,10 @@ export interface UploadReportParams { } /** GET /api/report/list 报告列表 */ -export function getReportList(params?: Record) { - return request>({ +export function getReportList() { + return request({ url: '/api/report/list', method: 'GET', - params, }) } @@ -86,7 +85,7 @@ export function getReportDetail(reportId: number | string) { }) } -/** POST /api/report/upload 上传报告(JSON) */ +/** POST /api/report/upload 上传报告数据(JSON) */ export function uploadReport(data: UploadReportParams) { return request({ url: '/api/report/upload', diff --git a/src/components/report/item.vue b/src/components/report/item.vue index f1426b8..4f286b2 100644 --- a/src/components/report/item.vue +++ b/src/components/report/item.vue @@ -1,8 +1,6 @@ diff --git a/src/composables/useProjectLifecycle.ts b/src/composables/useProjectLifecycle.ts index c266e7e..081bad0 100644 --- a/src/composables/useProjectLifecycle.ts +++ b/src/composables/useProjectLifecycle.ts @@ -1,7 +1,9 @@ import type { Project } from '@/service/project' +import { uploadReport } from '@/api/report' import { useCurrentProject } from '@/composables/useCurrentProject' import { historyReportService, projectService, workRecordService } from '@/service' import { useDbStore } from '@/store/modules/db' +import { getDeviceId } from '@/utils/device' import storage from '@/utils/storage' /** 本地时间字符串,格式与 seed 一致:YYYY-MM-DD HH:mm:ss */ @@ -127,7 +129,7 @@ export function useProjectLifecycle() { }) } - /** 结束项目 → 已结束,生成历史报告 */ + /** 结束项目 → 先上传报告,成功后再改本地状态并生成历史报告 */ async function endProject(projectId: number) { await withBusy(async () => { const project = await projectService.selectById(projectId) @@ -136,34 +138,71 @@ export function useProjectLifecycle() { return } if (project.status === 1) { - uni.showToast({ title: '项目已结束', icon: 'none' }) + uni.showToast({ title: '项目已经结束', icon: 'none' }) return } - const endTime = nowDateTime() - const open = await findOpenWorkRecord(projectId) - if (open?.id) { - await workRecordService.update(open.id, { - end_time: endTime, - duration: calcDurationHours(open.start_time, endTime), - }) - } - const latest = await projectService.selectById(projectId) if (!latest) { uni.showToast({ title: '项目不存在', icon: 'none' }) return } + const deviceId = getDeviceId() || storage.get('device_unique_id') || '' + if (!deviceId || !latest.project_name) { + uni.showToast({ title: '上传失败,请重新点击结束项目', icon: 'none' }) + return + } + + const endTime = nowDateTime() + const workStartTime = latest.start_time || endTime const workRecords = await workRecordService.selectByProjectId(projectId) const exceptionCount = workRecords.reduce((sum, item) => sum + (item.exception_count ?? 0), 0) + let uploaded = false + try { + const res = await uploadReport({ + deviceId, + projectName: latest.project_name, + reportNo: `RTK-${projectId}`, + workStartTime, + workEndTime: endTime, + constructionSection: latest.stake_range, + compactArea: latest.total_compaction_area ?? 0, + qualificationRate: latest.qualified_rate ?? 0, + workDuration: latest.total_duration ?? 0, + passCount: latest.total_pass_count ?? 0, + avgSpeed: latest.avg_speed ?? 0, + avgTemperature: latest.avg_paving_temp ?? 0, + avgCompaction: latest.avg_compaction ?? 0, + exceptionCount, + }) + uploaded = res.code === 200 + } + catch { + uploaded = false + } + + if (!uploaded) { + uni.showToast({ title: '上传失败,请重新点击结束项目', icon: 'none' }) + return + } + + // 上传成功后再改本地状态 + const open = await findOpenWorkRecord(projectId) + if (open?.id) { + await workRecordService.update(open.id, { + end_time: endTime, + duration: calcDurationHours(open.start_time, endTime), + }) + } + await historyReportService.insert({ project_id: projectId, report_name: `${latest.project_name} 碾压报告`, - device_id: storage.get('device_unique_id') || undefined, + device_id: deviceId, construction_area: latest.stake_range, - start_time: latest.start_time, + start_time: workStartTime, end_time: endTime, duration: latest.total_duration ?? 0, compaction_area: latest.total_compaction_area ?? 0, @@ -184,7 +223,7 @@ export function useProjectLifecycle() { setCurrentProject(null) await refreshAfterChange(projectId) - uni.showToast({ title: '已结束并生成报告', icon: 'success' }) + uni.showToast({ title: '项目已经结束', icon: 'success' }) }) } diff --git a/src/pages.json b/src/pages.json index d930a46..fb06eee 100644 --- a/src/pages.json +++ b/src/pages.json @@ -16,7 +16,7 @@ "navigationBarTitleText": "Road-Roller" }, "pages": [ - // GENERATED BY UNI-PAGES, PLATFORM: H5 || APP + // GENERATED BY UNI-PAGES, PLATFORM: APP || H5 { "path": "pages/Ahome/index", "type": "home", @@ -121,7 +121,7 @@ "color": "@tabFontColor", "selectedColor": "@tabSelectedColor", "list": [ - // GENERATED BY UNI-PAGES, PLATFORM: H5 || APP + // GENERATED BY UNI-PAGES, PLATFORM: APP || H5 { "pagePath": "pages/Ahome/index", "text": "首页", diff --git a/src/pages/report/detail/index.vue b/src/pages/report/detail/index.vue index cc07bbf..1a78cf2 100644 --- a/src/pages/report/detail/index.vue +++ b/src/pages/report/detail/index.vue @@ -1,11 +1,10 @@ diff --git a/src/pages/report/index.vue b/src/pages/report/index.vue index 1393464..dc3dc96 100644 --- a/src/pages/report/index.vue +++ b/src/pages/report/index.vue @@ -1,6 +1,9 @@ @@ -213,7 +308,7 @@ onMounted(async () => { - 报告列表 + 报告列表11111 共{{ reports.length }}条 @@ -226,8 +321,8 @@ onMounted(async () => {