From 55a2490e14e35cc46ab00d0ddd1581dcb1dabe24 Mon Sep 17 00:00:00 2001 From: BBIT-Kai <2911862937@qq.com> Date: Tue, 14 Apr 2026 17:50:27 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84=E5=AD=97=E7=AC=A6=E4=B8=B2?= =?UTF-8?q?=E7=B1=BB=E5=9E=8B=E7=9A=84=E4=BD=93=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- f10/src/main/resources/application.yaml | 4 +- .../main/resources/static/traceability.css | 6 +++ .../server/controller/Traceability.kt | 13 +++++ .../server/utils/dao/TraceabilityDao.kt | 10 ++++ .../web-antd/src/api/traceability/index.ts | 4 ++ .../src/views/traceability/consumer.vue | 16 ++++-- .../src/views/traceability/operator.vue | 54 +++++++++++++++---- .../src/views/traceability/preview.vue | 1 + 8 files changed, 92 insertions(+), 16 deletions(-) diff --git a/f10/src/main/resources/application.yaml b/f10/src/main/resources/application.yaml index 16ca0de..1400159 100644 --- a/f10/src/main/resources/application.yaml +++ b/f10/src/main/resources/application.yaml @@ -7,5 +7,5 @@ ktor: traceability: # 访问主服务的地址 - core-base-url: "http://127.0.0.1:8089" # 开发 -# core-base-url: "https://ai.ronsunny.cn:8090/api" # 生产 +# core-base-url: "http://127.0.0.1:8089" # 开发 + core-base-url: "https://ai.ronsunny.cn:8090/api" # 生产 diff --git a/f10/src/main/resources/static/traceability.css b/f10/src/main/resources/static/traceability.css index cb5d8ef..8f27692 100644 --- a/f10/src/main/resources/static/traceability.css +++ b/f10/src/main/resources/static/traceability.css @@ -85,6 +85,11 @@ a { line-height: 1.75; } +.timeline-item__body strong { + white-space: pre-wrap; + word-break: break-word; +} + .hero p { margin: 12px 0 0; } @@ -135,6 +140,7 @@ a { margin-top: 8px; line-height: 1.6; word-break: break-word; + white-space: pre-wrap; } .hero__aside { diff --git a/ktor/src/main/kotlin/ink/snowflake/server/controller/Traceability.kt b/ktor/src/main/kotlin/ink/snowflake/server/controller/Traceability.kt index d7f2ee9..ca491b4 100644 --- a/ktor/src/main/kotlin/ink/snowflake/server/controller/Traceability.kt +++ b/ktor/src/main/kotlin/ink/snowflake/server/controller/Traceability.kt @@ -288,6 +288,19 @@ fun Application.Traceability(config: AppConfig) { } call.respond(BaseResponse(message = "批次已发布", data = data)) } + post("/{id}/scan-count/reset") { + val id = parseUuidOrNull(call.parameters["id"]) + if (id == null) { + call.respond(HttpStatusCode.BadRequest, BaseResponse(status = false, message = "批次ID无效", data = null)) + return@post + } + val data = TraceabilityDao.resetBatchScanCount(id) + if (data == null) { + call.respond(HttpStatusCode.NotFound, BaseResponse(status = false, message = "批次不存在", data = null)) + return@post + } + call.respond(BaseResponse(message = "扫码次数已重置", data = data)) + } } route("/feedback") { diff --git a/ktor/src/main/kotlin/ink/snowflake/server/utils/dao/TraceabilityDao.kt b/ktor/src/main/kotlin/ink/snowflake/server/utils/dao/TraceabilityDao.kt index 24e7a0a..16f1921 100644 --- a/ktor/src/main/kotlin/ink/snowflake/server/utils/dao/TraceabilityDao.kt +++ b/ktor/src/main/kotlin/ink/snowflake/server/utils/dao/TraceabilityDao.kt @@ -764,6 +764,16 @@ object TraceabilityDao { getBatch(batchId) } + fun resetBatchScanCount(batchId: UUID): TraceBatchDetailResponse? = transaction { + val now = timestampLiteral(nowInstant()) + val updated = TraceabilityBatchesTable.update({ TraceabilityBatchesTable.id eq batchId }) { + it[scanCount] = 0 + it[updatedAt] = now + } + if (updated == 0) return@transaction null + getBatch(batchId) + } + fun getPublicDetailByCode( batchCode: String, increaseScan: Boolean = false, diff --git a/vue2/apps/web-antd/src/api/traceability/index.ts b/vue2/apps/web-antd/src/api/traceability/index.ts index 15ee023..b42096d 100644 --- a/vue2/apps/web-antd/src/api/traceability/index.ts +++ b/vue2/apps/web-antd/src/api/traceability/index.ts @@ -341,6 +341,10 @@ export function publishTraceabilityBatch(id: string) { return requestClient.post(`/traceability/batches/${id}/publish`); } +export function resetTraceabilityBatchScanCount(id: string) { + return requestClient.post(`/traceability/batches/${id}/scan-count/reset`); +} + export function getTraceabilityPublicDetail(code: string) { return requestClient.get( `/traceability/public/by-code/${code}`, diff --git a/vue2/apps/web-antd/src/views/traceability/consumer.vue b/vue2/apps/web-antd/src/views/traceability/consumer.vue index c744146..770be48 100644 --- a/vue2/apps/web-antd/src/views/traceability/consumer.vue +++ b/vue2/apps/web-antd/src/views/traceability/consumer.vue @@ -275,7 +275,10 @@ onMounted(loadBatches); >打开地图 - + {{ formatFieldValue(entry.value) }} @@ -349,10 +352,7 @@ onMounted(loadBatches); >打开地图 - + {{ formatFieldValue(entry.value) }} @@ -549,6 +549,7 @@ onMounted(loadBatches); .access-card strong { line-height: 1.6; word-break: break-word; + white-space: pre-wrap; } .section-stack { @@ -578,6 +579,11 @@ onMounted(loadBatches); color: #6b7280; } +.timeline-card strong { + white-space: pre-wrap; + word-break: break-word; +} + .kv-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); diff --git a/vue2/apps/web-antd/src/views/traceability/operator.vue b/vue2/apps/web-antd/src/views/traceability/operator.vue index c8c2475..f691b1f 100644 --- a/vue2/apps/web-antd/src/views/traceability/operator.vue +++ b/vue2/apps/web-antd/src/views/traceability/operator.vue @@ -27,6 +27,7 @@ import { getTraceabilityBatches, getTraceabilityTemplates, publishTraceabilityBatch, + resetTraceabilityBatchScanCount, updateTraceabilityBatchStep, uploadTraceabilityImage, } from '#/api'; @@ -435,6 +436,29 @@ async function saveStep() { } } +function resetBatchScanCount() { + if (!batchDetail.value?.id) return; + Modal.confirm({ + title: '重置扫码次数', + content: `确认将批次“${batchDetail.value.batchName || batchDetail.value.batchCode}”的扫码次数重置为 0 吗?`, + okText: '重置', + cancelText: '取消', + async onOk() { + saving.value = true; + try { + const detail = await resetTraceabilityBatchScanCount(batchDetail.value!.id); + if (detail) { + applyBatch(detail); + message.success('扫码次数已重置'); + await loadLists(); + } + } finally { + saving.value = false; + } + }, + }); +} + onMounted(async () => { await loadLists(); }); @@ -509,14 +533,23 @@ onMounted(async () => { title="发布信息" >
@@ -755,11 +788,12 @@ onMounted(async () => { (value) => updateFieldValue(field, value) " /> - { font-size: 12px; border-top: 1px dashed #e4e9f2; padding-top: 10px; + white-space: pre-wrap; + word-break: break-word; } .field-fixed-tip { diff --git a/vue2/apps/web-antd/src/views/traceability/preview.vue b/vue2/apps/web-antd/src/views/traceability/preview.vue index 5267ef0..532b43f 100644 --- a/vue2/apps/web-antd/src/views/traceability/preview.vue +++ b/vue2/apps/web-antd/src/views/traceability/preview.vue @@ -638,6 +638,7 @@ onMounted(loadPreviews); +