diff --git a/src/api/hard/hard-coffee.ts b/src/api/hard/hard-coffee.ts new file mode 100644 index 00000000..203e14b8 --- /dev/null +++ b/src/api/hard/hard-coffee.ts @@ -0,0 +1,39 @@ +import request from "/@/utils/request" + +/** + * 咖啡机(屋里咖啡)订单与生命周期日志。 + * 订单金额单位为分,展示时由页面统一换算。 + */ +export function fetchOrderPage(query?: Object) { + return request({ + url: "/hard/hard-coffee-manager/order/page", + method: "get", + params: query, + }) +} + +export function fetchOrderDetail(id: string) { + return request({ + url: "/hard/hard-coffee-manager/order/" + id, + method: "get", + }) +} + +export function fetchLogPage(query?: Object) { + return request({ + url: "/hard/hard-coffee-manager/log/page", + method: "get", + params: query, + }) +} + +/** + * 按本地订单id(hard_order.id)查询生命周期日志, + * 供订单售后详情页内嵌时间线使用。 + */ +export function fetchLogListByOrderId(orderId: string) { + return request({ + url: "/hard/hard-coffee-manager/log/list-by-order/" + orderId, + method: "get", + }) +} diff --git a/src/views/hard/components/hard-coffee-log.vue b/src/views/hard/components/hard-coffee-log.vue new file mode 100644 index 00000000..9faa5a5e --- /dev/null +++ b/src/views/hard/components/hard-coffee-log.vue @@ -0,0 +1,206 @@ + + + + + diff --git a/src/views/hard/hard-after-sale/order-refund.vue b/src/views/hard/hard-after-sale/order-refund.vue index 652ebc5b..bb2522de 100644 --- a/src/views/hard/hard-after-sale/order-refund.vue +++ b/src/views/hard/hard-after-sale/order-refund.vue @@ -795,6 +795,16 @@
+ +
+
+
+

咖啡机生命周期

+

该订单与屋里咖啡的扫码拉单、饭卡扣款、支付通知和退款同步交互记录

