刘嘉炜
3 years ago
28 changed files with 30367 additions and 8764 deletions
-
18480package-lock.json
-
10src/js/api.js
-
8src/js/once_name.js
-
125src/manifest.json
-
30src/pages.json
-
25src/pages/employee/manage/manage.vue
-
2src/pages/index/index.vue
-
444src/pages/site/manage/manage.vue
-
284src/pages/write_off/mall/confirm/confirm.vue
-
226src/pages/write_off/mall/list/list.vue
-
150src/pages/write_off/mall/success/success.vue
-
108src/pages/write_off/menu/menu.vue
-
362src/pages/write_off/number_of_people/number_of_people.vue
-
113src/pages/write_off/operate/operate.vue
-
4src/pages/write_off/search_result/search_result.vue
-
BINsrc/static/images/countdown_bg.png
-
BINsrc/static/images/write_off/mall.png
-
BINsrc/static/images/write_off/order.png
-
BINsrc/static/images/write_off/people.png
-
BINsrc/static/images/write_off/site.png
-
24src/store/index.js
-
26src/subpackage/device/js/device_fun.js
-
1src/subpackage/device/pages/air_conditioner/detail/detail.vue
-
18src/subpackage/device/pages/audio_manage/audio_manage.vue
-
2src/subpackage/device/pages/order_details/order_details.vue
-
35src/subpackage/device/pages/switch_manage/switch_manage.vue
-
32src/subpackage/retail/components/retail_pay_way/retail_pay_way.vue
-
18622yarn.lock
18480
package-lock.json
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -0,0 +1,284 @@ |
|||
<template> |
|||
<view class="mall-ls-confirm"> |
|||
<!-- 20211228 pm 说写死 --> |
|||
<view class="mlc-status">{{ '待发货' }}</view> |
|||
<view class="mlc-main"> |
|||
<view class="mm-top mm-box"> |
|||
<view class="mt-line"> |
|||
<view>下单时间</view> |
|||
<view>{{ orderInfo.success_time || '-' }}</view> |
|||
</view> |
|||
<view class="mt-line"> |
|||
<view>订单编号</view> |
|||
<view>{{ orderInfo.order_no || '-' }}</view> |
|||
<view @click="copyBtn(orderInfo.order_no || '-')">复制</view> |
|||
</view> |
|||
</view> |
|||
<view class="mm-user-info mm-box"> |
|||
<view class="mm-tit">收货人信息</view> |
|||
<view class="mui-info"> |
|||
<view class="mi-line">配送方式:{{ sendMethod }}</view> |
|||
<view class="mi-line">{{ pickupInfo.name || '-' }} {{ pickupInfo.phone || '-' }}</view> |
|||
<view class="mi-line">{{ pickupInfo.store_name || '-' }}</view> |
|||
<view class="mi-addr">{{ pickupInfo.store_addr || '-' }}</view> |
|||
</view> |
|||
<view class="mui-code">取货码:{{ pickupInfo.gcode || '-' }}</view> |
|||
</view> |
|||
<view class="mm-goods" v-if="goodsLs.length"> |
|||
<view class="mm-tit">商品信息</view> |
|||
<view class="mg-ls"> |
|||
<view class="ml-item" v-for="(e, i) in goodsLs" :key="i"> |
|||
<image mode="aspectFill" :src="e.product_imgs || ''"></image> |
|||
<view class="mi-info"> |
|||
<view class="mi-name">{{ e.product_name || '-' }}</view> |
|||
<view class="mi-spec"> |
|||
<view>{{ getSpecTxt(e) }}</view> |
|||
<view>×{{ e.product_nums || 0 }}</view> |
|||
</view> |
|||
</view> |
|||
</view> |
|||
</view> |
|||
</view> |
|||
</view> |
|||
<view class="mlc-fixd-btn" @click="confirmBtn">确认核销</view> |
|||
</view> |
|||
</template> |
|||
|
|||
<script> |
|||
import util from '../../../../utils/util'; |
|||
import { API } from '../../../../js/api'; |
|||
import { servers } from '../../../../js/server'; |
|||
import { WRITE_OFF_MALL_ORDER_INFO, WRITE_OFF_MALL_ORDER_SUCCESS } from '../../../../js/once_name'; |
|||
import { mapState } from 'vuex'; |
|||
export default { |
|||
computed: { |
|||
goodsLs(){ |
|||
let { orderInfo } = this; |
|||
if(!orderInfo || !orderInfo.product_order_goods || !orderInfo.product_order_goods.length)return []; |
|||
return orderInfo.product_order_goods || []; |
|||
}, |
|||
setStatusTxt() { |
|||
let { orderInfo } = this; |
|||
if(!orderInfo || orderInfo.pay_status == undefined)return '-'; |
|||
// 0待付款 1待发货 2待收货 3待评价 4交易完成 5订单关闭 6退款中 7退款完成 8退款失败 |
|||
let statusArr = ['待付款', '待发货', '待收货', '交易完成', '交易完成', '订单关闭', '退款中', '退款完成', '退款关闭']; |
|||
return statusArr[orderInfo.pay_status] || '-'; |
|||
}, |
|||
sendMethod(){ |
|||
let { orderInfo } = this; |
|||
if(!orderInfo)return '-'; |
|||
if(orderInfo.product_order_self_pickup == 1)return '自提'; |
|||
if(orderInfo.product_order_self_pickup == 0)return '快递'; |
|||
return '-' |
|||
}, |
|||
pickupInfo(){ |
|||
let { orderInfo } = this; |
|||
if(!orderInfo || !orderInfo.product_order_self_pickup_info)return {}; |
|||
return orderInfo.product_order_self_pickup_info |
|||
}, |
|||
}, |
|||
data(){ |
|||
return { |
|||
orderInfo: { |
|||
product_order_self_pickup_info: {} |
|||
} |
|||
} |
|||
}, |
|||
onLoad(options){ |
|||
console.warn(options) |
|||
util.$_once(WRITE_OFF_MALL_ORDER_INFO, data => { |
|||
console.warn(data) |
|||
this.orderInfo = data || { }; |
|||
}) |
|||
}, |
|||
methods: { |
|||
confirmBtn: util.debounce(function(){ |
|||
let { orderInfo, pickupInfo } = this; |
|||
util.showLoad(); |
|||
servers.post({ |
|||
url: API.writeOff.shop2WriteoffSet, |
|||
data: { |
|||
vcode: pickupInfo.gcode, |
|||
brand_id: orderInfo.brand_id, |
|||
}, |
|||
isDefaultGet: false, |
|||
}) |
|||
.then(res=>{ |
|||
util.hideLoad(); |
|||
if(res.data.code == 0){ |
|||
let _ls = res.data.data || []; |
|||
util.$_emit(WRITE_OFF_MALL_ORDER_SUCCESS, _ls); |
|||
util.routeTo(`/pages/write_off/mall/success/success`, 'rT') |
|||
}else{ |
|||
util.showNone(res.data.message || '操作失败!') |
|||
} |
|||
}) |
|||
.catch(util.hideLoad) |
|||
}, 200, true), |
|||
copyBtn(data){ |
|||
uni.setClipboardData({ data }); |
|||
}, |
|||
getSpecTxt(e){ |
|||
if( |
|||
e.product_spec_multi == 1&& |
|||
e.product_spec_multi_info&& |
|||
e.product_spec_multi_info.spec_info&& |
|||
e.product_spec_multi_info.spec_info.length){ |
|||
let specStr = (e.product_spec_multi_info.spec_info).join(";") |
|||
return specStr; |
|||
} |
|||
return '-'; |
|||
} |
|||
} |
|||
} |
|||
</script> |
|||
|
|||
<style lang="scss"> |
|||
@import '~style/public.scss'; |
|||
.mall-ls-confirm{ |
|||
padding-bottom: 132upx; |
|||
padding-bottom: calc( 132upx + constant(safe-area-inset-bottom)); /* 兼容 iOS < 11.2 */ |
|||
padding-bottom: calc( 132upx + env(safe-area-inset-bottom)); /* 兼容 iOS >= 11.2 */ |
|||
} |
|||
.mlc-status{ |
|||
padding: 0 44upx; |
|||
height: 106upx; |
|||
line-height: 106upx; |
|||
font-size: 36upx; |
|||
color: #fff; |
|||
font-weight: 500; |
|||
background-color: $themeColor; |
|||
} |
|||
.mlc-main{ |
|||
padding: 24upx; |
|||
.mm-box{ |
|||
margin-bottom: 24upx; |
|||
padding: 30upx 28upx; |
|||
background-color: #fff; |
|||
border-radius: 10upx; |
|||
} |
|||
.mm-tit{ |
|||
padding-bottom: 20upx; |
|||
line-height: 44upx; |
|||
font-weight: 500; |
|||
font-size: 28upx; |
|||
color: #333; |
|||
border-bottom: 2upx solid #F2F2F7; |
|||
} |
|||
.mm-top{ |
|||
.mt-line{ |
|||
@include centerFlex(flex-start); |
|||
>view{ |
|||
font-size: 28upx; |
|||
line-height: 60upx; |
|||
color: #333; |
|||
&:first-child{ |
|||
margin-right: 60upx; |
|||
flex-shrink: 0; |
|||
flex-grow: 0; |
|||
color: #9A9A9D; |
|||
} |
|||
&:nth-child(2){ |
|||
@include textHide(1); |
|||
} |
|||
&:nth-child(3){ |
|||
margin-left: 30upx; |
|||
flex-shrink: 0; |
|||
color: $themeColor; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
.mm-user-info{ |
|||
.mui-info{ |
|||
padding: 20upx 0; |
|||
border-bottom: 2upx solid #F2F2F7; |
|||
.mi-line{ |
|||
margin-bottom: 14upx; |
|||
font-size: 28upx; |
|||
line-height: 40upx; |
|||
color: #333; |
|||
@include textHide(1); |
|||
} |
|||
.mi-addr{ |
|||
font-size: 28upx; |
|||
line-height: 40upx; |
|||
color: #9C9C9F; |
|||
} |
|||
} |
|||
.mui-code{ |
|||
padding-top: 30upx; |
|||
font-weight: 500; |
|||
font-size: 32upx; |
|||
color: #333; |
|||
} |
|||
} |
|||
.mm-goods{ |
|||
padding: 22upx 28upx 0; |
|||
border-radius: 10upx; |
|||
background-color: #fff; |
|||
.mg-ls{ |
|||
.ml-item{ |
|||
padding: 30upx 0upx; |
|||
@include centerFlex(space-between); |
|||
&:not(:last-child){ |
|||
border-bottom: 2upx solid #F2F2F7; |
|||
} |
|||
>image{ |
|||
flex-shrink: 0; |
|||
margin-right: 20upx; |
|||
width: 180upx; |
|||
height: 180upx; |
|||
border-radius: 10upx; |
|||
} |
|||
.mi-info{ |
|||
flex-grow: 1; |
|||
.mi-name{ |
|||
width: 330upx; |
|||
margin-bottom: 12upx; |
|||
font-size: 28upx; |
|||
line-height: 40upx; |
|||
min-height: 80upx; |
|||
color: #333; |
|||
@include textHide(2); |
|||
} |
|||
.mi-spec{ |
|||
width: 100%; |
|||
@include centerFlex(space-between); |
|||
>view{ |
|||
font-size: 24upx; |
|||
line-height: 34upx; |
|||
color: #9A9A9D; |
|||
@include textHide(1); |
|||
&:first-child{ |
|||
flex-grow: 1; |
|||
} |
|||
&+view{ |
|||
flex-shrink: 0; |
|||
margin-left: 20upx; |
|||
max-width: 30%; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
|||
.mlc-fixd-btn{ |
|||
position: fixed; |
|||
left: 50%; |
|||
transform: translateX(-50%); |
|||
bottom: 10upx; |
|||
bottom: calc( 10upx + constant(safe-area-inset-bottom)); /* 兼容 iOS < 11.2 */ |
|||
bottom: calc( 10upx + env(safe-area-inset-bottom)); /* 兼容 iOS >= 11.2 */ |
|||
width: 622upx; |
|||
height: 112upx; |
|||
line-height: 112upx; |
|||
text-align: center; |
|||
font-size: 32upx; |
|||
border-radius: 10upx; |
|||
color: #fff; |
|||
background-color: $themeColor; |
|||
} |
|||
</style> |
@ -0,0 +1,226 @@ |
|||
<template> |
|||
<view class="mall-order-ls"> |
|||
<view class="mol-date"> |
|||
<view class="md-txt">核销日期</view> |
|||
<view class="md-picker"> |
|||
<picker mode="date" @change="stChange"> |
|||
<view> |
|||
<input :value="startTime" disabled placeholder="请选择时间" /> |
|||
<image mode="aspectFit" src="/static/images/icon/arrow_c33.png"></image> |
|||
</view> |
|||
</picker> |
|||
</view> |
|||
<view class="md-txt">至</view> |
|||
<view class="md-picker"> |
|||
<picker mode="date" @change="edChange"> |
|||
<view> |
|||
<input :value="endTime" disabled placeholder="请选择时间" /> |
|||
<image mode="aspectFit" src="/static/images/icon/arrow_c33.png"></image> |
|||
</view> |
|||
</picker> |
|||
</view> |
|||
</view> |
|||
<view class="mol-list"> |
|||
<view class="ml-item" v-for="(e, i) in writeOffList" :key="i"> |
|||
<view class="mi-order-no"> |
|||
<view class="mon-num">订单编号:{{ e.product_order_no || '-' }}</view> |
|||
<view class="mon-btn" @click="copyBtn(e.product_order_no || '-')">复制</view> |
|||
</view> |
|||
<view class="mi-info"> |
|||
<view class="mi-line">取货码:{{ e.product_order_no || '-' }}</view> |
|||
<view class="mi-line">取货人:{{ e.product_order_self_pickup_info.name || '-' }} {{ e.product_order_self_pickup_info.phone || '-' }}</view> |
|||
<view class="mi-line">商品:{{ e.product_order_goods.join(';') }}</view> |
|||
<view class="mi-line">核验人:{{ e.optuname }}</view> |
|||
<view class="mi-line">取货时间:{{ e.created_at || '-' }}</view> |
|||
</view> |
|||
</view> |
|||
</view> |
|||
|
|||
<view class="mol-fixed"> |
|||
<view @click="toOperate">核销订单</view> |
|||
</view> |
|||
</view> |
|||
</template> |
|||
|
|||
<script> |
|||
import { API } from '../../../../js/api'; |
|||
import { servers } from '../../../../js/server'; |
|||
import util from '../../../../utils/util'; |
|||
import { mapState } from 'vuex'; |
|||
export default { |
|||
computed: { |
|||
...mapState([ 'brandInfo' ]), |
|||
|
|||
}, |
|||
data(){ |
|||
return { |
|||
writeOffList: [], |
|||
page: 1, |
|||
startTime: '', |
|||
endTime: '', |
|||
|
|||
} |
|||
}, |
|||
onReachBottom(){ |
|||
let { brandInfo, startTime, endTime, page } = this; |
|||
this.getList({ |
|||
brand_id: brandInfo.brand.id, |
|||
stime: startTime || '', |
|||
etime: endTime || '', |
|||
page: ++page |
|||
}) |
|||
}, |
|||
onLoad(){ |
|||
this.refreshPage(); |
|||
}, |
|||
methods: { |
|||
refreshPage(){ |
|||
let { brandInfo, startTime, endTime } = this; |
|||
this.page = 1; |
|||
this.writeOffList = []; |
|||
this.$nextTick(_=>{ |
|||
this.getList({ |
|||
brand_id: brandInfo.brand.id, |
|||
stime: startTime || '', |
|||
etime: endTime || '', |
|||
}) |
|||
}) |
|||
}, |
|||
copyBtn(data){ |
|||
uni.setClipboardData({ data }) |
|||
}, |
|||
stChange(e){ |
|||
console.warn(e) |
|||
this.startTime = e.detail.value; |
|||
this.$nextTick(_=>this.refreshPage()); |
|||
}, |
|||
edChange(e){ |
|||
this.endTime = e.detail.value; |
|||
this.$nextTick(_=>this.refreshPage()); |
|||
}, |
|||
toOperate(){ |
|||
util.routeTo(`/pages/write_off/operate/operate?type=mall`, 'nT'); |
|||
}, |
|||
getList({ brand_id, page = 1, page_size = 15, stime = '', etime = '' }){ |
|||
util.showLoad(); |
|||
servers.get({ |
|||
url: API.writeOff.shop2WriteoffList, |
|||
data: { brand_id, page, page_size, stime, etime }, |
|||
failMsg: '加载失败!', |
|||
}) |
|||
.then(res=>{ |
|||
util.hideLoad(); |
|||
this.totalNum = res.total || 0; |
|||
let _list = res.list || []; |
|||
if(page == 1)return this.writeOffList = _list; |
|||
if(!_list.length)return util.showNone('没有更多!'); |
|||
this.page = page; |
|||
this.writeOffList = [...this.writeOffList, ..._list]; |
|||
|
|||
}) |
|||
}, |
|||
} |
|||
} |
|||
</script> |
|||
|
|||
<style lang="scss"> |
|||
@import '~style/public.scss'; |
|||
.mall-order-ls{ |
|||
padding-bottom: 122upx; |
|||
padding-bottom: calc( 122upx + constant(safe-area-inset-bottom)); /* 兼容 iOS < 11.2 */ |
|||
padding-bottom: calc( 122upx + env(safe-area-inset-bottom)); /* 兼容 iOS >= 11.2 */ |
|||
} |
|||
.mol-date{ |
|||
padding: 0 28upx; |
|||
height: 148upx; |
|||
background-color: #fff; |
|||
@include centerFlex(flex-start); |
|||
.md-txt{ |
|||
font-size: 32upx; |
|||
line-height: 44upx; |
|||
color: #1a1a1a; |
|||
} |
|||
.md-picker{ |
|||
margin: 0 20upx; |
|||
width: 226upx; |
|||
border: 2upx solid #D8D8D8; |
|||
border-radius: 10upx; |
|||
overflow: hidden; |
|||
view{ |
|||
padding: 0 10upx; |
|||
height: 88upx; |
|||
background-color: #f2f2f7; |
|||
@include centerFlex(space-between); |
|||
>input{ |
|||
flex-grow: 1; |
|||
height: 100%; |
|||
font-size: 28upx; |
|||
color: #1a1a1a; |
|||
} |
|||
>image{ |
|||
margin-left: 10upx; |
|||
flex-shrink: 0; |
|||
width: 22upx; |
|||
height: 22upx; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
|
|||
.mol-list{ |
|||
padding: 24upx; |
|||
.ml-item{ |
|||
margin-bottom: 24upx; |
|||
padding: 0 24upx; |
|||
background-color: #fff; |
|||
.mi-order-no{ |
|||
padding: 30upx 4upx; |
|||
border-bottom: 2upx solid #f2f2f7; |
|||
@include centerFlex(space-between); |
|||
.mon-num{ |
|||
font-size: 28upx; |
|||
font-weight: 500; |
|||
line-height: 40upx; |
|||
color: #1a1a1a; |
|||
} |
|||
.mon-btn{ |
|||
flex-shrink: 0; |
|||
margin-left: 20upx; |
|||
font-size: 28upx; |
|||
line-height: 40upx; |
|||
color: $themeColor; |
|||
|
|||
} |
|||
} |
|||
.mi-info{ |
|||
padding: 30upx 4upx; |
|||
.mi-line{ |
|||
font-size: 28upx; |
|||
line-height: 52upx; |
|||
color: #9C9C9F; |
|||
@include textHide(1); |
|||
} |
|||
} |
|||
} |
|||
} |
|||
|
|||
.mol-fixed{ |
|||
position: fixed; |
|||
left: 0; |
|||
bottom: 0; |
|||
width: 100%; |
|||
background-color: #fff; |
|||
padding: 10upx 40upx; |
|||
padding-bottom: calc( 10upx + constant(safe-area-inset-bottom)); /* 兼容 iOS < 11.2 */ |
|||
padding-bottom: calc( 10upx + env(safe-area-inset-bottom)); /* 兼容 iOS >= 11.2 */ |
|||
>view{ |
|||
height: 112upx; |
|||
line-height: 112upx; |
|||
text-align: center; |
|||
font-size: 32upx; |
|||
color: #fff; |
|||
background-color: $themeColor; |
|||
border-radius: 10upx; |
|||
} |
|||
} |
|||
</style> |
@ -0,0 +1,150 @@ |
|||
<template> |
|||
<view class="confirm-success"> |
|||
<view class="cs-tip"> |
|||
<image mode="aspectFit" src="/static/images/icon/success_tip.png"></image> |
|||
<view>核销成功</view> |
|||
</view> |
|||
<view class="cs-goods"> |
|||
<view class="cg-tit">请将以下商品取给客户</view> |
|||
<view class="mm-goods"> |
|||
<view class="mm-tit">商品信息</view> |
|||
<view class="mg-ls"> |
|||
<view class="ml-item" v-for="(e, i) in orderList" :key="i"> |
|||
<image mode="aspectFill" :src="e.imgs || ''"></image> |
|||
<view class="mi-info"> |
|||
<view class="mi-name">{{ e.name || '-' }}</view> |
|||
<view class="mi-spec"> |
|||
<view>{{ e.spec || '-' }}</view> |
|||
<view>×{{ e.nums || 0 }}</view> |
|||
</view> |
|||
</view> |
|||
</view> |
|||
</view> |
|||
</view> |
|||
</view> |
|||
<view class="mlc-fixd-btn" @click="backBtn">返回继续核销</view> |
|||
</view> |
|||
</template> |
|||
|
|||
<script> |
|||
import { WRITE_OFF_MALL_ORDER_SUCCESS } from '../../../../js/once_name' |
|||
import util from '../../../../utils/util' |
|||
export default { |
|||
data(){ |
|||
return { |
|||
orderList: [] |
|||
} |
|||
}, |
|||
onLoad(options){ |
|||
util.$_once(WRITE_OFF_MALL_ORDER_SUCCESS, list=>{ |
|||
this.orderList = list || []; |
|||
}) |
|||
}, |
|||
methods: { |
|||
backBtn(){ |
|||
util.routeTo(); |
|||
} |
|||
} |
|||
} |
|||
</script> |
|||
|
|||
<style lang="scss"> |
|||
@import '~style/public.scss'; |
|||
.confirm-success{ |
|||
padding-bottom: 132upx; |
|||
padding-bottom: calc( 132upx + constant(safe-area-inset-bottom)); /* 兼容 iOS < 11.2 */ |
|||
padding-bottom: calc( 132upx + env(safe-area-inset-bottom)); /* 兼容 iOS >= 11.2 */ |
|||
} |
|||
.cs-tip{ |
|||
padding: 84upx 0upx 104upx; |
|||
>image{ |
|||
display: block; |
|||
margin: 0 auto 46upx; |
|||
width: 100upx; |
|||
height: 100upx; |
|||
} |
|||
>view{ |
|||
text-align: center; |
|||
line-height: 66upx; |
|||
font-size: 48upx; |
|||
font-weight: 500; |
|||
color: #333; |
|||
} |
|||
} |
|||
.cs-goods{ |
|||
padding: 0 24upx; |
|||
.cg-tit{ |
|||
margin-bottom: 20upx; |
|||
font-weight: 500; |
|||
font-size: 32upx; |
|||
line-height: 44upx; |
|||
color: #1a1a1a; |
|||
} |
|||
.mm-goods{ |
|||
padding: 22upx 28upx 0; |
|||
border-radius: 10upx; |
|||
background-color: #fff; |
|||
.mg-ls{ |
|||
.ml-item{ |
|||
padding: 30upx 0upx; |
|||
@include centerFlex(space-between); |
|||
&:not(:last-child){ |
|||
border-bottom: 2upx solid #F2F2F7; |
|||
} |
|||
>image{ |
|||
flex-shrink: 0; |
|||
margin-right: 20upx; |
|||
width: 180upx; |
|||
height: 180upx; |
|||
border-radius: 10upx; |
|||
} |
|||
.mi-info{ |
|||
flex-grow: 1; |
|||
.mi-name{ |
|||
width: 330upx; |
|||
margin-bottom: 12upx; |
|||
font-size: 28upx; |
|||
line-height: 40upx; |
|||
color: #333; |
|||
@include textHide(2); |
|||
} |
|||
.mi-spec{ |
|||
width: 100%; |
|||
@include centerFlex(space-between); |
|||
>view{ |
|||
font-size: 24upx; |
|||
line-height: 34upx; |
|||
color: #9A9A9D; |
|||
@include textHide(1); |
|||
&:first-child{ |
|||
flex-grow: 1; |
|||
} |
|||
&+view{ |
|||
flex-shrink: 0; |
|||
margin-left: 20upx; |
|||
max-width: 30%; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
|||
.mlc-fixd-btn{ |
|||
position: fixed; |
|||
left: 50%; |
|||
transform: translateX(-50%); |
|||
bottom: 10upx; |
|||
bottom: calc( 10upx + constant(safe-area-inset-bottom)); /* 兼容 iOS < 11.2 */ |
|||
bottom: calc( 10upx + env(safe-area-inset-bottom)); /* 兼容 iOS >= 11.2 */ |
|||
width: 622upx; |
|||
height: 112upx; |
|||
line-height: 112upx; |
|||
text-align: center; |
|||
font-size: 32upx; |
|||
border-radius: 10upx; |
|||
color: #fff; |
|||
background-color: $themeColor; |
|||
} |
|||
</style> |
@ -0,0 +1,108 @@ |
|||
<template> |
|||
<view class="write-off-menu"> |
|||
<view class="wom-section"> |
|||
<view class="ws-tit">场地订单核销</view> |
|||
<view class="ws-ls"> |
|||
<view class="wl-item" @click="toOperate('site')"> |
|||
<image mode="aspectFit" src="/static/images/write_off/site.png"></image> |
|||
<view>场地订单核销</view> |
|||
</view> |
|||
<view class="wl-item" @click="toSiteList"> |
|||
<image mode="aspectFit" src="/static/images/write_off/order.png"></image> |
|||
<view>场地订单核销记录</view> |
|||
</view> |
|||
</view> |
|||
</view> |
|||
<view class="wom-section"> |
|||
<view class="ws-tit">商城订单核销</view> |
|||
<view class="ws-ls"> |
|||
<view class="wl-item" @click="toOperate('mall')"> |
|||
<image mode="aspectFit" src="/static/images/write_off/mall.png"></image> |
|||
<view>商城订单核销</view> |
|||
</view> |
|||
<view class="wl-item" @click="toMallLs"> |
|||
<image mode="aspectFit" src="/static/images/write_off/order.png"></image> |
|||
<view>商城订单核销记录</view> |
|||
</view> |
|||
</view> |
|||
</view> |
|||
<view class="wom-section"> |
|||
<view class="ws-tit">现场散客人数</view> |
|||
<view class="ws-ls"> |
|||
<view class="wl-item" @click="toPeopleNum"> |
|||
<image mode="aspectFit" src="/static/images/write_off/people.png"></image> |
|||
<view>现场散客人数查询</view> |
|||
</view> |
|||
</view> |
|||
</view> |
|||
</view> |
|||
</template> |
|||
|
|||
<script> |
|||
import util from '../../../utils/util'; |
|||
import { WRITE_OFF_STORE_NAME, WRITE_OFF_ORDER_INFO } from '../../../js/once_name'; |
|||
import { API } from '../../../js/api'; |
|||
import { servers } from '../../../js/server'; |
|||
export default { |
|||
methods: { |
|||
toPeopleNum(){ |
|||
util.routeTo(`/pages/write_off/number_of_people/number_of_people`, 'nT'); |
|||
}, |
|||
toOperate(type){ |
|||
util.$_emit(WRITE_OFF_STORE_NAME, null); |
|||
util.routeTo(`/pages/write_off/operate/operate?type=${type}`, 'nT'); |
|||
}, |
|||
toSiteList(){ |
|||
util.routeTo(`/pages/write_off/search_result/search_result`, 'nT'); |
|||
}, |
|||
toMallLs(){ |
|||
util.routeTo(`/pages/write_off/mall/list/list`, 'nT'); |
|||
}, |
|||
|
|||
} |
|||
} |
|||
</script> |
|||
|
|||
<style lang="scss"> |
|||
@import '~style/public.scss'; |
|||
.write-off-menu{ |
|||
padding: 60upx 68upx 0upx; |
|||
.wom-section{ |
|||
margin-bottom: 30upx; |
|||
.ws-tit{ |
|||
margin-bottom: 20upx; |
|||
font-size: 32upx; |
|||
font-weight: 500; |
|||
line-height: 44upx; |
|||
color: #1a1a1a; |
|||
} |
|||
.ws-ls{ |
|||
@include centerFlex(space-between); |
|||
flex-wrap: wrap; |
|||
.wl-item{ |
|||
padding-top: 58upx; |
|||
margin-bottom: 32upx; |
|||
width: 288upx; |
|||
height: 220upx; |
|||
border-radius: 10upx; |
|||
background-color: #fff; |
|||
>image{ |
|||
margin: 0 auto 22upx; |
|||
display: block; |
|||
width: 60upx; |
|||
height: 60upx; |
|||
} |
|||
>view{ |
|||
text-align: center; |
|||
line-height: 40upx; |
|||
font-size: 28upx; |
|||
color: #9c9c9f; |
|||
@include textHide(1); |
|||
} |
|||
|
|||
} |
|||
} |
|||
|
|||
} |
|||
} |
|||
</style> |
@ -0,0 +1,362 @@ |
|||
<template> |
|||
<view class="number-of-people"> |
|||
<view class="nop-store-name"> |
|||
<picker :range="stadiumList" range-key="name" @change="stadiumChange"> |
|||
<view class="nsn-frame"> |
|||
<input placeholder="请选择店铺" :value="curStadium.name" disabled /> |
|||
<image mode="aspectFit" src="/static/images/icon/arrow_c33.png"></image> |
|||
</view> |
|||
</picker> |
|||
</view> |
|||
<view class="nop-main"> |
|||
<view class="nm-date">日期:{{ dateStr || '-' }}</view> |
|||
<view class="nm-tit">现场散客人数</view> |
|||
<view class="nm-num"> |
|||
<image mode="aspectFit" src="/static/images/countdown_bg.png"></image> |
|||
<view class="nn-txt-num">{{peopleInfo.present_person_number || 0}}</view> |
|||
</view> |
|||
<view class="nm-btn" @click="isChangeNum = true">修改人数</view> |
|||
<view class="nm-tip"> |
|||
<text>温馨提示:\n\r修改现场人数可能会影 响现场灯光开关,请谨慎操作! 如后台有开启散客开关灯功能的,则散客人数达到阶梯最低X人时,对应灯光会自动开灯;少于X人的已开启的灯会自动关闭。</text> |
|||
</view> |
|||
</view> |
|||
<view class="ox-dark-mask" v-if="isChangeNum"> |
|||
<view class="nop-modifies-modal"> |
|||
<image class="nmm-close" @click="isChangeNum = false" src="/static/images/icon/x_close.png"></image> |
|||
<view class="nmm-tit">修改现场散客人数</view> |
|||
<view class="nmm-info"> |
|||
<view class="ni-num">当前现场散客人数为:{{peopleInfo.present_person_number || 0}}</view> |
|||
<view class="ni-ipt"> |
|||
<input placeholder="请输入散客人数" v-model="changeNum" type="number" /> |
|||
</view> |
|||
<view class="ni-tip">修改现场人数可能会影响现场灯光开关,请谨慎操作!</view> |
|||
</view> |
|||
<view class="nmm-btns"> |
|||
<view @click="isChangeNum = false">取消</view> |
|||
<view @click="confirmChange">确认</view> |
|||
</view> |
|||
</view> |
|||
</view> |
|||
</view> |
|||
</template> |
|||
|
|||
<script> |
|||
import { API } from '../../../js/api' |
|||
import { servers } from '../../../js/server' |
|||
import { mapState } from 'vuex'; |
|||
import util from '../../../utils/util'; |
|||
let timer = null; |
|||
export default { |
|||
computed: { |
|||
...mapState([ 'brandInfo' ]), |
|||
}, |
|||
data(){ |
|||
return { |
|||
isChangeNum: false, |
|||
stadiumList: [], |
|||
curStadium: { |
|||
name: '' |
|||
}, |
|||
peopleInfo: {}, |
|||
dateStr: '-', |
|||
changeNum: '', |
|||
} |
|||
}, |
|||
onLoad(options){ |
|||
this.initStore(); |
|||
this.dateStr = util.formatDate({ partition: 'zh' }) || '-'; |
|||
}, |
|||
|
|||
onUnload(){ |
|||
this.clearTime(); |
|||
}, |
|||
methods: { |
|||
confirmChange: util.debounce(function(){ |
|||
let { changeNum } = this; |
|||
if(isNaN(changeNum))return util.showNone('请输入正确人数!'); |
|||
this.isChangeNum = false; |
|||
this.setStadiumPresentNumber(changeNum); |
|||
}, 200, true), |
|||
setStadiumPresentNumber(num){ |
|||
let { curStadium } = this; |
|||
util.showLoad(); |
|||
servers.get({ |
|||
url: API.writeOff.setStadiumPresentNumber, |
|||
data: { |
|||
brand_id: curStadium.curStadium, |
|||
stadium_id: curStadium.id, |
|||
number: +num, |
|||
}, |
|||
isDefaultGet: false, |
|||
}) |
|||
.then(res=>{ |
|||
util.hideLoad(); |
|||
if(res.data.code == 0){ |
|||
util.showNone(res.data.message || '操作成功!'); |
|||
setTimeout(_=>{ |
|||
this.getUserNum({ |
|||
stadium_id: curStadium.id, |
|||
brand_id: curStadium.brand_id |
|||
}) |
|||
this.initInertval(); |
|||
}, 1200) |
|||
}else{ |
|||
util.showNone(res.data.message || '操作失败!'); |
|||
} |
|||
}) |
|||
.catch(util.hideLoad) |
|||
}, |
|||
initInertval(){ |
|||
this.clearTime(); |
|||
let { curStadium } = this; |
|||
if(!curStadium.id || !curStadium.brand_id)return; |
|||
timer = setInterval(_=>{ |
|||
if(!curStadium.id || !curStadium.brand_id)return this.clearTime(); |
|||
this.getUserNum({ |
|||
stadium_id: curStadium.id, |
|||
brand_id: curStadium.brand_id |
|||
}) |
|||
}, 3000); |
|||
}, |
|||
clearTime(){ |
|||
clearInterval(timer); |
|||
timer = null; |
|||
}, |
|||
|
|||
stadiumChange(e){ |
|||
let { stadiumList } = this; |
|||
let _curStadium = stadiumList[e.detail.value] || {}; |
|||
if(!_curStadium.id || !_curStadium.brand_id)return; |
|||
this.curStadium = _curStadium; |
|||
this.getUserNum({ |
|||
stadium_id: _curStadium.id, |
|||
brand_id: _curStadium.brand_id |
|||
}) |
|||
this.initInertval(); |
|||
}, |
|||
async initStore(){ |
|||
let { brandInfo } = this; |
|||
try{ |
|||
util.showLoad(); |
|||
let _storeList = await this.getStoreList({ brand_id: brandInfo.brand.id || '' }); |
|||
if(!_storeList || !_storeList.length)return util.showNone('没有店铺信息'); |
|||
this.stadiumList = _storeList || []; |
|||
let _curStadium = _storeList[0] || {}; |
|||
this.curStadium = _curStadium; |
|||
this.initInertval(); |
|||
this.getUserNum({ |
|||
stadium_id: _curStadium.id, |
|||
brand_id: _curStadium.brand_id |
|||
}) |
|||
util.hideLoad(); |
|||
}catch(err){ |
|||
util.hideLoad(); |
|||
util.showNone('初始化店铺数据失败!'); |
|||
console.warn('加载数据失败!', err); |
|||
} |
|||
}, |
|||
// 获取店铺列表 |
|||
getStoreList({ |
|||
page=1, |
|||
page_size=9999, |
|||
brand_id='', |
|||
}){ |
|||
return servers.get({ |
|||
url: API.stadiumList, |
|||
data: { |
|||
page, |
|||
page_size, |
|||
brand_id, |
|||
}, |
|||
failMsg: '获取列表失败!' |
|||
}) |
|||
.then(res=>{ |
|||
let _list = res.list || []; |
|||
return _list |
|||
}) |
|||
}, |
|||
getUserNum({ |
|||
stadium_id, |
|||
brand_id, |
|||
}){ |
|||
servers.get({ |
|||
url: API.writeOff.timingNumber, |
|||
data: { stadium_id, brand_id }, |
|||
failMsg: '加载现场人数失败!' |
|||
}) |
|||
.then(res=>{ |
|||
this.peopleInfo = res |
|||
}) |
|||
} |
|||
} |
|||
} |
|||
</script> |
|||
|
|||
<style lang="scss"> |
|||
@import '~style/public.scss'; |
|||
page{ |
|||
background-color: #fff; |
|||
} |
|||
.number-of-people{ |
|||
.nop-store-name{ |
|||
height: 144upx; |
|||
@include centerFlex(center); |
|||
.nsn-frame{ |
|||
padding: 0 20upx; |
|||
width: 702upx; |
|||
height: 92upx; |
|||
border-radius: 10upx; |
|||
background-color: #F2F2F7; |
|||
@include centerFlex(space-between); |
|||
>input{ |
|||
flex-grow: 1; |
|||
line-height: 40upx; |
|||
font-size: 28upx; |
|||
color: #1A1A1A; |
|||
} |
|||
>image{ |
|||
flex-shrink: 0; |
|||
margin-left: 20upx; |
|||
width: 28upx; |
|||
height: 28upx; |
|||
} |
|||
} |
|||
} |
|||
.nop-main{ |
|||
padding: 8upx 30upx 0; |
|||
.nm-date{ |
|||
margin-bottom: 86upx; |
|||
line-height: 44upx; |
|||
font-size: 32upx; |
|||
color: #1a1a1a; |
|||
} |
|||
.nm-tit{ |
|||
margin-bottom: 48upx; |
|||
text-align: center; |
|||
font-size: 32upx; |
|||
font-weight: 500; |
|||
} |
|||
.nm-num{ |
|||
position: relative; |
|||
margin: 0 auto 100upx; |
|||
display: block; |
|||
width: 400upx; |
|||
height: 400upx; |
|||
.nn-txt-num{ |
|||
line-height: 400upx; |
|||
text-align: center; |
|||
font-size: 96upx; |
|||
font-weight: 500; |
|||
color: $themeColor; |
|||
} |
|||
>image { |
|||
position: absolute; |
|||
left: 50%; |
|||
top: 50%; |
|||
z-index: -1; |
|||
margin-left: -250upx; |
|||
margin-top: -250upx; |
|||
display: block; |
|||
width: 500upx; |
|||
height: 500upx; |
|||
animation: Rotate 6s linear infinite |
|||
} |
|||
@keyframes Rotate{ |
|||
0% {transform: rotate(360deg);} |
|||
50% {transform: rotate(180deg);} |
|||
100% {transform: rotate(0deg);} |
|||
} |
|||
} |
|||
.nm-btn{ |
|||
margin: 0 auto 106upx; |
|||
width: 618upx; |
|||
line-height: 112upx; |
|||
height: 112upx; |
|||
text-align: center; |
|||
border-radius: 10upx; |
|||
font-size: 38upx; |
|||
color: #fff; |
|||
background-color: $themeColor; |
|||
} |
|||
.nm-tip{ |
|||
margin-bottom: 30upx; |
|||
font-size: 28upx; |
|||
line-height: 52upx; |
|||
color: #9C9C9F; |
|||
} |
|||
|
|||
} |
|||
.nop-modifies-modal{ |
|||
position: absolute; |
|||
left: 50%; |
|||
top: 50%; |
|||
transform: translate(-50%, -50%); |
|||
padding-top: 78upx; |
|||
width: 620upx; |
|||
height: 706upx; |
|||
background-color: #fff; |
|||
border-radius: 10upx; |
|||
.nmm-close{ |
|||
position: absolute; |
|||
right: 30upx; |
|||
top: 30upx; |
|||
width: 34upx; |
|||
height: 34upx; |
|||
} |
|||
.nmm-tit{ |
|||
line-height: 44upx; |
|||
text-align: center; |
|||
font-weight: 500; |
|||
font-size: 32upx; |
|||
color: #1A1A1A; |
|||
} |
|||
.nmm-info{ |
|||
padding: 54upx 80upx 80upx; |
|||
.ni-num{ |
|||
margin-bottom: 30upx; |
|||
font-size: 28upx; |
|||
line-height: 48upx; |
|||
color: #1A1A1A; |
|||
@include textHide(1); |
|||
} |
|||
.ni-ipt{ |
|||
margin-bottom: 26upx; |
|||
padding: 0 20upx; |
|||
height: 88upx; |
|||
border-radius: 10upx; |
|||
border: 2upx solid #D8D8D8; |
|||
>input{ |
|||
flex-grow: 1; |
|||
height: 100%; |
|||
font-size: 28upx; |
|||
color: #1A1A1A; |
|||
} |
|||
} |
|||
.ni-tip{ |
|||
font-size: 24upx; |
|||
line-height: 34upx; |
|||
color: #EA5061; |
|||
} |
|||
} |
|||
.nmm-btns{ |
|||
@include centerFlex(center); |
|||
>view{ |
|||
margin: 0 10upx; |
|||
width: 240upx; |
|||
height: 88upx; |
|||
line-height: 84upx; |
|||
text-align: center; |
|||
font-size: 32upx; |
|||
border-radius: 10upx; |
|||
border: 2upx solid $themeColor; |
|||
color: $themeColor; |
|||
&+view{ |
|||
color: #fff; |
|||
background-color: $themeColor; |
|||
} |
|||
} |
|||
} |
|||
|
|||
} |
|||
} |
|||
</style> |
After Width: 700 | Height: 700 | Size: 33 KiB |
After Width: 128 | Height: 128 | Size: 1.4 KiB |
After Width: 128 | Height: 128 | Size: 1.0 KiB |
After Width: 128 | Height: 128 | Size: 1.8 KiB |
After Width: 120 | Height: 120 | Size: 1.4 KiB |
@ -0,0 +1,26 @@ |
|||
|
|||
/* |
|||
硬件处理函数 |
|||
*/ |
|||
var DEVICE_FUN = { |
|||
|
|||
/* |
|||
@data:过滤数据 |
|||
@switchInfo:操作的设备信息 |
|||
使用: _data = DEVICE_FUN.AC_filterCloudACData(data,switchInfo); |
|||
场景: 目前需求只要求照明(中控状态更新,灯操控) 其它需要再对接 |
|||
注意: 涉及deviceApi.ouxuanac 接口的,理论上来说都需要做兼容去在逻辑中传入硬件信息判断是否是云中控 |
|||
*/ |
|||
AC_filterCloudACData(data,switchInfo){ |
|||
console.log("云中控参数检测 AC_filterCloudACData",data,switchInfo); |
|||
//处理云中控专用参数
|
|||
// 这里device是设备名 一旦出现云中控 设备id被 (OUXUANAC_CLOUD_+hardware_net_addr) 串起来的字符串覆盖
|
|||
if(!!switchInfo&&switchInfo.hardware_connect_method=="YZK"){ |
|||
data.device = "OUXUANAC_CLOUD_"+switchInfo.hardware_net_addr; |
|||
} |
|||
|
|||
return data |
|||
}, |
|||
} |
|||
|
|||
export default DEVICE_FUN; |
18622
yarn.lock
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
Write
Preview
Loading…
Cancel
Save
Reference in new issue