Browse Source

finish tid1803

tid1878
刘嘉炜 3 months ago
parent
commit
64649e8100
  1. 138
      src/components/period_select.vue
  2. 12
      src/pages.json
  3. 2
      src/pages/index/index.vue
  4. 2
      src/pages/order_search/order_search.vue
  5. 2
      src/subpackage/verification/components/head_bar.vue
  6. 21
      src/subpackage/verification/components/record/dy_item.vue
  7. 95
      src/subpackage/verification/components/record/mall_item.vue
  8. 37
      src/subpackage/verification/components/record/site_item.vue
  9. 15
      src/subpackage/verification/components/stadium_picker.vue
  10. 5
      src/subpackage/verification/js/api.js
  11. 35
      src/subpackage/verification/pages/index.vue
  12. 62
      src/subpackage/verification/pages/null.vue
  13. 307
      src/subpackage/verification/pages/record.vue
  14. 244
      src/subpackage/verification/pages/record_search.vue
  15. BIN
      src/subpackage/verification/static/images/order/null_code.png
  16. BIN
      src/subpackage/verification/static/images/order/null_range.png
  17. BIN
      src/subpackage/verification/static/images/order/null_search.png
  18. BIN
      src/subpackage/verification/static/images/round_close.png

138
src/components/period_select.vue