+
+
+ +
@@ -818,7 +828,7 @@ import * as hardInvoiceApi from "/@/api/hard/hard-invoice" import * as mapAddressApi from "/@/api/hard/hard-order-address" import { displayPrice } from "/@/utils/formatMoney" import { getAutoRefundTaskStatus } from "/@/constants/autoRefund" -import { Box, Calendar, Check, CreditCard, Document, List, Location, Money, Picture, Printer, ShoppingCart, Timer } from "@element-plus/icons-vue" +import { Box, Calendar, Check, Coffee, CreditCard, Document, List, Location, Money, Picture, Printer, ShoppingCart, Timer } from "@element-plus/icons-vue" import type { Component } from "vue" import dayjs from "dayjs" @@ -826,6 +836,8 @@ import dayjs from "dayjs" const RefundRejectForm = defineAsyncComponent(() => import("./refund-reject.vue")) /** 智能柜订单流程日志,仅设备类型为生鲜柜时加载。 */ const HardDoorLog = defineAsyncComponent(() => import("../components/hard-door-log.vue")) +/** 咖啡机生命周期日志,仅设备类型为咖啡机时加载。 */ +const HardCoffeeLog = defineAsyncComponent(() => import("../components/hard-coffee-log.vue")) /** 当前订单的全部售后记录与日志入口。 */ const SaleTable = defineAsyncComponent(() => import("../components/sale-table.vue")) /** 商城订单发货弹窗,沿用现有物流单号提交接口。 */ @@ -833,8 +845,10 @@ const ShipmentsForm = defineAsyncComponent(() => import("./shipments-form.vue")) /** 售后状态 10 表示当前申请仍等待人工审核,属于既有前后端协议编码。 */ const AFTER_SALE_APPLY_STATUS = "10" -/** 设备类型 4 表示生鲜智能柜,只有该类型存在开门与识别流程日志。 */ -const SMART_CABINET_HARD_TYPE = "4" + /** 设备类型 4 表示生鲜智能柜,只有该类型存在开门与识别流程日志。 */ + const SMART_CABINET_HARD_TYPE = "4" + /** 设备类型 13 表示屋里咖啡咖啡机,订单存在厂商交互生命周期日志。 */ + const COFFEE_HARD_TYPE = "13" /** 消费机支付订单类型编码,后端允许该类型没有购物车明细。 */ const SIMPLE_PAYMENT_ORDER_TYPE = "9" /** 商城订单类型编码,使用发货、收货履约状态。 */ @@ -1256,6 +1270,10 @@ const isSimplePaymentOrder = computed(() => orderTypeCode.value === SIMPLE_PAYME const isSmartCabinetOrder = computed( () => String(globalData.detail.hardType || globalData.detail.sysType || "") === SMART_CABINET_HARD_TYPE, ) +/** 咖啡机订单展示屋里咖啡交互生命周期时间线。 */ +const isCoffeeOrder = computed( + () => String(globalData.detail.hardType || globalData.detail.sysType || "") === COFFEE_HARD_TYPE, +) /** 当前订单在管理端的业务流程摘要。 */ const orderScenarioLabel = computed(() => getOrderScenarioLabel(orderTypeCode.value)) @@ -1486,6 +1504,9 @@ const sectionNavItems = computed(() => { if (isSmartCabinetOrder.value) { items.push({ key: "cabinet", label: "智能柜日志", targetId: "section-cabinet", icon: Box }) } + if (isCoffeeOrder.value) { + items.push({ key: "coffee", label: "咖啡机生命周期", targetId: "section-coffee", icon: Coffee }) + } return items }) diff --git a/src/views/hard/hard-coffee-log/index.vue b/src/views/hard/hard-coffee-log/index.vue new file mode 100644 index 00000000..e61b757c --- /dev/null +++ b/src/views/hard/hard-coffee-log/index.vue @@ -0,0 +1,131 @@ + + + diff --git a/src/views/hard/hard-coffee-order/index.vue b/src/views/hard/hard-coffee-order/index.vue new file mode 100644 index 00000000..de639be0 --- /dev/null +++ b/src/views/hard/hard-coffee-order/index.vue @@ -0,0 +1,188 @@ + + + diff --git a/src/views/hard/hard-manager/coffee-machine-section.vue b/src/views/hard/hard-manager/coffee-machine-section.vue new file mode 100644 index 00000000..92d5a423 --- /dev/null +++ b/src/views/hard/hard-manager/coffee-machine-section.vue @@ -0,0 +1,128 @@ + + + diff --git a/src/views/hard/hard-manager/details.vue b/src/views/hard/hard-manager/details.vue index ff9435a5..63117fe9 100644 --- a/src/views/hard/hard-manager/details.vue +++ b/src/views/hard/hard-manager/details.vue @@ -13,6 +13,7 @@ effect="light"> {{ detail.online ? "在线" : "离线" }} + 厂商云管理 无屏 USB 外设 状态暂不支持 @@ -37,20 +38,24 @@
- {{ isPrinterAsset ? "运行方式" : "连接状态" }} + {{ isPrinterAsset ? "运行方式" : isCoffeeMachine ? "设备运营" : "连接状态" }} {{ runtimeStatusText }} - {{ isPrinterAsset ? printerProxyTargetText : detail.lastOnlineTime || "暂无心跳时间" }} + {{ + isPrinterAsset ? printerProxyTargetText : isCoffeeMachine ? "屋里咖啡平台维护在线状态" : detail.lastOnlineTime || "暂无心跳时间" + }}
- {{ isPrinterAsset ? "客户端归属" : "客户端版本" }} - {{ isPrinterAsset ? "业务终端" : apkVersionText }} - {{ + {{ isPrinterAsset || isCoffeeMachine ? "客户端归属" : "客户端版本" }} + 屋里咖啡 + {{ isPrinterAsset ? "业务终端" : apkVersionText }} + 固件与出品由厂商负责 + {{ isPrinterAsset ? "不单独安装 APK" : detail.apkVersionCode ? "Build " + detail.apkVersionCode : "暂无内部版本码" - }} + }}
配置完成度 @@ -157,6 +162,9 @@
+
@@ -618,6 +626,16 @@ +
+
+
+

咖啡机接入

+

屋里咖啡扫码支付接入信息与本机最近交易

+
+
+ +
+
@@ -669,6 +687,7 @@ import { Box, CircleCheck, + Coffee, Connection, DataLine, Document, @@ -874,7 +893,7 @@ const runtimeSupportedTypes = ["1", "2"] /** 超市和食堂业务终端,目前也是唯一会上传文件日志的设备类型。 */ const businessTerminalTypes = ["1", "2"] /** 不适用 MQTT 和人脸配置的云设备类型编码。 */ -const terminalConfigurationExcludedTypes = ["9", "10", "11", "12"] +const terminalConfigurationExcludedTypes = ["9", "10", "11", "12", "13"] /** 终端日志查看权限。 */ const LOG_VIEW_PERMISSION = "hard_hardTerminalLogFile_view" /** 终端日志预览权限。 */ @@ -896,6 +915,8 @@ const PrinterDialog = defineAsyncComponent(() => import("./printer-dialog.vue")) const InfoSetting = defineAsyncComponent(() => import("../hard-door-manager/info-setting.vue")) /** 智能柜音量设置弹窗。 */ const VolumeSetting = defineAsyncComponent(() => import("../hard-door-manager/volume-setting.vue")) +/** 咖啡机接入信息与最近交易分区内容。 */ +const CoffeeMachineSection = defineAsyncComponent(() => import("./coffee-machine-section.vue")) /** 页面内部滚动容器。 */ const detailContainerRef = ref() @@ -968,6 +989,8 @@ const supportsFace = computed(() => !terminalConfigurationExcludedTypes.includes const isBusinessTerminal = computed(() => businessTerminalTypes.includes(String(detail.type))) /** 当前设备是否为无屏 EY_PRINT 打印机资产。 */ const isPrinterAsset = computed(() => String(detail.type) === "12") +/** 当前设备是否为屋里咖啡咖啡机。 */ +const isCoffeeMachine = computed(() => String(detail.type) === "13") /** 当前设备是否提供打印绑定或参数配置。 */ const supportsPrinter = computed(() => isBusinessTerminal.value || isPrinterAsset.value) /** 当前设备是否为生鲜智能柜。 */ @@ -996,7 +1019,7 @@ const printerConfigured = computed(() => ) /** 当前设备类型适用的可配置能力数量。 */ const availableCapabilityCount = computed( - () => Number(supportsMq.value) + Number(supportsFace.value) + Number(supportsPrinter.value) + Number(isSmartCabinet.value), + () => Number(supportsMq.value) + Number(supportsFace.value) + Number(supportsPrinter.value) + Number(isSmartCabinet.value) + Number(isCoffeeMachine.value), ) /** 当前设备已完成关键项的能力数量。 */ const configuredCapabilityCount = computed( @@ -1004,7 +1027,8 @@ const configuredCapabilityCount = computed( Number(supportsMq.value && mqConfigured.value) + Number(supportsFace.value && faceConfigured.value) + Number(supportsPrinter.value && printerConfigured.value) + - Number(isSmartCabinet.value && Boolean(hardDoorDetail.value?.id)), + Number(isSmartCabinet.value && Boolean(hardDoorDetail.value?.id)) + + Number(isCoffeeMachine.value && Boolean(detail.uniqueCode)), ) /** 当前设备日志文件总数。 */ const logFileCount = computed(() => Number(logSummary.value?.fileCount || 0)) @@ -1016,6 +1040,7 @@ const apkVersionText = computed(() => { /** 当前运行状态文案。 */ const runtimeStatusText = computed(() => { if (isPrinterAsset.value) return "由业务终端代理" + if (isCoffeeMachine.value) return "厂商云管理" if (!isRuntimeSupported.value) return "暂不支持" return detail.online ? "在线" : "离线" }) @@ -1059,6 +1084,7 @@ const sectionNavItems = computed(() => { if (supportsPrinter.value) items.push({ key: "printer", label: "打印配置", targetId: "section-printer", icon: Printer }) if (showLogSection.value) items.push({ key: "logs", label: "终端日志", targetId: "section-logs", icon: Document }) if (isSmartCabinet.value) items.push({ key: "cabinet", label: "智能柜", targetId: "section-cabinet", icon: Box }) + if (isCoffeeMachine.value) items.push({ key: "coffee", label: "咖啡机接入", targetId: "section-coffee", icon: Coffee }) items.push({ key: "maintenance", label: "维护信息", targetId: "section-maintenance", icon: Setting }) return items })