|
@@ -0,0 +1,466 @@
|
|
|
+<template>
|
|
|
+ <view class="page" :style="{'min-height':(h)+'px','padding-top':mt+'px'}">
|
|
|
+ <c-nav-bar title="核销" @goBack="back()"></c-nav-bar>
|
|
|
+ <view class="types">
|
|
|
+ <view class="item bg2" @tap="scanCode(0)">
|
|
|
+ <view class="n">扫码核销</view>
|
|
|
+ <u-icon name="arrow-right" color="#fff" size="26" label="点击扫描" label-color="#fff" label-size="28" cu
|
|
|
+ label-pos="left"></u-icon>
|
|
|
+ </view>
|
|
|
+ <view class="item bg1" @tap="scanCode(1)">
|
|
|
+ <view class="n">扫身份证</view>
|
|
|
+ <u-icon name="arrow-right" color="#fff" size="26" label="点击扫描" label-color="#fff" label-size="28"
|
|
|
+ label-pos="left"></u-icon>
|
|
|
+ </view>
|
|
|
+ </view>
|
|
|
+ <view class="orderInfo">
|
|
|
+ <view class="tit">
|
|
|
+ 订单详情
|
|
|
+ </view>
|
|
|
+ <view class="time">{{orderInfo.playDate}} {{orderInfo.playTime}}出发</view>
|
|
|
+ <view class="bottom">
|
|
|
+ <text>{{orderInfo.num}}人</text>
|
|
|
+ <text>出游·{{orderInfo.playLength||0}}小时</text>
|
|
|
+ <text>¥{{orderInfo.realPrice}}</text>
|
|
|
+ </view>
|
|
|
+ </view>
|
|
|
+ <view class="list">
|
|
|
+ <view class="tit">{{boatNo}} 共({{data.length}})人</view>
|
|
|
+ <view class="item" v-for="(i,index) in data" :key="index">
|
|
|
+ <text class="type" :class="i.remark=='book'?'t1':'t2'">{{i.remark=='book'?'预订单':'现场单'}}</text>
|
|
|
+ <view class="personInfo">
|
|
|
+ <view class="name">{{i.touristName|handle(1)}}</view>
|
|
|
+ <view class="code">
|
|
|
+ 身份证 {{i.touristCode|handle(3)}}
|
|
|
+ </view>
|
|
|
+ </view>
|
|
|
+ <u-icon name="minus-circle" size="36" color="#FEA400" @tap="jian(index)"
|
|
|
+ v-if="i.remark!='book'"></u-icon>
|
|
|
+ </view>
|
|
|
+ </view>
|
|
|
+ <view class="list">
|
|
|
+ <view class="tit">选择渔船</view>
|
|
|
+ <view class="typeItem">
|
|
|
+ <view class="txt" v-for="(t,i) in types" :key="i" @click="typeIndex=i" :class="typeIndex==i?'on':''">
|
|
|
+ {{t.boatNo}}
|
|
|
+ <image v-if="typeIndex==i"
|
|
|
+ src="https://i.ringzle.com/file/20240320/b458b03f8f654a51a921656b8aa955de.png"></image>
|
|
|
+ </view>
|
|
|
+
|
|
|
+ </view>
|
|
|
+ </view>
|
|
|
+ <view class="btn">
|
|
|
+ <text @click="hexiao">开始发船</text>
|
|
|
+ </view>
|
|
|
+ </view>
|
|
|
+</template>
|
|
|
+
|
|
|
+<script>
|
|
|
+ import {
|
|
|
+ encrypt,
|
|
|
+ decrypt,
|
|
|
+ tuomin
|
|
|
+ } from '../../utils/aes.js'
|
|
|
+ var that;
|
|
|
+ const lcReader = uni.requireNativePlugin('LcReader');
|
|
|
+ const modal = uni.requireNativePlugin('modal');
|
|
|
+ var globalEvent = uni.requireNativePlugin('globalEvent');
|
|
|
+
|
|
|
+ // 依赖引入
|
|
|
+ const Intent = plus.android.importClass('android.content.Intent')
|
|
|
+ const IntentFilter = plus.android.importClass('android.content.IntentFilter')
|
|
|
+ const main = plus.android.runtimeMainActivity()
|
|
|
+ // pda广播名称
|
|
|
+ const SCANACTION = "scan.rcv.message"//扫描名称
|
|
|
+ export default {
|
|
|
+ data() {
|
|
|
+ return {
|
|
|
+ typeIndex: null,
|
|
|
+ types: [],
|
|
|
+ date: new Date().Format('yyyy-MM-dd'),
|
|
|
+ show: false,
|
|
|
+ data: [],
|
|
|
+ merchantId: uni.getStorageSync('merchantId'),
|
|
|
+ playTime: '',
|
|
|
+ boatNo: '',
|
|
|
+ type: '',
|
|
|
+ orderInfo: {},
|
|
|
+ keyName: ''
|
|
|
+ }
|
|
|
+ },
|
|
|
+ onLoad(opt) {
|
|
|
+ that = this;
|
|
|
+ this.playTime = opt.playTime || '';
|
|
|
+ this.boatNo = opt.boatNo || '';
|
|
|
+ this.getOrderInfo();
|
|
|
+ this.getTypes();
|
|
|
+
|
|
|
+ this.initSDK();
|
|
|
+ globalEvent.addEventListener('readInfo', function(e) {
|
|
|
+ if(e.Id&&e.Name) that.handleScanResult(e.Id,1,e.Name);
|
|
|
+ });
|
|
|
+ },
|
|
|
+ filters: {
|
|
|
+ handle(val, type) {
|
|
|
+ return tuomin(val, type);
|
|
|
+ }
|
|
|
+ },
|
|
|
+ destroyed() {
|
|
|
+ this.keyName = this.orderInfo.playDate + this.orderInfo.playTime + this.boatNo;
|
|
|
+ uni.setStorageSync(this.keyName, JSON.stringify(this.data));
|
|
|
+ },
|
|
|
+ methods: {
|
|
|
+ initSDK() {
|
|
|
+ // 调用异步方法
|
|
|
+ lcReader.initSDK({
|
|
|
+ 'name': 'unimp',
|
|
|
+ 'age': 1
|
|
|
+ });
|
|
|
+ },
|
|
|
+ getTypes() {
|
|
|
+ this.$api.get('/scenic/api/boat/page', {
|
|
|
+ page: -1
|
|
|
+ }).then(res => {
|
|
|
+ if (res.data.code == 0) {
|
|
|
+ this.types = res.data.data.list;
|
|
|
+ }
|
|
|
+ })
|
|
|
+ },
|
|
|
+ getOrderInfo() {
|
|
|
+ this.$api.post('/scenic/api/order/queryStartOrderInfo', {
|
|
|
+ merchantId: this.merchantId,
|
|
|
+ boatNo: this.boatNo
|
|
|
+ }).then(res => {
|
|
|
+ if (res.data.code == 0) {
|
|
|
+ this.orderInfo = res.data.data;
|
|
|
+ this.keyName = this.orderInfo.playDate + this.orderInfo.playTime + this.boatNo;
|
|
|
+ if (uni.getStorageSync(this.keyName)) {
|
|
|
+ this.data = JSON.parse(uni.getStorageSync(this.keyName)) || [];
|
|
|
+ }
|
|
|
+ }
|
|
|
+ })
|
|
|
+ },
|
|
|
+ scanCode(type) {
|
|
|
+ let mg = '请按下按钮进行二维码扫描';
|
|
|
+ if(type==1) mg = '请放置身份证进行读取';
|
|
|
+ this.$showToast(mg);
|
|
|
+ if(type==0) this.scanCodeByEwm();
|
|
|
+ else if(type==1){
|
|
|
+ // lcReader.sigleRead();//单次读卡
|
|
|
+ lcReader.cycleReadCard();//循环读卡
|
|
|
+ }
|
|
|
+ },
|
|
|
+ //扫二维码或条形码
|
|
|
+ scanCodeByEwm(){
|
|
|
+ var filter = new IntentFilter();
|
|
|
+ filter.addAction(SCANACTION);
|
|
|
+
|
|
|
+ // 接收
|
|
|
+ let that = this;
|
|
|
+ var receiver = plus.android.implements('io.dcloud.feature.internal.reflect.BroadcastReceiver', {
|
|
|
+ onReceive: (context, intent)=>{
|
|
|
+ if (intent.getAction() === SCANACTION) {
|
|
|
+ // 扫描信息处理
|
|
|
+ let scanCode = intent.getStringExtra("barcodeData");
|
|
|
+ // 接收信息处理
|
|
|
+ if(scanCode) that.handleScanResult(scanCode,0,'');
|
|
|
+ }
|
|
|
+ }
|
|
|
+ })
|
|
|
+ main.registerReceiver(receiver, filter);
|
|
|
+ },
|
|
|
+ // 处理扫码结果的函数,可以根据实际需求进行扩展
|
|
|
+ handleScanResult(result, type, name) {
|
|
|
+ // 例如:导航到某个页面,或者处理其他业务逻辑
|
|
|
+ let sendData = {};
|
|
|
+ sendData.playDate = this.orderInfo.playDate;
|
|
|
+ sendData.playTime = this.orderInfo.playTime;
|
|
|
+ sendData.playLength = this.orderInfo.playLength || 1;
|
|
|
+ sendData.merchantId = this.orderInfo.merchantId;
|
|
|
+ sendData.orderType = this.orderInfo.orderType;
|
|
|
+ sendData.type = type;
|
|
|
+ sendData.boatNo = this.boatNo;
|
|
|
+ if(type==0) sendData.writeOffCode = result;
|
|
|
+ else if(type==1){
|
|
|
+ sendData.touristCode = encrypt(result);
|
|
|
+ sendData.touristName = encrypt(name);
|
|
|
+ }
|
|
|
+
|
|
|
+ this.$api.post('/scenic/api/order/scanCode', sendData).then(res => {
|
|
|
+ if (res.data.code == 0) {
|
|
|
+ if (this.data.findIndex((item) => {
|
|
|
+ return item.touristCode == res.data.data.touristCode
|
|
|
+ }) > -1) {
|
|
|
+ let mg = '该核验码已扫';
|
|
|
+ if(type==1) mg = '该身份证已扫';
|
|
|
+ this.$showToast(mg);
|
|
|
+ } else {
|
|
|
+ this.data.push(res.data.data);
|
|
|
+ }
|
|
|
+ if(type==1) lcReader.cancelCycle();//关闭循环读卡
|
|
|
+ } else {
|
|
|
+ this.$showToast(res.data.msg)
|
|
|
+ if(type==1) lcReader.cancelCycle();//关闭循环读卡
|
|
|
+ }
|
|
|
+ })
|
|
|
+ },
|
|
|
+ check() {
|
|
|
+ uni.navigateTo({
|
|
|
+ url: '/pagesHouse/Verification/check'
|
|
|
+ })
|
|
|
+ },
|
|
|
+ hexiao() {
|
|
|
+ if (this.data.length == 0) {
|
|
|
+ return this.$showToast('请选择核销人')
|
|
|
+ }
|
|
|
+ if (this.typeIndex == null) {
|
|
|
+ return this.$showToast('请选择渔船')
|
|
|
+ }
|
|
|
+ let boatCode = this.types[this.typeIndex].boatNo;
|
|
|
+ let newData = JSON.parse(JSON.stringify(this.data));
|
|
|
+ newData.forEach(d=>{
|
|
|
+ d.touristCode = encrypt(d.touristCode);
|
|
|
+ d.touristName = encrypt(d.touristName);
|
|
|
+ })
|
|
|
+ this.$api.post('/scenic/api/order/sailWriteOff', {
|
|
|
+ playDate:this.orderInfo.playDate,
|
|
|
+ playTime:this.orderInfo.playTime,
|
|
|
+ playLength:this.orderInfo.playLength,
|
|
|
+ orderType: this.orderInfo.orderType,
|
|
|
+ touristList: newData,
|
|
|
+ boatCode: boatCode
|
|
|
+ }).then(res => {
|
|
|
+ if (res.data.code == 0) {
|
|
|
+ uni.navigateTo({
|
|
|
+ url: "/pagesHouse/Verification/success?boatNo=" + this.boatNo + '&price=' +
|
|
|
+ this.orderInfo.realPrice
|
|
|
+ })
|
|
|
+ }else this.$showToast(res.data.msg)
|
|
|
+ })
|
|
|
+ uni.removeStorageSync(this.keyName);
|
|
|
+ },
|
|
|
+ jian(index){
|
|
|
+ if(this.data.length>index) this.data.splice(index,1);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+</script>
|
|
|
+
|
|
|
+<style lang="less" scoped>
|
|
|
+ /deep/.u-icon {
|
|
|
+ justify-content: flex-end;
|
|
|
+ }
|
|
|
+
|
|
|
+ .btn {
|
|
|
+ position: fixed;
|
|
|
+ bottom: 0;
|
|
|
+ left: 0;
|
|
|
+ z-index: 1;
|
|
|
+ padding: 16rpx 30rpx 36rpx 30rpx;
|
|
|
+ width: 100%;
|
|
|
+ box-sizing: border-box;
|
|
|
+ background: #fff;
|
|
|
+
|
|
|
+ text {
|
|
|
+ display: block;
|
|
|
+ background-color: #007A69;
|
|
|
+ color: #007A69;
|
|
|
+ color: #fff;
|
|
|
+ height: 88rpx;
|
|
|
+ line-height: 88rpx;
|
|
|
+ border-radius: 44rpx;
|
|
|
+ text-align: center;
|
|
|
+ font-size: 32rp;
|
|
|
+ font-weight: bold;
|
|
|
+ box-sizing: border-box;
|
|
|
+
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ .page {
|
|
|
+ background: #F5F8FA;
|
|
|
+ padding: 20rpx 24rpx 160rpx;
|
|
|
+ box-sizing: border-box;
|
|
|
+
|
|
|
+ .types {
|
|
|
+ display: flex;
|
|
|
+ gap: 36rpx;
|
|
|
+ justify-content: space-between;
|
|
|
+
|
|
|
+
|
|
|
+ .n {
|
|
|
+ margin-bottom: 20rpx;
|
|
|
+ color: #fff;
|
|
|
+ }
|
|
|
+
|
|
|
+ .item {
|
|
|
+ width: 330rpx;
|
|
|
+ height: 156rpx;
|
|
|
+ padding: 34rpx 24rpx;
|
|
|
+ font-size: 36rpx;
|
|
|
+ font-weight: bold;
|
|
|
+ box-sizing: border-box;
|
|
|
+ }
|
|
|
+
|
|
|
+ .bg2 {
|
|
|
+ background: url('https://i.ringzle.com/file/20240316/3fc9f6a78557492e98caa50392411e3a.png') no-repeat center;
|
|
|
+ background-size: 100%;
|
|
|
+ }
|
|
|
+
|
|
|
+ .bg1 {
|
|
|
+ background: url('https://i.ringzle.com/file/20240316/8a927d5d4da84728b6bb0896541baccf.png') no-repeat center;
|
|
|
+ background-size: 100%;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ .orderInfo {
|
|
|
+ background-color: #fff;
|
|
|
+ color: #333;
|
|
|
+ padding: 0 24rpx 36rpx;
|
|
|
+ margin: 20rpx 0 0;
|
|
|
+ background: #fff;
|
|
|
+ border-radius: 16rpx;
|
|
|
+
|
|
|
+ .tit {
|
|
|
+ padding: 32rpx 0 24rpx;
|
|
|
+ font-size: 32rpx;
|
|
|
+ }
|
|
|
+
|
|
|
+ .time {
|
|
|
+ font-size: 36rpx;
|
|
|
+ font-weight: bold;
|
|
|
+ margin-bottom: 32rpx;
|
|
|
+ }
|
|
|
+
|
|
|
+ .bottom {
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+
|
|
|
+ text {
|
|
|
+ &:first-child {
|
|
|
+ width: 88rpx;
|
|
|
+ height: 54rpx;
|
|
|
+ background-color: #007A69;
|
|
|
+ color: #fff;
|
|
|
+ font-size: 34rpx;
|
|
|
+ font-weight: bold;
|
|
|
+ margin-right: 10rpx;
|
|
|
+ text-align: center;
|
|
|
+ border-radius: 12rpx;
|
|
|
+ }
|
|
|
+
|
|
|
+ &:nth-child(2) {
|
|
|
+ width: 200rpx;
|
|
|
+ flex: 1;
|
|
|
+ }
|
|
|
+
|
|
|
+ &:last-child {
|
|
|
+ font-size: 30rpx;
|
|
|
+ font-weight: bold;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ .list {
|
|
|
+ box-sizing: border-box;
|
|
|
+ padding: 0 24rpx 0;
|
|
|
+ border-radius: 16rpx;
|
|
|
+ background-color: #fff;
|
|
|
+ margin-top: 20rpx;
|
|
|
+
|
|
|
+ .tit {
|
|
|
+ font-size: 36rpx;
|
|
|
+ font-weight: bold;
|
|
|
+ color: #111;
|
|
|
+ padding: 36rpx 0 17rpx;
|
|
|
+ }
|
|
|
+
|
|
|
+ .typeItem {
|
|
|
+ display: flex;
|
|
|
+ justify-content: space-between;
|
|
|
+ flex-wrap: wrap;
|
|
|
+ gap: 20rpx 0;
|
|
|
+ padding-bottom: 50rpx;
|
|
|
+
|
|
|
+ .txt {
|
|
|
+ display: inline-block;
|
|
|
+ width: 316rpx;
|
|
|
+ height: 80rpx;
|
|
|
+ background: #fff;
|
|
|
+ border-radius: 16rpx;
|
|
|
+ text-align: center;
|
|
|
+ line-height: 80rpx;
|
|
|
+ border: 2rpx solid #EFEFEF;
|
|
|
+ color: #333;
|
|
|
+ position: relative;
|
|
|
+
|
|
|
+ &.on {
|
|
|
+ color: #007A69;
|
|
|
+ background: rgba(0, 122, 105, 0.06);
|
|
|
+ border: 2rpx solid #007A69;
|
|
|
+
|
|
|
+ image {
|
|
|
+ position: absolute;
|
|
|
+ bottom: 0;
|
|
|
+ right: 0;
|
|
|
+ width: 34rpx;
|
|
|
+ height: 26rpx;
|
|
|
+ z-index: 11;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ .item {
|
|
|
+ display: flex;
|
|
|
+ justify-content: space-between;
|
|
|
+ padding: 24rpx 0;
|
|
|
+ align-items: center;
|
|
|
+
|
|
|
+ .type {
|
|
|
+ width: 110rpx;
|
|
|
+ height: 48rpx;
|
|
|
+ text-align: center;
|
|
|
+ display: inline-block;
|
|
|
+ line-height: 48rpx;
|
|
|
+ border-radius: 11rpx;
|
|
|
+ font-size: 26rpx;
|
|
|
+ font-weight: bold;
|
|
|
+ color: #111;
|
|
|
+ margin-right: 16rpx;
|
|
|
+ }
|
|
|
+
|
|
|
+ .t1 {
|
|
|
+ background-color: #F0F8F6;
|
|
|
+ color: #007A69;
|
|
|
+ }
|
|
|
+
|
|
|
+ .t2 {
|
|
|
+ background-color: #E8EFFD;
|
|
|
+ color: #326EE0;
|
|
|
+ }
|
|
|
+
|
|
|
+ .personInfo {
|
|
|
+ flex: 1;
|
|
|
+
|
|
|
+ .name {
|
|
|
+ font-size: 30rpx;
|
|
|
+ color: #111;
|
|
|
+ margin-bottom: 16rpx;
|
|
|
+ }
|
|
|
+
|
|
|
+ .code {
|
|
|
+ color: #666;
|
|
|
+ font-size: 28rpx;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+</style>
|