You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

etcDeviceInfo.vue 16KB

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