From 4ad08f699d711849ca4dd271f2107dee8942ad99 Mon Sep 17 00:00:00 2001 From: jia <1451658316@qq.com> Date: Mon, 14 Aug 2023 18:03:57 +0800 Subject: [PATCH] =?UTF-8?q?1.=E5=AF=B9=E6=8E=A5=E8=B0=83=E8=B4=A7=E5=A4=A7?= =?UTF-8?q?=E5=8E=85=E7=AD=89=E6=8E=A5=E5=8F=A3=20=20=202.=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E8=B0=83=E8=B4=A7=E3=80=81=E5=A7=94=E6=89=98=E7=95=8C?= =?UTF-8?q?=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/release/release.vue | 9 +- components/shoppinglist/shoppinglist.vue | 80 +++-- .../initiateDelegation/index.vue | 130 +++---- .../receivedCommission/index.vue | 323 ++++++++++++++++-- pages/releaseManagement/index.vue | 14 +- pages/trading_hall/product_details/index.vue | 16 +- pages/trading_hall/transfer_goods/index.vue | 233 +++++-------- pages/users/order_list/index.vue | 4 +- pages/users/order_list/indexCopy.vue | 8 +- pages/users/trading_hall/index.vue | 28 +- plugin/voice/voice.js | 269 +++++++++++++++ static/audio/order.mp3 | Bin 0 -> 11088 bytes 12 files changed, 810 insertions(+), 304 deletions(-) create mode 100644 plugin/voice/voice.js create mode 100644 static/audio/order.mp3 diff --git a/components/release/release.vue b/components/release/release.vue index 2265738..eb7e02f 100644 --- a/components/release/release.vue +++ b/components/release/release.vue @@ -121,7 +121,7 @@ .release_content_left { display: flex; - + } .release_content_right { @@ -135,7 +135,7 @@ height: 96rpx; margin-top: 21rpx; margin-right: 19rpx; - margin-left: -15rpx; + image { width: 111rpx; @@ -144,11 +144,12 @@ } .release_imga { + width: 76rpx; height: 113rpx; - margin-left: 21rpx; + margin-top: 5rpx; - margin-right: 19rpx; + margin-right: 50rpx; image { width: 76rpx; diff --git a/components/shoppinglist/shoppinglist.vue b/components/shoppinglist/shoppinglist.vue index 7a29516..258289d 100644 --- a/components/shoppinglist/shoppinglist.vue +++ b/components/shoppinglist/shoppinglist.vue @@ -31,34 +31,39 @@ {{item.store_name}} - - - - {{item.attrValue[index].sku}} - - + + + {{item.attrValue[index].sku}} + - 库存:{{item.stock}} + 库存:{{item.attrValue[index].stock}} - + + + + 出售价格 - + 出售数量 - - + + + @@ -140,8 +145,8 @@ IfProductId: 0, }], index: 0, - pickerData: '请选择' - + pickerData: '请选择', + itstock: '', }; }, @@ -157,16 +162,13 @@ mounted() { this.checkedArr = this.checkedObj this.getBounht(); - - }, methods: { // picker修改事件 - bindPickerChange: function(e, storage) { - console.log(e) - console.log(storage) - // this.index = e.target.value + bindPickerChange: function(e, storage, num) { + this.bought[num].attrValue[this.index].stock=storage[e.detail.value].stock + this.bought[num].product_attr_unique=storage[e.detail.value].unique this.pickerData = storage[this.index] // 这里就是选中的对象 }, @@ -174,8 +176,10 @@ close() { this.$emit('close'); }, - numberChange(data) { + numberChange(data,i) { this.peicenumber = data.number; + this.bought[i].num=data.number + }, tabs(index) { this.isActive = index @@ -203,7 +207,7 @@ }, searchBut() { this.whereb.page = this.wherec.page = this.wheres.page = - this.bought = [] + this.bought = [] this.isActive == 0 ? this.getBounht() : '' }, getBounht() { @@ -213,7 +217,6 @@ getCommunitygetOrderList(that.whereb).then( res => { - that.loadingb = false; that.loadedb = res.data.list.length < that.whereb.limit; that.bought.push.apply(that.bought, res.data.list); @@ -237,9 +240,14 @@ that.checkedArr.forEach((val, i) => { if (item.product_id == val.product_id) { that.$set(item, 'check', true); + that.$set(item, 'num', val.num); + + }else{ + that.$set(item, 'num', 0); } }) }) + }, /*已选中的商品打钩*/ getCheckedGoods() { @@ -250,10 +258,19 @@ }, /*点击选中与否*/ goodsCheck(item) { - this.$set(item, 'check', !item.check); - console.log(item, 'check', !item.check) + this.$set(item, 'check', !item.check); if (item.check) { + if(this.peicenumber>0){ + item.num=this.peicenumber + }else{ + item.num=1 + } + + if(!item.product_attr_unique){ + item.product_attr_unique=item.attrValue[0].unique + } this.checkedArr.push(item) + } else { this.checkedArr.splice(this.checkedArr.findIndex(itemn => ((itemn.spu_id == item.spu_id) || (item .spu_id == ( @@ -263,8 +280,9 @@ }, /*确定提交*/ submit() { + this.$emit('getProduct', this.checkedArr); - console.log(this.checkedArr) + }, } } @@ -408,7 +426,7 @@ .price { display: flex; - margin-right: 15rpx; + margin-right: 15rpx; input { width: 210rpx; @@ -419,9 +437,9 @@ font-size: 28rpx; font-family: PingFang SC-Regular, PingFang SC; font-weight: 400; - + margin-left: 20rpx; - + } } diff --git a/pages/commissionedSales/initiateDelegation/index.vue b/pages/commissionedSales/initiateDelegation/index.vue index e38eac1..ce2d100 100644 --- a/pages/commissionedSales/initiateDelegation/index.vue +++ b/pages/commissionedSales/initiateDelegation/index.vue @@ -6,7 +6,7 @@ - + @@ -43,12 +43,12 @@ - + 已接受 - + 结束委托 @@ -60,7 +60,7 @@ - + 已拒绝 @@ -94,7 +94,7 @@ - - + + - - + + + @@ -211,17 +210,16 @@ 利息比例: 0.05% - + 拒绝原因: - - + @@ -96,8 +95,10 @@ - 价格:¥{{price}} - + + 价格:¥{{price}} + @@ -136,13 +137,7 @@ - + @@ -154,7 +149,7 @@ import authorize from '@/components/Authorize'; import avatar from "@/components/yq-avatar/yq-avatar.vue"; import associated from '@/components/shoppinglist/shoppinglist.vue'; - + import { TOKENNAME, HTTP_REQUEST_URL @@ -173,6 +168,9 @@ import { configMap } from '@/utils'; + import { + getCommunitycreate + } from '@/api/trading-floor.js' import store from '@/store'; export default { components: { @@ -187,11 +185,13 @@ formData: { image: [], content: "", - topic_id: "", - spu_id: [], - video_link: '' + topic_id: 0, + category_id: 0, + video_link: '', + is_type: 3, + product_info: [] }, - price:0, + price: 0, imageSrc: '', productList: [], topicName: {}, @@ -222,7 +222,9 @@ video_link: "", showVideo: false, videoplay: false, - videoContext: '' + videoContext: '', + + }; }, computed: { @@ -251,8 +253,7 @@ onLoad(options) { // uni.hideTabBar() this.id = options.id; - this.order_id = options.order_id; - // console.log("options.order_id", options.order_id) + this.tabActive = options.type || 1; if (this.community_app_switch.length == 1) { this.tabActive = this.community_app_switch[0] @@ -261,16 +262,8 @@ this.isAuto = true; this.isShowAuth = true } else { - if (this.id) { - this.getDetail() - } else { - // const data = getStorage('addPlant'); - // if(data){ - // this.formData.content = data.content || ''; - // this.formData.image = data.image || []; - // } - } - if (this.order_id) this.getOrderGoods() + + } this.videoContext = uni.createVideoContext("myvideo", this); }, @@ -279,7 +272,8 @@ this.formData.content = '' this.formData.image = [] this.formData.topic_id = '' - this.formData.spu_id = '' + + this.formData.video_link = '' this.productList = [] this.topicName = {} @@ -293,31 +287,7 @@ authColse: function(e) { this.isShowAuth = e; }, - /*获取图文详情*/ - getDetail() { - let that = this - plantDetailApi(that.id).then(res => { - that.formData = res.data - that.productList = res.data.relevance || [] - that.topicName = res.data.topic || {} - }).catch(err => { - return that.$util.Tips({ - title: err - }); - }) - }, - /*获取关联订单商品*/ - getOrderGoods() { - let that = this - orderAssociatePlantApi(that.order_id).then(res => { - that.productList = res.data || [] - that.formData.spu_id = res.data.map(val => val.spu_id) - }).catch(err => { - return that.$util.Tips({ - title: err - }); - }) - }, + /*点击输入价格*/ addprice() { this.isshow = true @@ -485,7 +455,7 @@ close() { this.$refs.associated.close(); - + }, /*查看视频*/ videoshow() { @@ -508,8 +478,23 @@ }, /*获取选中的宝贝*/ getProduct(data) { - this.productList = data; - this.formData.spu_id = data.map(val => val.spu_id) + if (data.length > 0) { +this.productList = data; + for (let i in data) { + this.price = Number(this.price) + (Number(data[i].num) * Number(data[i].price)) + this.formData.product_info.push({ + product_attr_unique: data[i].product_attr_unique, + number: Number(data[i].num), + price: data[i].price + }) + } + } else { + this.price = 0 + } + + + + this.$refs.associated.close(); }, @@ -517,128 +502,62 @@ * 提交数据 */ formSubmit: function(e) { + console.log(this.id) let that = this, value = that.formData; if (value.image.length == 0) return that.$util.Tips({ - title: '请添加话题图片' + title: '请添加图文图片' + }); + if (value.product_info.length == 0) return that.$util.Tips({ + title: '请选择产品' }); if (!value.content) return that.$util.Tips({ - title: '请分享使用心得和体会' + title: '请添加商品描述' }); if (that.tabActive == 2 && !value.video_link) { return that.$util.Tips({ title: '请添加话题视频' }); } - if (!value.category_id || !value.topic_id) { - return that.$util.Tips({ - title: '请选择话题' - }) - } - if (that.id) { - if (value.relevance.length) { - value.spu_id = value.relevance.map(val => (val.spu && val.spu.spu_id) || val.spu_id) - } - } - value.order_id = that.order_id - value.is_type = that.tabActive + uni.showLoading({ title: '保存中', mask: true }) - that.id ? updatePlantApi(that.id, value).then(res => { - uni.hideLoading() - that.$util.Tips({ - title: res.messge, - icon: 'success' - }); - - setTimeout(function() { - if (that.tabActive == 2) { - uni.navigateTo({ - //#ifdef APP - url: '/pages/short_video/appSwiper/index?id=' + res.data - .community_id + '&user=1&uid=' + - that.uid - //#endif - //#ifndef APP - url: '/pages/short_video/nvueSwiper/index?id=' + res.data - .community_id + '&user=1&uid=' + - that.uid - //#endif - }); - } else { - uni.navigateTo({ - url: '/pages/plantGrass/plant_detail/index?id=' + res.data - .community_id + '&type=' + that - .tabActive - }) - } - /** - * 将对象所有值为空 - * */ - /** - * 将对象所有值为空 - * */ + getCommunitycreate(value).then(res => { + if (res.status == '200') { + uni.hideLoading() + that.$util.Tips({ + title: '发布成功', + icon: 'success' + }); that.formData = { image: [], content: "", - topic_id: "", - spu_id: [], - video_link: "", - } - that.topicName = {} - }, 1000); - }).catch(err => { - return that.$util.Tips({ - title: err - }); - }) : createPlantApi(value).then(res => { - uni.hideLoading() - that.$util.Tips({ - title: res.messge, - icon: 'success' - }); - setStorage('addPlant', ''); - setTimeout(function() { - if (that.tabActive == 2) { - uni.navigateTo({ - //#ifdef APP - url: '/pages/short_video/appSwiper/index?id=' + res.data - .community_id + '&user=1&uid=' + - that.uid - //#endif - //#ifndef APP - url: '/pages/short_video/nvueSwiper/index?id=' + res.data - .community_id + '&user=1&uid=' + - that.uid - //#endif - }); - } else { - uni.navigateTo({ - url: '/pages/plantGrass/plant_detail/index?id=' + res.data - .community_id + '&type=' + that - .tabActive - }) - } - /** - * 将对象所有值为空 - * */ - that.formData = { - image: [], - content: "", - topic_id: "", - spu_id: [], - video_link: "", + topic_id: 0, + category_id: 0, + video_link: '', + is_type: 3, + product_info: [] } + uni.navigateTo({ + url: '/pages/releaseManagement/index?key=' + 2 + }) - }, 1000); + } else { + that.$util.Tips({ + title: res.messge, + icon: 'success' + }); + } }).catch(err => { - // console.log('aaa', value) + return that.$util.Tips({ title: err }); }) + + } } } diff --git a/pages/users/order_list/index.vue b/pages/users/order_list/index.vue index 432146b..0afdb64 100644 --- a/pages/users/order_list/index.vue +++ b/pages/users/order_list/index.vue @@ -21,7 +21,7 @@ 全部 - {{orderData.all || 0}} + {{orderData.orderCount || 0}} 待付款 @@ -493,7 +493,7 @@ */ getOrderData: function() { let that = this; - orderData().then(res => { + orderData({product_type:0}).then(res => { that.$set(that, 'orderData', res.data); }) }, diff --git a/pages/users/order_list/indexCopy.vue b/pages/users/order_list/indexCopy.vue index 03d3f7f..d563918 100644 --- a/pages/users/order_list/indexCopy.vue +++ b/pages/users/order_list/indexCopy.vue @@ -21,7 +21,7 @@ 全部 - {{orderData.all || 0}} + {{orderData.orderCount || 0}} 待付款 @@ -493,8 +493,10 @@ */ getOrderData: function() { let that = this; - orderData().then(res => { - console.log(res.data) + orderData({ + product_type:98 + }).then(res => { + // console.log(res.data) that.$set(that, 'orderData', res.data); }) }, diff --git a/pages/users/trading_hall/index.vue b/pages/users/trading_hall/index.vue index 3f8a4e1..3c7f6c1 100644 --- a/pages/users/trading_hall/index.vue +++ b/pages/users/trading_hall/index.vue @@ -17,8 +17,10 @@ - - {{this.recomname}} + + + {{this.recomname}} + @@ -41,16 +43,16 @@ 调货 委托销售 - {{item.name}} + {{item.title}} {{item.total_price}} - + - {{item.author.nickname}} + {{item.mer_name}} @@ -164,7 +166,7 @@ }, getlist(index) { - console.log(this.num) + if (this.num == 0) { this.where = { page: 1, @@ -222,8 +224,10 @@ this.visible = false }, menuAction(action, rowId) { - console.log(action); + // console.log(action); // 忽略初始化时的传入的空操作 + this.num=action + this.getlist(action) if (action === '') { this.recomname = this.options[0].text } else { @@ -305,7 +309,7 @@ font-size: 32rpx; font-family: 'PingFang SC'; font-weight: 400; - color: #F84221; + .recom_sym { width: 28rpx; @@ -361,10 +365,11 @@ } .list { - width: 100%; + width: 694.74rpx; + margin: 0 auto; display: flex; - justify-content: flex-start; + justify-content: space-between; align-items: center; flex-wrap: wrap; @@ -374,7 +379,7 @@ height: 561rpx; background-color: #fff; margin-top: 21rpx; - margin-left: 25rpx; + border-radius: 14rpx 14rpx 0 0; .shopimg { @@ -403,6 +408,7 @@ font-weight: 400; color: #FFFFFF; font-size: 25rpx; + margin-right: 15rpx; } } diff --git a/plugin/voice/voice.js b/plugin/voice/voice.js new file mode 100644 index 0000000..eba91a9 --- /dev/null +++ b/plugin/voice/voice.js @@ -0,0 +1,269 @@ +/** + * Notes: APP语音播报 + * @author WJD + * @version 1.0.0 + * @Date 2022-01-26 + */ + +// import store from '../store' + +// 是否播放中 +let isPlaying = false; +// 播放列表 +let currentAudio = ['/static/audio/order.mp3']; +// 播放顺序 +let playIndex = 0 +// 播放器 +let audioPlayer = null; +// 平台 +let platform = 'iOS'; +// 定时器 +let timer = null; +// socket地址 +const socketUrl = "wss://gateworker.yngod.cn:8686"; + +const voice = { + // 创建播放器 + init: () => { + // platform = plus.os.name; + // if (platform == 'Android') { + // let MediaPlayer = plus.android.importClass("android.media.MediaPlayer"); + // audioPlayer = new MediaPlayer() + // } + // if (platform == "iOS") { + // let AVAudioPlayer = plus.ios.importClass("AVAudioPlayer"); + // audioPlayer = new AVAudioPlayer(); + // } + console.log('创建播放器成功'); + // voice.playAudio(); + }, + // 连接socket + connectSocketGlobal: () => { + uni.connectSocket({ + url: socketUrl, + success: (res) => { + console.log('连接成功'); + } + }) + + uni.onSocketOpen((success) => { + console.log('WebSocket连接已打开!'); + let storeIds = store.state.storeIds; + if (storeIds.length > 0) { + storeIds.forEach(sid => { + uni.sendSocketMessage({ + data: sid.toString(), + success: (s) => { + console.log('成功'); + } + }); + }) + } + store.commit('setData', { + key: 'socketIsOpen', + val: true + }); + }) + + uni.onSocketError(function(error) { + console.log('WebSocket连接打开失败,请检查!'); + }); + + uni.onSocketMessage((res) => { + console.log('接收播报数据', res) + //按接收的内容播放信息 + try { + if (typeof res == 'string') { + res = JSON.parse(res); + } + if (typeof res.data == 'string') { + res.data = JSON.parse(res.data); + } + if(res.data?.Hearbeat) { + uni.sendSocketMessage({ + data: "hearbeat", + success: (s) => { + console.log('成功'); + } + }); + return ; + } + if (res.data.needPlay) { + try { + // var parseStr = voice.parseAudioData(res.data); + } catch (e) { + // console.log('解析出错', e) + } + // console.log('解析数据', parseStr) + // voice.addAudioQueue(parseStr); + } + } catch (e) {} + }) + }, + //解析服务器数据 + parseAudioData: function(serverData) { + let audio = []; + //头部 + //处理中间数字 + serverData.data = parseFloat(serverData.data).toString(); + //如果当前数字中没有小数点,则用.00补足 + if (serverData.data.indexOf('.') == -1) serverData.data += '.00'; + let dot = serverData.data.indexOf('.'); + let l = serverData.data.length; + for (let n = 0; n < l; n++) { + //如果上一位是0则不加入 + if (audio[audio.length - 1] != 0 || serverData.data.substr(n, 1) != '0') { + audio.push(serverData.data.substr(n, 1)); + //根据当前数字的位置与dot的位置决定后缀并且当前不是小数点 + if (serverData.data.substr(n, 1) != '.' && serverData.data.substr(n, 1) != '0') { + if (dot - n == 2) { + audio.push('ten'); + } else if (dot - n == 3) { + audio.push('hundred'); + } else if (dot - n == 4) { + audio.push('thousand'); + } else if (dot - n == 5) { + audio.push('ten_thousand'); + } + } + } + } + //如果出现1shi则去掉1 + let _audio = audio.join('&'); + if (audio[0] == 1) { + _audio = _audio.replace('1&shi', 'shi'); //应对一十元问题 + } + if (audio[0] != 0) { + _audio = _audio.replace('0&.', '.'); //应对一十点问题 + } + if (_audio.indexOf('.&0') == _audio.length - 2 - 1) { //应对末尾是.0 + _audio = _audio.substr(0, _audio.length - 2 - 2); + } + //加入前缀 + if (_audio) { + _audio = 'header_' + serverData.header.toString() + '&' + _audio; + } else { + _audio = 'header_' + serverData.header.toString(); + } + audio = _audio.split("&"); + //如果有金额 + if (l) { + audio.push('yuan'); + } + //底部 + if (serverData.footer) { + audio.push('footer'); + } + let result = []; + audio.map(item => { + if (item != '.') + result.push(`/static/audio/tts_${item}.mp3`); + else + result.push(`/static/audio/tts_dot.mp3`); + }) + return result; + }, + // 随机数 + getRandomKey: () => { + var max = 99999; + var min = 1; + return (Date.parse(new Date()) + '' + parseInt(Math.random() * (max - min + 1) + min, 10)).toString(); + }, + + // 语言播报语音数据 加入到队列里面 + addAudioQueue: (parseStr) => { + let audioList = store.state.audioList; + audioList[voice.getRandomKey()] = parseStr; + store.commit('setData', { + key: 'audioList', + val: audioList + }); + }, + // 重置播放列表 + resetPlayList: () => { + playIndex = 0; + currentAudio = ['/static/audio/order.mp3']; + }, + clearTimer: () => { + if (timer) { + clearInterval(timer); + timer = null; + } + + }, + // 播放音频 + playAudio: () => { + + if (isPlaying) { + console.log('播放中,请等待...') + return false; + } + if (audioPlayer == null) { + console.log('未启动音频播放器'); + return false; + } + + let audioList = currentAudio; + if (currentAudio.length == 0) { + const keys = Object.keys(audioList) + if (keys.length) { + currentAudio = Object.values(audioList)[0] + delete audioList[keys[0]] + playIndex = 0 + // store.commit('setData', { + // key: 'audioList', + // val: audioList + // }); + } else { + voice.resetPlayList(); + } + } + console.log('正在播报:', currentAudio[playIndex]); + let path = plus.io.convertLocalFileSystemURL(currentAudio[playIndex]); + let currentTime = 0; // 当前流媒体的播放的位置,单位是秒 + let currentDuration = 0; // 当前文件时长 + if (platform == 'iOS') { + let NSData = plus.ios.importClass("NSData"); + let AVAudioPlayer = plus.ios.importClass("AVAudioPlayer"); + let pathFileData = NSData.dataWithContentsOfFile(path); + audioPlayer.initWithDataerror(pathFileData, null); + // audioPlayer.setNumberOfLoops(-1); //-1:无限循环 + audioPlayer.prepareToPlay(); //初始化播放器 + audioPlayer.play(); + isPlaying = audioPlayer.isPlaying(); + // 当前播放进度 currentTime 秒 + } else { + let MediaPlayer = plus.android.importClass("android.media.MediaPlayer"); + audioPlayer.setDataSource(path); //指定音频文件路径 + // audioPlayer.setLooping(true); //设置为循环播放 + audioPlayer.prepare(); //初始化播放器MediaPlayer + audioPlayer.start(); + isPlaying = audioPlayer.isPlaying(); + // 获取音乐的总时长 + // console.log(audioPlayer.getDuration()); + // 当前播放进度 getCurrentPosition 毫秒 + } + timer = setInterval(function() { + currentTime = platform == 'iOS' ? audioPlayer.currentTime() : audioPlayer + .getCurrentPosition() / 1000; + currentDuration = platform == 'iOS' ? audioPlayer.duration() : audioPlayer + .getDuration() / 1000; + if (currentTime == currentDuration || currentTime == 0) { + isPlaying = false; + voice.clearTimer(); + if (playIndex < currentAudio.length - 1) { + playIndex++ + } else { + currentAudio = []; + playIndex = 0; + } + if (Object.keys(audioList).length == 0 && currentAudio.length == 0) { + voice.resetPlayList(); + } + voice.playAudio(); + } + }, 200); + } +} + +export default voice diff --git a/static/audio/order.mp3 b/static/audio/order.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..3bec7be6020527c90e2d72bb8f00ea586e94f124 GIT binary patch literal 11088 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