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.

deviceInfo.vue 15KB

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