Kaynağa Gözat

修改选择权益产品

yxb
DESKTOP-2IO5MST\huting 1 yıl önce
ebeveyn
işleme
8304b796d7

+ 4
- 4
datas/enum.ts Dosyayı Görüntüle

@@ -1,8 +1,8 @@
//分页数据
export enum PageData {
NUM = 1, //页码 从第几页开始
SIZE = 10, //每页加载数
NO_MORE_SIZE = 2, //如果列表已无数据,可设置列表的总数量要大于等于2条才显示无更多数据
NUM = 1, //页码 从第几页开始
SIZE = 10, //每页加载数
NO_MORE_SIZE = 2, //如果列表已无数据,可设置列表的总数量要大于等于2条才显示无更多数据
}

//订单状态
@@ -50,7 +50,7 @@ export enum OrderTypes {
'EXCHANGE_CARD_TYPE' = '储值卡转记账卡',
'REPLACEMENT_CARD' = '更换卡',
'REPLACEMENT_SIGNATURE' = '更换签',
'SUPPLEMENT_OBU' = '增补OBU',
'SUPPLEMENT_OBU' = '增补OBU',
'OFFICAL_SUPPLEMENT_OBU' = '公务车增补OBU',
'同时换卡换签' = '暂无同时换卡换签枚举',
'ETC注销' = '暂无ETC注销枚举',

+ 1
- 1
pages/index/index.vue Dosyayı Görüntüle

@@ -282,7 +282,7 @@
easing: "easeInOutCubic"
})
const state = reactive({
type: 0, //0客车 1货车
type: 0, //1客车 2货车
userType: 1, //1个人 2单位
notice: "",
swiperList: [],

+ 113
- 116
subpackage/orders/cancel-order.vue Dosyayı Görüntüle

@@ -1,129 +1,126 @@
<!-- 取消订单 -->
<template>
<view class="form">
<form-builder
:formData="state.formData"
:config="config"
@submit="doCancelOrder"
/>
</view>
<view class="form">
<form-builder :formData="state.formData" :config="config" @submit="doCancelOrder" />
</view>
</template>

<script setup lang="ts">
import { reactive } from "vue";
import { onLoad } from "@dcloudio/uni-app";
import { request } from "@/utils/network/request.js";
import { msg, confirm, getOrderStatusName } from "@/utils/utils";
import { cancelOrder,cancelOrderNew } from "@/utils/network/api";
import { getItem, StorageKeys } from "@/utils/storage";
import { reactive } from "vue";
import { onLoad } from "@dcloudio/uni-app";
import { request } from "@/utils/network/request.js";
import { msg, confirm, getOrderStatusName } from "@/utils/utils";
import { cancelOrder, cancelOrderNew } from "@/utils/network/api";
import { getItem, StorageKeys } from "@/utils/storage";

const config = {
submitName: "取消订单", //按钮名称(默认提交)
titleWidth: 160, //标题最小宽度
};
const config = {
submitName: "取消订单", //按钮名称(默认提交)
titleWidth: 160, //标题最小宽度
};

const state = reactive({
orderInfo: {} as any, //订单数据
formData: [
{
title: "订单编号",
inputType: "number",
type: 2,
value: "orderNumber",
bg: true,
hint: "订单编号",
disabled: true,
},
{
title: "订单车牌号",
type: 2,
value: "carNumber",
bg: true,
hint: "订单车牌号",
disabled: true,
},
{
title: "订单状态",
type: 2,
value: "orderStatus",
bg: true,
hint: "订单状态",
disabled: true,
},
{
title: "请输入取消原因",
required: true,
type: 5,
vertical: 2,
value: "orderReason",
maxlength: 100,
bg: true,
hint: "限制100字符以内",
emptyHint: "请输入取消的原因",
},
],
});
const state = reactive({
orderInfo: {} as any, //订单数据
formData: [
{
title: "订单编号",
inputType: "number",
type: 2,
value: "orderNumber",
bg: true,
hint: "订单编号",
disabled: true,
},
{
title: "订单车牌号",
type: 2,
value: "carNumber",
bg: true,
hint: "订单车牌号",
disabled: true,
},
{
title: "订单状态",
type: 2,
value: "orderStatus",
bg: true,
hint: "订单状态",
disabled: true,
},
{
title: "请输入取消原因",
required: true,
type: 5,
vertical: 2,
value: "orderReason",
maxlength: 100,
bg: true,
hint: "限制100字符以内",
emptyHint: "请输入取消的原因",
},
],
});

//取消订单
const doCancelOrder = (e: any) => {
confirm(
"是否确认取消订单",
() => {
const options = {
type: 2,
data: {
id: state.orderInfo.id,
source: "WECHAT",
reason: e.orderReason,
opId: getItem(StorageKeys.OpenId),
},
method: "POST",
showLoading: true,
};
// #ifdef MP-WEIXIN
request(cancelOrder, options).then((res) => {
cancelOrderSuccess();
});
// #endif
// #ifdef MP-ALIPAY
request(cancelOrderNew, options).then((res) => {
cancelOrderSuccess();
});
// #endif
},
"取消确认"
);
};
//取消订单
const doCancelOrder = (e : any) => {
confirm(
"是否确认取消订单",
() => {
const options = {
type: 2,
data: {
id: state.orderInfo.id,
source: "WECHAT",
reason: e.orderReason,
// opId: getItem(StorageKeys.OpenId),
openId: getItem(StorageKeys.OpenId),
},
method: "POST",
showLoading: true,
};
console.log("options", options)
// #ifdef MP-WEIXIN
request(cancelOrder, options).then((res) => {
cancelOrderSuccess();
});
// #endif
// #ifdef MP-ALIPAY
request(cancelOrderNew, options).then((res) => {
cancelOrderSuccess();
});
// #endif
},
"取消确认"
);
};

const cancelOrderSuccess = () => {
const content =
state.orderInfo.orderStep == 4
? "您的订单已取消"
: "您的订单已取消,我们将在1-2个工作日内将费用原路退回";
confirm(
content,
() => {
uni.$emit("refreshOrder");
uni.navigateBack();
},
"取消成功",
false
);
};
const cancelOrderSuccess = () => {
const content =
state.orderInfo.orderStep == 4
? "您的订单已取消"
: "您的订单已取消,我们将在1-2个工作日内将费用原路退回";
confirm(
content,
() => {
uni.$emit("refreshOrder");
uni.navigateBack();
},
"取消成功",
false
);
};

onLoad((options) => {
state.orderInfo = JSON.parse(options.data) ?JSON.parse(options.data): {};
state.formData[0].hint = state.orderInfo.orderId;
state.formData[1].hint = state.orderInfo.vehiclePlate;
state.formData[2].hint = getOrderStatusName(state.orderInfo.orderStep);
});
onLoad((options) => {
console.log("options", options)
state.orderInfo = JSON.parse(options.data) ? JSON.parse(options.data) : {};
state.formData[0].hint = state.orderInfo.orderId;
state.formData[1].hint = state.orderInfo.vehiclePlate;
state.formData[2].hint = getOrderStatusName(state.orderInfo.orderStep);
});
</script>

<style lang="scss" scoped>
.form {
border-top: 1px solid #f7f7f7;
padding: 20rpx;
}
</style>
.form {
border-top: 1px solid #f7f7f7;
padding: 20rpx;
}
</style>

+ 4
- 1
subpackage/orders/car-release.vue Dosyayı Görüntüle

@@ -279,8 +279,11 @@
});
// #endif
// #ifdef MP-WEIXIN
// uni.redirectTo({
// url: `/subpackage/orders/interestsList?orderId=${state.form.orderId}&&clientFee=${getItem("clientFee")}&&id=${getItem("productId")}`// url: `/subpackage/orders/sign-up?orderId=${state.form.orderId}&&clientFee=${getItem("clientFee")}&&id=${getItem("productId")}`,
// });
uni.redirectTo({
url: `/subpackage/orders/interestsList?orderId=${state.form.orderId}&&clientFee=${getItem("clientFee")}&&id=${getItem("productId")}`// url: `/subpackage/orders/sign-up?orderId=${state.form.orderId}&&clientFee=${getItem("clientFee")}&&id=${getItem("productId")}`,
url: `/subpackage/orders/product-detail?orderId=${state.orderId}&&clientFee=${state.clientFee}&&id=${state.id}&&data=${items}&&isValueCard=${getItem("isValueCard")}`,
});
// #endif


+ 26
- 18
subpackage/orders/choice-product.vue Dosyayı Görüntüle

