import { hasLogin, msg, timesDiff } from "@/utils/utils"; | import { hasLogin, msg, timesDiff } from "@/utils/utils"; | ||||
import { orderList } from "@/utils/network/api"; | import { orderList } from "@/utils/network/api"; | ||||
import { PageData } from "@/datas/enum"; | import { PageData } from "@/datas/enum"; | ||||
const tools = require("../../static/etcUtil/tools.js"); | |||||
export default function useOrderListItem(props) { | export default function useOrderListItem(props) { | ||||
//搜索关键字 | //搜索关键字 | ||||
const searchKeyWords = ref(''); | const searchKeyWords = ref(''); | ||||
msg('请输入需要搜索的车牌号!'); | msg('请输入需要搜索的车牌号!'); | ||||
return; | return; | ||||
} | } | ||||
refreshList(true); | |||||
// #endif | // #endif | ||||
// #ifdef MP-ALIPAY | |||||
tools.showLoadingAlert("加载中"); | |||||
refreshList(true); | refreshList(true); | ||||
tools.hideLoadingAlert(); | |||||
// #endif | |||||
} | } | ||||
//订单车牌号输入 | //订单车牌号输入 |
* 打开蓝牙 | * 打开蓝牙 | ||||
*/ | */ | ||||
const openBluetooth = () => { | const openBluetooth = () => { | ||||
tools.hideLoadingAlert(); | |||||
let foundDevices = []; //扫描到的蓝牙列表 | let foundDevices = []; //扫描到的蓝牙列表 | ||||
uni.closeBluetoothAdapter(); //先关闭蓝牙 | uni.closeBluetoothAdapter(); //先关闭蓝牙 | ||||
} else { | } else { | ||||
return; | return; | ||||
} | } | ||||
} | } | ||||
/** | /** |
if ((endTime - beginTime) >= 3000) { | if ((endTime - beginTime) >= 3000) { | ||||
mIsInitCmdSend = false; | mIsInitCmdSend = false; | ||||
m_isConn = false; | m_isConn = false; | ||||
console.log('00000000'); | |||||
callback_2(makeRes(-1, [], '蓝牙已断开')) | callback_2(makeRes(-1, [], '蓝牙已断开')) | ||||
} | } | ||||
} | } | ||||
console.log('******解析后的指令数据为' + mReturnedRawCmdData) | console.log('******解析后的指令数据为' + mReturnedRawCmdData) | ||||
if (receiveDataCallBack) { | if (receiveDataCallBack) { | ||||
receiveDataCallBack(makeRes(errorcode, mReturnedRawCmdData, errorcode == 0 ? '收到数据成功' : '数据透传失败')) | receiveDataCallBack(makeRes(errorcode, mReturnedRawCmdData, errorcode == 0 ? '收到数据成功' : '数据透传失败')) | ||||
receiveDataCallBack = null | |||||
} | } | ||||
mUnpacketDataCache = [] | mUnpacketDataCache = [] | ||||
} | } | ||||
let totalDataLen = etcProtoData.length; | let totalDataLen = etcProtoData.length; | ||||
let blockSize = maxLenPerPacket; | let blockSize = maxLenPerPacket; | ||||
let offset = 0 | let offset = 0 | ||||
//if (blockSize == undefined) | |||||
if(!blockSize) | |||||
{ | |||||
if (blockSize == undefined) { | |||||
blockSize = 100 | blockSize = 100 | ||||
} | } | ||||
for (; offset < (totalDataLen - blockSize); offset += blockSize) { | for (; offset < (totalDataLen - blockSize); offset += blockSize) { | ||||
_pack.packNumOffset = PackNumOffset; | _pack.packNumOffset = PackNumOffset; | ||||
sendBuff.push.apply(sendBuff, pSendBuf.slice(offset, offset + blockSize)) | sendBuff.push.apply(sendBuff, pSendBuf.slice(offset, offset + blockSize)) | ||||
let sendBuffDataLen = sendBuff.length ; | |||||
if (sendBuffDataLen == 0) | |||||
return ; | |||||
hr = makeSingleEtcProtocolPaket(sendBuff, _pack) | hr = makeSingleEtcProtocolPaket(sendBuff, _pack) | ||||
if (hr != 0) { | if (hr != 0) { | ||||
return hr; | return hr; | ||||
return hexArr; | 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() { | function makeHandShakeStep1WithETC() { | ||||
let cBuff = [] | let cBuff = [] |
console.log('指令执行内容', cmdArr, type) | console.log('指令执行内容', cmdArr, type) | ||||
switch (connectPrefixName) { | switch (connectPrefixName) { | ||||
case "WJ": | case "WJ": | ||||
console.log('WJ执行内容====', cmdArr, type) | |||||
wjApi.transCmd(cmdArr, type, function(res) { | wjApi.transCmd(cmdArr, type, function(res) { | ||||
console.log('WJ执行内容====11111', res) | |||||
if (res.code == 0) { | if (res.code == 0) { | ||||
func(res.data); | func(res.data); | ||||
} else { | } else { | ||||
}); | }); | ||||
break; | break; | ||||
case "JL": | case "JL": | ||||
console.log('JL执行内容====', cmdArr, type) | |||||
jlApi.transCmd(cmdArr, type, function(res) { | jlApi.transCmd(cmdArr, type, function(res) { | ||||
console.log('JL执行内容====11111', res) | |||||
if (res.code == 0) { | if (res.code == 0) { | ||||
func(res.data); | func(res.data); | ||||
} else { | } else { | ||||
}); | }); | ||||
break; | break; | ||||
case "TD": | case "TD": | ||||
console.log('TD执行内容====', cmdArr, type) | |||||
tdApi.transCmd(cmdArr, type, function(res) { | tdApi.transCmd(cmdArr, type, function(res) { | ||||
console.log('TD执行内容====', cmdArr, type) | |||||
if (res.code == 0) { | if (res.code == 0) { | ||||
func(res.data); | func(res.data); | ||||
} else { | } else { |
/********************** showModalAlert ************************/ | /********************** showModalAlert ************************/ | ||||
function showModalAlert(content, successFunc = null, failFunc = null, title = '温馨提示', showCancel = false) { | 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********************/ | /*******************showToastAlert********************/ | ||||
left: 0; | left: 0; | ||||
background: white; | background: white; | ||||
box-sizing: border-box; | box-sizing: border-box; | ||||
width: 100%; | |||||
} | } | ||||
.content { | .content { |
<template> | <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> | </template> | ||||
<script setup lang="ts"> | <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> | </script> | ||||
<style> | <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> | ||||
<style lang="scss" scoped> | <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> |
<view> 3.xxxxxxxx </view> | <view> 3.xxxxxxxx </view> | ||||
<view> 4.xxxxxxxx </view> | <view> 4.xxxxxxxx </view> | ||||
</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="mask" v-show="state.showPopup"> | ||||
<view class="main"> | <view class="main"> | ||||
<view class="top"> | <view class="top"> |
<view> 3.xxxxxxxx </view> | <view> 3.xxxxxxxx </view> | ||||
<view> 4.xxxxxxxx </view> | <view> 4.xxxxxxxx </view> | ||||
</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="mask" v-show="state.showPopup"> | ||||
<view class="main"> | <view class="main"> | ||||
<view class="top"> | <view class="top"> |
</view> | </view> | ||||
</view> | </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="mask" v-show="state.showPopup"> | ||||
<view class="main"> | <view class="main"> | ||||
//返回列表 | //返回列表 | ||||
const toBack = () => { | const toBack = () => { | ||||
// navTo("/pages/service/service") | |||||
uni.navigateBack({ | uni.navigateBack({ | ||||
delta: 2 | delta: 2 | ||||
}) | }) |
</view> | </view> | ||||
</view> | </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="mask" v-show="state.showPopup"> | ||||
<view class="main"> | <view class="main"> | ||||
} else if (cosResponse == "9303") { | } else if (cosResponse == "9303") { | ||||
tools.showModalAlert("此卡pin已永久锁定!请联系客服进行换卡处理!", function successFunc() {}); | tools.showModalAlert("此卡pin已永久锁定!请联系客服进行换卡处理!", function successFunc() {}); | ||||
} else { | } else { | ||||
console.log("卡执行指令结果",res) | |||||
console.log("卡执行指令结果", res) | |||||
let cosResponse = "" | 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] + "," | cosResponse += res[i] + "," | ||||
}else{ | |||||
} else { | |||||
cosResponse += res[i] | cosResponse += res[i] | ||||
} | } | ||||
} | } | ||||
color: #333; | color: #333; | ||||
} | } | ||||
} | } | ||||
</style> | |||||
</style> |
<view class="content"> | <view class="content"> | ||||
<text class="title">卡上余额(元)</text> | <text class="title">卡上余额(元)</text> | ||||
<view class=""> | <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> | </view> | ||||
<view class="from"> | <view class="from"> | ||||
</u-radio-group> | </u-radio-group> | ||||
</view> | </view> | ||||
<view v-if="flag"> | <view v-if="flag"> | ||||
<view class="from_item" > | |||||
<view class="from_item"> | |||||
<text>联系人姓名:</text> | <text>联系人姓名:</text> | ||||
<input type="text" name="" id="" placeholder="请输入联系人姓名" v-model="state.hasData.customerName"> | <input type="text" name="" id="" placeholder="请输入联系人姓名" v-model="state.hasData.customerName"> | ||||
</view> | </view> | ||||
</view> | </view> | ||||
<view class="from_item" v-if="state.isShow"> | <view class="from_item" v-if="state.isShow"> | ||||
<text>开户行支行:</text> | <text>开户行支行:</text> | ||||
<input type="number" placeholder="开户行支行" v-model="state.branchName"> | |||||
<input placeholder="开户行支行" v-model="state.branchName"> | |||||
</view> | </view> | ||||
<view class="from_item" v-if="state.isShow"> | <view class="from_item" v-if="state.isShow"> | ||||
<text>退费银行卡号:</text> | <text>退费银行卡号:</text> | ||||
<input type="number" placeholder="请输入银行卡号" v-model="state.bankCardId"> | |||||
<input type="number" placeholder="请输入银行卡号" v-model="state.bankCardId"> | |||||
</view> | </view> | ||||
<view class="from_item" v-if="state.isShow"> | <view class="from_item" v-if="state.isShow"> | ||||
<text>开户行地址:</text> | <text>开户行地址:</text> | ||||
<picker mode="region" @change="choiceAddress" > | |||||
<picker mode="region" @change="choiceAddress"> | |||||
<view>{{state.addressShow}}</view> | <view>{{state.addressShow}}</view> | ||||
</picker> | </picker> | ||||
</view> | </view> | ||||
<u-form-item label="手机号" class="phoneBox" > | |||||
<u-form-item label="手机号" class="phoneBox"> | |||||
<u-input placeholder='请输入手机号' type="number" v-model="state.tel" /> | <u-input placeholder='请输入手机号' type="number" v-model="state.tel" /> | ||||
<u-button type="success" size="mini" @click="getCode" v-if="waitTime==0">获取验证码</u-button> | <u-button type="success" size="mini" @click="getCode" v-if="waitTime==0">获取验证码</u-button> | ||||
<text class="agreen" v-else>{{waitTime}}后重试</text> | <text class="agreen" v-else>{{waitTime}}后重试</text> | ||||
</u-form-item> | </u-form-item> | ||||
<u-form-item label="验证码" > | |||||
<u-form-item label="验证码"> | |||||
<u-input placeholder='请输入验证码' type="number" v-model="state.newMobileCode" class="code" /> | <u-input placeholder='请输入验证码' type="number" v-model="state.newMobileCode" class="code" /> | ||||
</u-form-item> | </u-form-item> | ||||
<view class="from_item"> | <view class="from_item"> | ||||
</u-radio-group> | </u-radio-group> | ||||
</view> | </view> | ||||
</view> | </view> | ||||
</view> | </view> | ||||
<button class="submit" @click="sure()">确认退费</button> | <button class="submit" @click="sure()">确认退费</button> | ||||
</view> | </view> | ||||
</template> | </template> | ||||
<script setup lang="ts"> | <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([{ | const radiolist1 = reactive([{ | ||||
name: '卡退费', | |||||
disabled: false | |||||
}, | |||||
{ | |||||
name: '余额补领', | |||||
disabled: false | |||||
}, | |||||
], ) | |||||
name: '卡退费', | |||||
disabled: false | |||||
}, | |||||
{ | |||||
name: '余额补领', | |||||
disabled: false | |||||
}, | |||||
]) | |||||
const radiolist2 = reactive([{ | const radiolist2 = reactive([{ | ||||
name: '银行卡', | |||||
disabled: false | |||||
}, | |||||
{ | |||||
name: '现金', | |||||
disabled: false | |||||
}, | |||||
], ) | |||||
name: '银行卡', | |||||
disabled: false | |||||
}, | |||||
{ | |||||
name: '现金', | |||||
disabled: false | |||||
}, | |||||
]) | |||||
const radiolist3 = reactive([{ | const radiolist3 = reactive([{ | ||||
name: '个人', | |||||
disabled: false | |||||
}, | |||||
{ | |||||
name: '单位', | |||||
disabled: false | |||||
}, | |||||
], ) | |||||
name: '个人', | |||||
disabled: false | |||||
}, | |||||
{ | |||||
name: '单位', | |||||
disabled: false | |||||
}, | |||||
]) | |||||
const state = reactive({ | 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, | index: -1, | ||||
cusType:1, //用户类型 1-个人 2-单位 | |||||
bankCardId:"", //银行卡号 | |||||
isShow:true, //是否展示银行卡那些 | |||||
cusType: 1, //用户类型 1-个人 2-单位 | |||||
bankCardId: "", //银行卡号 | |||||
isShow: true, //是否展示银行卡那些 | |||||
}); | }); | ||||
// 单选默认数据 | // 单选默认数据 | ||||
const radiovalue1 = ref('卡退费') | const radiovalue1 = ref('卡退费') | ||||
console.log('radioChange', n); | console.log('radioChange', n); | ||||
if (n == '银行卡') { | if (n == '银行卡') { | ||||
refundType.value = true | refundType.value = true | ||||
state.refoundMethod=1 | |||||
state.isShow=true; | |||||
state.refoundMethod = 1 | |||||
state.isShow = true; | |||||
console.log(refundType.value); | console.log(refundType.value); | ||||
} else { | } else { | ||||
refundType.value = false | 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); | console.log(refundType.value); | ||||
} | } | ||||
} | } | ||||
console.log('radioChange', n); | console.log('radioChange', n); | ||||
if (n == '个人') { | if (n == '个人') { | ||||
refundType3.value = true | refundType3.value = true | ||||
state.cusType=1 | |||||
state.cusType = 1 | |||||
console.log(refundType.value); | console.log(refundType.value); | ||||
} else { | } else { | ||||
refundType3.value = false | refundType3.value = false | ||||
state.cusType=2 | |||||
state.cusType = 2 | |||||
console.log(refundType.value); | console.log(refundType.value); | ||||
} | } | ||||
} | } | ||||
/*视图进入后操作*/ | /*视图进入后操作*/ | ||||
onLoad((option) => { | onLoad((option) => { | ||||
state.vehicleId = option.vehicleId | 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("请输入开户行!"); | msg("请输入开户行!"); | ||||
return; | return; | ||||
} | } | ||||
if(!state.branchName){ | |||||
if (!state.branchName) { | |||||
msg("请输入开户行支行!"); | msg("请输入开户行支行!"); | ||||
return; | return; | ||||
} | } | ||||
if(state.addressShow=="请选择开户行地址"){ | |||||
if (state.addressShow == "请选择开户行地址") { | |||||
msg("请选择开户行地址!"); | msg("请选择开户行地址!"); | ||||
return; | return; | ||||
} | } | ||||
if(!state.bankCardId){ | |||||
if (!state.bankCardId) { | |||||
msg("请输入银行卡号!"); | msg("请输入银行卡号!"); | ||||
return; | return; | ||||
} | } | ||||
} | } | ||||
if (!checkStr(state.tel, "mobile")) { | if (!checkStr(state.tel, "mobile")) { | ||||
msg("请输入正确的手机号!"); | |||||
return; | |||||
msg("请输入正确的手机号!"); | |||||
return; | |||||
} | } | ||||
if(!state.newMobileCode){ | |||||
if (!state.newMobileCode) { | |||||
msg("请输入验证码!"); | msg("请输入验证码!"); | ||||
return; | return; | ||||
} | } | ||||
cardFree(); | cardFree(); | ||||
}else{ | |||||
} else { | |||||
// 余额退费 | // 余额退费 | ||||
balanceReclaiming(); | balanceReclaiming(); | ||||
} | } | ||||
method: "POST", | method: "POST", | ||||
showLoading: true, | showLoading: true, | ||||
}; | }; | ||||
request(queryRefund, options).then((res) => { | 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 = { | var data = { | ||||
orderId: state.hasData.orderId, //退费信息编号 | orderId: state.hasData.orderId, //退费信息编号 | ||||
bankType: state.bankType, //开户行 | bankType: state.bankType, //开户行 | ||||
method: "POST", | method: "POST", | ||||
showLoading: true, | showLoading: true, | ||||
}; | }; | ||||
console.log("options",options) | |||||
console.log("options", options) | |||||
request(queryCardFreeExit, options).then((res) => { | 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 = { | var data = { | ||||
orderId: state.hasData.orderId, //退费信息编号 | orderId: state.hasData.orderId, //退费信息编号 | ||||
// orderId: "2a0cc6aca04548a7ac42ee1606eac4f8", //退费信息编号 | |||||
}; | }; | ||||
const options = { | const options = { | ||||
type: 2, | type: 2, | ||||
method: "POST", | method: "POST", | ||||
showLoading: true, | showLoading: true, | ||||
}; | }; | ||||
request(queryRefundApply, options).then((res) => { | 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 = () => { | const getCode = () => { | ||||
console.log(123); | console.log(123); | ||||
icon: 'none' | icon: 'none' | ||||
}); | }); | ||||
} | } | ||||
} | } | ||||
// 发送验证码 | // 发送验证码 | ||||
const sendCodeApi = (type) => { | const sendCodeApi = (type) => { | ||||
method: "POST", //提交方式(默认POST) | method: "POST", //提交方式(默认POST) | ||||
showLoading: true, //是否显示加载中(默认显示) | showLoading: true, //是否显示加载中(默认显示) | ||||
}; | }; | ||||
//调用方式 | //调用方式 | ||||
request(sendCode, options) | request(sendCode, options) | ||||
.then((res) => { | .then((res) => { | ||||
waitTime.value -= 1 | waitTime.value -= 1 | ||||
}, 1000) | }, 1000) | ||||
} | } | ||||
function bindPickerChange(e){ | |||||
function bindPickerChange(e) { | |||||
state.index = e.detail.value | state.index = e.detail.value | ||||
} | } | ||||
</script> | </script> | ||||
} | } | ||||
</style> | </style> | ||||
<style lang="scss" scoped> | <style lang="scss" scoped> | ||||
::v-deep .u-icon__icon{ | |||||
::v-deep .u-icon__icon { | |||||
top: -4px !important; | top: -4px !important; | ||||
} | } | ||||
.oderPage { | .oderPage { | ||||
flex: 1; | flex: 1; | ||||
width: 100%; | width: 100%; | ||||
.content { | .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 { | .title { | ||||
font-size: 28rpx; | font-size: 28rpx; | ||||
// transform: translate(-50%); | // transform: translate(-50%); | ||||
margin: 30rpx auto; | margin: 30rpx auto; | ||||
} | } | ||||
::v-deep .u-form-item--right__content__slot { | ::v-deep .u-form-item--right__content__slot { | ||||
display: flex; | display: flex; | ||||
justify-content: space-between; | |||||
justify-content: space-between; | |||||
.btn { | .btn { | ||||
flex: 1; | flex: 1; | ||||
background: transparent; | background: transparent; | ||||
font-size: 30rpx; | font-size: 30rpx; | ||||
color: #15E5C1; | color: #15E5C1; | ||||
z-index: 999; | z-index: 999; | ||||
} | } | ||||
} | } | ||||
.agreen{ | |||||
.agreen { | |||||
color: rgb(25, 190, 197); | color: rgb(25, 190, 197); | ||||
} | } | ||||
::v-deep .code>view{ | |||||
::v-deep .code>view { | |||||
text-align: right !important; | text-align: right !important; | ||||
} | } | ||||
::v-deep .code{ | |||||
::v-deep .code { | |||||
width: 100% !important; | width: 100% !important; | ||||
} | } | ||||
</style> | |||||
</style> |
} else { | } else { | ||||
let content = s4.decryptData_CBC(res, sm4Key) | let content = s4.decryptData_CBC(res, sm4Key) | ||||
console.log('请求成功返回参数:', code, content) | |||||
console.log('请求成功返回参数:', code, content, res) | |||||
resolve(content.data) | resolve(content.data) | ||||
} | } | ||||
} | } |
} | } | ||||
export function AsciToHexString(strAsci, nLen) { | export function AsciToHexString(strAsci, nLen) { | ||||
let s = String(strAsci); | 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 bytes = encoder.encode(s); | ||||
let strResult = HexToString(bytes); | let strResult = HexToString(bytes); | ||||
let strLen = strResult.length; | let strLen = strResult.length; | ||||
} | } | ||||
const DIGITS_UPPER = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', | 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) { | export function HexToString(inHex) { | ||||
let i; | let i; | ||||
* @param {string} data | * @param {string} data | ||||
* @returns {string} | * @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; | |||||
} | } | ||||
/** | /** | ||||
* @returns {Uint8Array} | * @returns {Uint8Array} | ||||
*/ | */ | ||||
export function hexStringToByteArray(str) { | 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; | |||||
} | } | ||||
/** | /** | ||||
* @returns {string} | * @returns {string} | ||||
*/ | */ | ||||
export function HexToInt(data) { | 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) { | 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'; | |||||
} | |||||
} | } |