@@ -9,7 +9,7 @@ import { getItem, StorageKeys } from "@/utils/storage"; | |||
import { hasLogin, msg, timesDiff } from "@/utils/utils"; | |||
import { orderList } from "@/utils/network/api"; | |||
import { PageData } from "@/datas/enum"; | |||
const tools = require("../../static/etcUtil/tools.js"); | |||
export default function useOrderListItem(props) { | |||
//搜索关键字 | |||
const searchKeyWords = ref(''); | |||
@@ -46,8 +46,14 @@ export default function useOrderListItem(props) { | |||
msg('请输入需要搜索的车牌号!'); | |||
return; | |||
} | |||
refreshList(true); | |||
// #endif | |||
// #ifdef MP-ALIPAY | |||
tools.showLoadingAlert("加载中"); | |||
refreshList(true); | |||
tools.hideLoadingAlert(); | |||
// #endif | |||
} | |||
//订单车牌号输入 |
@@ -184,6 +184,7 @@ | |||
* 打开蓝牙 | |||
*/ | |||
const openBluetooth = () => { | |||
tools.hideLoadingAlert(); | |||
let foundDevices = []; //扫描到的蓝牙列表 | |||
uni.closeBluetoothAdapter(); //先关闭蓝牙 | |||
@@ -541,6 +542,7 @@ | |||
} else { | |||
return; | |||
} | |||
} | |||
/** |
@@ -140,7 +140,6 @@ function conn(device, callback_1, callback_2) { | |||
if ((endTime - beginTime) >= 3000) { | |||
mIsInitCmdSend = false; | |||
m_isConn = false; | |||
console.log('00000000'); | |||
callback_2(makeRes(-1, [], '蓝牙已断开')) | |||
} | |||
} | |||
@@ -217,6 +216,7 @@ function conn(device, callback_1, callback_2) { | |||
console.log('******解析后的指令数据为' + mReturnedRawCmdData) | |||
if (receiveDataCallBack) { | |||
receiveDataCallBack(makeRes(errorcode, mReturnedRawCmdData, errorcode == 0 ? '收到数据成功' : '数据透传失败')) | |||
receiveDataCallBack = null | |||
} | |||
mUnpacketDataCache = [] | |||
} | |||
@@ -374,9 +374,7 @@ function subReqDataAndMakeEtcProtoPacket(etcProtoData) { | |||
let totalDataLen = etcProtoData.length; | |||
let blockSize = maxLenPerPacket; | |||
let offset = 0 | |||
//if (blockSize == undefined) | |||
if(!blockSize) | |||
{ | |||
if (blockSize == undefined) { | |||
blockSize = 100 | |||
} | |||
@@ -399,9 +397,6 @@ function subReqDataAndMakeEtcProtoPacket(etcProtoData) { | |||
for (; offset < (totalDataLen - blockSize); offset += blockSize) { | |||
_pack.packNumOffset = PackNumOffset; | |||
sendBuff.push.apply(sendBuff, pSendBuf.slice(offset, offset + blockSize)) | |||
let sendBuffDataLen = sendBuff.length ; | |||
if (sendBuffDataLen == 0) | |||
return ; | |||
hr = makeSingleEtcProtocolPaket(sendBuff, _pack) | |||
if (hr != 0) { | |||
return hr; | |||
@@ -621,22 +616,22 @@ function ab2hexArr(arr) { | |||
return hexArr; | |||
} | |||
// function str2Bytes(str) { | |||
// var pos = 0; | |||
// var len = str.length; | |||
// if (len % 2 != 0) { | |||
// return null; | |||
// } | |||
// len /= 2; | |||
// var hexA = new Array(); | |||
// for (var i = 0; i < len; i++) { | |||
// var s = str.substr(pos, 2); | |||
// var v = parseInt(s, 16); | |||
// hexA.push(v); | |||
// pos += 2; | |||
// } | |||
// return hexA; | |||
// } | |||
function str2Bytes(str) { | |||
var pos = 0; | |||
var len = str.length; | |||
if (len % 2 != 0) { | |||
return null; | |||
} | |||
len /= 2; | |||
var hexA = new Array(); | |||
for (var i = 0; i < len; i++) { | |||
var s = str.substr(pos, 2); | |||
var v = parseInt(s, 16); | |||
hexA.push(v); | |||
pos += 2; | |||
} | |||
return hexA; | |||
} | |||
function makeHandShakeStep1WithETC() { | |||
let cBuff = [] |
@@ -128,7 +128,9 @@ function transCmd(cmdArr, type, func, callBack = null) { | |||
console.log('指令执行内容', cmdArr, type) | |||
switch (connectPrefixName) { | |||
case "WJ": | |||
console.log('WJ执行内容====', cmdArr, type) | |||
wjApi.transCmd(cmdArr, type, function(res) { | |||
console.log('WJ执行内容====11111', res) | |||
if (res.code == 0) { | |||
func(res.data); | |||
} else { | |||
@@ -141,7 +143,9 @@ function transCmd(cmdArr, type, func, callBack = null) { | |||
}); | |||
break; | |||
case "JL": | |||
console.log('JL执行内容====', cmdArr, type) | |||
jlApi.transCmd(cmdArr, type, function(res) { | |||
console.log('JL执行内容====11111', res) | |||
if (res.code == 0) { | |||
func(res.data); | |||
} else { | |||
@@ -232,7 +236,9 @@ function transCmd(cmdArr, type, func, callBack = null) { | |||
}); | |||
break; | |||
case "TD": | |||
console.log('TD执行内容====', cmdArr, type) | |||
tdApi.transCmd(cmdArr, type, function(res) { | |||
console.log('TD执行内容====', cmdArr, type) | |||
if (res.code == 0) { | |||
func(res.data); | |||
} else { |
@@ -151,33 +151,37 @@ function navigateBack(delta, successFunc = null, failFunc = null) { | |||
/********************** showModalAlert ************************/ | |||
function showModalAlert(content, successFunc = null, failFunc = null, title = '温馨提示', showCancel = false) { | |||
uni.showModal({ | |||
title: title, | |||
content: content, | |||
showCancel: showCancel, | |||
//是否显示取消按钮 | |||
cancelText: '取消', | |||
//默认是“取消” | |||
cancelColor: theme.cancelModalColor, | |||
//取消文字的颜色 | |||
confirmText: '确定', | |||
//默认是“确定” | |||
confirmColor: theme.modalColor, | |||
//确定文字的颜色 | |||
success: function(res) { | |||
//接口调用成功的回调函数 | |||
if (successFunc != null) { | |||
successFunc(res); | |||
} | |||
}, | |||
fail: function(res) { | |||
//接口调用失败的回调函数 | |||
if (failFunc != null) { | |||
failFunc(res); | |||
} | |||
}, | |||
complete: function(res) {} //接口调用结束的回调函数(调用成功、失败都会执行) | |||
}); | |||
console.log("温馨提示", title, content != "") | |||
if (content != "") { | |||
uni.showModal({ | |||
title: title, | |||
content: content, | |||
showCancel: showCancel, | |||
//是否显示取消按钮 | |||
cancelText: '取消', | |||
//默认是“取消” | |||
cancelColor: theme.cancelModalColor, | |||
//取消文字的颜色 | |||
confirmText: '确定', | |||
//默认是“确定” | |||
confirmColor: theme.modalColor, | |||
//确定文字的颜色 | |||
success: function(res) { | |||
//接口调用成功的回调函数 | |||
if (successFunc != null) { | |||
successFunc(res); | |||
} | |||
}, | |||
fail: function(res) { | |||
//接口调用失败的回调函数 | |||
if (failFunc != null) { | |||
failFunc(res); | |||
} | |||
}, | |||
complete: function(res) {} //接口调用结束的回调函数(调用成功、失败都会执行) | |||
}); | |||
} | |||
} | |||
/*******************showToastAlert********************/ | |||
@@ -168,6 +168,7 @@ | |||
left: 0; | |||
background: white; | |||
box-sizing: border-box; | |||
width: 100%; | |||
} | |||
.content { |
@@ -1,266 +1,230 @@ | |||
<template> | |||
<view class="oderPage"> | |||
<view class="head"> | |||
您的ETC卡类型是记账卡,需要先解约,才可继续办理更换业务,请确认您的签约信息 | |||
</view> | |||
<view class="content"> | |||
<view class="row"> | |||
<text>签约银行</text> | |||
<text>工商银行</text> | |||
</view> | |||
<view class="row"> | |||
<text>签约时间</text> | |||
<text>2022-10-11 12:11:12</text> | |||
</view> | |||
<view class="row"> | |||
<text>卡号</text> | |||
<text>12312313213123</text> | |||
</view> | |||
<view class="row"> | |||
<text>车牌号</text> | |||
<text>贵A123321</text> | |||
</view> | |||
</view> | |||
<button class="submit" @click="toPage()">下一步</button> | |||
</view> | |||
<view class="oderPage"> | |||
<view class="head"> | |||
您的ETC卡类型是记账卡,需要先解约,才可继续办理更换业务,请确认您的签约信息 | |||
</view> | |||
<view class="content"> | |||
<view class="row"> | |||
<text>签约银行</text> | |||
<text>工商银行</text> | |||
</view> | |||
<view class="row"> | |||
<text>签约时间</text> | |||
<text>2022-10-11 12:11:12</text> | |||
</view> | |||
<view class="row"> | |||
<text>卡号</text> | |||
<text>12312313213123</text> | |||
</view> | |||
<view class="row"> | |||
<text>车牌号</text> | |||
<text>贵A123321</text> | |||
</view> | |||
</view> | |||
<button class="submit" @click="toPage()">下一步</button> | |||
</view> | |||
</template> | |||
<script setup lang="ts"> | |||
import navBar from "./components/nav-bar.vue"; | |||
import { checkStr } from "@/utils/utils"; | |||
import { ref, reactive } from "vue"; | |||
import { navTo } from "@/utils/utils"; | |||
import { onReady } from "@dcloudio/uni-app"; | |||
// 表单数据 | |||
const form = reactive({ | |||
bank: "工商银行", | |||
time: "2022-10-11 10:12:30", | |||
code: "12321123312313", | |||
carID: "贵A123321", | |||
}); | |||
// 验证规则 | |||
const rules = { | |||
receiving1: [ | |||
{ | |||
required: true, | |||
message: "请选择", | |||
trigger: ["change", "blur"], | |||
}, | |||
], | |||
receiving2: [ | |||
{ | |||
required: true, | |||
message: "请选择", | |||
trigger: ["change", "blur"], | |||
}, | |||
], | |||
code: [ | |||
{ | |||
required: true, | |||
message: "请输入", | |||
trigger: ["change", "blur"], | |||
}, | |||
], | |||
phone: [ | |||
{ | |||
required: true, | |||
message: "请输入手机号", | |||
trigger: ["change", "blur"], | |||
}, | |||
{ | |||
// 自定义验证函数,见上说明 | |||
validator: (rule, value, callback) => { | |||
// 上面有说,返回true表示校验通过,返回false表示不通过 | |||
console.log(checkStr(value, "mobile"), "0011"); | |||
return checkStr(value, "mobile"); | |||
}, | |||
message: "手机号码不正确", | |||
trigger: ["change", "blur"], | |||
}, | |||
], | |||
// status: [{ | |||
// required: true, | |||
// message: '请选择状态', | |||
// | |||
// trigger: ['change', 'blur'], | |||
}; | |||
// 验证提示类型(toast要版本为1.3.5才支持) | |||
const errorType = ["message", "border-bottom", "toast"]; | |||
// 设置验证规则 | |||
const myForm = ref(null); | |||
onReady(() => { | |||
myForm.value.setRules(rules); | |||
}); | |||
// 单选数据列表 | |||
const radiolist1 = reactive([ | |||
{ | |||
name: "营业点自提", | |||
disabled: false, | |||
}, | |||
{ | |||
name: "邮寄", | |||
disabled: false, | |||
}, | |||
]); | |||
// 单选 | |||
const radioChange = (n) => { | |||
console.log("radioChange", n); | |||
// if (n == '卡退费') { | |||
// flag.value = true | |||
// console.log(flag.value); | |||
// } else { | |||
// flag.value = false | |||
// console.log(flag.value); | |||
// } | |||
}; | |||
// // 提交 | |||
// const submit = () => { | |||
// myForm.value.validate((valid) => { | |||
// console.log(valid); | |||
// if (valid) { | |||
// console.log('验证通过', form); | |||
// } else { | |||
// console.log('验证未通过'); | |||
// } | |||
// }) | |||
// } | |||
const toPage = () => { | |||
navTo("/subpackage/after-sale/account-change/release-products"); | |||
// uni.showModal({ | |||
// title: '模拟两种情况', | |||
// confirmText: '有卡有签', | |||
// cancelText: '无卡无签', | |||
// success: function(res) { | |||
// if (res.confirm) { | |||
// console.log('用户点击确定'); | |||
// navTo('/pages/bluetooth/bluetooth') | |||
// } else if (res.cancel) { | |||
// console.log('用户点击取消'); | |||
// navTo('/subpackage/after-sale/ETC-log-off/upload-card') | |||
// } | |||
// } | |||
// }); | |||
}; | |||
import navBar from "./components/nav-bar.vue"; | |||
import { checkStr } from "@/utils/utils"; | |||
import { ref, reactive } from "vue"; | |||
import { navTo } from "@/utils/utils"; | |||
import { onReady } from "@dcloudio/uni-app"; | |||
// 表单数据 | |||
const form = reactive({ | |||
bank: "工商银行", | |||
time: "2022-10-11 10:12:30", | |||
code: "12321123312313", | |||
carID: "贵A123321", | |||
}); | |||
// 验证规则 | |||
const rules = { | |||
receiving1: [ | |||
{ | |||
required: true, | |||
message: "请选择", | |||
trigger: ["change", "blur"], | |||
}, | |||
], | |||
receiving2: [ | |||
{ | |||
required: true, | |||
message: "请选择", | |||
trigger: ["change", "blur"], | |||
}, | |||
], | |||
code: [ | |||
{ | |||
required: true, | |||
message: "请输入", | |||
trigger: ["change", "blur"], | |||
}, | |||
], | |||
phone: [ | |||
{ | |||
required: true, | |||
message: "请输入手机号", | |||
trigger: ["change", "blur"], | |||
}, | |||
{ | |||
// 自定义验证函数,见上说明 | |||
validator: (rule, value, callback) => { | |||
// 上面有说,返回true表示校验通过,返回false表示不通过 | |||
console.log(checkStr(value, "mobile"), "0011"); | |||
return checkStr(value, "mobile"); | |||
}, | |||
message: "手机号码不正确", | |||
trigger: ["change", "blur"], | |||
}, | |||
], | |||
}; | |||
// 验证提示类型(toast要版本为1.3.5才支持) | |||
const errorType = ["message", "border-bottom", "toast"]; | |||
// 设置验证规则 | |||
const myForm = ref(null); | |||
onReady(() => { | |||
myForm.value.setRules(rules); | |||
}); | |||
// 单选数据列表 | |||
const radiolist1 = reactive([ | |||
{ | |||
name: "营业点自提", | |||
disabled: false, | |||
}, | |||
{ | |||
name: "邮寄", | |||
disabled: false, | |||
}, | |||
]); | |||
// 单选 | |||
const radioChange = (n) => { | |||
console.log("radioChange", n); | |||
}; | |||
const toPage = () => { | |||
navTo("/subpackage/after-sale/account-change/release-products"); | |||
}; | |||
</script> | |||
<style> | |||
page { | |||
width: 100%; | |||
height: 100%; | |||
display: flex; | |||
flex-direction: column; | |||
background: #eef7f7; | |||
} | |||
page { | |||
width: 100%; | |||
height: 100%; | |||
display: flex; | |||
flex-direction: column; | |||
background: #eef7f7; | |||
} | |||
</style> | |||
<style lang="scss" scoped> | |||
.oderPage { | |||
flex: 1; | |||
width: 100%; | |||
.head { | |||
padding: 30rpx; | |||
font-size: 28rpx; | |||
color: #303133; | |||
padding-bottom: 0; | |||
} | |||
.content { | |||
background-color: #fff; | |||
background-color: #fff; | |||
margin-top: 30rpx; | |||
padding: 0 30rpx; | |||
.row { | |||
display: flex; | |||
justify-content: space-between; | |||
padding: 30rpx 0; | |||
border-bottom: 1rpx solid #dcdcdc; | |||
} | |||
} | |||
.from { | |||
background-color: #fff; | |||
margin-top: 30rpx; | |||
padding: 0 30rpx; | |||
::v-deep .u-form-item { | |||
padding: 0; | |||
line-height: normal; | |||
.u-form-item__message { | |||
margin-bottom: 12rpx; | |||
} | |||
} | |||
.from_item { | |||
display: flex; | |||
flex-wrap: nowrap; | |||
justify-content: space-between; | |||
align-items: center; | |||
height: 80rpx; | |||
border-bottom: 1rpx solid #dcdcdc; | |||
.btn { | |||
font-size: 24rpx; | |||
font-family: Microsoft YaHei; | |||
font-weight: 400; | |||
color: #ffffff; | |||
background: #00b38b; | |||
border-radius: 10rpx; | |||
padding: 10rpx 15rpx; | |||
} | |||
::v-deep .input { | |||
text-align: right; | |||
flex: 1; | |||
input { | |||
text-align: right; | |||
} | |||
} | |||
} | |||
.from_item1 { | |||
display: flex; | |||
flex-wrap: nowrap; | |||
flex-direction: column; | |||
justify-content: space-between; | |||
padding: 30rpx; | |||
border-bottom: #dcdcdc 1px solid; | |||
input { | |||
text-align: right; | |||
} | |||
.textarea { | |||
background-color: #f1f1f1; | |||
width: 100%; | |||
border-radius: 20rpx; | |||
margin-top: 10rpx; | |||
text-indent: 1rem; | |||
height: 180rpx; | |||
padding: 20rpx; | |||
box-sizing: border-box; | |||
} | |||
} | |||
} | |||
} | |||
.submit { | |||
background: linear-gradient(to left, #43a1e0 0%, #13e7c1 100%); | |||
width: 670rpx; | |||
height: 80rpx; | |||
color: #fff; | |||
border-radius: 100rpx; | |||
position: fixed; | |||
left: 50%; | |||
transform: translate(-50%); | |||
bottom: 60rpx; | |||
font-size: 32rpx; | |||
} | |||
</style> | |||
.oderPage { | |||
flex: 1; | |||
width: 100%; | |||
.head { | |||
padding: 30rpx; | |||
font-size: 28rpx; | |||
color: #303133; | |||
padding-bottom: 0; | |||
} | |||
.content { | |||
background-color: #fff; | |||
background-color: #fff; | |||
margin-top: 30rpx; | |||
padding: 0 30rpx; | |||
.row { | |||
display: flex; | |||
justify-content: space-between; | |||
padding: 30rpx 0; | |||
border-bottom: 1rpx solid #dcdcdc; | |||
} | |||
} | |||
.from { | |||
background-color: #fff; | |||
margin-top: 30rpx; | |||
padding: 0 30rpx; | |||
::v-deep .u-form-item { | |||
padding: 0; | |||
line-height: normal; | |||
.u-form-item__message { | |||
margin-bottom: 12rpx; | |||
} | |||
} | |||
.from_item { | |||
display: flex; | |||
flex-wrap: nowrap; | |||
justify-content: space-between; | |||
align-items: center; | |||
height: 80rpx; | |||
border-bottom: 1rpx solid #dcdcdc; | |||
.btn { | |||
font-size: 24rpx; | |||
font-family: Microsoft YaHei; | |||
font-weight: 400; | |||
color: #ffffff; | |||
background: #00b38b; | |||
border-radius: 10rpx; | |||
padding: 10rpx 15rpx; | |||
} | |||
::v-deep .input { | |||
text-align: right; | |||
flex: 1; | |||
input { | |||
text-align: right; | |||
} | |||
} | |||
} | |||
.from_item1 { | |||
display: flex; | |||
flex-wrap: nowrap; | |||
flex-direction: column; | |||
justify-content: space-between; | |||
padding: 30rpx; | |||
border-bottom: #dcdcdc 1px solid; | |||
input { | |||
text-align: right; | |||
} | |||
.textarea { | |||
background-color: #f1f1f1; | |||
width: 100%; | |||
border-radius: 20rpx; | |||
margin-top: 10rpx; | |||
text-indent: 1rem; | |||
height: 180rpx; | |||
padding: 20rpx; | |||
box-sizing: border-box; | |||
} | |||
} | |||
} | |||
} | |||
.submit { | |||
background: linear-gradient(to left, #43a1e0 0%, #13e7c1 100%); | |||
width: 670rpx; | |||
height: 80rpx; | |||
color: #fff; | |||
border-radius: 100rpx; | |||
position: fixed; | |||
left: 50%; | |||
transform: translate(-50%); | |||
bottom: 60rpx; | |||
font-size: 32rpx; | |||
} | |||
</style> |
@@ -69,8 +69,8 @@ | |||
<view> 3.xxxxxxxx </view> | |||
<view> 4.xxxxxxxx </view> | |||
</view> --> | |||
<button class="submit" @click="toPage" v-show="!state.flag">卡签续期</button> | |||
<button class="submit" @click="toBack" v-show="state.flag">返回服务中心</button> | |||
<button class="submit" @click="toPage" v-if="!state.flag">卡签续期</button> | |||
<button class="submit" @click="toBack" v-else="state.flag">返回服务中心</button> | |||
<view class="mask" v-show="state.showPopup"> | |||
<view class="main"> | |||
<view class="top"> |
@@ -68,8 +68,8 @@ | |||
<view> 3.xxxxxxxx </view> | |||
<view> 4.xxxxxxxx </view> | |||
</view> --> | |||
<button class="submit" @click="toPage" v-show="!state.flag">{{orderInfos.cardStatus ==1?'卡签停用':'卡签启用'}}</button> | |||
<button class="submit" @click="toBack" v-show="state.flag">返回服务中心</button> | |||
<button class="submit" @click="toPage" v-if="!state.flag">{{orderInfos.cardStatus ==1?'卡签停用':'卡签启用'}}</button> | |||
<button class="submit" @click="toBack" v-else>返回服务中心</button> | |||
<view class="mask" v-show="state.showPopup"> | |||
<view class="main"> | |||
<view class="top"> |
@@ -62,8 +62,8 @@ | |||
</view> | |||
</view> | |||
</view> | |||
<button class="submit" @click="toPage" v-show="!state.flag" :disabled="state.disabled">设备升级</button> | |||
<button class="submit" @click="toBack" v-show="state.flag">返回服务中心</button> | |||
<button class="submit" @click="toPage" v-if="!state.flag" :disabled="state.disabled">设备升级</button> | |||
<button class="submit" @click="toBack" v-else>返回服务中心</button> | |||
<view class="mask" v-show="state.showPopup"> | |||
<view class="main"> | |||
@@ -275,7 +275,6 @@ | |||
//返回列表 | |||
const toBack = () => { | |||
// navTo("/pages/service/service") | |||
uni.navigateBack({ | |||
delta: 2 | |||
}) |
@@ -47,8 +47,8 @@ | |||
</view> | |||
</view> | |||
</view> | |||
<button class="submit" @click="toPage" v-show="!state.flag" :disabled="state.disabled">卡PIN码解锁</button> | |||
<button class="submit" @click="toBack" v-show="state.flag">返回服务中心</button> | |||
<button class="submit" @click="toPage" v-if="!state.flag" :disabled="state.disabled">卡PIN码解锁</button> | |||
<button class="submit" @click="toBack" v-else>返回服务中心</button> | |||
<view class="mask" v-show="state.showPopup"> | |||
<view class="main"> | |||
@@ -207,12 +207,12 @@ | |||
} else if (cosResponse == "9303") { | |||
tools.showModalAlert("此卡pin已永久锁定!请联系客服进行换卡处理!", function successFunc() {}); | |||
} else { | |||
console.log("卡执行指令结果",res) | |||
console.log("卡执行指令结果", res) | |||
let cosResponse = "" | |||
for(let i = 0; i < res.length; i++){ | |||
if(i < res.length - 1 ){ | |||
for (let i = 0; i < res.length; i++) { | |||
if (i < res.length - 1) { | |||
cosResponse += res[i] + "," | |||
}else{ | |||
} else { | |||
cosResponse += res[i] | |||
} | |||
} | |||
@@ -480,4 +480,4 @@ | |||
color: #333; | |||
} | |||
} | |||
</style> | |||
</style> |
@@ -3,7 +3,8 @@ | |||
<view class="content"> | |||
<text class="title">卡上余额(元)</text> | |||
<view class=""> | |||
<text style="font-size: 30rpx;">¥</text>{{state.hasData.cardBalance? state.hasData.cardBalance / 100:state.hasData.cardBalance}} | |||
<text | |||
style="font-size: 30rpx;">¥</text>{{state.hasData.cardBalance? state.hasData.cardBalance / 100:state.hasData.cardBalance}} | |||
</view> | |||
</view> | |||
<view class="from"> | |||
@@ -18,7 +19,7 @@ | |||
</u-radio-group> | |||
</view> | |||
<view v-if="flag"> | |||
<view class="from_item" > | |||
<view class="from_item"> | |||
<text>联系人姓名:</text> | |||
<input type="text" name="" id="" placeholder="请输入联系人姓名" v-model="state.hasData.customerName"> | |||
</view> | |||
@@ -31,24 +32,24 @@ | |||
</view> | |||
<view class="from_item" v-if="state.isShow"> | |||
<text>开户行支行:</text> | |||
<input type="number" placeholder="开户行支行" v-model="state.branchName"> | |||
<input placeholder="开户行支行" v-model="state.branchName"> | |||
</view> | |||
<view class="from_item" v-if="state.isShow"> | |||
<text>退费银行卡号:</text> | |||
<input type="number" placeholder="请输入银行卡号" v-model="state.bankCardId"> | |||
<input type="number" placeholder="请输入银行卡号" v-model="state.bankCardId"> | |||
</view> | |||
<view class="from_item" v-if="state.isShow"> | |||
<text>开户行地址:</text> | |||
<picker mode="region" @change="choiceAddress" > | |||
<picker mode="region" @change="choiceAddress"> | |||
<view>{{state.addressShow}}</view> | |||
</picker> | |||
</view> | |||
<u-form-item label="手机号" class="phoneBox" > | |||
<u-form-item label="手机号" class="phoneBox"> | |||
<u-input placeholder='请输入手机号' type="number" v-model="state.tel" /> | |||
<u-button type="success" size="mini" @click="getCode" v-if="waitTime==0">获取验证码</u-button> | |||
<text class="agreen" v-else>{{waitTime}}后重试</text> | |||
</u-form-item> | |||
<u-form-item label="验证码" > | |||
<u-form-item label="验证码"> | |||
<u-input placeholder='请输入验证码' type="number" v-model="state.newMobileCode" class="code" /> | |||
</u-form-item> | |||
<view class="from_item"> | |||
@@ -72,68 +73,68 @@ | |||
</u-radio-group> | |||
</view> | |||
</view> | |||
</view> | |||
<button class="submit" @click="sure()">确认退费</button> | |||
</view> | |||
</template> | |||
<script setup lang="ts"> | |||
import {ref,reactive} from "vue"; | |||
import { checkStr, msg } from "@/utils/utils"; | |||
import {navTo} from "@/utils/utils"; | |||
import {queryRefund,queryCardFreeExit,queryRefundApply,sendCode} from "@/utils/network/api.js"; | |||
import {onLoad} from "@dcloudio/uni-app"; | |||
import {request} from "@/utils/network/request.js"; | |||
import {stringToJson} from "@/utils/network/encryption"; | |||
import { ref, reactive } from "vue"; | |||
import { checkStr, msg } from "@/utils/utils"; | |||
import { navTo } from "@/utils/utils"; | |||
import { queryRefund, queryCardFreeExit, queryRefundApply, sendCode } from "@/utils/network/api.js"; | |||
import { onLoad } from "@dcloudio/uni-app"; | |||
import { request } from "@/utils/network/request.js"; | |||
import { stringToJson } from "@/utils/network/encryption"; | |||
// 单选数据列表 | |||
const radiolist1 = reactive([{ | |||
name: '卡退费', | |||
disabled: false | |||
}, | |||
{ | |||
name: '余额补领', | |||
disabled: false | |||
}, | |||
], ) | |||
name: '卡退费', | |||
disabled: false | |||
}, | |||
{ | |||
name: '余额补领', | |||
disabled: false | |||
}, | |||
]) | |||
const radiolist2 = reactive([{ | |||
name: '银行卡', | |||
disabled: false | |||
}, | |||
{ | |||
name: '现金', | |||
disabled: false | |||
}, | |||
], ) | |||
name: '银行卡', | |||
disabled: false | |||
}, | |||
{ | |||
name: '现金', | |||
disabled: false | |||
}, | |||
]) | |||
const radiolist3 = reactive([{ | |||
name: '个人', | |||
disabled: false | |||
}, | |||
{ | |||
name: '单位', | |||
disabled: false | |||
}, | |||
], ) | |||
name: '个人', | |||
disabled: false | |||
}, | |||
{ | |||
name: '单位', | |||
disabled: false | |||
}, | |||
]) | |||
const state = reactive({ | |||
name:'', | |||
phone:"", | |||
bank:"", | |||
vehicleId:"", //车牌号 | |||
hasData:{}, //通过车牌查出来的数据 | |||
address:"", //地址 | |||
addressShow:"请选择开户行地址", //展示的地址 | |||
tel:"", | |||
newMobileCode:"", | |||
bankType:"", //开户行 | |||
branchName:"", //开户行支行 | |||
refoundMethod:1, //退款方式 1:银行卡 2现金 | |||
array: ['贵阳银行股份有限公司', '中国工商银行股份有限公司', '中国建设银行股份有限公司', '中国银行股份有限公司','中国农业银行股份有限公司','中国交通银行股份有限公司', | |||
'兴业银行股份有限公司','平安银行股份有限公司','中国邮政储蓄银行股份有限公司','中国光大银行股份有限公司','贵州银行股份有限公司','中国民生银行股份有限公司', | |||
'招商银行股份有限公司','.农村信用社联合社','农村商业银行'], | |||
name: '', | |||
phone: "", | |||
bank: "", | |||
vehicleId: "", //车牌号 | |||
hasData: {}, //通过车牌查出来的数据 | |||
address: "", //地址 | |||
addressShow: "请选择开户行地址", //展示的地址 | |||
tel: "", | |||
newMobileCode: "", | |||
bankType: "", //开户行 | |||
branchName: "", //开户行支行 | |||
refoundMethod: 1, //退款方式 1:银行卡 2现金 | |||
array: ['贵阳银行股份有限公司', '中国工商银行股份有限公司', '中国建设银行股份有限公司', '中国银行股份有限公司', '中国农业银行股份有限公司', '中国交通银行股份有限公司', | |||
'兴业银行股份有限公司', '平安银行股份有限公司', '中国邮政储蓄银行股份有限公司', '中国光大银行股份有限公司', '贵州银行股份有限公司', '中国民生银行股份有限公司', | |||
'招商银行股份有限公司', '.农村信用社联合社', '农村商业银行'], | |||
index: -1, | |||
cusType:1, //用户类型 1-个人 2-单位 | |||
bankCardId:"", //银行卡号 | |||
isShow:true, //是否展示银行卡那些 | |||
cusType: 1, //用户类型 1-个人 2-单位 | |||
bankCardId: "", //银行卡号 | |||
isShow: true, //是否展示银行卡那些 | |||
}); | |||
// 单选默认数据 | |||
const radiovalue1 = ref('卡退费') | |||
@@ -159,17 +160,17 @@ | |||
console.log('radioChange', n); | |||
if (n == '银行卡') { | |||
refundType.value = true | |||
state.refoundMethod=1 | |||
state.isShow=true; | |||
state.refoundMethod = 1 | |||
state.isShow = true; | |||
console.log(refundType.value); | |||
} else { | |||
refundType.value = false | |||
state.refoundMethod=2 | |||
state.isShow=false; | |||
state.bankType=""; | |||
state.branchName=""; | |||
state.bankCardId=""; | |||
state.address=""; | |||
state.refoundMethod = 2 | |||
state.isShow = false; | |||
state.bankType = ""; | |||
state.branchName = ""; | |||
state.bankCardId = ""; | |||
state.address = ""; | |||
console.log(refundType.value); | |||
} | |||
} | |||
@@ -180,52 +181,52 @@ | |||
console.log('radioChange', n); | |||
if (n == '个人') { | |||
refundType3.value = true | |||
state.cusType=1 | |||
state.cusType = 1 | |||
console.log(refundType.value); | |||
} else { | |||
refundType3.value = false | |||
state.cusType=2 | |||
state.cusType = 2 | |||
console.log(refundType.value); | |||
} | |||
} | |||
/*视图进入后操作*/ | |||
onLoad((option) => { | |||
state.vehicleId = option.vehicleId | |||
queryRefundAction(); | |||
queryRefundAction(); | |||
}); | |||
const sure=()=>{ | |||
const sure = () => { | |||
// 卡退费 | |||
if(flag.value){ | |||
if (flag.value) { | |||
// 银行卡才需要做这些判断 | |||
if(refundType.value){ | |||
if(state.array[state.index]=='请选择'){ | |||
if (refundType.value) { | |||
if (state.array[state.index] == '请选择') { | |||
msg("请输入开户行!"); | |||
return; | |||
} | |||
if(!state.branchName){ | |||
if (!state.branchName) { | |||
msg("请输入开户行支行!"); | |||
return; | |||
} | |||
if(state.addressShow=="请选择开户行地址"){ | |||
if (state.addressShow == "请选择开户行地址") { | |||
msg("请选择开户行地址!"); | |||
return; | |||
} | |||
if(!state.bankCardId){ | |||
if (!state.bankCardId) { | |||
msg("请输入银行卡号!"); | |||
return; | |||
} | |||
} | |||
if (!checkStr(state.tel, "mobile")) { | |||
msg("请输入正确的手机号!"); | |||
return; | |||
msg("请输入正确的手机号!"); | |||
return; | |||
} | |||
if(!state.newMobileCode){ | |||
if (!state.newMobileCode) { | |||
msg("请输入验证码!"); | |||
return; | |||
} | |||
cardFree(); | |||
}else{ | |||
} else { | |||
// 余额退费 | |||
balanceReclaiming(); | |||
} | |||
@@ -241,18 +242,18 @@ | |||
method: "POST", | |||
showLoading: true, | |||
}; | |||
request(queryRefund, options).then((res) => { | |||
const data = stringToJson(res.bizContent); | |||
console.log("data",data) | |||
// 有无数据卡数据 | |||
if(data.hasData){ | |||
state.hasData=data.data[0] | |||
} | |||
const data = stringToJson(res.bizContent); | |||
console.log("data", data) | |||
// 有无数据卡数据 | |||
if (data.hasData) { | |||
state.hasData = data.data[0] | |||
} | |||
}); | |||
} | |||
// 卡退费 | |||
const cardFree=()=>{ | |||
const cardFree = () => { | |||
var data = { | |||
orderId: state.hasData.orderId, //退费信息编号 | |||
bankType: state.bankType, //开户行 | |||
@@ -272,19 +273,18 @@ | |||
method: "POST", | |||
showLoading: true, | |||
}; | |||
console.log("options",options) | |||
console.log("options", options) | |||
request(queryCardFreeExit, options).then((res) => { | |||
const data = stringToJson(res.bizContent); | |||
console.log("data",data) | |||
navTo(`/subpackage/after-sale/refundPage-result`) | |||
const data = stringToJson(res.bizContent); | |||
console.log("data", data) | |||
navTo(`/subpackage/after-sale/refundPage-result`) | |||
}); | |||
} | |||
// 余额补领 | |||
const balanceReclaiming=()=>{ | |||
const balanceReclaiming = () => { | |||
var data = { | |||
orderId: state.hasData.orderId, //退费信息编号 | |||
// orderId: "2a0cc6aca04548a7ac42ee1606eac4f8", //退费信息编号 | |||
}; | |||
const options = { | |||
type: 2, | |||
@@ -292,17 +292,17 @@ | |||
method: "POST", | |||
showLoading: true, | |||
}; | |||
request(queryRefundApply, options).then((res) => { | |||
const data = stringToJson(res.bizContent); | |||
console.log("data",data) | |||
navTo(`/subpackage/after-sale/refundPage-result`) | |||
const data = stringToJson(res.bizContent); | |||
console.log("data", data) | |||
navTo(`/subpackage/after-sale/refundPage-result`) | |||
}); | |||
} | |||
function choiceAddress(e){ | |||
console.log("e",e.detail.value) | |||
state.address=e.detail.value; | |||
state.addressShow=state.address[0]+"-"+state.address[1]+"-"+state.address[2] | |||
function choiceAddress(e) { | |||
console.log("e", e.detail.value) | |||
state.address = e.detail.value; | |||
state.addressShow = state.address[0] + "-" + state.address[1] + "-" + state.address[2] | |||
} | |||
const getCode = () => { | |||
console.log(123); | |||
@@ -315,7 +315,7 @@ | |||
icon: 'none' | |||
}); | |||
} | |||
} | |||
// 发送验证码 | |||
const sendCodeApi = (type) => { | |||
@@ -328,7 +328,7 @@ | |||
method: "POST", //提交方式(默认POST) | |||
showLoading: true, //是否显示加载中(默认显示) | |||
}; | |||
//调用方式 | |||
request(sendCode, options) | |||
.then((res) => { | |||
@@ -353,7 +353,7 @@ | |||
waitTime.value -= 1 | |||
}, 1000) | |||
} | |||
function bindPickerChange(e){ | |||
function bindPickerChange(e) { | |||
state.index = e.detail.value | |||
} | |||
</script> | |||
@@ -369,23 +369,24 @@ | |||
} | |||
</style> | |||
<style lang="scss" scoped> | |||
::v-deep .u-icon__icon{ | |||
::v-deep .u-icon__icon { | |||
top: -4px !important; | |||
} | |||
.oderPage { | |||
flex: 1; | |||
width: 100%; | |||
.content { | |||
display: flex; | |||
flex-direction: column; | |||
/* justify-content: center; */ | |||
align-items: center; | |||
width: 750rpx; | |||
// height: 266rpx; | |||
background-color: #fff; | |||
margin-bottom: 30rpx; | |||
padding: 75rpx 0; | |||
display: flex; | |||
flex-direction: column; | |||
/* justify-content: center; */ | |||
align-items: center; | |||
width: 750rpx; | |||
// height: 266rpx; | |||
background-color: #fff; | |||
margin-bottom: 30rpx; | |||
padding: 75rpx 0; | |||
.title { | |||
font-size: 28rpx; | |||
@@ -442,25 +443,30 @@ | |||
// transform: translate(-50%); | |||
margin: 30rpx auto; | |||
} | |||
::v-deep .u-form-item--right__content__slot { | |||
display: flex; | |||
justify-content: space-between; | |||
justify-content: space-between; | |||
.btn { | |||
flex: 1; | |||
background: transparent; | |||
font-size: 30rpx; | |||
color: #15E5C1; | |||
z-index: 999; | |||
} | |||
} | |||
.agreen{ | |||
.agreen { | |||
color: rgb(25, 190, 197); | |||
} | |||
::v-deep .code>view{ | |||
::v-deep .code>view { | |||
text-align: right !important; | |||
} | |||
::v-deep .code{ | |||
::v-deep .code { | |||
width: 100% !important; | |||
} | |||
</style> | |||
</style> |
@@ -168,7 +168,7 @@ export function request(code, options = {}, start = false) { | |||
} else { | |||
let content = s4.decryptData_CBC(res, sm4Key) | |||
console.log('请求成功返回参数:', code, content) | |||
console.log('请求成功返回参数:', code, content, res) | |||
resolve(content.data) | |||
} | |||
} |
@@ -28,7 +28,8 @@ export function HighAddZero(str, nLen) { | |||
} | |||
export function AsciToHexString(strAsci, nLen) { | |||
let s = String(strAsci); | |||
let encoder = new TextEncoder("UTF-8"); | |||
// let encoder = new TextEncoder("UTF-8"); | |||
let encoder = new TextEncoder("GBK"); | |||
let bytes = encoder.encode(s); | |||
let strResult = HexToString(bytes); | |||
let strLen = strResult.length; | |||
@@ -44,7 +45,7 @@ export function AsciToHexString(strAsci, nLen) { | |||
} | |||
const DIGITS_UPPER = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', | |||
'E', 'F' | |||
'E', 'F' | |||
]; | |||
export function HexToString(inHex) { | |||
let i; | |||
@@ -62,28 +63,28 @@ export function HexToString(inHex) { | |||
* @param {string} data | |||
* @returns {string} | |||
*/ | |||
export function HexToStrig(data,charType=1) { | |||
let str = data.substring(data.length - 2); | |||
while (str === "00") { | |||
data = data.substring(0, data.length - 2); | |||
if (data.length === 0) { | |||
return ""; | |||
} | |||
str = data.substring(data.length - 2); | |||
} | |||
const asd = hexStringToByteArray(data); | |||
try { | |||
if(charType ==1){ | |||
str = new TextDecoder("GBK").decode(asd); | |||
}else{ | |||
str = new TextDecoder("UTF-8").decode(asd); | |||
} | |||
} catch (e) { | |||
console.error(e); | |||
} | |||
return str; | |||
export function HexToStrig(data, charType = 1) { | |||
let str = data.substring(data.length - 2); | |||
while (str === "00") { | |||
data = data.substring(0, data.length - 2); | |||
if (data.length === 0) { | |||
return ""; | |||
} | |||
str = data.substring(data.length - 2); | |||
} | |||
const asd = hexStringToByteArray(data); | |||
try { | |||
str = new TextDecoder("GBK").decode(asd); | |||
// if(charType ==1){ | |||
// }else{ | |||
// str = new TextDecoder("UTF-8").decode(asd); | |||
// } | |||
} catch (e) { | |||
console.error(e); | |||
} | |||
return str; | |||
} | |||
/** | |||
@@ -93,14 +94,14 @@ export function HexToStrig(data,charType=1) { | |||
* @returns {Uint8Array} | |||
*/ | |||
export function hexStringToByteArray(str) { | |||
if (!str) { | |||
return new Uint8Array(); | |||
} | |||
const result = new Uint8Array(str.length / 2); | |||
for (let i = 0; i < str.length; i += 2) { | |||
result[i / 2] = parseInt(str.substr(i, 2), 16); | |||
} | |||
return result; | |||
if (!str) { | |||
return new Uint8Array(); | |||
} | |||
const result = new Uint8Array(str.length / 2); | |||
for (let i = 0; i < str.length; i += 2) { | |||
result[i / 2] = parseInt(str.substr(i, 2), 16); | |||
} | |||
return result; | |||
} | |||
/** | |||
@@ -110,38 +111,38 @@ export function hexStringToByteArray(str) { | |||
* @returns {string} | |||
*/ | |||
export function HexToInt(data) { | |||
let num = -1; | |||
try { | |||
num = parseInt(data, 16); | |||
} catch (e) { | |||
console.error(e); | |||
} | |||
return num.toString(); | |||
let num = -1; | |||
try { | |||
num = parseInt(data, 16); | |||
} catch (e) { | |||
console.error(e); | |||
} | |||
return num.toString(); | |||
} | |||
function guessEncoding(bytes) { | |||
// 检查字节序列是否以 BOM(字节顺序标记)开头 | |||
if (bytes[0] === 0xEF && bytes[1] === 0xBB && bytes[2] === 0xBF) { | |||
return 'UTF-8'; | |||
} else if (bytes[0] === 0xFE && bytes[1] === 0xFF) { | |||
return 'UTF-16BE'; | |||
} else if (bytes[0] === 0xFF && bytes[1] === 0xFE) { | |||
return 'UTF-16LE'; | |||
} else { | |||
// 统计每个字节的频率 | |||
let freq = {}; | |||
for (let i = 0; i < bytes.length; i++) { | |||
let b = bytes[i]; | |||
freq[b] = freq[b] ? freq[b] + 1 : 1; | |||
} | |||
// 检查字节序列是否以 BOM(字节顺序标记)开头 | |||
if (bytes[0] === 0xEF && bytes[1] === 0xBB && bytes[2] === 0xBF) { | |||
return 'UTF-8'; | |||
} else if (bytes[0] === 0xFE && bytes[1] === 0xFF) { | |||
return 'UTF-16BE'; | |||
} else if (bytes[0] === 0xFF && bytes[1] === 0xFE) { | |||
return 'UTF-16LE'; | |||
} else { | |||
// 统计每个字节的频率 | |||
let freq = {}; | |||
for (let i = 0; i < bytes.length; i++) { | |||
let b = bytes[i]; | |||
freq[b] = freq[b] ? freq[b] + 1 : 1; | |||
} | |||
// 检查是否存在 GBK 的特定字节序列 | |||
if (freq[0x81] && freq[0x81] > 0 && freq[0x40] && freq[0x40] > 0) { | |||
return 'GBK'; | |||
} | |||
// 检查是否存在 GBK 的特定字节序列 | |||
if (freq[0x81] && freq[0x81] > 0 && freq[0x40] && freq[0x40] > 0) { | |||
return 'GBK'; | |||
} | |||
// 如果没有特定的 GBK 字节序列,则假设为 UTF-8 | |||
return 'UTF-8'; | |||
} | |||
// 如果没有特定的 GBK 字节序列,则假设为 UTF-8 | |||
return 'UTF-8'; | |||
} | |||
} |