@@ -18,7 +18,7 @@
记账卡
</view> -->
<view style="margin-top: 15rpx" class="tip">
{{ item.cardTypeArr }}
{{ item['releaseProductStandards']['productStandards']['cardTypeArr'] }}
</view>
</view>
<view class="money">
@@ -77,8 +77,11 @@
} else {
state.isValueCard = 3
}
// uni.redirectTo({
// url: `/subpackage/orders/essential-information?promoteId=${getItem("promoteId")}&userType=${state.userType}&type=${state.type}&isSign=${state.isSign}&isValueCard=${state.isValueCard}`,
// });
uni.redirectTo({
url: `/subpackage/orders/essential-information?promoteId=${getItem("promoteId")}&userType=${state.userType}&type=${state.type}&isSign=${state.isSign}&isValueCard=${state.isValueCard}`,
url: `/subpackage/orders/interestsList?promoteId=${getItem("promoteId")}&userType=${state.userType}&type=${state.type}&isValueCard=${state.isValueCard}`,
});
}
const savaHandle = (val) => {
@@ -88,7 +91,7 @@
setItem("isValueCard", val.isValueCard);
state.isSign = val.isSign;
// 判断是几张卡
console.log("val.cardTypeArr.split(", ")", val.cardTypeArr.split(","))
console.log("state.dataArray[i]['releaseProductStandards']['productStandards']", val['releaseProductStandards']['productStandards'])
// if (val.promoteName.indexOf('选装') != -1) {
// if (val.cardTypeArr.split(",")[0] == "记账卡") {
// state.isValueCard = 2
@@ -103,23 +106,26 @@
// return
// }

if (val.cardTypeArr.split(",").length == 1) {
if (val.cardTypeArr.split(",")[0] == "记账卡") {
if (val['releaseProductStandards']['productStandards']['cardTypeArr'].split(",").length == 1) {
if (val['releaseProductStandards']['productStandards']['cardTypeArr'].split(",")[0] == "记账卡") {
state.isValueCard = 2
} else if (val.cardTypeArr.split(",")[0] == '储值卡') {
} else if (val['releaseProductStandards']['productStandards']['cardTypeArr'].split(",")[0] == '储值卡') {
state.isValueCard = 1
} else {
state.isValueCard = 3
}
// uni.redirectTo({
// url: `/subpackage/orders/essential-information?promoteId=${getItem("promoteId")}&userType=${state.userType}&type=${state.type}&isValueCard=${state.isValueCard}`,
// });
uni.redirectTo({
url: `/subpackage/orders/essential-information?promoteId=${getItem("promoteId")}&userType=${state.userType}&type=${state.type}&isValueCard=${state.isValueCard}`,
url: `/subpackage/orders/interestsList?promoteId=${val['promoteId']}&userType=${state.userType}&type=${state.type}&isValueCard=${state.isValueCard}`,
});
} else {
state.radiolist1 = [];
// 处理卡的数据
for (var i = 0; i < val.cardTypeArr.split(",").length; i++) {
for (var i = 0; i < val['releaseProductStandards']['productStandards']['cardTypeArr'].split(",").length; i++) {
const obj = {};
obj["name"] = val.cardTypeArr.split(",")[i];
obj["name"] = val['releaseProductStandards']['productStandards']['cardTypeArr'].split(",")[i];
obj["disabled"] = false;
state.radiolist1.push(obj)
}
@@ -141,8 +147,10 @@
state.userType = option.userType;
state.type = option.type;
var data = {
type: state.type,
source: state.sysType //请求方来源
userType: state.userType,
// source: state.sysType, //请求方来源
agencyId: '52010106004',
vanType: state.type
};
const options = {
type: 2,
@@ -155,20 +163,20 @@
// console.log(res.bizContent);
const data = stringToJson(res.bizContent);
console.log(data);
// console.log(typeof(data));
state.dataArray = data.csmsnPromoteDistPro ? data.csmsnPromoteDistPro : [];
state.dataArray = data.list ? data.list : [];
console.log("state.dataArray", state.dataArray);
for (var i = 0; i < state.dataArray.length; i++) {
const cardTypeArr = []
for (var j = 0; j < state.dataArray[i].cardType.length; j++) {
if (state.dataArray[i].cardType[j] == '1') {
for (var j = 0; j < state.dataArray[i]['releaseProductStandards']['productStandards'].cardType.length; j++) {
if (state.dataArray[i]['releaseProductStandards']['productStandards'].cardType[j] == '1') {
cardTypeArr.push('储值卡')
} else if (state.dataArray[i].cardType[j] == '2') {
} else if (state.dataArray[i]['releaseProductStandards']['productStandards'].cardType[j] == '2') {
cardTypeArr.push('记账卡')
} else if (state.dataArray[i].cardType[j] == '3') {
} else if (state.dataArray[i]['releaseProductStandards']['productStandards'].cardType[j] == '3') {
cardTypeArr.push('预存卡')
}
}
state.dataArray[i].cardTypeArr = cardTypeArr.toString()
state.dataArray[i]['releaseProductStandards']['productStandards']['cardTypeArr'] = cardTypeArr.toString()
}
console.log("state.dataArray", state.dataArray)
});

+ 56
- 23
subpackage/orders/essential-information.vue Dosyayı Görüntüle

@@ -49,12 +49,12 @@
<image :src="`${$imgUrl}common/arror-right.png`" class="icon"></image>
</view>
</view>
<view class="as-layout-horizontal agreement">
<!-- <view class="as-layout-horizontal agreement">
<checkbox-group @change="checkboxChange">
<checkbox :checked="state.checked" style="transform: scale(0.8)" />我已阅读并同意
</checkbox-group>
<text style="color:#007AFF;text-decoration: underline;" @click="downAuthD()">《用户协议》</text>
</view>
</view> -->
<view style="margin-top: 30rpx" class="action">
<button type="default" class="button" @click="nextAction()">
下一步
@@ -79,6 +79,7 @@
</view>
<view class="phone">
{{ item.consigneeTel }}
<text class="default" v-if="item.defaultAddress==1">默认</text>
</view>
</view>
<view class="address">
@@ -119,7 +120,8 @@
productReCode,
getGlobalParam,
infoQuery,
envs
envs,
addProduct
} from "@/utils/network/api.js";
import { request } from "@/utils/network/request.js";
import { reactive, ref } from "vue";
@@ -145,6 +147,7 @@
longitude: "",
latitude: "",
detailedAddress: '', //通过经纬度转的地址
cardType: '' //卡类型
},
show: false,
addressArray: [],
@@ -267,10 +270,10 @@
msg("请输入正确的申办车牌");
return;
}
if (!state.checked) {
msg("请勾选协议!")
return;
}
// if (!state.checked) {
// msg("请勾选协议!")
// return;
// }
//1.优先车牌校验 2.在进行订单创建
var vehicleData = {
vehiclePlate: state.data.vehiclePlate,
@@ -304,18 +307,19 @@
console.log(data);
//提交产品信息
productReCodeAction(data.orderId).then((result) => {
console.log(state.data);
console.log(result);
if (state.data.userType == 1) {
uni.navigateTo({
url: `/subpackage/orders/opening-account-people?orderId=${data.orderId}&&vehiclePlateColor=${state.data.vehiclePlateColor}&isSign=${state.isValueCard}&type=${state.data.type}`,
});
} else {
uni.navigateTo({
url: `/subpackage/orders/opening-account-unit?orderId=${data.orderId}&&vehiclePlateColor=${state.data.vehiclePlateColor}&isSign=${state.isValueCard}&type=${state.data.type}`,
});
}

console.log("产品信息", result);
// 加购权益产品
addProductRequest().then((res) => {
if (state.data.userType == 1) {
uni.navigateTo({
url: `/subpackage/orders/opening-account-people?orderId=${data.orderId}&&vehiclePlateColor=${state.data.vehiclePlateColor}&isSign=${state.isValueCard}&type=${state.data.type}`,
});
} else {
uni.navigateTo({
url: `/subpackage/orders/opening-account-unit?orderId=${data.orderId}&&vehiclePlateColor=${state.data.vehiclePlateColor}&isSign=${state.isValueCard}&type=${state.data.type}`,
});
}
})
})
}
});
@@ -389,6 +393,7 @@
state.data.userType = option.userType;
state.data.promoteId = option.promoteId;
state.isValueCard = option.isValueCard
state.data.cardType = option.isValueCard
console.log("订单选择推广发行产品接口", option)
getInfo();
uni.getLocation({
@@ -465,10 +470,6 @@
})

const productReCodeAction = (orderId) => {
// var data = {
// productId: state.data.productId,
// orderId: orderId,
// };
var data = {
promoteId: state.data.promoteId,
orderId: orderId,
@@ -491,6 +492,30 @@
reject(error);
});
};
const addProductRequest = () => {
const options = {
type: 2,
data: {
orderId: state.orderId, //订单编号
openId: getItem(StorageKeys.OpenId), //操作人 id
equityId: state.data.promoteId, //权益Id
totalAmount: allMoney * 100, //总金额
isRepeatPurchase: 0
},
method: "POST",
showLoading: true,
};
console.log("optionss", options);
return new Promise(async (resolve, reject) => {
const res = await request(addProduct, options);
const data = stringToJson(res.bizContent);
console.log("111")
resolve(data);
}).catch((error) => {
console.log("222")
reject(error);
});
}
</script>

<style lang="scss" scoped>
@@ -680,4 +705,12 @@
align-items: center;
justify-content: center;
}

.default {
border: 1rpx solid #00b38b;
border-radius: 5rpx;
padding: 2rpx 4rpx;
color: #00b38b;
margin-left: 4rpx;
}
</style>

+ 29
- 104
subpackage/orders/interestsList.vue Dosyayı Görüntüle

@@ -1,4 +1,4 @@
s<template>
<template>
<view class="content">
<view class="item" v-for="(item,index) in state.list" :key='index'>
<view class="title">
@@ -20,9 +20,6 @@ s<template>
</view>
</view>
</view>
<!-- <button type="default" class="button" @click="savaHandle()">
开通服务
</button> -->
<button type="default" class="button" @click="addInterestsList()">
加购权益
</button>
@@ -32,7 +29,7 @@ s<template>
<script setup lang="ts">
import { onLoad, onShow } from "@dcloudio/uni-app";
import { reactive } from "vue";
import { queryInterestsList } from "@/utils/network/api.js";
import { equityProductsApi } from "@/utils/network/api.js";
import { stringToJson } from "@/utils/network/encryption";
import { request } from "@/utils/network/request";
import { etcQYAction } from "@/utils/network/api.js";
@@ -65,19 +62,34 @@ s<template>
clientFee: "",
list: [], //权益数据
choiceValue: [], //选择的权益数据的下标
choiceValueComplete: [] //选择的权益数据的具体数据
choiceValueComplete: [], //选择的权益数据的具体数据
isValueCard: "",
type: 0,
userType: 0,
promoteId: "", //产品id
})

