Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569
  1. <template>
  2. <view class="wrapper">
  3. <view class="info-card">
  4. <view class="title">卡信息</view>
  5. <view class="cell">
  6. <view class="cell-left">卡号</view>
  7. <view class="cell-right">{{ card.cardNo }}</view>
  8. </view>
  9. <view class="cell" v-if="card.startTime">
  10. <view class="cell-left">启用时间</view>
  11. <view class="cell-right">{{ card.startTime }}</view>
  12. </view>
  13. <view class="cell" v-if="card.endTime">
  14. <view class="cell-left">结束时间</view>
  15. <view class="cell-right">{{ card.endTime }}</view>
  16. </view>
  17. <!-- <view class="cell">
  18. <view class="cell-left">用户姓名</view>
  19. <view class="cell-right">{{ card.userName }}</view>
  20. </view>
  21. <view class="cell">
  22. <view class="cell-left">身份证号</view>
  23. <view class="cell-right">{{ card.idNum }}</view>
  24. </view>
  25. <view class="cell">
  26. <view class="cell-left">车辆类型</view>
  27. <view class="cell-right">{{ card.type }}</view>
  28. </view>
  29. <view class="cell">
  30. <view class="cell-left">车辆用户类型</view>
  31. <view class="cell-right">{{ card.v_userType }}</view>
  32. </view>
  33. <view class="cell">
  34. <view class="cell-left">车牌号</view>
  35. <view class="cell-right">{{ card.vehiclePlate }}</view>
  36. </view>
  37. <view class="cell">
  38. <view class="cell-left">车牌颜色</view>
  39. <view class="cell-right">{{ card.color }}</view>
  40. </view>
  41. <view class="cell">
  42. <view class="cell-left">启用时间</view>
  43. <view class="cell-right">{{ card.startTime }}</view>
  44. </view>
  45. <view class="cell">
  46. <view class="cell-left">结束时间</view>
  47. <view class="cell-right">{{ card.endTime }}</view>
  48. </view>
  49. <view class="cell">
  50. <view class="cell-left">卡签绑定</view>
  51. <view class="cell-right">{{ card.favourable }}</view>
  52. </view>
  53. <view class="cell">
  54. <view class="cell-left">校验值</view>
  55. <view class="cell-right">{{ card.money }}</view>
  56. </view>
  57. <view class="cell">
  58. <view class="cell-left">版本号</view>
  59. <view class="cell-right">{{ card.version }}</view>
  60. </view>
  61. <view class="cell" v-if="state.cardStatus">
  62. <view class="cell-left">卡状态</view>
  63. <view class="cell-right">{{getCodeName('CARD_STATE_TYPE',state.cardStatus)}}</view>
  64. </view>
  65. <view class="cell" v-if="state.cardTypeName">
  66. <view class="cell-left">卡类型</view>
  67. <view class="cell-right">{{state.cardTypeName}}</view>
  68. </view> -->
  69. </view>
  70. <view class="info-card">
  71. <view class="title">OBU信息</view>
  72. <view class="cell">
  73. <view class="cell-left">obu号</view>
  74. <view class="cell-right">{{ obu.num }}</view>
  75. </view>
  76. <view class="cell">
  77. <view class="cell-left">车辆类型</view>
  78. <view class="cell-right">{{ obu.type }}</view>
  79. </view>
  80. <view class="cell">
  81. <view class="cell-left">车辆用户类型</view>
  82. <view class="cell-right">{{ obu.userType }}</view>
  83. </view>
  84. <view class="cell">
  85. <view class="cell-left">车牌号</view>
  86. <view class="cell-right">{{ obu.vehiclePlate }}</view>
  87. </view>
  88. <view class="cell">
  89. <view class="cell-left">车牌颜色</view>
  90. <view class="cell-right">{{ obu.vehiclePlateColor }}</view>
  91. </view>
  92. <view class="cell">
  93. <view class="cell-left">核定载人数</view>
  94. <view class="cell-right">{{ obu.approvedCount }}</view>
  95. </view>
  96. <view class="cell" v-if="obu.vin">
  97. <view class="cell-left">车辆识别代号</view>
  98. <view class="cell-right">{{ obu.vin }}</view>
  99. </view>
  100. <view class="cell">
  101. <view class="cell-left">车轴数</view>
  102. <view class="cell-right">{{ obu.axleCount }}</view>
  103. </view>
  104. <view class="cell">
  105. <view class="cell-left">车轮数</view>
  106. <view class="cell-right">{{ obu.wheelCount }}</view>
  107. </view>
  108. <view class="cell">
  109. <view class="cell-left">轴距</view>
  110. <view class="cell-right">{{ obu.axleDistance }}</view>
  111. </view>
  112. <view class="cell">
  113. <view class="cell-left">外廓尺寸</view>
  114. <view class="cell-right">{{ obu.outsideDimensions }}mm</view>
  115. </view>
  116. <view class="cell" v-if="obu.startTime">
  117. <view class="cell-left">启用时间</view>
  118. <view class="cell-right">{{ obu.startTime }}</view>
  119. </view>
  120. <view class="cell" v-if="obu.endTime">
  121. <view class="cell-left">结束时间</view>
  122. <view class="cell-right">{{ obu.endTime }}</view>
  123. </view>
  124. </view>
  125. <view class="btn" @click="back">返回订单列表</view>
  126. </view>
  127. </template>
  128. <script setup>
  129. import {
  130. getCodeName
  131. } from "@/datas/queryKey.js";
  132. import {
  133. reactive
  134. } from "vue";
  135. import {
  136. onLoad,
  137. onUnload
  138. } from "@dcloudio/uni-app";
  139. import {
  140. request,requestNew
  141. } from "@/utils/network/request";
  142. import {
  143. decrypt9901,
  144. cardList,
  145. searchObuInfo,
  146. getOpenId
  147. } from "@/utils/network/api";
  148. import {
  149. stringToJson
  150. } from "@/utils/network/encryption";
  151. import {
  152. HexToStrig,
  153. hexStringToByteArray,
  154. HexToInt
  155. } from "@/utils/util/fileData.js";
  156. import {
  157. getVehicleType
  158. } from "@/subpackage/carPark/js/vehicleType.js"
  159. import {
  160. getVehiclePlateColor
  161. } from "@/datas/vehiclePlateColor.js"
  162. import {
  163. getItem
  164. } from "@/utils/storage";
  165. const cmd = require("../../../static/etcUtil/cmdConfig.js");
  166. const tools = require("../../../static/etcUtil/tools.js");
  167. const datas = require("../../../static/etcUtil/datas.js");
  168. const bluetoothUtil = require("../../../static/etcUtil/index.js");
  169. // let jyApiEtc = require("../../../static/etc/JYAPI-ETC/jy-bluetooth-obu-wechatmp.js"); //前装-金溢
  170. const card = reactive({
  171. cardNo: "",
  172. startTime: "",
  173. endTime: "",
  174. userName: "",
  175. idNum: "",
  176. vehiclePlate: "",
  177. vehiclePlateColor: "",
  178. color: "",
  179. version: "",
  180. type: "",
  181. favourable: "",
  182. money: "",
  183. v_userType: "",
  184. })
  185. const obu = reactive({
  186. num: "",
  187. startTime: "",
  188. endTime: "",
  189. version: "",
  190. approvedCount: "",
  191. axleCount: "",
  192. axleDistance: "",
  193. engineNum: "",
  194. type: "",
  195. userType: "",
  196. vehiclePlate: "",
  197. vehiclePlateColor: "",
  198. vin: "",
  199. wheelCount: "",
  200. isJH: "",
  201. outsideDimensions: "",
  202. })
  203. const state = reactive({
  204. vehicleId: "",
  205. obuStatus: "",
  206. cardStatus: "",
  207. cardTypeName: "",
  208. openid:""
  209. })
  210. onLoad((option) => {
  211. // #ifdef MP-WEIXIN
  212. getOpenID();/*传参*/
  213. // #endif
  214. getCardId()
  215. })
  216. //获取微信小程序openid
  217. const getOpenID = () => {
  218. uni.login({
  219. provider: "weixin",
  220. success: function (e) {
  221. getOpenid(e.code);
  222. },
  223. fail: function () {
  224. msg("获取不到oppenId,请检查AppID和Secret是否争取");
  225. },
  226. });
  227. };
  228. const getOpenid = (code) => {
  229. const options = {
  230. type: 2,
  231. data: {
  232. "jsCode": code
  233. },
  234. method: "POST",
  235. showLoading: true,
  236. };
  237. // #ifdef MP-WEIXIN
  238. requestNew(getOpenId, options).then((res) => {
  239. const result = res;
  240. console.log("获取微信小程序openid", result);
  241. const openidData = stringToJson(result.data);
  242. state.openid = openidData.openid
  243. });
  244. // #endif
  245. }
  246. /**
  247. * 获取卡号
  248. */
  249. const getCardId = () => {
  250. //执行0015文件
  251. tools.showLoadingAlert("执行指令");
  252. // if (datas.getData("deviceName").includes("JY")) {
  253. // jyApiEtc.getCardInfo(function(res) {
  254. // if (res.code == '0') {
  255. // var cardInfo = res.cardInfo;
  256. // console.log("res.cardInfo", res.cardInfo)
  257. // card.cardNo = cardInfo.cardId;
  258. // card.startTime = cardInfo.signedDate;
  259. // card.endTime = cardInfo.expiredDate;
  260. // // message = "卡片方标识:" + cardInfo.provider + " 卡片类型:" + cardInfo.cardType + " 卡片版本号:" +
  261. // // cardInfo.cardVersion + " 卡号:" + cardInfo.cardId + " 启用时间:" +
  262. // // cardInfo.signedDate + " 到期时间:" + cardInfo.expiredDate + " 车牌号:" + cardInfo
  263. // // .vehicleNumber +
  264. // // " 用户类型:" + cardInfo.userType + " 车牌颜色:" + cardInfo.plateColor + " 车型:" + cardInfo
  265. // // .vehicleModel;
  266. // getObuId();
  267. // } else {
  268. // tools.alertF("获取卡片信息失败" + res.code);
  269. // }
  270. // })
  271. // } else {
  272. let cmdArr = [cmd.HOME_DIRECTORY, cmd.APPLICATION_DIRECTORY, "00B095002B"];
  273. console.log(cmdArr);
  274. console.log(bluetoothUtil);
  275. bluetoothUtil.transCmd(cmdArr, '10', function(res) { //10:写卡 20:写OBU
  276. console.log("res====", res)
  277. var cardStr = res[2];
  278. if (cardStr == undefined || cardStr == "undefined" || cardStr == "") {
  279. tools.alertF("卡指令不符" + cardStr);
  280. return;
  281. }
  282. if (cardStr.length < 40) {
  283. tools.alertF("卡指令长度不符" + cardStr);
  284. return;
  285. }
  286. card.cardNo = cardStr.substring(24, 40)
  287. getObuId();
  288. return;
  289. let str = res[2].substring(res[2].length - 4, res[2].length); //判断是否为9000
  290. let str3 = res[3].substring(res[3].length - 4, res[3].length); //判断是否为9000
  291. if (str == "9000" || str3 == "9000") {
  292. if (res[2].length > 86 || res[3] >= 12) {
  293. console.log("res[2]", res[2].substring(84, 86), getVehiclePlateColor(parseInt(res[2]
  294. .substring(82, 84), 16)), res[2].substring(18, 19))
  295. card.cardNo = res[2].substring(20, 40);
  296. card.startTime = res[2].substring(40, 48);
  297. card.endTime = res[2].substring(48, 56);
  298. card.version = res[2].substring(18, 19) >= 4 ? "4x" : "2x";
  299. card.money = res[3].substring(0, 8);
  300. card.v_userType = parseInt(res[2].substring(80, 82), 16);
  301. console.log("card.v_userType", card.v_userType)
  302. card.vehiclePlate = HexToStrig(res[2].substring(56, 80));
  303. if (res[2].substring(18, 19) >= 4) {
  304. //4x卡
  305. card.type = getVehicleType(parseInt(res[2].substring(84, 86), 16));
  306. // card.vehiclePlateColor = parseInt(res[2].substring(82, 84), 16);
  307. card.color = getVehiclePlateColor(parseInt(res[2].substring(82, 84), 16))
  308. } else {
  309. //2x卡--获取车牌颜色
  310. card.type = "--";
  311. // card.vehiclePlateColor = parseInt(res[2].substring(82, 84), 16);
  312. card.color = getVehiclePlateColor(parseInt(res[2].substring(82, 86), 16))
  313. }
  314. state.vehicleId = card.vehiclePlate + "_" + parseInt(res[2].substring(82, 84), 16)
  315. console.log("card.color===========", card.vehiclePlate, parseInt(res[2].substring(82,
  316. 84),
  317. 16))
  318. // 读卡信息
  319. getCardList()
  320. //执行0016文件
  321. let arr = [cmd.HOME_DIRECTORY, cmd.PERSONAL_INFORMATION]
  322. bluetoothUtil.transCmd(arr, '10', function(res) {
  323. let str2 = res[1].substring(res[1].length - 4, res[1].length);
  324. if (str2 == "9000") {
  325. if (res[1].length > 108) {
  326. card.userName = HexToStrig(res[1].substring(4, 44)); //姓名
  327. card.userName = card.userName[0] + '*'.repeat(card.userName
  328. .length - 1)
  329. card.idNum = HexToStrig(res[1].substring(44, 108)).replace(
  330. /^\d{14}/,
  331. '**************'); //身份证号码
  332. //获取是否有优惠
  333. let cmdArr3 = [cmd.HOME_DIRECTORY, cmd.APPLICATION_DIRECTORY, cmd
  334. .CMD_00B08E0000
  335. ];
  336. bluetoothUtil.transCmd(cmdArr3, '10', function(res) {
  337. let str3 = res[2].substring(res[2].length - 4, res[2]
  338. .length);
  339. if (str3 == "9000") {
  340. if (res[2].length > 131) {
  341. let _str = parseInt(res[2].substring(129, 130),
  342. 16);
  343. switch (_str) {
  344. case 0:
  345. card.favourable = "否";
  346. break;
  347. case 1:
  348. card.favourable = "是";
  349. break;
  350. default:
  351. card.favourable = '未知' + "_" + _str;
  352. break;
  353. }
  354. //回调读取OBU指令
  355. getObuId()
  356. tools.hideLoadingAlert();
  357. } else {
  358. alertF("CMD_00B08E0000指令长度不符" + res[2]);
  359. }
  360. return;
  361. }
  362. alertF(cmd.PERSONAL_INFORMATION + "_" + str);
  363. })
  364. } else {
  365. alertF("PERSONAL_INFORMATION指令长度不符" + res[1]);
  366. }
  367. return;
  368. }
  369. alertF("PERSONAL_INFORMATION指令长度不符" + res[1]);
  370. })
  371. } else {
  372. alertF("CMD_READBINARY指令长度不符" + res[2]);
  373. }
  374. return;
  375. }
  376. alertF("CMD_READBINARY指令长度不符" + res[2]);
  377. })
  378. // }
  379. };
  380. /**
  381. * 获取OBU号
  382. */
  383. const getObuId = () => {
  384. tools.showLoadingAlert("执行指令");
  385. // if (datas.getData("deviceName").includes("JY")) {
  386. // jyApiEtc.getSystemInfo(function(res) {
  387. // console.log("获取OBU===", res)
  388. // if (res.code == 0) {
  389. // obu.num = res.systemInfo.serialNumber
  390. // obu.startTime = res.systemInfo.signedDate
  391. // obu.endTime = res.systemInfo.expiredDate
  392. // } else {
  393. // tools.alertF("获取OBU信息失败");
  394. // }
  395. // });
  396. // } else {
  397. let cmdArr = [cmd.HOME_DIRECTORY, cmd.OBU_SYSTEM_FILE];
  398. bluetoothUtil.transCmd(cmdArr, '20', function(res) {
  399. var obuStr = res[1];
  400. if (obuStr == undefined || obuStr == "undefined" || obuStr == "") {
  401. tools.alertF("OBU指令不符" + obuStr);
  402. return;
  403. }
  404. if (obuStr.length < 36) {
  405. tools.alertF("OBU指令长度不符" + obuStr);
  406. return;
  407. }
  408. obu.num = obuStr.substring(20, 36)
  409. let rand = datas.generateMixed(16);
  410. let arr = [cmd.OBU_DF01, cmd.OBU_00B400000A + rand + cmd.OBU_4F00];
  411. bluetoothUtil.transCmd(arr, '20', function(res) {
  412. console.log("解密信息kc没问题", res);
  413. let str2 = res[1].substring(res[1].length - 4, res[1].length);
  414. if (str2 == "9000") {
  415. console.log("===========", obu.num, res[1].substring(0, res[1].length -
  416. 4))
  417. decryptObuVehicleInfo(obu.num, res[1].substring(0, res[1].length - 4),function(res) {
  418. console.log("res---",res)
  419. obu.approvedCount =res.approvedCount;
  420. obu.axleCount = res.axleCount;
  421. obu.axleDistance = res.axleDistance;
  422. obu.type = getVehicleType(res.type);
  423. obu.userType = res.userType == 0 ?"个人用户" :"单位用户";
  424. obu.vehiclePlate =res.plateNum;
  425. //获取车牌颜色
  426. obu.vehiclePlateColor = getVehiclePlateColor(res.plateColor);
  427. obu.vin = res.vin;
  428. obu.wheelCount = res.wheelCount;
  429. obu.outsideDimensions = res.outsideDimensions
  430. tools.hideLoadingAlert();
  431. });
  432. bluetoothUtil.disconnectDevice();
  433. tools.showToastAlert("蓝牙已断开");
  434. console.log('蓝牙已断开=========')
  435. return;
  436. }
  437. })
  438. })
  439. // }
  440. };
  441. /**
  442. * 解密OBU车辆信息
  443. */
  444. const decryptObuVehicleInfo = (num, data, func) => {
  445. const options = {
  446. type: 2,
  447. data: {
  448. obuId: num,
  449. encryptedInfo: data,
  450. wxOpenId:getItem("mobile")
  451. },
  452. method: "POST",
  453. showLoading: true,
  454. };
  455. request(decrypt9901, options).then((res) => {
  456. const data = stringToJson(res.bizContent)
  457. console.log("decrypt9901",data)
  458. const FileData = JSON.parse(data.data)
  459. func(FileData)
  460. });
  461. };
  462. //返回按钮
  463. const back = () => {
  464. uni.$emit("refreshOrder");
  465. uni.switchTab({
  466. url: "/pages/order/order"
  467. })
  468. }
  469. //提示对话框
  470. const alertF = (msg) => {
  471. //隐藏加载框
  472. tools.hideLoadingAlert();
  473. //提示对话框
  474. tools.showModalAlert(msg);
  475. }
  476. const getCardList = () => {
  477. var data = {
  478. vehicleId: state.vehicleId
  479. };
  480. const options = {
  481. type: 2,
  482. data: data,
  483. method: "POST",
  484. showLoading: true,
  485. };
  486. request(cardList, options).then((res) => {
  487. let result = stringToJson(res.bizContent);
  488. state.cardStatus = result.data[0].cardStatus
  489. if (result.data[0].cardType == 1 && result.data[0].debitType == 1) {
  490. state.cardTypeName = "预存卡"
  491. } else if (result.data[0].cardType == 2) {
  492. state.cardTypeName = "储值卡"
  493. } else {
  494. state.cardTypeName = "记账卡"
  495. }
  496. console.log("152", result)
  497. })
  498. }
  499. </script>
  500. <style scoped>
  501. .wrapper {
  502. padding-bottom: 50rpx;
  503. }
  504. .info-card {
  505. margin: 30rpx;
  506. border-radius: 16rpx;
  507. padding-bottom: 40rpx;
  508. box-shadow: 0rpx 6rpx 25rpx 0rpx rgba(0, 0, 0, 0.3);
  509. }
  510. .info-card .title {
  511. padding: 30rpx 0;
  512. font-size: 36rpx;
  513. text-align: center;
  514. color: #13E7C1;
  515. }
  516. .info-card .cell {
  517. display: flex;
  518. flex-direction: row;
  519. padding: 15rpx 40rpx;
  520. font-size: 30rpx;
  521. }
  522. .cell-left {
  523. flex: 1;
  524. text-align: left;
  525. color: #666;
  526. }
  527. .cell-right {
  528. margin-left: 30rpx;
  529. text-align: right;
  530. color: #333;
  531. overflow: hidden;
  532. }
  533. .btn {
  534. background: linear-gradient(to right, #13E7C1, #43A1E0);
  535. opacity: 1;
  536. border-radius: 100rpx;
  537. color: #fff;
  538. font-size: 30rpx;
  539. height: 80rpx;
  540. line-height: 80rpx;
  541. box-shadow: 0rpx 4rpx 11rpx 1rpx rgba(223, 223, 223, 0.5);
  542. width: 670rpx;
  543. margin: 40rpx;
  544. text-align: center;
  545. }
  546. </style>