From 7cf50486ef5c9140816270e0deb119af39297eb4 Mon Sep 17 00:00:00 2001 From: xuan <1359774872@qq.com> Date: Mon, 26 Oct 2026 12:07:53 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=88=90=E5=8A=9F=E5=A4=B1=E8=B4=A5?= =?UTF-8?q?=E5=8F=8A=E6=8F=90=E4=BA=A4=E5=AE=A1=E6=A0=B8=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E8=AF=AD=E9=9F=B3=E6=92=AD=E6=8A=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/common/util.js | 34 +++++++++++++++++-- src/pages/saleship/salepickscandetail.vue | 21 ++++++------ .../storeFabricBusinessOutMixin.js | 10 +++--- .../storeFabricBusinessOutView.vue | 7 ++-- .../storegoods/storeGoodsBusinessCheckAdd.vue | 12 +++---- .../storeGoodsBusinessCheckDetail.vue | 10 +++--- .../storeGoodsBusinessStationMoveOnly.vue | 6 ++-- .../storegoods/storeGoodsProcessInMixin.js | 10 +++--- .../storegoods/storeGoodsProcessInView.vue | 7 ++-- .../storegoods/storeGoodsProcessOutMixin.js | 10 +++--- .../storegoods/storeGoodsProcessOutView.vue | 7 ++-- .../storeGoodsProcessReturnInMixin.js | 10 +++--- .../storeGoodsProcessReturnInView.vue | 7 ++-- .../storegoods/storeGoodsPurchaseInMixin.js | 10 +++--- .../storegoods/storeGoodsPurchaseInView.vue | 7 ++-- 15 files changed, 101 insertions(+), 67 deletions(-) diff --git a/src/common/util.js b/src/common/util.js index f245774..25865c3 100644 --- a/src/common/util.js +++ b/src/common/util.js @@ -2,6 +2,7 @@ * 通用公共js库,主要定义api接口,auth apikey 常量值和通用函数 */ import store from '@/store/index.js'; +import { speak } from './tts.js'; // var apiurl = 'http://192.168.1.66:50002/hcscm/pda/v1/'; //开发环境 添 // var apiurl = 'http://192.168.1.55:50002/hcscm/pda/v1/'; //开发环境 添 @@ -332,7 +333,34 @@ function createAudio(src) { let successAudio = undefined; let errorAudio = undefined; -function playSuccessAudio() { +/** 审核类操作成功时的固定播报 */ +function statusSuccessVoice(action) { + const map = { + approve: '审核成功', + void: '作废成功', + unapprove: '消审成功', + }; + return map[action] || '操作成功'; +} + +/** 成功/失败提示音约 0.9 秒,播完再朗读,避免提示音抢走语音 */ +let speakFeedbackTimer = null; + +function speakFeedback(text, fallback) { + let content = String(text == null ? '' : text) + .replace(/[\r\n\t]/g, '') + .replace(/[!!。..??;;,,、]/g, '') + .trim(); + if (!content || content.length > 32) content = fallback; + if (speakFeedbackTimer) clearTimeout(speakFeedbackTimer); + speakFeedbackTimer = setTimeout(() => { + speakFeedbackTimer = null; + speak(content); + }, 1100); +} + +function playSuccessAudio(text) { + speakFeedback(text, '成功'); if (!successAudio) { //console.log("create success"); successAudio = createAudio('/static/audio/appright.wav'); @@ -349,7 +377,8 @@ function playSuccessAudio() { successAudio.play(); } -function playErrorAudio() { +function playErrorAudio(text) { + speakFeedback(text, '失败'); if (!errorAudio) { //console.log("create error"); errorAudio = createAudio('/static/audio/apperror.wav'); @@ -378,4 +407,5 @@ export default { parGetData, playSuccessAudio, playErrorAudio, + statusSuccessVoice, }; diff --git a/src/pages/saleship/salepickscandetail.vue b/src/pages/saleship/salepickscandetail.vue index 92e0fbb..85a9303 100644 --- a/src/pages/saleship/salepickscandetail.vue +++ b/src/pages/saleship/salepickscandetail.vue @@ -218,11 +218,11 @@ export default { this.openPhoneScan(); }, - playSuccess() { - util.playSuccessAudio(); + playSuccess(text) { + util.playSuccessAudio(text); }, - playError() { - util.playErrorAudio(); + playError(text) { + util.playErrorAudio(text); }, handleAllCrockNoChange() { @@ -289,7 +289,7 @@ export default { }, // 添加通用错误提示方法 showError(message) { - this.playError(); + this.playError(message); uni.showModal({ title: '提示', content: message, @@ -298,7 +298,7 @@ export default { }, // 添加成功提示方法 showSuccess(message) { - this.playSuccess(); + this.playSuccess(message); uni.showToast({ title: message, icon: 'success' @@ -364,7 +364,6 @@ export default { if (res.data.code == 0 && res.data.msg == "success") { var aResultData = res.data.data; - this.playSuccess(); this.FabricGoodsNo = aResultData.product_code; this.FabricGoodsName = aResultData.product_name; this.GoodsCodeNo = aResultData.product_color_code; @@ -401,7 +400,7 @@ export default { // 提交按钮方法 submitBtnFun: function () { if (this.BillMasterID == 0) { - this.playError(); + this.playError("单号为空,不能提交"); this.BillDataMessage = "单号为空,不能提交"; return; } @@ -438,15 +437,15 @@ export default { console.log('outFpmArrangeOrder res', res) if (res) { this.BillDataMessage = "成功生成出仓单!"; - this.playSuccess(); + this.playSuccess("提交成功"); } else { - this.playError(); + this.playError("提交生成出仓单出错"); this.BillDataMessage = "提交生成出仓单出错!" + res.msg; return; } }).catch(error => { this.submitLoading = false - this.playError(); + this.playError("连接服务器出错"); this.BillDataMessage = "连接服务器出错,请检查后台服务是否启动!"; }); }, diff --git a/src/pages/storefabric/storeFabricBusinessOutMixin.js b/src/pages/storefabric/storeFabricBusinessOutMixin.js index a53da25..46b0858 100644 --- a/src/pages/storefabric/storeFabricBusinessOutMixin.js +++ b/src/pages/storefabric/storeFabricBusinessOutMixin.js @@ -248,7 +248,7 @@ export default { this.applyOrder(order); this.headerSaved = true; this.syncCanScanFromStatus(order.audit_status); - this.showSuccess('保存成功,可以扫码'); + this.showSuccess('保存成功,可以扫码', '提交成功'); this.registerOrderScanBroadcast(); }) .catch((e) => { @@ -390,16 +390,16 @@ export default { if (!order) return; this.applyOrder(order); this.syncCanScanFromStatus(order.audit_status); - this.showSuccess('操作成功'); + this.showSuccess(util.statusSuccessVoice(action)); }), }); }, showError(message, options = {}) { - if (!options.skipErrorAudio) util.playErrorAudio(); + if (!options.skipErrorAudio) util.playErrorAudio(message); uni.showModal({ title: '提示', content: message, showCancel: false }); }, - showSuccess(message) { - util.playSuccessAudio(); + showSuccess(message, voiceText) { + util.playSuccessAudio(voiceText || message); uni.showToast({ title: message, icon: 'success' }); }, getBillTypeName() { diff --git a/src/pages/storefabric/storeFabricBusinessOutView.vue b/src/pages/storefabric/storeFabricBusinessOutView.vue index 85d3ce5..f74c7b2 100644 --- a/src/pages/storefabric/storeFabricBusinessOutView.vue +++ b/src/pages/storefabric/storeFabricBusinessOutView.vue @@ -123,13 +123,14 @@ export default { uni.hideLoading(); const order = normalizeOrder(res); if (order) this.order = order; - util.playSuccessAudio(); - uni.showToast({ title: '操作成功', icon: 'success' }); + const voice = util.statusSuccessVoice(action); + util.playSuccessAudio(voice); + uni.showToast({ title: voice, icon: 'success' }); }), }); }, showError(message) { - util.playErrorAudio(); + util.playErrorAudio(message); uni.showModal({ title: '提示', content: message, showCancel: false }); }, }, diff --git a/src/pages/storegoods/storeGoodsBusinessCheckAdd.vue b/src/pages/storegoods/storeGoodsBusinessCheckAdd.vue index eb21267..e7993b4 100644 --- a/src/pages/storegoods/storeGoodsBusinessCheckAdd.vue +++ b/src/pages/storegoods/storeGoodsBusinessCheckAdd.vue @@ -250,7 +250,7 @@ // 添加通用错误提示方法 showError(message) { - this.playError(); + this.playError(message); uni.showModal({ title: '提示', content: message, @@ -260,7 +260,7 @@ // 添加成功提示方法 showSuccess(message) { - this.playSuccess(); + this.playSuccess(message); uni.showToast({ title: message, icon: 'success' @@ -269,11 +269,11 @@ - playSuccess() { - util.playSuccessAudio(); + playSuccess(text) { + util.playSuccessAudio(text); }, - playError() { - util.playErrorAudio(); + playError(text) { + util.playErrorAudio(text); }, BarCodeDelChange: function() { diff --git a/src/pages/storegoods/storeGoodsBusinessCheckDetail.vue b/src/pages/storegoods/storeGoodsBusinessCheckDetail.vue index c8636b2..baab2ec 100644 --- a/src/pages/storegoods/storeGoodsBusinessCheckDetail.vue +++ b/src/pages/storegoods/storeGoodsBusinessCheckDetail.vue @@ -183,7 +183,7 @@ export default { // 添加通用错误提示方法 showError(message) { - this.playError(); + this.playError(message); uni.showModal({ title: '提示', content: message, @@ -191,11 +191,11 @@ export default { }); }, - playSuccess() { - util.playSuccessAudio(); + playSuccess(text) { + util.playSuccessAudio(text); }, - playError() { - util.playErrorAudio(); + playError(text) { + util.playErrorAudio(text); }, BarCodeDelChange: function () { diff --git a/src/pages/storegoods/storeGoodsBusinessStationMoveOnly.vue b/src/pages/storegoods/storeGoodsBusinessStationMoveOnly.vue index 1bddc53..6bd1136 100644 --- a/src/pages/storegoods/storeGoodsBusinessStationMoveOnly.vue +++ b/src/pages/storegoods/storeGoodsBusinessStationMoveOnly.vue @@ -189,8 +189,8 @@ export default { playSuccess() { util.playSuccessAudio(); }, - playError() { - util.playErrorAudio(); + playError(text) { + util.playErrorAudio(text); }, // 自定义扫码处理回调 - 处理本页面特有的扫码逻辑 @@ -268,7 +268,7 @@ export default { // 添加一个通用的错误提示方法 showError(message) { - this.playError(); + this.playError(message); uni.showModal({ title: '提示', content: message, diff --git a/src/pages/storegoods/storeGoodsProcessInMixin.js b/src/pages/storegoods/storeGoodsProcessInMixin.js index a9e042d..9a755b4 100644 --- a/src/pages/storegoods/storeGoodsProcessInMixin.js +++ b/src/pages/storegoods/storeGoodsProcessInMixin.js @@ -496,7 +496,7 @@ export default { this.headerSaved = true; this.clearWarehouseBin(); this.syncCanScanFromStatus(order.audit_status); - this.showSuccess('保存成功,请先扫描仓位'); + this.showSuccess('保存成功,请先扫描仓位', '提交成功'); this.registerOrderScanBroadcast(); }) .catch((e) => { @@ -637,16 +637,16 @@ export default { if (!order) return; this.applyOrder(order); this.syncCanScanFromStatus(order.audit_status); - this.showSuccess('操作成功'); + this.showSuccess(util.statusSuccessVoice(action)); }), }); }, showError(message) { - util.playErrorAudio(); + util.playErrorAudio(message); uni.showModal({ title: '提示', content: message, showCancel: false }); }, - showSuccess(message) { - util.playSuccessAudio(); + showSuccess(message, voiceText) { + util.playSuccessAudio(voiceText || message); uni.showToast({ title: message, icon: 'success' }); }, }, diff --git a/src/pages/storegoods/storeGoodsProcessInView.vue b/src/pages/storegoods/storeGoodsProcessInView.vue index 17b69f2..b48c657 100644 --- a/src/pages/storegoods/storeGoodsProcessInView.vue +++ b/src/pages/storegoods/storeGoodsProcessInView.vue @@ -122,13 +122,14 @@ export default { uni.hideLoading(); const order = normalizeOrder(res); if (order) this.order = order; - util.playSuccessAudio(); - uni.showToast({ title: '操作成功', icon: 'success' }); + const voice = util.statusSuccessVoice(action); + util.playSuccessAudio(voice); + uni.showToast({ title: voice, icon: 'success' }); }), }); }, showError(message) { - util.playErrorAudio(); + util.playErrorAudio(message); uni.showModal({ title: '提示', content: message, showCancel: false }); }, }, diff --git a/src/pages/storegoods/storeGoodsProcessOutMixin.js b/src/pages/storegoods/storeGoodsProcessOutMixin.js index 484757a..88c9d6a 100644 --- a/src/pages/storegoods/storeGoodsProcessOutMixin.js +++ b/src/pages/storegoods/storeGoodsProcessOutMixin.js @@ -367,7 +367,7 @@ export default { this.applyOrder(order); this.headerSaved = true; this.syncCanScanFromStatus(order.audit_status); - this.showSuccess('保存成功,请开始扫码'); + this.showSuccess('保存成功,请开始扫码', '提交成功'); this.registerOrderScanBroadcast(); }) .catch((e) => { @@ -480,16 +480,16 @@ export default { if (!order) return; this.applyOrder(order); this.syncCanScanFromStatus(order.audit_status); - this.showSuccess('操作成功'); + this.showSuccess(util.statusSuccessVoice(action)); }), }); }, showError(message) { - util.playErrorAudio(); + util.playErrorAudio(message); uni.showModal({ title: '提示', content: message, showCancel: false }); }, - showSuccess(message) { - util.playSuccessAudio(); + showSuccess(message, voiceText) { + util.playSuccessAudio(voiceText || message); uni.showToast({ title: message, icon: 'success' }); }, }, diff --git a/src/pages/storegoods/storeGoodsProcessOutView.vue b/src/pages/storegoods/storeGoodsProcessOutView.vue index 533d0aa..ffb00d7 100644 --- a/src/pages/storegoods/storeGoodsProcessOutView.vue +++ b/src/pages/storegoods/storeGoodsProcessOutView.vue @@ -107,13 +107,14 @@ export default { uni.hideLoading(); const order = normalizeOrder(res); if (order) this.order = order; - util.playSuccessAudio(); - uni.showToast({ title: '操作成功', icon: 'success' }); + const voice = util.statusSuccessVoice(action); + util.playSuccessAudio(voice); + uni.showToast({ title: voice, icon: 'success' }); }), }); }, showError(message) { - util.playErrorAudio(); + util.playErrorAudio(message); uni.showModal({ title: '提示', content: message, showCancel: false }); }, }, diff --git a/src/pages/storegoods/storeGoodsProcessReturnInMixin.js b/src/pages/storegoods/storeGoodsProcessReturnInMixin.js index 368504f..7dfd1b4 100644 --- a/src/pages/storegoods/storeGoodsProcessReturnInMixin.js +++ b/src/pages/storegoods/storeGoodsProcessReturnInMixin.js @@ -419,7 +419,7 @@ export default { this.headerSaved = true; this.clearWarehouseBin(); this.syncCanScanFromStatus(order.audit_status); - this.showSuccess('保存成功,请先扫描仓位'); + this.showSuccess('保存成功,请先扫描仓位', '提交成功'); this.registerOrderScanBroadcast(); }) .catch((e) => { @@ -537,16 +537,16 @@ export default { if (!order) return; this.applyOrder(order); this.syncCanScanFromStatus(order.audit_status); - this.showSuccess('操作成功'); + this.showSuccess(util.statusSuccessVoice(action)); }), }); }, showError(message) { - util.playErrorAudio(); + util.playErrorAudio(message); uni.showModal({ title: '提示', content: message, showCancel: false }); }, - showSuccess(message) { - util.playSuccessAudio(); + showSuccess(message, voiceText) { + util.playSuccessAudio(voiceText || message); uni.showToast({ title: message, icon: 'success' }); }, }, diff --git a/src/pages/storegoods/storeGoodsProcessReturnInView.vue b/src/pages/storegoods/storeGoodsProcessReturnInView.vue index 6a637c0..0b0bb1a 100644 --- a/src/pages/storegoods/storeGoodsProcessReturnInView.vue +++ b/src/pages/storegoods/storeGoodsProcessReturnInView.vue @@ -107,13 +107,14 @@ export default { uni.hideLoading(); const order = normalizeOrder(res); if (order) this.order = order; - util.playSuccessAudio(); - uni.showToast({ title: '操作成功', icon: 'success' }); + const voice = util.statusSuccessVoice(action); + util.playSuccessAudio(voice); + uni.showToast({ title: voice, icon: 'success' }); }), }); }, showError(message) { - util.playErrorAudio(); + util.playErrorAudio(message); uni.showModal({ title: '提示', content: message, showCancel: false }); }, }, diff --git a/src/pages/storegoods/storeGoodsPurchaseInMixin.js b/src/pages/storegoods/storeGoodsPurchaseInMixin.js index 8a712ee..8824f83 100644 --- a/src/pages/storegoods/storeGoodsPurchaseInMixin.js +++ b/src/pages/storegoods/storeGoodsPurchaseInMixin.js @@ -501,7 +501,7 @@ export default { this.headerSaved = true; this.clearWarehouseBin(); this.syncCanScanFromStatus(order.audit_status); - this.showSuccess('保存成功,请先扫描仓位'); + this.showSuccess('保存成功,请先扫描仓位', '提交成功'); this.registerOrderScanBroadcast(); }) .catch((e) => { @@ -642,16 +642,16 @@ export default { if (!order) return; this.applyOrder(order); this.syncCanScanFromStatus(order.audit_status); - this.showSuccess('操作成功'); + this.showSuccess(util.statusSuccessVoice(action)); }), }); }, showError(message) { - util.playErrorAudio(); + util.playErrorAudio(message); uni.showModal({ title: '提示', content: message, showCancel: false }); }, - showSuccess(message) { - util.playSuccessAudio(); + showSuccess(message, voiceText) { + util.playSuccessAudio(voiceText || message); uni.showToast({ title: message, icon: 'success' }); }, }, diff --git a/src/pages/storegoods/storeGoodsPurchaseInView.vue b/src/pages/storegoods/storeGoodsPurchaseInView.vue index de3fdfa..2e5e5ad 100644 --- a/src/pages/storegoods/storeGoodsPurchaseInView.vue +++ b/src/pages/storegoods/storeGoodsPurchaseInView.vue @@ -122,13 +122,14 @@ export default { uni.hideLoading(); const order = normalizeOrder(res); if (order) this.order = order; - util.playSuccessAudio(); - uni.showToast({ title: '操作成功', icon: 'success' }); + const voice = util.statusSuccessVoice(action); + util.playSuccessAudio(voice); + uni.showToast({ title: voice, icon: 'success' }); }), }); }, showError(message) { - util.playErrorAudio(); + util.playErrorAudio(message); uni.showModal({ title: '提示', content: message, showCancel: false }); }, },