onLoad((option : any) => {
getList(option.orderId);
getOpenID();
// getList("promoteId", option);
console.log("promoteId", option)

state.orderId = option.orderId;
state.clientFee = option.clientFee;
state.id = option.id;
state.userType = option.userType;
state.type = option.type;
state.isValueCard = option.isValueCard;
state.promoteId = option.promoteId;
getList();
getOpenID();

console.log("option", option)
})
const addInterestsList = () => {
uni.redirectTo({
url: `/subpackage/orders/essential-information?promoteId=${getItem("promoteId")}&userType=${state.userType}&type=${state.type}&isValueCard=${state.isValueCard}`,
});
return;
state.choiceValueComplete = [];
for (var i = 0; i < state.choiceValue.length; i++) {
state.choiceValueComplete.push(state.list[state.choiceValue[i]])
@@ -121,11 +133,11 @@ s<template>
};
console.log("optionss", optionss);
request(addProduct, optionss).then((res) => {
// uni.navigateTo({
// url: `/subpackage/orders/order_payment?orderId=${state.orderId}&&clientFee=${state.clientFee}&&id=${state.id}&&data=${items}&&isValueCard=${state.detailsObj.isValueCard}`,
// uni.redirectTo({
// url: `/subpackage/orders/product-detail?orderId=${state.orderId}&&clientFee=${state.clientFee}&&id=${state.id}&&data=${items}&&isValueCard=${state.detailsObj.isValueCard}`,
// });
uni.redirectTo({
url: `/subpackage/orders/product-detail?orderId=${state.orderId}&&clientFee=${state.clientFee}&&id=${state.id}&&data=${items}&&isValueCard=${state.detailsObj.isValueCard}`,
url: `/subpackage/orders/essential-information?promoteId=${getItem("promoteId")}&userType=${state.userType}&type=${state.type}&isValueCard=${state.isValueCard}`,
});
});

@@ -134,20 +146,22 @@ s<template>
}