@ -0,0 +1,138 @@
<template>
<!-- 时间段选择 -->
<view class="period-select-mask" v-if="isShow" @click="isShow = false">
<view class="ol-period" @click.stop="()=>false">
<view class="op-tit">日期范围</view>
<picker mode="date" class="op-picker" @change="startTimeChange" :value="startTime">
<view class="op-time">
<text class="ot-tit">开始时间</text>
<view class="ot-right">
<input class="or-ipt" placeholder="选择时间" disabled :value="startTime"/>
<image class="or-icon" mode="aspectFit" src="/static/images/icon/arrow_b2.png"></image>
</view>
</view>
</picker>
<picker mode="date" class="op-picker" @change="endTimeChange" :value="endTime">
<view class="op-time">
<text class="ot-tit">截止时间</text>
<view class="ot-right">
<input class="or-ipt" placeholder="选择时间" disabled :value="endTime"/>
<image class="or-icon" mode="aspectFit" src="/static/images/icon/arrow_b2.png"></image>
</view>
</view>
</picker>
<view class="pl-btn active" @click="confirmBtn">确定</view>
</view>
</view>
</template>
<script>
import { showNone, showModal } from '@/utils/util';
export default {
props: {
value: {
type: String,
default: ''
}
},
watch: {
value: {
handler(val) {
let [start, end] = val.split('_');
this.startTime = start;
this.endTime = end;
},
immediate: true
}
},
data(){
return {
isShow: false,
startTime: '',
endTime: '',
}
},
methods: {
show(){
this.isShow = true
},
hide(){
this.isShow = false
},
startTimeChange(e){
this.startTime = e.detail.value;
},
endTimeChange(e){
this.endTime = e.detail.value;
},
confirmBtn(){
let { startTime, endTime } = this;
let _sTimestemp = new Date(startTime.replace(/\-/g,'/')).getTime();
let _eTimestemp = new Date(endTime.replace(/\-/g,'/')).getTime();
if(_sTimestemp > _eTimestemp)return showModal({ content: '开始时间不能大于结束时间' });
this.$emit('input', `${startTime}_${endTime}`);
this.hide();
}
}
}
</script>
<style lang="scss">
.period-select-mask{
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: rgba(0,0,0,0.4);
z-index: 9999;
}
.ol-period{
position: absolute;
left: 0;
top: 0;
padding-left: 38upx;
padding-top: 66upx;
height: 472upx;
width: 100%;
background-color: #fff;
.op-tit{
@include flcw(24upx, 34upx, #9c9c9f);
}
.op-picker{
width: 100%;
}
.op-time{
padding-right: 40upx;
height: 124upx;
border-bottom: 2upx solid #D8D8D8;
@include ctf(space-between);
.ot-tit{
flex-shrink: 0;
@include flcw(32upx, 44upx, #1a1a1a);
}
.ot-right{
flex-grow: 1;
@include ctf(flex-end);
.or-ipt{
flex-grow: 1;
height: 100%;
text-align: right;
@include flcw(32upx, 44upx, #1a1a1a);
}
.or-icon{
flex-shrink: 0;
margin-left: 36upx;
width: 28upx;
height: 28upx;
}
}
}
.pl-btn{
min-height: 124upx;
text-align: center;
@include flcw(32upx, 124upx, $mColor, 500);
}
}
</style>

12
src/pages.json

@ -895,6 +895,18 @@
"root": "subpackage/verification",
"pages": [
{
"path": "pages/null",
"style" : {
"navigationBarTitleText": "核销查询"
}
},
{
"path": "pages/record_search",
"style" : {
"navigationBarTitleText": "核销查询"
}
},
{
"path": "pages/index",
"style" : {
"navigationBarTitleText": "核销查询"

2
src/pages/index/index.vue

@ -116,7 +116,7 @@
{
id: 4,
name: '核销查询',
path: '/pages/write_off/menu/menu',
path: '/subpackage/verification/pages/index',
serverKey: 1008 //
},
{

2
src/pages/order_search/order_search.vue

@ -3,7 +3,7 @@
<view class="os-bar">
<view>
<image mode="aspectFit" src="/static/images/icon/search.png"></image>
<input placeholder="输入订单号" v-model="searchTxt" confirm-type="search" @confirm="iptConfirm" />
<input placeholder="输入订单号" v-model="searchTxt" confirm-type="search" @confirm="iptConfirm" />
<image v-if="searchTxt!=''" mode="aspectFit" src="/static/images/icon/round_close.png" @click="clearSearch"></image>
</view>
</view>

2
src/subpackage/verification/components/head_bar.vue

@ -6,7 +6,7 @@
<image class="hf-icon" mode="aspectFit" src="/subpackage/verification/static/images/arrow_c9f.png"></image>
</view>
</picker>
<image v-if="search" class="hb-icon" mode="aspectFit" src="/subpackage/verification/static/images/search.png"></image>
<image v-if="search" class="hb-icon" mode="aspectFit" src="/subpackage/verification/static/images/search.png" @click="$emit('click:search')"></image>
</view>
</template>

21
src/subpackage/verification/components/record/dy_item.vue

@ -1,21 +1,21 @@
<template>
<view class="site-item">
<view class="si-stadium">欧轩智能羽毛球馆(永泰店)</view>
<!-- <view class="si-stadium">{{ stadiumName || '-' }}</view> -->
<view class="si-lines">
<view class="sl-item">
<view class="sl-left">订单编号20195175645666</view>
<view class="sl-left">订单编号{{ orderNum || '-' }}</view>
</view>
<view class="sl-item">
<view class="sl-left">用户信息18316553852(yiming)</view>
<view class="sl-left">用户信息{{ userPhone || '-' }}</view>
</view>
<view class="sl-item">
<view class="sl-left">券码 200801108978</view>
<view class="sl-left">券码 {{ verifyCode || '-' }}</view>
</view>
<view class="sl-item">
<view class="sl-left">验证方式扫码器验证(欧轩门闸)</view>
<view class="sl-left">验证方式{{ verifyMethod || '-' }}</view>
</view>
<view class="sl-item">
<view class="sl-left">核销时间2021-05-17 11:12:58</view>
<view class="sl-left">核销时间{{ verifyTime || '-' }}</view>
</view>
</view>
</view>
@ -23,7 +23,14 @@
<script>
export default {
props: [
// 'stadiumName',
'orderNum',
'userPhone',
'verifyCode',
'verifyMethod',
'verifyTime',
]
}
</script>

95
src/subpackage/verification/components/record/mall_item.vue

@ -0,0 +1,95 @@
<template>
<view class="site-item">
<view class="si-order-num">
<view class="son-txt">订单编号{{ orderNum || '-' }}</view>
<view class="son-copy" @click="copyBtn">复制</view>
</view>
<view class="si-lines">
<view class="sl-item">
<view class="sl-left">取货码{{ orderCode || '-' }}</view>
</view>
<view class="sl-item">
<view class="sl-left">取货人{{ userName || '-' }} {{ userPhone || '-' }}</view>
</view>
<view class="sl-item">
<view class="sl-left">商品{{ goodsStr || '-' }}</view>
</view>
<view class="sl-item">
<view class="sl-left">核验人{{ optUser || '-' }}</view>
</view>
<view class="sl-item">
<view class="sl-left">取货时间{{ createdAt || '-' }}</view>
</view>
</view>
</view>
</template>
<script>
export default {
props: [
'orderNum',
'orderCode',
'userPhone',
'userName',
'goodsStr',
'optUser',
'createdAt',
],
methods: {
copyBtn(){
uni.setClipboardData({ data: this.orderNum });
}
}
}
</script>
<style lang="scss">
.site-item{
position: relative;
padding: 0 20upx;
border-radius: 10upx;
background: #fff;
.si-order-num{
min-height: 100upx;
border-bottom: 2upx solid #D8D8D8;
@include ctf;
.son-txt{
flex-grow: 1;
@include flcw(28upx, 98upx, #1A1A1A, 500);
@include tHide;
}
.son-copy{
padding-right: 20upx;
margin-left: 20upx;
flex-shrink: 0;
@include flcw(28upx, 98upx, $mColor, 500);
}
}
.si-lines{
padding-top: 8upx;
padding-bottom: 32upx;
.sl-item{
display: flex;
.sl-left{
@include flcw(28upx, 52upx, #9c9c9f);
@include tHide;
}
.sl-right{
max-width: 200upx;
flex-shrink: 0;
margin-left: 10upx;
@include flcw(28upx, 52upx, $mColor);
@include tHide;
}
}
}
.si-btn{
position: absolute;
right: 20upx;
bottom: 32upx;
width: 192upx;
text-align: center;
background-color: $mColor;
border-radius: 10upx;
@include flcw(32upx, 80upx, #fff, 500);
}
}
</style>

37
src/subpackage/verification/components/record/site_item.vue

@ -1,40 +1,45 @@
<template>
<view class="site-item">
<view class="si-stadium">欧轩智能羽毛球馆(永泰店)</view>
<view class="si-stadium">{{ stadiumName || '-' }}</view>
<view class="si-lines">
<view class="sl-item">
<view class="sl-left">订单编号20195175645666</view>
<view class="sl-right">租场</view>
<view class="sl-left">订单编号{{ orderNum || '-' }}</view>
<view class="sl-right">{{ orderType || '-' }}</view>
</view>
<view class="sl-item">
<view class="sl-left">用户信息18316553852(yiming)</view>
<view class="sl-left">用户信息{{ userPhone || '-' }}({{ userNickname || '-' }})</view>
</view>
<view class="sl-item">
<view class="sl-left">核销码 200801108978</view>
<view class="sl-left">核销码 {{ verifyCode || '-' }}</view>
</view>
<view class="sl-item">
<view class="sl-left">验证方式扫码器验证(欧轩门闸)</view>
<view class="sl-left">验证方式{{ verifyMethod || '-' }}</view>
</view>
<view class="sl-item">
<view class="sl-left">核销时间2021-05-17 11:12:58</view>
<view class="sl-left">核销时间{{ verifyTime || '-' }}</view>
</view>
<view class="sl-item">
<view class="sl-left">离场时间2021-05-17 11:12:58</view>
<view class="sl-left">离场时间{{ verifyLeaveTime || '-' }}</view>
</view>
</view>
<view class="si-btn">手动离场</view>
<view class="si-btn" v-if="verifyLeaveTime === ''" @click="$emit('click:leave')">手动离场</view>
</view>
<!-- 订单编号20195175645666
用户信息18316553852(yiming)
核销码 200801108978
验证方式扫码器验证(欧轩门闸)
核销时间2021-05-17 11:12:58
离场时间2021-05-17 11:12:58 -->
</template>
<script>
export default {
props: [
'stadiumName',
'orderNum',
'orderType',
'userPhone',
'userNickname',
'verifyCode',
'verifyMethod',
'verifyTime',
'verifyLeaveTime',
]
}
</script>

15
src/subpackage/verification/components/stadium_picker.vue

@ -0,0 +1,15 @@
<template>
<view class="stadium-picker">
</view>
</template>
<script>
export default {
}
</script>
<style lang="scss">
</style>

5
src/subpackage/verification/js/api.js

@ -8,6 +8,11 @@ export const SUB_API = {
timingOpen: `${ORIGIN}/stadium/person/timing/open`, // 【20220208】凌晨自动清零【开/关】
// tid1803
enterVerifyOrder: `${ORIGIN}/admin/stadium/order/enterVerifyOrder`, // 商家助手-核销查询-输入验证码
listVerifyRecord: `${ORIGIN}/admin/stadium/order/listVerifyRecord`, // 商家助手-核销查询列表
leaveVerifyOrder:`${ORIGIN}/admin/stadium/order/leaveVerifyOrder`, // 【20220208】核销记录列表 - 手动离场
dyPoiOrderList: `${ORIGIN}/admin/douyinPlatformProductOrder/list`, // 商家助手-dypoi订单
shop2WriteoffList: `${ORIGIN}/admin/assistant/shop2/writeoffList`, // 商城订单核销 - 列表
}

35
src/subpackage/verification/pages/index.vue

@ -10,7 +10,7 @@
<image @click="scanCode" class="wib-img" mode="aspectFit" src="/subpackage/verification/static/images/scan.png"></image>
</view>
<view class="ws-txt">可输入订场次卡年月卡赛事商城到店领取商品的验证码/券码进行核销或点扫码图标进入扫描界面扫码核销</view>
<view class="ws-btn">确认</view>
<view class="ws-btn" @click="confirmBtn">确认</view>
</view>
<view class="woi-btns">
@ -22,7 +22,7 @@
<image class="wi-icon" mode="aspectFit" src="/subpackage/verification/static/images/tab1.png"></image>
<view class="wi-txt">现场人数</view>
</view>
<view class="wb-items">
<view class="wb-items" @click="toRecord">
<image class="wi-icon" mode="aspectFit" src="/subpackage/verification/static/images/tab2.png"></image>
<view class="wi-txt">核销记录</view>
</view>
@ -34,7 +34,7 @@
import API from "../js/api.js";
import server from "../js/server.js";
import { showLoad, hideLoad, showModal, showNone, debounce, changeLowerCase, $_emit, routeTo } from "@/utils/util.js";
import { showLoad, hideLoad, showModal, showNone, debounce, changeLowerCase, $_emit, routeTo, jsonStr } from "@/utils/util.js";
import { WRITE_OFF_ORDER_INFO } from '@/js/once_name';
import headBar from "../components/head_bar.vue";
export default {
@ -64,6 +64,20 @@ export default {
let { brand_id } = this;
routeTo(`/subpackage/blacklist/pages/abnormal_list/abnormal_list?brand_id=${brand_id}`, 'nT');
},
toRecord(){
let { brand_id } = this;
routeTo(`/subpackage/verification/pages/record?brand_id=${brand_id}`, 'nT');
},
confirmBtn: debounce(function(){
let { iptCode } = this;
let { curStadium } = this;
if(!curStadium?.id)return showModal({ content: '请选择场馆!' });
this.verifyOrder({
brand_id: curStadium?.brand_id ?? '',
stadium_id: curStadium?.id ?? '',
verify_code: iptCode ?? '',
})
}, 300, true),
scanCode: debounce(function(){
let { curStadium } = this;
if(!curStadium?.id)return showModal({ content: '请选择场馆!' });
@ -72,12 +86,11 @@ export default {
scanType: 'qrCode',
success: res=> {
if(changeLowerCase(res.scanType) !== 'qr_code')return showNone('不支持此类型!');
console.log('扫码结果--->', res);
let { curStadium } = this;
this.verifyOrder({
brand_id: curStadium?.brand_id || '',
stadium_id: curStadium?.id || '',
decrypt_text: res?.result || '',
brand_id: curStadium?.brand_id ?? '',
stadium_id: curStadium?.id ?? '',
decrypt_text: res?.result ?? '',
})
},
fail: function(err) {
@ -158,13 +171,13 @@ export default {
routeTo(`/pages/write_off/events_order/events_order?type=${_vType}`, 'nT');
return
}
//
$_emit(WRITE_OFF_ORDER_INFO, { ..._orderData });
routeTo(`/pages/write_off/confirm_order/confirm_order?type=${_vType}`, 'nT');
}else if(_data.code === 805){
routeTo(`/subpackage/verification/pages/null?tip=${jsonStr(_data?.message ?? '')}`, 'nT');
}else{
if(!_vType)return Promise.reject(_data);
routeTo(`/pages/write_off/null/null?type=${_vType}`, 'nT');
// return Promise.reject(_data);
return Promise.reject(_data);
}
})
.catch(err => {

62
src/subpackage/verification/pages/null.vue

@ -0,0 +1,62 @@
<template>
<view class="null-container">
<image v-if="tipHas('二维码')" class="nc-pic" mode="aspectFit" src="/subpackage/verification/static/images/order/null_code.png"></image>
<image v-else-if="tipHas('范围')" class="nc-pic" mode="aspectFit" src="/subpackage/verification/static/images/order/null_range.png"></image>
<image v-else class="nc-pic" mode="aspectFit" src="/subpackage/verification/static/images/order/null_search.png"></image>
<view class="nc-txt">{{ tip || '很抱歉!获取找不到订单信息' }}</view>
<view class="nc-btn" @click="routeTo">返回</view>
</view>
</template>
<script>
import { jsonPar, routeTo } from '@/utils/util';
export default {
data(){
return {
tip: '',
}
},
onLoad(options){
let _tip = options?.tip ?? '';
this.tip = jsonPar(_tip);
},
methods: {
tipHas(txt){
let { tip } = this;
return tip.indexOf(txt) > -1;
},
routeTo,
}
}
</script>
<style lang="scss">
page{
background: #fff;
}
.null-container{
padding-top: 220upx;
.nc-pic{
display: block;
width: 400upx;
height: 400upx;
margin: 0 auto;
}
.nc-txt{
padding: 0 30upx;
margin-top: 80upx;
text-align: center;
@include flcw(28upx, 40upx, #9C9C9F);
}
.nc-btn{
margin: 260upx auto 0;
width: 280upx;
text-align: center;
height: 92upx;
border-radius: 10upx;
border: 2upx solid $mColor;
@include flcw(32upx, 88upx, $mColor);
}
}
</style>

307
src/subpackage/verification/pages/record.vue

@ -1,26 +1,63 @@
<template>
<view class="verification-record">
<view class="vr-header">
<head-bar search></head-bar>
<head-bar
:range="stadiumList" range-key="name" @change="stadiumChange"
placeholder="请选择场馆" :value="curStadium.name"
search
@click:search="toSearch"
></head-bar>
<view class="vh-tabs">
<view class="vt-item" :class="{ active: curTab === 0 }" @click="curTab = 0">场地核销记录</view>
<view class="vt-item" :class="{ active: curTab === 1 }" @click="curTab = 1">抖音核销记录</view>
<view class="vt-item" :class="{ active: curTab === 2 }" @click="curTab = 2">商城核销记录</view>
<view v-for="(e,i) in tabs" :key="i" :class="{ 'vt-item': true, active: curTab === i }" @click="curTab = i">{{ e }}</view>
</view>
</view>
<view class="vr-time-board">
<view class="vtb-time">
<view class="vt-txt">2024.04.09 2024.05.09</view>
<view class="vtb-time" @click="showPeriodModal">
<view class="vt-txt">{{ showPeriodStr }}</view>
<image class="vt-icon" mode="aspectFit" src="/subpackage/verification/static/images/calendar.png"></image>
</view>
<view class="vtb-num">核销数量30</view>
<view class="vtb-num">核销数量{{ recordLs.length || 0 }}</view>
</view>
<view class="vr-list">
<site-item></site-item>
<view class="vl-space" style="height: 24rpx;"></view>
<dy-item></dy-item>
<block v-for="(e, i) in recordLs" :key="i">
<site-item
v-if="curTab === 0"
:stadium-name="e.extension&&e.extension.stadium_name"
:order-num="e.order_no"
:order-type="e.type"
:user-phone="e.extension&&e.extension.user_phone"
:user-nickname="e.extension&&e.extension.nickname"
:verify-code="e.verify_code"
:verify-method="e.desc"
:verify-time="e.verify_time"
:verify-leave-time="e.verify_leave_time"
@click:leave="siteLeaveBtn(e, i)"
></site-item>
<dy-item
v-if="curTab === 1"
:order-num="e.order_no"
:user-phone="e.user_phone"
:verify-code="e.verify_code"
:verify-method="e.verify_method"
:verify-time="e.verify_time"
></dy-item>
<mall-item
v-if="curTab === 2"
:order-num="e.product_order_no"
:order-code="e.product_order_self_pickup_info.gcode"
:user-phone="e.product_order_self_pickup_info.phone"
:user-name="e.product_order_self_pickup_info.name"
:goods-str="e.product_order_goods.join(';')"
:opt-user="e.optuname"
:created-at="e.created_at"
></mall-item>
<view class="vl-space" style="height: 24rpx;"></view>
</block>
</view>
<period-select ref="periodSelect" v-model="periodStr" ></period-select>
</view>
</template>
@ -28,22 +65,266 @@
import headBar from "../components/head_bar.vue";
import siteItem from "../components/record/site_item.vue";
import dyItem from "../components/record/dy_item.vue";
import mallItem from "../components/record/mall_item.vue";
import periodSelect from "@/components/period_select.vue";
import { formatDate, showLoad, hideLoad, showModal, showNone, debounce, formatTime, routeTo } from "@/utils/util";
import API from "../js/api.js";
import server from "../js/server.js";
export default {
components: { headBar, siteItem, dyItem },
components: { headBar, siteItem, dyItem, mallItem, periodSelect },
computed: {
//
showPeriodStr(){
let { periodStr } = this;
return periodStr ? periodStr.replace(/\_/, ' 至 ').replace(/\-/g, '.') : ''
},
//
periodObj(){
let { periodStr } = this;
if(!periodStr)return {};
let [start, end] = periodStr.split('_');
return {
start: start ?? '',
end: end ?? '',
}
},
},
watch: {
periodStr(nVal, oVal){
if(oVal&&nVal&&nVal !== oVal)this.refreshRecordLs();
},
curTab(nVal, oVal){
if(nVal !== oVal)this.reloadRecordLs();
}
},
data(){
return {
brand_id: '',
tabs: [ '场地核销记录', '抖音核销记录', '商城核销记录' ],
curTab: 0,
periodStr: '',/** ex: 2025-01-01_2025-01-02 */
stadiumList: [],
curStadium: {},
recordLs: [],
page: 1,
}
},
async onLoad(options){
this.brand_id = options?.brand_id ?? '';
this.getStadiumLs({ brand_id: options?.brand_id ?? '' });
this.reloadRecordLs();
},
onReachBottom(){
let { curStadium, periodObj, page, brand_id } = this;
this.getRecordLs({
brand_id: brand_id ?? '',
stadium_id: curStadium?.id ?? '',
start_time: periodObj?.start ?? '',
end_time: periodObj?.end ?? '',
page: page + 1,
});
},
methods: {
//
toSearch(){
let { brand_id, curTab } = this;
routeTo(`/subpackage/verification/pages/record_search?brand_id=${brand_id}&type=${curTab}`, 'nT');
},
//
siteLeaveBtn: debounce(function(e, idx){
console.log(e, idx);
showModal({
content: '是否确认手动离场?',
showCancel: true,
success: async mRes=>{
if(mRes.confirm){
let _status = await this.leaveVerifyOrder({ brand_id: e?.brand_id ?? '', id: e?.id ?? '' });
if(_status)this.recordLs[idx].verify_leave_time = formatTime(new Date());
this.$forceUpdate();
}
}
})
}, 300, true),
//
initPeriodStr(){
let _today = new Date();
let _todayTimestamp = _today.getTime();
let _eStr = formatDate({ date: _today });
let _first30DaysTimestamp = _todayTimestamp - 30 * 24 * 60 * 60 * 1000;
let _sStr = formatDate({ date: new Date(_first30DaysTimestamp) });
return this.periodStr = `${_sStr}_${_eStr}`;
},
showPeriodModal(){
this.$refs?.periodSelect?.show?.();
},
//
stadiumChange(e){
let { stadiumList } = this;
let _curStadium = stadiumList?.[e?.detail?.value ?? 0] ?? {};
this.curStadium = _curStadium;
this.refreshRecordLs();
},
// /
reloadRecordLs(){
let { brand_id } = this;
this.page = 1;
this.recordLs = [];
this.initPeriodStr();
let { periodObj, curStadium } = this;
this.getRecordLs({
brand_id: brand_id ?? '' ,
stadium_id: curStadium.id ?? '',
start_time: periodObj.start,
end_time: periodObj.end,
});
},
// /
refreshRecordLs(){
let { curStadium, periodObj, brand_id } = this;
this.page = 1;
this.recordLs = [];
this.getRecordLs({
brand_id: brand_id ?? '',
stadium_id: curStadium?.id ?? '',
start_time: periodObj?.start ?? '',
end_time: periodObj?.end ?? '',
});
},
//
getStadiumLs({ brand_id }){
showLoad();
return server.post({
url: API.stadiumList,
data: { page_size: 9999, page: 1, brand_id },
isDefaultGet: false,
})
.then(res => {
hideLoad();
let _data = res?.data || {};
if(_data.code === 0){
let _ls = _data?.data?.list || [];
this.stadiumList = _ls;
return _ls;
}else{
return Promise.reject(_data);
}
})
.catch(err => {
hideLoad();
showModal({
title: '提示',
content: err.message || '加载门店失败!'
})
console.warn('verification record getStadiumLs err --->', err);
// return Promise.reject(err);
})
},
// -
getRecordLs({ brand_id, stadium_id = '', start_time = '', end_time = '', page = 1, page_size = 20 }){
showLoad();
return server.post({
url: this.getRecordLsAPI(),
data: this.formatQuery({ brand_id, stadium_id, start_time, end_time, page, page_size }),
isDefaultGet: false,
})
.then(res => {
hideLoad();
let _data = res?.data || {};
if(_data.code === 0){
let _ls = this.formatRecordLs(_data?.data?.list || []);
if(page === 1)return this.recordLs = _ls;
if(!_ls.length)return showNone('没有更多!');
this.page = page;
this.recordLs = [ ...this.recordLs, ..._ls ];
return _ls;
}else{
return Promise.reject(_data);
}
})
.catch(err => {
hideLoad();
showModal({
title: '提示',
content: err.message || '加载数据失败!'
})
console.warn('verification record getRecordLs err --->', err);
// return Promise.reject(err);
})
},
// API
getRecordLsAPI(){
let { curTab } = this;
if(curTab === 0)return API.listVerifyRecord
if(curTab === 1)return API.dyPoiOrderList
if(curTab === 2)return API.shop2WriteoffList
},
//
formatQuery(query){
let { curTab } = this;
if(curTab === 1)query['order_status'] = 'used';
if(curTab === 2){
query['stime'] = query?.start_time ?? '';
query['etime'] = query?.end_time ?? '';
delete query.start_time
delete query.end_time
}
return query;
},
//
formatRecordLs(ls){
let { curTab } = this;
//
if(curTab === 1){
return ls.map(item=>{
let _code = item?.order_codes?.find(e=>e?.code_status == 'used');
console.log('_code',item);
return {
order_no: item?.order_no ?? '',
user_phone: item?.mobile ?? '',
verify_code: _code?.code ?? '',
verify_method: _code?.verification_method ?? '',
verify_time: _code?.verification_time ?? '',
};
})
}
return ls;
},
// -
leaveVerifyOrder({ brand_id, id }){
showLoad();
return server.post({
url: API.leaveVerifyOrder,
data: { brand_id, id },
isDefaultGet: false,
})
.then(res => {
hideLoad();
let _data = res?.data || {};
if(_data.code === 0){
showNone(_data?.message || '操作成功!')
return true;
}else{
return Promise.reject(_data);
}
})
.catch(err => {
hideLoad();
showModal({
title: '提示',
content: err.message || '操作失败!'
})
console.warn('verification record leaveVerifyOrder err --->', err);
// return Promise.reject(err);
return false;
})
},
}
}
</script>
<style lang="scss">
.verification-record{
@include isPd(20upx);
}
.vr-header{
background: #fff;

244
src/subpackage/verification/pages/record_search.vue

@ -0,0 +1,244 @@
<template>
<view class="record-search">
<view class="os-bar">
<view>
<image mode="aspectFit" src="/subpackage/verification/static/images/search.png"></image>
<input placeholder="请输入手机号/核销码" v-model="searchTxt" confirm-type="search" @confirm="iptConfirm" />
<image v-if="searchTxt!==''" mode="aspectFit" src="/subpackage/verification/static/images/round_close.png" @click="clearSearch"></image>
</view>
</view>
<view class="rs-ls">
<block v-for="(e, i) in searchLs" :key="i">
<site-item
v-if="orderType === 0"
:stadium-name="e.extension&&e.extension.stadium_name"
:order-num="e.order_no"
:order-type="e.type"
:user-phone="e.extension&&e.extension.user_phone"
:user-nickname="e.extension&&e.extension.nickname"
:verify-code="e.verify_code"
:verify-method="e.desc"
:verify-time="e.verify_time"
:verify-leave-time="e.verify_leave_time"
@click:leave="siteLeaveBtn(e, i)"
></site-item>
<dy-item
v-if="orderType === 1"
:order-num="e.order_no"
:user-phone="e.user_phone"
:verify-code="e.verify_code"
:verify-method="e.verify_method"
:verify-time="e.verify_time"
></dy-item>
<mall-item
v-if="orderType === 2"
:order-num="e.product_order_no"
:order-code="e.product_order_self_pickup_info.gcode"
:user-phone="e.product_order_self_pickup_info.phone"
:user-name="e.product_order_self_pickup_info.name"
:goods-str="e.product_order_goods.join(';')"
:opt-user="e.optuname"
:created-at="e.created_at"
></mall-item>
<view class="vl-space" style="height: 24rpx;"></view>
</block>
</view>
</view>
</template>
<script>
import { formatDate, showLoad, hideLoad, showModal, showNone, debounce, formatTime, routeTo } from "@/utils/util";
import API from "../js/api.js";
import server from "../js/server.js";
import siteItem from "../components/record/site_item.vue";
import dyItem from "../components/record/dy_item.vue";
import mallItem from "../components/record/mall_item.vue";
export default {
components: { siteItem, dyItem, mallItem },
data(){
return {
brand_id: '',
orderType: '',
searchTxt: '',
page: 1,
searchLs: [],
}
},
onLoad(options){
this.brand_id = options?.brand_id ?? '';
this.orderType = +(options?.type ?? '');
},
onReachBottom(){
let { searchTxt, page } = this;
this.getRecordLs({
keyword: searchTxt,
page: ++page
})
},
methods: {
clearSearch(){
this.searchTxt = '';
},
iptConfirm(e){
let { brand_id } = this;
console.log(e);
this.page = 1;
this.searchLs = [];
this.getRecordLs({
brand_id,
keyword: e?.detail?.value || ''
})
},
//
siteLeaveBtn: debounce(function(e, idx){
showModal({
content: '是否确认手动离场?',
showCancel: true,
success: async mRes=>{
if(mRes.confirm){
let _status = await this.leaveVerifyOrder({ brand_id: e?.brand_id ?? '', id: e?.id ?? '' });
if(_status)this.searchLs[idx].verify_leave_time = formatTime(new Date());
this.$forceUpdate();
}
}
})
}, 300, true),
// -
leaveVerifyOrder({ brand_id, id }){
showLoad();
return server.post({
url: API.leaveVerifyOrder,
data: { brand_id, id },
isDefaultGet: false,
})
.then(res => {
hideLoad();
let _data = res?.data || {};
if(_data.code === 0){
showNone(_data?.message || '操作成功!')
return true;
}else{
return Promise.reject(_data);
}
})
.catch(err => {
hideLoad();
showModal({
title: '提示',
content: err.message || '操作失败!'
})
console.warn('verification record_search leaveVerifyOrder err --->', err);
// return Promise.reject(err);
return false;
})
},
// -
getRecordLs({ brand_id, stadium_id = '', start_time = '', end_time = '', page = 1, page_size = 20, keyword = '' }){
showLoad();
return server.post({
url: this.getRecordLsAPI(),
data: this.formatQuery({ brand_id, stadium_id, start_time, end_time, page, page_size, keyword }),
isDefaultGet: false,
})
.then(res => {
hideLoad();
let _data = res?.data || {};
if(_data.code === 0){
let _ls = this.formatRecordLs(_data?.data?.list || []);
if(page === 1)return this.searchLs = _ls;
if(!_ls.length)return showNone('没有更多!');
this.page = page;
this.searchLs = [ ...this.searchLs, ..._ls ];
return _ls;
}else{
return Promise.reject(_data);
}
})
.catch(err => {
hideLoad();
showModal({
title: '提示',
content: err.message || '加载数据失败!'
})
console.warn('verification record_search getRecordLs err --->', err);
// return Promise.reject(err);
})
},
getRecordLsAPI(){
let { orderType } = this;
if(orderType === 0)return API.listVerifyRecord
if(orderType === 1)return API.dyPoiOrderList
if(orderType === 2)return API.shop2WriteoffList
},
formatQuery(query){
let { orderType } = this;
if(orderType === 1)query['order_status'] = 'used';
if(orderType === 2){
query['stime'] = query?.start_time ?? '';
query['etime'] = query?.end_time ?? '';
delete query.start_time
delete query.end_time
}
return query;
},
formatRecordLs(ls){
let { orderType } = this;
//
if(orderType === 1){
return ls.map(item=>{
let _code = item?.order_codes?.find(e=>e?.code_status == 'used');
return {
order_no: item?.order_no ?? '',
user_phone: item?.mobile ?? '',
verify_code: _code?.code ?? '',
verify_method: _code?.verification_method ?? '',
verify_time: _code?.verification_time ?? '',
};
})
}
return ls;
},
}
}
</script>
<style lang="scss">
.record-search{
@include isPd(20upx);
}
.os-bar{
margin-bottom: 24upx;
height: 144upx;
background-color: #fff;
@include ctf(center);
>view{
padding: 0 20upx;
height: 92upx;
width: 702upx;
border-radius: 10upx;
background-color: #f2f2f7;
@include ctf(center);
>image{
margin-right: 20upx;
flex-shrink: 0;
width: 40upx;
height: 40upx;
}
>input{
height: 100%;
flex-grow: 1;
@include flcw(32upx, 44upx, #1a1a1a);
&+image{
flex-shrink: 0;
margin-right: 0;
margin-left: 20upx;
width: 32upx;
height: 32upx;
}
}
}
}
.rs-ls{
padding: 0 24upx;
}
</style>

BIN
src/subpackage/verification/static/images/order/null_code.png

After

Width: 200  |  Height: 148  |  Size: 7.6 KiB

BIN
src/subpackage/verification/static/images/order/null_range.png

After

Width: 185  |  Height: 185  |  Size: 3.6 KiB

BIN
src/subpackage/verification/static/images/order/null_search.png

After

Width: 185  |  Height: 185  |  Size: 4.4 KiB

BIN
src/subpackage/verification/static/images/round_close.png

After

Width: 32  |  Height: 32  |  Size: 369 B

Loading…
Cancel
Save