const getList = (id) => {
const getList = () => {
const options = {
type: 2,
data: { "orderId": id },
data: {
"promoteId": state.promoteId,
},
method: 'POST',
showLoading: true,
}
request(queryInterestsList, options).then((res) => {
request(equityProductsApi, options).then((res) => {
const data = stringToJson(res.bizContent);
for (var i = 0; i < data.data.length; i++) {
data.data[i]['isShow'] = false;
}
state.list = data.data
console.log("222", state.list)
console.log("222", state)
})
}
const change = (e) => {
@@ -162,22 +176,6 @@ s<template>
success: function (e) {
console.log(e);
getOpenid(e.code);
// uni.request({
// url: `https://api.weixin.qq.com/sns/jscode2session?appid=${wechatAppID}&secret=${wechatSecret}&js_code=${e.code}&grant_type=authorization_code`,
// success: (res : any) => {
// state.openid = res.data.openid;
// setItem("QYorder", state);
// console.log(res);
// },
// fail: (err : any) => {
// uni.showToast({
// title: "网络异常,请重试!" + err.errcode,
// icon: "error",
// duration: 500,
// });
// return;
// },
// });
},
});
//#endif
@@ -203,79 +201,6 @@ s<template>
});
// #endif
}
const savaHandle = () => {
state.choiceValueComplete = [];
for (var i = 0; i < state.choiceValue.length; i++) {
state.choiceValueComplete.push(state.list[state.choiceValue[i]])
}
let items = encodeURIComponent(JSON.stringify(state.choiceValueComplete));
console.log("state.choiceValueComplete", state.choiceValueComplete)
console.log("openid*******", state.openid);
//如果获取openId成功
if (state.openid) {
var data = {
orderId: state.orderId,
subOpenId: state.openid,
};
const options = {
type: 2,
data: data,
method: "POST",
showLoading: true,
};
request(etcQYAction, options).then((res) => {
const data = stringToJson(res.bizContent);
if (data.userState === "UNAUTHORIZED") {
uni.navigateToMiniProgram({
appId: "wxbcad394b3d99dac9",
path: "pages/route/index",
extraData: {
appid: "wxcb1388c809fe25a9",
sub_appid: "wx008c60533388527a",
mch_id: "1500877591",
sub_mch_id: "1622652848",
nonce_str: data.nonceStr,
sign_type: "HMAC-SHA256",
trade_scene: "HIGHWAY",
plate_number: data.plateNumber,
sub_openid: data.subOpenId,
sign: data.sign,
},
success(res) {
console.log(res);
},
complete(res) {
console.log(res);
},
fail(res) {
console.log(res);
// 未成功跳转到车主小程序
},
});
} else if (data.userState === "NORMAL") {
msg("已开通车主服务");

uni.navigateTo({
url: `/subpackage/orders/product-detail?orderId=${state.orderId}&&clientFee=${state.clientFee}&&id=${state.id}&&data=${items}`,
});
} else if (data.userState === "PAUSED") {
msg("已暂停车主服务");
return;
} else if (data.userState === "OVERDUE") {
msg("用户已开通车主服务,但欠费状态。提示用户还款,请跳转到车主服务");
return;
}
});
} else {
//如果获取openId失败
uni.showToast({
title: "网络异常,请重试!",
icon: "none",
duration: 1000,
});
return;
}
};
const changeIsShow = (index) => {
console.log(index, state.list[index]['isShow'], !state.list[index]['isShow'])
state.list[index]['isShow'] = !state.list[index]['isShow']

+ 110
- 75
subpackage/orders/opening-account-unit.vue Dosyayı Görüntüle

@@ -72,13 +72,15 @@
<u-input inputAlign="right" class="clearBg" placeholder='请输入部门名称' v-model="state.form.department" />
</u-form-item>
<u-form-item label="社会信用代码">
<u-input inputAlign="right" class="clearBg" placeholder='请输入社会信用代码' v-model="state.form.userIdNum" />
<u-input inputAlign="right" class="clearBg" placeholder='请输入社会信用代码'
v-model="state.form.userIdNum" />
</u-form-item>
<u-form-item label="经办人姓名">
<u-input inputAlign="right" class="clearBg" placeholder='请输入经办人姓名' v-model="state.form.agentName" />
</u-form-item>
<u-form-item label="经办人身份证号">
<u-input inputAlign="right" class="clearBg" placeholder='请输入经办人身份证号' v-model="state.form.agentIdNum" />
<u-input inputAlign="right" class="clearBg" placeholder='请输入经办人身份证号'
v-model="state.form.agentIdNum" />
</u-form-item>
<u-form-item label="经办人联系方式">
<u-input inputAlign="right" class="clearBg" placeholder='请输入经办人联系方式' v-model="state.form.tel" />
@@ -126,7 +128,7 @@
onLoad,
onPageScroll,
} from "@dcloudio/uni-app";
import {
import {
setItem,
getItem,
} from "@/utils/storage";
@@ -134,9 +136,9 @@ import {
msg,
checkStr
} from "@/utils/utils";
const scrollTop =ref(0);//滚动距离
const scrollTop = ref(0);//滚动距离
const state = reactive({
form: {
orderId: "", //订单ID
@@ -167,7 +169,7 @@ import {
},
orderId: "",
vehiclePlateColor: '',
isSign:''
isSign: ''
});

const savaHandle = () => {
@@ -176,63 +178,91 @@ import {
} else {
state.form.agentGender = 'WOMAN'
}
if (!state.form.posImgUrl) {
msg('请上传营业执照');
return;
}
if (!state.form.agentPosImgUrl) {
msg('上传身份证的人像面');
return;
}
if (!state.form.agentNegImgUrl) {
msg('上传身份证的国徽面');
return;
}
if (!state.form.proxyUrl) {
msg('上传身份证的委托书');
return;
}
if (!state.form.userName) {
msg('请输入公司名称');
return;
}
if (!state.form.department) {
msg('请输入社会信用代码');
return;
}
if (!state.form.agentName) {
msg('请输入经办人姓名');
return;
}
if (!checkStr(state.form.agentIdNum, 'card')) {
msg('请输入正确身份证');
msg('请输入正确的经办人身份证');
return;
}
if (!checkStr(state.form.tel, 'mobile')) {
msg('请输入正确手机号');
msg('请输入正确的经办人联系方式');
return;
}
//如果未登录||新用户
// if (!getItem('openId')) {
let data = {
userType: "ENTERPRISE",
idNum: state.form.userIdNum,
idType: state.form.userIdType,
mobile: state.form.tel,
userName: state.form.userName,
gender: 'UNKOWN',
certifyChannel: "BAIDUOCR",
address: state.form.address,
agentIdNum: state.form.agentIdNum,
agentIdType: state.form.agentIdType,
agentName: state.form.agentName,
department: state.form.department,
userIdImgUrl: state.form.posImgUrl,
userIdImgBase64: "",
}
const options = {
type: 2,
data: data,
method: "POST",
showLoading: true,
};
request(register, options).then((res) => {
let result = stringToJson(res.bizContent);
if (result.accessToken && result.openId) {
setItem('token', result.accessToken)
setItem('openId', result.openId)
state.form.opId = result.openId;
let data = state.form;
const options = {
type: 2,
data: data,
method: "POST",
showLoading: true,
};
request(etcCompanyCardInfoSubmit, options).then((res) => {
// let result = stringToJson(res.bizContent);
console.log(res);
uni.redirectTo({
url: `/subpackage/orders/car-release?orderId=${state.orderId}&vehiclePlateColor=${state.vehiclePlateColor}&type=1&isSign=${state.isSign}`,
});

let data = {
userType: "ENTERPRISE",
idNum: state.form.userIdNum,
idType: state.form.userIdType,
mobile: state.form.tel,
userName: state.form.userName,
gender: 'UNKOWN',
certifyChannel: "BAIDUOCR",
address: state.form.address,
agentIdNum: state.form.agentIdNum,
agentIdType: state.form.agentIdType,
agentName: state.form.agentName,
department: state.form.department,
userIdImgUrl: state.form.posImgUrl,
userIdImgBase64: "",
}
const options = {
type: 2,
data: data,
method: "POST",
showLoading: true,
};
request(register, options).then((res) => {
let result = stringToJson(res.bizContent);
if (result.accessToken && result.openId) {
setItem('token', result.accessToken)
setItem('openId', result.openId)
state.form.opId = result.openId;
let data = state.form;
const options = {
type: 2,
data: data,
method: "POST",
showLoading: true,
};
request(etcCompanyCardInfoSubmit, options).then((res) => {
// let result = stringToJson(res.bizContent);
console.log(res);
uni.redirectTo({
url: `/subpackage/orders/car-release?orderId=${state.orderId}&vehiclePlateColor=${state.vehiclePlateColor}&type=1&isSign=${state.isSign}`,
});
}
})
});
}
})

// }else{
// var data = state.form;
// const options = {
@@ -249,28 +279,28 @@ import {
// });
// }
};
onLoad((option: any) => {
onLoad((option : any) => {
state.form.orderId = option.orderId;
state.orderId = option.orderId;
state.vehiclePlateColor = option.vehiclePlateColor;
state.form.opId = getItem('openId')?getItem('openId'):'';
state.isSign=option.isSign;
state.form.opId = getItem('openId') ? getItem('openId') : '';
state.isSign = option.isSign;
});
//监听页面滚动
onPageScroll((e) => {
scrollTop.value = e.scrollTop;
});
//营业执照Orc接口调用
const cardImageOcrYY = () => {
uni.chooseImage({
count: 1, //只能选取一张照片
sizeType: ["original", "compressed"], //可以指定是原图还是压缩图,默认二者都有
sourceType: ["camera", "album"], //从相册选择
success: function(res) {
success: function (res) {
pathToBase64(res.tempFilePaths[0])
.then((path) => {
var data = {
@@ -288,7 +318,7 @@ import {
if (data.result) {
state.form.userName = stringToJson(data.result
.businessLicense)[
'名称'];
'名称'];
state.form.userIdNum = stringToJson(data.result
.businessLicense)[
'统一社会信用代码'];
@@ -297,17 +327,17 @@ import {

});
})
.catch((error) => {});
.catch((error) => { });
},
});
};
const cardImageOcr = (val: any) => {
const cardImageOcr = (val : any) => {
var imageType = val;
uni.chooseImage({
count: 1, //只能选取一张照片
sizeType: ["original", "compressed"], //可以指定是原图还是压缩图,默认二者都有
sourceType: ["camera", "album"], //从相册选择
success: function(res) {
success: function (res) {
pathToBase64(res.tempFilePaths[0])
.then((path) => {
var data = {
@@ -337,12 +367,12 @@ import {
}
});
})
.catch((error) => {});
.catch((error) => { });
},
});
};
//委托书获取图片给后端
const cardFileImageUpdateyy = (val: any) => {
const cardFileImageUpdateyy = (val : any) => {
var data = {
fileBase64: val,
};
@@ -362,7 +392,7 @@ import {
count: 1, //只能选取一张照片
sizeType: ["original", "compressed"], //可以指定是原图还是压缩图,默认二者都有
sourceType: ["camera", "album"], //从相册选择
success: function(res) {
success: function (res) {
pathToBase64(res.tempFilePaths[0])
.then((path) => {
var data = {
@@ -379,13 +409,13 @@ import {
state.form.proxyUrl = data.data.url;
});
})
.catch((error) => {});
.catch((error) => { });
},
});
};

//替换图片地址
const strReplace = (str: string) => {
const strReplace = (str : string) => {
let imgUrl = str.replace("http://192.168.101.145:9000", envs[process.env.NODE_ENV].baseUrl);
imgUrl = imgUrl.replace("http://100.64.2.113:9000", envs[process.env.NODE_ENV].baseUrl);
return imgUrl;
@@ -521,9 +551,14 @@ import {
line-height: 24rpx;
margin-bottom: 60rpx;
}
}
::v-deep .u-input__input{

::v-deep .u-input__input {
background: transparent;
}
</style>

::v-deep .u-form-item--left .u-form-item--left__content {
padding-right: 0px;
}
</style>

+ 2
- 2
subpackage/orders/sign-up.vue Dosyayı Görüntüle

@@ -186,8 +186,8 @@
//如果获取openId成功
if (state.openid) {
var data = {
orderId: state.orderId,
// orderId: "20231012114651162505354",
// orderId: state.orderId,
orderId: "20231012114651162505354",
subOpenId: state.openid,
};
const options = {

+ 6
- 3
utils/network/api.js Dosyayı Görüntüle

@@ -29,7 +29,8 @@ export const aliPayConfigId = "6a9a54bc01f6443123452b1234"; //支付配置编号
export const aliPayConfigIdTwo = "6a9a54bc01f644312543761234";
export const wechatAppID = "wx8fba957179c1329a"; //九州小程序APPid:wx008c60533388527a
export const wechatSecret = "699c10826113ddb350fbe58a96e2b015"; //九州小程序AppSecret:95197718b43b497f02732bd9f8011080
// export const sm4Key = "5dc11f854ceca1473e1a5075ed16eb226b4543a9a05fe50f7fba40f898099ce34abba69a07a20509f315f94d808a4d0e988935588858f65a";
// export const sm4Key =
// "5dc11f854ceca1473e1a5075ed16eb226b4543a9a05fe50f7fba40f898099ce34abba69a07a20509f315f94d808a4d0e988935588858f65a";
export const sm4Key = "5dc11f854ceca147";
//字典
@@ -75,7 +76,8 @@ export const exchangeProcess = '886' //8.101.ASS-换货/换卡签审核接口
//产品选择
// export const etcQueryProduct = "48"; //获取产品根据orderId获取
export const etcQueryProduct = "098bff3fc88e48bf9cafc3b5679b4d07"; //获取产品 根据客货类型获取
// export const etcQueryProduct = "098bff3fc88e48bf9cafc3b5679b4d07"; //获取产品 根据客货类型获取
export const etcQueryProduct = "f01002fa6ded4162afaec1139e503641"; //获取产品 根据客货类型获取
// export const productReCode = '914'//订单产品选择接口
export const productReCode = '198172b1858d474fa8e35225d65014d7' //订单选择推广发行产品
@@ -248,4 +250,5 @@ export const getOpenidApi = "53c0698b512a44539ea05cc88157e68b" //获取微信小
export const getAgreementApi = "32a9d99a781a4bf2af29a46d903702bd" //根据订单编号获取渠道产品的补充协议
export const mobileIsRepeatApi = "19d58812148d41bbb7d435ab93928787" //个人账号重复注册校验
export const transferRecordApi = "323bc6e1f3304c83921155fc220e9e37" //过户记录查询
export const agreementConfirmApi = "96fa039a85f54655af06d980c8ddc057" //协议确认接口
export const agreementConfirmApi = "96fa039a85f54655af06d980c8ddc057" //协议确认接口
export const equityProductsApi = "56db1aa8b9854f2f8c2428f3393e5045" //查询加购权益产品

+ 2
- 2
utils/network/request.js Dosyayı Görüntüle

@@ -59,8 +59,8 @@ export function request(code, options = {}, start = false) {
rbacSource: 'MINI_PROGRAM',
accessToken: getItem(StorageKeys.Token)
}
// options.url = envs[process.env.NODE_ENV].baseUrl + '/api/interfaceMidGroundIn'
options.url = envs[process.env.NODE_ENV].baseUrl + '/ifzt/api/interfaceMidGroundIn'
options.url = envs[process.env.NODE_ENV].baseUrl + '/api/interfaceMidGroundIn'
// options.url = envs[process.env.NODE_ENV].baseUrl + '/ifzt/api/interfaceMidGroundIn'
//默认json数据格式提交`
let contentType = 'application/x-www-form-urlencoded'


+ 486
- 485
utils/util/sm4.js Dosyayı Görüntüle

@@ -13,7 +13,7 @@
* var sm4 = new SM4Util();
sm4.encryptData_CBC('');
*/
import * as base64js from '../node-model/base64-js'
import * as base64js from '../node-model/base64-js'

/**
* 国密SM4加密算法
@@ -21,493 +21,494 @@ import * as base64js from '../node-model/base64-js'
* @email 1216113487@qq.com
* @company 中科软
*/
function SM4_Context () {
this.mode = 1
this.isPadding = true
this.sk = new Array(32)
function SM4_Context() {
this.mode = 1
this.isPadding = true
this.sk = new Array(32)
}

function SM4 () {
this.SM4_ENCRYPT = 1
this.SM4_DECRYPT = 0

const SboxTable = [0xd6, 0x90, 0xe9, 0xfe, 0xcc, 0xe1, 0x3d, 0xb7, 0x16, 0xb6, 0x14, 0xc2, 0x28, 0xfb, 0x2c, 0x05,
0x2b, 0x67, 0x9a, 0x76, 0x2a, 0xbe, 0x04, 0xc3, 0xaa, 0x44, 0x13, 0x26, 0x49, 0x86, 0x06, 0x99,
0x9c, 0x42, 0x50, 0xf4, 0x91, 0xef, 0x98, 0x7a, 0x33, 0x54, 0x0b, 0x43, 0xed, 0xcf, 0xac, 0x62,
0xe4, 0xb3, 0x1c, 0xa9, 0xc9, 0x08, 0xe8, 0x95, 0x80, 0xdf, 0x94, 0xfa, 0x75, 0x8f, 0x3f, 0xa6,
0x47, 0x07, 0xa7, 0xfc, 0xf3, 0x73, 0x17, 0xba, 0x83, 0x59, 0x3c, 0x19, 0xe6, 0x85, 0x4f, 0xa8,
0x68, 0x6b, 0x81, 0xb2, 0x71, 0x64, 0xda, 0x8b, 0xf8, 0xeb, 0x0f, 0x4b, 0x70, 0x56, 0x9d, 0x35,
0x1e, 0x24, 0x0e, 0x5e, 0x63, 0x58, 0xd1, 0xa2, 0x25, 0x22, 0x7c, 0x3b, 0x01, 0x21, 0x78, 0x87,
0xd4, 0x00, 0x46, 0x57, 0x9f, 0xd3, 0x27, 0x52, 0x4c, 0x36, 0x02, 0xe7, 0xa0, 0xc4, 0xc8, 0x9e,
0xea, 0xbf, 0x8a, 0xd2, 0x40, 0xc7, 0x38, 0xb5, 0xa3, 0xf7, 0xf2, 0xce, 0xf9, 0x61, 0x15, 0xa1,
0xe0, 0xae, 0x5d, 0xa4, 0x9b, 0x34, 0x1a, 0x55, 0xad, 0x93, 0x32, 0x30, 0xf5, 0x8c, 0xb1, 0xe3,
0x1d, 0xf6, 0xe2, 0x2e, 0x82, 0x66, 0xca, 0x60, 0xc0, 0x29, 0x23, 0xab, 0x0d, 0x53, 0x4e, 0x6f,
0xd5, 0xdb, 0x37, 0x45, 0xde, 0xfd, 0x8e, 0x2f, 0x03, 0xff, 0x6a, 0x72, 0x6d, 0x6c, 0x5b, 0x51,
0x8d, 0x1b, 0xaf, 0x92, 0xbb, 0xdd, 0xbc, 0x7f, 0x11, 0xd9, 0x5c, 0x41, 0x1f, 0x10, 0x5a, 0xd8,
0x0a, 0xc1, 0x31, 0x88, 0xa5, 0xcd, 0x7b, 0xbd, 0x2d, 0x74, 0xd0, 0x12, 0xb8, 0xe5, 0xb4, 0xb0,
0x89, 0x69, 0x97, 0x4a, 0x0c, 0x96, 0x77, 0x7e, 0x65, 0xb9, 0xf1, 0x09, 0xc5, 0x6e, 0xc6, 0x84,
0x18, 0xf0, 0x7d, 0xec, 0x3a, 0xdc, 0x4d, 0x20, 0x79, 0xee, 0x5f, 0x3e, 0xd7, 0xcb, 0x39, 0x48]

const FK = [0xa3b1bac6, 0x56aa3350, 0x677d9197, 0xb27022dc]

const CK = [0x00070e15, 0x1c232a31, 0x383f464d, 0x545b6269,
0x70777e85, 0x8c939aa1, 0xa8afb6bd, 0xc4cbd2d9,
0xe0e7eef5, 0xfc030a11, 0x181f262d, 0x343b4249,
0x50575e65, 0x6c737a81, 0x888f969d, 0xa4abb2b9,
0xc0c7ced5, 0xdce3eaf1, 0xf8ff060d, 0x141b2229,
0x30373e45, 0x4c535a61, 0x686f767d, 0x848b9299,
0xa0a7aeb5, 0xbcc3cad1, 0xd8dfe6ed, 0xf4fb0209,
0x10171e25, 0x2c333a41, 0x484f565d, 0x646b7279]

this.GET_ULONG_BE = function (b, i) {
return (b[i] & 0xff) << 24 | ((b[i + 1] & 0xff) << 16) | ((b[i + 2] & 0xff) << 8) | (b[i + 3] & 0xff) & 0xffffffff
}

this.PUT_ULONG_BE = function (n, b, i) {
var t1 = (0xFF & (n >> 24))
var t2 = (0xFF & (n >> 16))
var t3 = (0xFF & (n >> 8))
var t4 = (0xFF & (n))
b[i] = t1 > 128 ? t1 - 256 : t1
b[i + 1] = t2 > 128 ? t2 - 256 : t2
b[i + 2] = t3 > 128 ? t3 - 256 : t3
b[i + 3] = t4 > 128 ? t4 - 256 : t4
}

this.SHL = function (x, n) {
return (x & 0xFFFFFFFF) << n
}

this.ROTL = function (x, n) {
// const s = this.SHL(x, n);
// const ss = x >> (32 - n);
return this.SHL(x, n) | x >> (32 - n)
}


this.sm4Lt = function (ka) {
let bb = 0
let c = 0
const a = new Array(4)
const b = new Array(4)
this.PUT_ULONG_BE(ka, a, 0)
b[0] = this.sm4Sbox(a[0])
b[1] = this.sm4Sbox(a[1])
b[2] = this.sm4Sbox(a[2])
b[3] = this.sm4Sbox(a[3])
bb = this.GET_ULONG_BE(b, 0)
c = bb ^ this.ROTL(bb, 2) ^ this.ROTL(bb, 10) ^ this.ROTL(bb, 18) ^ this.ROTL(bb, 24)
return c
}

this.sm4F = function (x0, x1, x2, x3, rk) {
return x0 ^ this.sm4Lt(x1 ^ x2 ^ x3 ^ rk)
}

this.sm4CalciRK = function (ka) {
let bb = 0
let rk = 0
const a = new Array(4)
const b = new Array(4)
this.PUT_ULONG_BE(ka, a, 0)
b[0] = this.sm4Sbox(a[0])
b[1] = this.sm4Sbox(a[1])
b[2] = this.sm4Sbox(a[2])
b[3] = this.sm4Sbox(a[3])
bb = this.GET_ULONG_BE(b, 0)
rk = bb ^ this.ROTL(bb, 13) ^ this.ROTL(bb, 23)
return rk
}



this.sm4Sbox = function (inch) {
const i = inch & 0xFF
const retVal = SboxTable[i]
return retVal > 128 ? retVal - 256 : retVal
}

this.sm4_setkey_enc = function (ctx, key) {
if (ctx == null) {
alert("ctx is null!")
return false
}
if (key == null || key.length !== 16) {
alert("key error!")
return false
}
ctx.mode = this.SM4_ENCRYPT
this.sm4_setkey(ctx.sk, key)

}

//生成解密密钥
this.sm4_setkey_dec = function (ctx, key) {
if (ctx == null) {
Error("ctx is null!")
}

if (key == null || key.length !== 16) {
Error("2key error!")
}

// var i = 0;
ctx.mode = 0
this.sm4_setkey(ctx.sk, key)
ctx.sk = ctx.sk.reverse()
}

this.sm4_setkey = function (SK, key) {
const MK = new Array(4)
const k = new Array(36)
// var i = 0;
MK[0] = this.GET_ULONG_BE(key, 0)
MK[1] = this.GET_ULONG_BE(key, 4)
MK[2] = this.GET_ULONG_BE(key, 8)
MK[3] = this.GET_ULONG_BE(key, 12)
k[0] = MK[0] ^ FK[0]
k[1] = MK[1] ^ FK[1]
k[2] = MK[2] ^ FK[2]
k[3] = MK[3] ^ FK[3]
for (let i = 0; i < 32; i++) {
k[(i + 4)] = (k[i] ^ this.sm4CalciRK(k[(i + 1)] ^ k[(i + 2)] ^ k[(i + 3)] ^ CK[i]))
SK[i] = k[(i + 4)]
}

}
this.padding = function (input, mode) {
let p
if (input == null) {
return null
}
let ret = null
if (mode === this.SM4_ENCRYPT) {
p = parseInt(16 - input.length % 16)
ret = input.slice(0)
for (let i = 0; i < p; i++) {
ret[input.length + i] = p
}
} else {
p = input[input.length - 1]
ret = input.slice(0, input.length - p)
}
return ret
}
this.sm4_one_round = function (sk, input, output) {
let i = 0
const ulbuf = new Array(36)
ulbuf[0] = this.GET_ULONG_BE(input, 0)
ulbuf[1] = this.GET_ULONG_BE(input, 4)
ulbuf[2] = this.GET_ULONG_BE(input, 8)
ulbuf[3] = this.GET_ULONG_BE(input, 12)
while (i < 32) {
ulbuf[(i + 4)] = this.sm4F(ulbuf[i], ulbuf[(i + 1)], ulbuf[(i + 2)], ulbuf[(i + 3)], sk[i])
i++
}
this.PUT_ULONG_BE(ulbuf[35], output, 0)
this.PUT_ULONG_BE(ulbuf[34], output, 4)
this.PUT_ULONG_BE(ulbuf[33], output, 8)
this.PUT_ULONG_BE(ulbuf[32], output, 12)

}



this.sm4_crypt_ecb = function (ctx, input) {
if (input == null) {
alert("input is null!")
}
if ((ctx.isPadding) && (ctx.mode == this.SM4_ENCRYPT)) {
input = this.padding(input, this.SM4_ENCRYPT)
}

let i = 0
let length = input.length
let bous = []
for (; length > 0; length -= 16) {
var out = new Array(16)
var ins = input.slice(i * 16, (16 * (i + 1)))
this.sm4_one_round(ctx.sk, ins, out)
bous = bous.concat(out)
i++
}

let output = bous
if (ctx.isPadding && ctx.mode === this.SM4_DECRYPT) {
output = this.padding(output, this.SM4_DECRYPT)
}
for (i = 0; i < output.length; i++) {
if (output[i] < 0) {
output[i] = output[i] + 256
}
}
return output
}

this.sm4_crypt_cbc = function (ctx, iv, input) {
let out
let ins
let out1
let k
if (iv == null || iv.length !== 16) {
alert("iv error!")
}

if (input == null) {
alert("input is null!")
}

if (ctx.isPadding && ctx.mode === this.SM4_ENCRYPT) {
input = this.padding(input, this.SM4_ENCRYPT)
}

let i = 0
let length = input.length
let bous = []
if (ctx.mode === this.SM4_ENCRYPT) {
k = 0
for (; length > 0; length -= 16) {
out = new Array(16)
out1 = new Array(16)
ins = input.slice(k * 16, (16 * (k + 1)))

for (i = 0; i < 16; i++) {
out[i] = (ins[i] ^ iv[i])
}
this.sm4_one_round(ctx.sk, out, out1)
iv = out1.slice(0, 16)
bous = bous.concat(out1)
k++
}
}
else {
let temp = []
k = 0
for (; length > 0; length -= 16) {
out = new Array(16)
out1 = new Array(16)
ins = input.slice(k * 16, (16 * (k + 1)))
temp = ins.slice(0, 16)
this.sm4_one_round(ctx.sk, ins, out)
for (i = 0; i < 16; i++) {
out1[i] = (out[i] ^ iv[i])
}
iv = temp.slice(0, 16)
bous = bous.concat(out1)
k++
}
}

let output = bous
if (ctx.isPadding && ctx.mode === this.SM4_DECRYPT) {
output = this.padding(output, this.SM4_DECRYPT)
}

for (i = 0; i < output.length; i++) {
if (output[i] < 0) {
output[i] = output[i] + 256
}
}
return output
}
function SM4() {
this.SM4_ENCRYPT = 1
this.SM4_DECRYPT = 0

const SboxTable = [0xd6, 0x90, 0xe9, 0xfe, 0xcc, 0xe1, 0x3d, 0xb7, 0x16, 0xb6, 0x14, 0xc2, 0x28, 0xfb, 0x2c, 0x05,
0x2b, 0x67, 0x9a, 0x76, 0x2a, 0xbe, 0x04, 0xc3, 0xaa, 0x44, 0x13, 0x26, 0x49, 0x86, 0x06, 0x99,
0x9c, 0x42, 0x50, 0xf4, 0x91, 0xef, 0x98, 0x7a, 0x33, 0x54, 0x0b, 0x43, 0xed, 0xcf, 0xac, 0x62,
0xe4, 0xb3, 0x1c, 0xa9, 0xc9, 0x08, 0xe8, 0x95, 0x80, 0xdf, 0x94, 0xfa, 0x75, 0x8f, 0x3f, 0xa6,
0x47, 0x07, 0xa7, 0xfc, 0xf3, 0x73, 0x17, 0xba, 0x83, 0x59, 0x3c, 0x19, 0xe6, 0x85, 0x4f, 0xa8,
0x68, 0x6b, 0x81, 0xb2, 0x71, 0x64, 0xda, 0x8b, 0xf8, 0xeb, 0x0f, 0x4b, 0x70, 0x56, 0x9d, 0x35,
0x1e, 0x24, 0x0e, 0x5e, 0x63, 0x58, 0xd1, 0xa2, 0x25, 0x22, 0x7c, 0x3b, 0x01, 0x21, 0x78, 0x87,
0xd4, 0x00, 0x46, 0x57, 0x9f, 0xd3, 0x27, 0x52, 0x4c, 0x36, 0x02, 0xe7, 0xa0, 0xc4, 0xc8, 0x9e,
0xea, 0xbf, 0x8a, 0xd2, 0x40, 0xc7, 0x38, 0xb5, 0xa3, 0xf7, 0xf2, 0xce, 0xf9, 0x61, 0x15, 0xa1,
0xe0, 0xae, 0x5d, 0xa4, 0x9b, 0x34, 0x1a, 0x55, 0xad, 0x93, 0x32, 0x30, 0xf5, 0x8c, 0xb1, 0xe3,
0x1d, 0xf6, 0xe2, 0x2e, 0x82, 0x66, 0xca, 0x60, 0xc0, 0x29, 0x23, 0xab, 0x0d, 0x53, 0x4e, 0x6f,
0xd5, 0xdb, 0x37, 0x45, 0xde, 0xfd, 0x8e, 0x2f, 0x03, 0xff, 0x6a, 0x72, 0x6d, 0x6c, 0x5b, 0x51,
0x8d, 0x1b, 0xaf, 0x92, 0xbb, 0xdd, 0xbc, 0x7f, 0x11, 0xd9, 0x5c, 0x41, 0x1f, 0x10, 0x5a, 0xd8,
0x0a, 0xc1, 0x31, 0x88, 0xa5, 0xcd, 0x7b, 0xbd, 0x2d, 0x74, 0xd0, 0x12, 0xb8, 0xe5, 0xb4, 0xb0,
0x89, 0x69, 0x97, 0x4a, 0x0c, 0x96, 0x77, 0x7e, 0x65, 0xb9, 0xf1, 0x09, 0xc5, 0x6e, 0xc6, 0x84,
0x18, 0xf0, 0x7d, 0xec, 0x3a, 0xdc, 0x4d, 0x20, 0x79, 0xee, 0x5f, 0x3e, 0xd7, 0xcb, 0x39, 0x48
]

const FK = [0xa3b1bac6, 0x56aa3350, 0x677d9197, 0xb27022dc]

const CK = [0x00070e15, 0x1c232a31, 0x383f464d, 0x545b6269,
0x70777e85, 0x8c939aa1, 0xa8afb6bd, 0xc4cbd2d9,
0xe0e7eef5, 0xfc030a11, 0x181f262d, 0x343b4249,
0x50575e65, 0x6c737a81, 0x888f969d, 0xa4abb2b9,
0xc0c7ced5, 0xdce3eaf1, 0xf8ff060d, 0x141b2229,
0x30373e45, 0x4c535a61, 0x686f767d, 0x848b9299,
0xa0a7aeb5, 0xbcc3cad1, 0xd8dfe6ed, 0xf4fb0209,
0x10171e25, 0x2c333a41, 0x484f565d, 0x646b7279
]

this.GET_ULONG_BE = function(b, i) {
return (b[i] & 0xff) << 24 | ((b[i + 1] & 0xff) << 16) | ((b[i + 2] & 0xff) << 8) | (b[i + 3] & 0xff) &
0xffffffff
}

this.PUT_ULONG_BE = function(n, b, i) {
var t1 = (0xFF & (n >> 24))
var t2 = (0xFF & (n >> 16))
var t3 = (0xFF & (n >> 8))
var t4 = (0xFF & (n))
b[i] = t1 > 128 ? t1 - 256 : t1
b[i + 1] = t2 > 128 ? t2 - 256 : t2
b[i + 2] = t3 > 128 ? t3 - 256 : t3
b[i + 3] = t4 > 128 ? t4 - 256 : t4
}

this.SHL = function(x, n) {
return (x & 0xFFFFFFFF) << n
}

this.ROTL = function(x, n) {
// const s = this.SHL(x, n);
// const ss = x >> (32 - n);
return this.SHL(x, n) | x >> (32 - n)
}


this.sm4Lt = function(ka) {
let bb = 0
let c = 0
const a = new Array(4)
const b = new Array(4)
this.PUT_ULONG_BE(ka, a, 0)
b[0] = this.sm4Sbox(a[0])
b[1] = this.sm4Sbox(a[1])
b[2] = this.sm4Sbox(a[2])
b[3] = this.sm4Sbox(a[3])
bb = this.GET_ULONG_BE(b, 0)
c = bb ^ this.ROTL(bb, 2) ^ this.ROTL(bb, 10) ^ this.ROTL(bb, 18) ^ this.ROTL(bb, 24)
return c
}

this.sm4F = function(x0, x1, x2, x3, rk) {
return x0 ^ this.sm4Lt(x1 ^ x2 ^ x3 ^ rk)
}

this.sm4CalciRK = function(ka) {
let bb = 0
let rk = 0
const a = new Array(4)
const b = new Array(4)
this.PUT_ULONG_BE(ka, a, 0)
b[0] = this.sm4Sbox(a[0])
b[1] = this.sm4Sbox(a[1])
b[2] = this.sm4Sbox(a[2])
b[3] = this.sm4Sbox(a[3])
bb = this.GET_ULONG_BE(b, 0)
rk = bb ^ this.ROTL(bb, 13) ^ this.ROTL(bb, 23)
return rk
}



this.sm4Sbox = function(inch) {
const i = inch & 0xFF
const retVal = SboxTable[i]
return retVal > 128 ? retVal - 256 : retVal
}

this.sm4_setkey_enc = function(ctx, key) {
if (ctx == null) {
alert("ctx is null!")
return false
}
if (key == null || key.length !== 16) {
alert("key error!")
return false
}
ctx.mode = this.SM4_ENCRYPT
this.sm4_setkey(ctx.sk, key)

}

//生成解密密钥
this.sm4_setkey_dec = function(ctx, key) {
if (ctx == null) {
Error("ctx is null!")
}

if (key == null || key.length !== 16) {
Error("2key error!")
}

// var i = 0;
ctx.mode = 0
this.sm4_setkey(ctx.sk, key)
ctx.sk = ctx.sk.reverse()
}

this.sm4_setkey = function(SK, key) {
const MK = new Array(4)
const k = new Array(36)
// var i = 0;
MK[0] = this.GET_ULONG_BE(key, 0)
MK[1] = this.GET_ULONG_BE(key, 4)
MK[2] = this.GET_ULONG_BE(key, 8)
MK[3] = this.GET_ULONG_BE(key, 12)
k[0] = MK[0] ^ FK[0]
k[1] = MK[1] ^ FK[1]
k[2] = MK[2] ^ FK[2]
k[3] = MK[3] ^ FK[3]
for (let i = 0; i < 32; i++) {
k[(i + 4)] = (k[i] ^ this.sm4CalciRK(k[(i + 1)] ^ k[(i + 2)] ^ k[(i + 3)] ^ CK[i]))
SK[i] = k[(i + 4)]
}

}
this.padding = function(input, mode) {
let p
if (input == null) {
return null
}
let ret = null
if (mode === this.SM4_ENCRYPT) {
p = parseInt(16 - input.length % 16)
ret = input.slice(0)
for (let i = 0; i < p; i++) {
ret[input.length + i] = p
}
} else {
p = input[input.length - 1]
ret = input.slice(0, input.length - p)
}
return ret
}
this.sm4_one_round = function(sk, input, output) {
let i = 0
const ulbuf = new Array(36)
ulbuf[0] = this.GET_ULONG_BE(input, 0)
ulbuf[1] = this.GET_ULONG_BE(input, 4)
ulbuf[2] = this.GET_ULONG_BE(input, 8)
ulbuf[3] = this.GET_ULONG_BE(input, 12)
while (i < 32) {
ulbuf[(i + 4)] = this.sm4F(ulbuf[i], ulbuf[(i + 1)], ulbuf[(i + 2)], ulbuf[(i + 3)], sk[i])
i++
}
this.PUT_ULONG_BE(ulbuf[35], output, 0)
this.PUT_ULONG_BE(ulbuf[34], output, 4)
this.PUT_ULONG_BE(ulbuf[33], output, 8)
this.PUT_ULONG_BE(ulbuf[32], output, 12)

}



this.sm4_crypt_ecb = function(ctx, input) {
if (input == null) {
alert("input is null!")
}
if ((ctx.isPadding) && (ctx.mode == this.SM4_ENCRYPT)) {
input = this.padding(input, this.SM4_ENCRYPT)
}

let i = 0
let length = input.length
let bous = []
for (; length > 0; length -= 16) {
var out = new Array(16)
var ins = input.slice(i * 16, (16 * (i + 1)))
this.sm4_one_round(ctx.sk, ins, out)
bous = bous.concat(out)
i++
}

let output = bous
if (ctx.isPadding && ctx.mode === this.SM4_DECRYPT) {
output = this.padding(output, this.SM4_DECRYPT)
}
for (i = 0; i < output.length; i++) {
if (output[i] < 0) {
output[i] = output[i] + 256
}
}
return output
}

this.sm4_crypt_cbc = function(ctx, iv, input) {
let out
let ins
let out1
let k
if (iv == null || iv.length !== 16) {
alert("iv error!")
}

if (input == null) {
alert("input is null!")
}

if (ctx.isPadding && ctx.mode === this.SM4_ENCRYPT) {
input = this.padding(input, this.SM4_ENCRYPT)
}

let i = 0
let length = input.length
let bous = []
if (ctx.mode === this.SM4_ENCRYPT) {
k = 0
for (; length > 0; length -= 16) {
out = new Array(16)
out1 = new Array(16)
ins = input.slice(k * 16, (16 * (k + 1)))

for (i = 0; i < 16; i++) {
out[i] = (ins[i] ^ iv[i])
}
this.sm4_one_round(ctx.sk, out, out1)
iv = out1.slice(0, 16)
bous = bous.concat(out1)
k++
}
} else {
let temp = []
k = 0
for (; length > 0; length -= 16) {
out = new Array(16)
out1 = new Array(16)
ins = input.slice(k * 16, (16 * (k + 1)))
temp = ins.slice(0, 16)
this.sm4_one_round(ctx.sk, ins, out)
for (i = 0; i < 16; i++) {
out1[i] = (out[i] ^ iv[i])
}
iv = temp.slice(0, 16)
bous = bous.concat(out1)
k++
}
}

let output = bous
if (ctx.isPadding && ctx.mode === this.SM4_DECRYPT) {
output = this.padding(output, this.SM4_DECRYPT)
}

for (i = 0; i < output.length; i++) {
if (output[i] < 0) {
output[i] = output[i] + 256
}
}
return output
}
}


export function SM4Util () {
// 和后端key一致
// 当时用CBC模式的时候
this.iv = "ZkR_SiNoSOFT=568"
this.hexString = false

// ECB模式加密
this.encryptData_ECB = function (plainText) {
try {
const sm4 = new SM4()
const ctx = new SM4_Context()
ctx.isPadding = true
ctx.mode = sm4.SM4_ENCRYPT
const keyBytes = this.stringToByte(this.secretKey)
sm4.sm4_setkey_enc(ctx, keyBytes)
const encrypted = sm4.sm4_crypt_ecb(ctx, this.stringToByte(plainText))
const cipherText = base64js.fromByteArray(encrypted)
if (cipherText != null && cipherText.trim().length > 0) {
cipherText.replace(/(\s*|\t|\r|\n)/g, "")
}
return cipherText
} catch (e) {
console.error(e)
return null
}
}
//解密_ECB
this.decryptData_ECB = function (cipherText) {
try {
let sm4 = new SM4()
let ctx = new SM4_Context()
ctx.isPadding = true
ctx.mode = sm4.SM4_ENCRYPT
let keyBytes = this.stringToByte(this.secretKey)
sm4.sm4_setkey_dec(ctx, keyBytes)
let decrypted = sm4.sm4_crypt_ecb(ctx, base64js.toByteArray(cipherText))
return utf8ByteToUnicodeStr(decrypted)
} catch (e) {
console.error(e)
return null
}
}

// CBC模式加密
this.encryptData_CBC = function (plainText,secretKey) {
try {
plainText = JSON.stringify(plainText)
const sm4 = new SM4()
const ctx = new SM4_Context()
ctx.isPadding = true
ctx.mode = sm4.SM4_ENCRYPT

const keyBytes = this.stringToByte(secretKey.substring(0,16))
const ivBytes = this.stringToByte(this.iv)

sm4.sm4_setkey_enc(ctx, keyBytes)
const encrypted = sm4.sm4_crypt_cbc(ctx, ivBytes, this.stringToByte(plainText))
const cipherText = base64js.fromByteArray(encrypted)
if (cipherText != null && cipherText.trim().length > 0) {
cipherText.replace(/(\s*|\t|\r|\n)/g, "")
}
return cipherText
}
catch (e) {
console.error(e)
return null
}
}
//解密_CBC
this.decryptData_CBC = function (cipherText,secretKey) {
try {
let sm4 = new SM4()
let ctx = new SM4_Context()
ctx.isPadding = true
ctx.mode = sm4.SM4_ENCRYPT
let keyBytes = this.stringToByte(secretKey.substring(0,16))
let ivBytes = this.stringToByte(this.iv)
sm4.sm4_setkey_dec(ctx, keyBytes)
let decrypted = sm4.sm4_crypt_cbc(ctx, ivBytes, base64js.toByteArray(cipherText.data.bizContent))
let bizContent = utf8ByteToUnicodeStr(decrypted)
// let begin = bizContent.indexOf('{');
// let end = bizContent.lastIndexOf('}');
// cipherText.data.bizContent = bizContent.substring(begin,end+1)
cipherText.data.bizContent = bizContent;
return cipherText
} catch (e) {
console.error(e)
return null
}
}

this.stringToByte = function (str) {
const bytes = []
let len, c
len = str.length
for (let i = 0; i < len; i++) {
c = str.charCodeAt(i)
if (c >= 0x010000 && c <= 0x10FFFF) {
bytes.push(((c >> 18) & 0x07) | 0xF0)
bytes.push(((c >> 12) & 0x3F) | 0x80)
bytes.push(((c >> 6) & 0x3F) | 0x80)
bytes.push((c & 0x3F) | 0x80)
} else if (c >= 0x000800 && c <= 0x00FFFF) {
bytes.push(((c >> 12) & 0x0F) | 0xE0)
bytes.push(((c >> 6) & 0x3F) | 0x80)
bytes.push((c & 0x3F) | 0x80)
} else if (c >= 0x000080 && c <= 0x0007FF) {
bytes.push(((c >> 6) & 0x1F) | 0xC0)
bytes.push((c & 0x3F) | 0x80)
} else {
bytes.push(c & 0xFF)
}
}
return bytes
}


this.byteToString = function (arr) {
if (typeof arr === 'string') {
return arr
}
let str = '',
_arr = arr
for (let i = 0; i < _arr.length; i++) {
const one = _arr[i].toString(2),
v = one.match(/^1+?(?=0)/)
if (v && one.length === 8) {
const bytesLength = v[0].length
let store = _arr[i].toString(2).slice(7 - bytesLength)
for (let st = 1; st < bytesLength; st++) {
store += _arr[st + i].toString(2).slice(2)
}
str += String.fromCharCode(parseInt(store, 2))
i += bytesLength - 1
} else {
str += String.fromCharCode(_arr[i])
}
}
return str
}

function utf8ByteToUnicodeStr (utf8Bytes) {
var unicodeStr = ""
for (var pos = 0; pos < utf8Bytes.length;) {
var flag = utf8Bytes[pos]
var unicode = 0
if ((flag >>> 7) === 0) {
unicodeStr += String.fromCharCode(utf8Bytes[pos])
pos += 1

} else if ((flag & 0xFC) === 0xFC) {
unicode = (utf8Bytes[pos] & 0x3) << 30
unicode |= (utf8Bytes[pos + 1] & 0x3F) << 24
unicode |= (utf8Bytes[pos + 2] & 0x3F) << 18
unicode |= (utf8Bytes[pos + 3] & 0x3F) << 12
unicode |= (utf8Bytes[pos + 4] & 0x3F) << 6
unicode |= (utf8Bytes[pos + 5] & 0x3F)
unicodeStr += String.fromCharCode(unicode)
pos += 6

} else if ((flag & 0xF8) === 0xF8) {
unicode = (utf8Bytes[pos] & 0x7) << 24
unicode |= (utf8Bytes[pos + 1] & 0x3F) << 18
unicode |= (utf8Bytes[pos + 2] & 0x3F) << 12
unicode |= (utf8Bytes[pos + 3] & 0x3F) << 6
unicode |= (utf8Bytes[pos + 4] & 0x3F)
unicodeStr += String.fromCharCode(unicode)
pos += 5

} else if ((flag & 0xF0) === 0xF0) {
unicode = (utf8Bytes[pos] & 0xF) << 18
unicode |= (utf8Bytes[pos + 1] & 0x3F) << 12
unicode |= (utf8Bytes[pos + 2] & 0x3F) << 6
unicode |= (utf8Bytes[pos + 3] & 0x3F)
unicodeStr += String.fromCharCode(unicode)
pos += 4

} else if ((flag & 0xE0) === 0xE0) {
unicode = (utf8Bytes[pos] & 0x1F) << 12;;
unicode |= (utf8Bytes[pos + 1] & 0x3F) << 6
unicode |= (utf8Bytes[pos + 2] & 0x3F)
unicodeStr += String.fromCharCode(unicode)
pos += 3

} else if ((flag & 0xC0) === 0xC0) { //110
unicode = (utf8Bytes[pos] & 0x3F) << 6
unicode |= (utf8Bytes[pos + 1] & 0x3F)
unicodeStr += String.fromCharCode(unicode)
pos += 2

} else {
unicodeStr += String.fromCharCode(utf8Bytes[pos])
pos += 1
}
}
return unicodeStr
}
export function SM4Util() {
// 和后端key一致
// 当时用CBC模式的时候
this.iv = "ZkR_SiNoSOFT=568"
this.hexString = false

// ECB模式加密
this.encryptData_ECB = function(plainText) {
try {
const sm4 = new SM4()
const ctx = new SM4_Context()
ctx.isPadding = true
ctx.mode = sm4.SM4_ENCRYPT
const keyBytes = this.stringToByte(this.secretKey)
sm4.sm4_setkey_enc(ctx, keyBytes)
const encrypted = sm4.sm4_crypt_ecb(ctx, this.stringToByte(plainText))
const cipherText = base64js.fromByteArray(encrypted)
if (cipherText != null && cipherText.trim().length > 0) {
cipherText.replace(/(\s*|\t|\r|\n)/g, "")
}
return cipherText
} catch (e) {
console.error(e)
return null
}
}
//解密_ECB
this.decryptData_ECB = function(cipherText) {
try {
let sm4 = new SM4()
let ctx = new SM4_Context()
ctx.isPadding = true
ctx.mode = sm4.SM4_ENCRYPT
let keyBytes = this.stringToByte(this.secretKey)
sm4.sm4_setkey_dec(ctx, keyBytes)
let decrypted = sm4.sm4_crypt_ecb(ctx, base64js.toByteArray(cipherText))
return utf8ByteToUnicodeStr(decrypted)
} catch (e) {
console.error(e)
return null
}
}

// CBC模式加密
this.encryptData_CBC = function(plainText, secretKey) {
try {
plainText = JSON.stringify(plainText)
const sm4 = new SM4()
const ctx = new SM4_Context()
ctx.isPadding = true
ctx.mode = sm4.SM4_ENCRYPT

const keyBytes = this.stringToByte(secretKey.substring(0, 16))
const ivBytes = this.stringToByte(this.iv)

sm4.sm4_setkey_enc(ctx, keyBytes)
const encrypted = sm4.sm4_crypt_cbc(ctx, ivBytes, this.stringToByte(plainText))
const cipherText = base64js.fromByteArray(encrypted)
if (cipherText != null && cipherText.trim().length > 0) {
cipherText.replace(/(\s*|\t|\r|\n)/g, "")
}
return cipherText
} catch (e) {
console.error(e)
return null
}
}
//解密_CBC
this.decryptData_CBC = function(cipherText, secretKey) {
try {
let sm4 = new SM4()
let ctx = new SM4_Context()
ctx.isPadding = true
ctx.mode = sm4.SM4_ENCRYPT
let keyBytes = this.stringToByte(secretKey.substring(0, 16))
let ivBytes = this.stringToByte(this.iv)
sm4.sm4_setkey_dec(ctx, keyBytes)
let decrypted = sm4.sm4_crypt_cbc(ctx, ivBytes, base64js.toByteArray(cipherText.data.bizContent))
let bizContent = utf8ByteToUnicodeStr(decrypted)
// let begin = bizContent.indexOf('{');
// let end = bizContent.lastIndexOf('}');
// cipherText.data.bizContent = bizContent.substring(begin,end+1)
cipherText.data.bizContent = bizContent;
return cipherText
} catch (e) {
console.error(e)
return null
}
}

this.stringToByte = function(str) {
const bytes = []
let len, c
len = str.length
for (let i = 0; i < len; i++) {
c = str.charCodeAt(i)
if (c >= 0x010000 && c <= 0x10FFFF) {
bytes.push(((c >> 18) & 0x07) | 0xF0)
bytes.push(((c >> 12) & 0x3F) | 0x80)
bytes.push(((c >> 6) & 0x3F) | 0x80)
bytes.push((c & 0x3F) | 0x80)
} else if (c >= 0x000800 && c <= 0x00FFFF) {
bytes.push(((c >> 12) & 0x0F) | 0xE0)
bytes.push(((c >> 6) & 0x3F) | 0x80)
bytes.push((c & 0x3F) | 0x80)
} else if (c >= 0x000080 && c <= 0x0007FF) {
bytes.push(((c >> 6) & 0x1F) | 0xC0)
bytes.push((c & 0x3F) | 0x80)
} else {
bytes.push(c & 0xFF)
}
}
return bytes
}


this.byteToString = function(arr) {
if (typeof arr === 'string') {
return arr
}
let str = '',
_arr = arr
for (let i = 0; i < _arr.length; i++) {
const one = _arr[i].toString(2),
v = one.match(/^1+?(?=0)/)
if (v && one.length === 8) {
const bytesLength = v[0].length
let store = _arr[i].toString(2).slice(7 - bytesLength)
for (let st = 1; st < bytesLength; st++) {
store += _arr[st + i].toString(2).slice(2)
}
str += String.fromCharCode(parseInt(store, 2))
i += bytesLength - 1
} else {
str += String.fromCharCode(_arr[i])
}
}
return str
}

function utf8ByteToUnicodeStr(utf8Bytes) {
var unicodeStr = ""
for (var pos = 0; pos < utf8Bytes.length;) {
var flag = utf8Bytes[pos]
var unicode = 0
if ((flag >>> 7) === 0) {
unicodeStr += String.fromCharCode(utf8Bytes[pos])
pos += 1

} else if ((flag & 0xFC) === 0xFC) {
unicode = (utf8Bytes[pos] & 0x3) << 30
unicode |= (utf8Bytes[pos + 1] & 0x3F) << 24
unicode |= (utf8Bytes[pos + 2] & 0x3F) << 18
unicode |= (utf8Bytes[pos + 3] & 0x3F) << 12
unicode |= (utf8Bytes[pos + 4] & 0x3F) << 6
unicode |= (utf8Bytes[pos + 5] & 0x3F)
unicodeStr += String.fromCharCode(unicode)
pos += 6

} else if ((flag & 0xF8) === 0xF8) {
unicode = (utf8Bytes[pos] & 0x7) << 24
unicode |= (utf8Bytes[pos + 1] & 0x3F) << 18
unicode |= (utf8Bytes[pos + 2] & 0x3F) << 12
unicode |= (utf8Bytes[pos + 3] & 0x3F) << 6
unicode |= (utf8Bytes[pos + 4] & 0x3F)
unicodeStr += String.fromCharCode(unicode)
pos += 5

} else if ((flag & 0xF0) === 0xF0) {
unicode = (utf8Bytes[pos] & 0xF) << 18
unicode |= (utf8Bytes[pos + 1] & 0x3F) << 12
unicode |= (utf8Bytes[pos + 2] & 0x3F) << 6
unicode |= (utf8Bytes[pos + 3] & 0x3F)
unicodeStr += String.fromCharCode(unicode)
pos += 4

} else if ((flag & 0xE0) === 0xE0) {
unicode = (utf8Bytes[pos] & 0x1F) << 12;;
unicode |= (utf8Bytes[pos + 1] & 0x3F) << 6
unicode |= (utf8Bytes[pos + 2] & 0x3F)
unicodeStr += String.fromCharCode(unicode)
pos += 3

} else if ((flag & 0xC0) === 0xC0) { //110
unicode = (utf8Bytes[pos] & 0x3F) << 6
unicode |= (utf8Bytes[pos + 1] & 0x3F)
unicodeStr += String.fromCharCode(unicode)
pos += 2

} else {
unicodeStr += String.fromCharCode(utf8Bytes[pos])
pos += 1
}
}
return unicodeStr
}
}

Loading…
İptal
Kaydet