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.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610
  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.userNameStr }}</view>
  12. </view>
  13. <view class="cell">
  14. <view class="cell-left">身份证号</view>
  15. <view class="cell-right">{{ card.idNumStr }}</view>
  16. </view>
  17. <view class="cell">
  18. <view class="cell-left">车辆类型</view>
  19. <view class="cell-right">{{ card.typeStr }}</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.colorStr }}</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.favourableStr }}</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.typeStr }}</view>
  67. </view>
  68. <view class="cell">
  69. <view class="cell-left">车辆用户类型</view>
  70. <view class="cell-right">{{ obu.userTypeStr }}</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.vehiclePlateColorStr }}</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.isJHStr }}</view>
  119. </view>
  120. <view class="cell">
  121. <view class="cell-left">拆卸状态</view>
  122. <view class="cell-right">{{obu.loadStatus=='01'?'正常':'已拆卸'}}</view>
  123. </view>
  124. <view class="cell">
  125. <view class="cell-left">版本号</view>
  126. <view class="cell-right">{{ obu.version }}</view>
  127. </view>
  128. <view class="cell" v-if="state.obuStatus">
  129. <view class="cell-left">签状态</view>
  130. <view class="cell-right">{{getCodeName('OBU_STATE_TYPE',state.obuStatus)}}</view>
  131. </view>
  132. </view>
  133. <view class="btn" @click="back">返回</view>
  134. </view>
  135. </template>
  136. <script setup>
  137. import {
  138. getCodeName
  139. } from "@/datas/queryKey.js";
  140. import {
  141. reactive
  142. } from "vue";
  143. import {
  144. onLoad,
  145. onUnload
  146. } from "@dcloudio/uni-app";
  147. import {
  148. requestNew
  149. } from "@/utils/network/request";
  150. import {cardObuQuery,obuFileDataDecrypt,cardObuQueryinLog, saveRecord} from "@/utils/network/api";
  151. import {
  152. getVehicleType
  153. } from "@/subpackage/after-sale/js/vehicleType.js"
  154. import {
  155. getVehiclePlateColor
  156. } from "@/datas/vehiclePlateColor.js"
  157. import {
  158. decryptCardVehicleInformation
  159. } from "@/datas/publicRequest";
  160. const cmd = require("../../../static/etcUtil/cmdConfig.js");
  161. const tools = require("../../../static/etcUtil/tools.js");
  162. const datas = require("../../../static/etcUtil/datas.js");
  163. const bluetoothUtil = require("../../../static/etcUtil/index.js");
  164. const card = reactive({
  165. cardNo: "",
  166. startTime: "",
  167. endTime: "",
  168. userName: "",
  169. userNameStr:"",
  170. idNum: "",
  171. idNumStr:"",
  172. vehiclePlate: "",
  173. vehiclePlateColor: "",
  174. color: "",
  175. colorStr:"",
  176. version: "",
  177. type: "",
  178. typeStr:"",
  179. favourable: "",
  180. favourableStr:"",
  181. money: "",
  182. v_userType: ""
  183. })
  184. const obu = reactive({
  185. num: "",
  186. startTime: "",
  187. endTime: "",
  188. version: "",
  189. approvedCount: "",
  190. axleCount: "",
  191. axleDistance: "",
  192. engineNum: "",
  193. type: "",
  194. typeStr:"",
  195. userType: "",
  196. userTypeStr:"",
  197. vehiclePlate: "",
  198. vehiclePlateColor: "",
  199. vehiclePlateColorStr:"",
  200. vin: "",
  201. wheelCount: "",
  202. isJH: "",
  203. isJHStr: "",
  204. outsideDimensions: "",
  205. loadStatus:""
  206. })
  207. const state = reactive({
  208. vehicleId: "",
  209. obuStatus: "",
  210. cardStatus: "",
  211. cardTypeName: "",
  212. backIndex:""
  213. })
  214. onLoad((option) => {
  215. state.backIndex=option.backIndex
  216. getCardId()
  217. })
  218. /**
  219. * 获取卡号
  220. */
  221. const getCardId = () => {
  222. //执行0015文件
  223. tools.showLoadingAlert("执行指令");
  224. let cmdArr = [cmd.HOME_DIRECTORY, cmd.APPLICATION_DIRECTORY, cmd.CMD_READBINARY, cmd.CMD_GETBALANCE];
  225. console.log(cmdArr);
  226. console.log(bluetoothUtil);
  227. bluetoothUtil.transCmd(cmdArr, '10', function(res) { //10:写卡 20:写OBU
  228. console.log("5201",res)
  229. let str = res[2].substring(res[2].length - 4, res[2].length); //判断是否为9000
  230. let str3 = res[3].substring(res[3].length - 4, res[3].length); //判断是否为9000
  231. if (str == "9000" || str3 == "9000") {
  232. if (res[2].length > 86 || res[3] >= 12) {
  233. console.log("res[2]", res[2].substring(84, 86), getVehiclePlateColor(parseInt(res[2]
  234. .substring(82, 84), 16)), res[2].substring(18, 19))
  235. card.cardNo = res[2].substring(20, 40);
  236. card.startTime = res[2].substring(40, 48);
  237. card.endTime = res[2].substring(48, 56);
  238. card.version = res[2].substring(18, 20);
  239. card.money = res[3].substring(0, 8);
  240. card.v_userType = parseInt(res[2].substring(80, 82), 16);
  241. console.log("card.v_userType", card.v_userType)
  242. decryptCardVehicleInformation(res[2].substring(56, 80), function (res) {
  243. card.vehiclePlate =res;
  244. });
  245. console.log("res[2].substring(18, 19)",res[2].substring(18, 20))
  246. if (res[2].substring(18, 19) >= 4) {
  247. //4x卡
  248. card.type = parseInt(res[2].substring(84, 86), 16);
  249. card.typeStr = getVehicleType(parseInt(res[2].substring(84, 86), 16));
  250. card.color = parseInt(res[2].substring(82, 84), 16)
  251. card.colorStr = getVehiclePlateColor(parseInt(res[2].substring(82, 84), 16))
  252. } else {
  253. //2x卡--获取车牌颜色
  254. card.type = "--";
  255. card.color =parseInt(res[2].substring(82, 84), 16)
  256. card.colorStr = getVehiclePlateColor(parseInt(res[2].substring(82, 84), 16))
  257. card.typeStr = getVehicleType(parseInt(res[2].substring(84, 86), 16));
  258. }
  259. state.vehicleId = card.vehiclePlate + "_" + parseInt(res[2].substring(82, 84), 16)
  260. // 读卡信息
  261. // getCardList()
  262. //执行0016文件
  263. let arr = [cmd.HOME_DIRECTORY, cmd.PERSONAL_INFORMATION]
  264. bluetoothUtil.transCmd(arr, '10', function(res) {
  265. let str2 = res[1].substring(res[1].length - 4, res[1].length);
  266. if (str2 == "9000") {
  267. if (res[1].length > 108) {
  268. console.log("res====",res)
  269. decryptCardVehicleInformation(res[1].substring(4, 44), function (res) {
  270. card.userName = res; //姓名
  271. card.userNameStr = card.userName[0] + '*'.repeat(card.userName.length - 1)
  272. });
  273. decryptCardVehicleInformation(res[1].substring(44, 108), function (res) {
  274. card.idNum = res; //身份证号码
  275. card.idNumStr=res.replace(/^\d{14}/,'**************')
  276. });
  277. //获取是否有优惠
  278. let cmdArr3 = [cmd.HOME_DIRECTORY, cmd.APPLICATION_DIRECTORY, cmd
  279. .CMD_00B08E0000
  280. ];
  281. bluetoothUtil.transCmd(cmdArr3, '10', function(res) {
  282. let str3 = res[2].substring(res[2].length - 4, res[2]
  283. .length);
  284. if (str3 == "9000") {
  285. if (res[2].length > 131) {
  286. let _str = parseInt(res[2].substring(129, 130),
  287. 16);
  288. card.favourable=_str
  289. switch (_str) {
  290. case 0:
  291. card.favourableStr = "否";
  292. break;
  293. case 1:
  294. card.favourableStr = "是";
  295. break;
  296. default:
  297. card.favourableStr = '未知' + "_" + _str;
  298. break;
  299. }
  300. //回调读取OBU指令
  301. getObuId()
  302. tools.hideLoadingAlert();
  303. } else {
  304. alertF("CMD_00B08E0000指令长度不符" + res[2]);
  305. }
  306. return;
  307. }
  308. alertF(cmd.PERSONAL_INFORMATION + "_" + str);
  309. })
  310. } else {
  311. alertF("PERSONAL_INFORMATION指令长度不符" + res[1]);
  312. }
  313. return;
  314. }
  315. alertF("PERSONAL_INFORMATION指令长度不符" + res[1]);
  316. })
  317. } else {
  318. alertF("CMD_READBINARY指令长度不符" + res[2]);
  319. }
  320. return;
  321. }
  322. alertF("CMD_READBINARY指令长度不符" + res[2]);
  323. })
  324. };
  325. /**
  326. * 获取OBU号
  327. */
  328. const getObuId = () => {
  329. tools.showLoadingAlert("执行指令");
  330. let cmdArr = [cmd.HOME_DIRECTORY, cmd.OBU_SYSTEM_FILE];
  331. bluetoothUtil.transCmd(cmdArr, '20', function(res) {
  332. let str = res[1].substring(res[1].length - 4, res[1].length);
  333. if (str == "9000") {
  334. if (res[1].length > 52) {
  335. obu.num = res[1].substring(20, 36);
  336. obu.startTime = res[1].substring(36, 44);
  337. obu.endTime = res[1].substring(44, 52);
  338. obu.version = res[1].substring(18, 20);
  339. obu.isJH = res[1].substring(53, 54)
  340. obu.isJHStr = res[1].substring(53, 54) == "1" ? "是" : res[1].substring(53, 54) == "0" ?
  341. "否" : "其他:" + res[1].substring(53, 54);
  342. obu.loadStatus=res[1].substring(52, 54)=='01'?'正常':'已拆卸',
  343. console.log("开始执行车辆信息识读");
  344. let rand = res[1].substring(18, 20) >= 50?'40':'00';
  345. var arr = [cmd.OBU_DF01, '00B400000A000000000000000045'+ rand];
  346. bluetoothUtil.transCmd(arr, '20', function(res) {
  347. console.log(res);
  348. console.log("开始执行车辆信息识读成功");
  349. let str2 = res[1].substring(res[1].length - 4, res[1].length);
  350. let obuVersion = res[1].substring(18, 20);
  351. let keyIndex = obuVersion > 50 ? '40' : '00';
  352. let reqType = '00';
  353. let proviceCode = '5201';
  354. if (str2 == "9000") {
  355. console.log("===========", obu.num, res[1].substring(0, res[1].length - 4))
  356. decryptObuVehicleInfo(obu.num, res[1].substring(0, res[1].length - 4),
  357. obuVersion, rand, reqType, proviceCode,
  358. function(res) {
  359. obu.approvedCount = res.approvedCount;
  360. obu.axleCount = res.axleCount;
  361. obu.axleDistance = res.axleDistance;
  362. obu.engineNum = res.engineNumber.replace(/\u0000/g, '');
  363. obu.type = res.collectionType;
  364. obu.typeStr = getVehicleType(res.collectionType);
  365. obu.userType = res.userType;
  366. if(res.userType == 0){
  367. obu.userTypeStr = "普通车" ;
  368. }else if(res.userType == 6){
  369. obu.userTypeStr = "公务车" ;
  370. }
  371. obu.vehiclePlate = res.vehiclePlate.replace(/\u0000/g, '');
  372. //获取车牌颜色
  373. obu.vehiclePlateColor = res.vehiclePlateColor;
  374. obu.vehiclePlateColorStr = getVehiclePlateColor(res.vehiclePlateColor);
  375. obu.vin = res.vin.replace(/\u0000/g, '');
  376. obu.wheelCount = res.wheelsCount;
  377. obu.outsideDimensions = res.carLong + "x" + res.carWidth + "x" + res.carHeight
  378. getObuList();
  379. tools.hideLoadingAlert();
  380. });
  381. //断开蓝牙
  382. bluetoothUtil.disconnectDevice();
  383. tools.showToastAlert("蓝牙已断开");
  384. console.log('蓝牙已断开=========')
  385. return;
  386. }
  387. alertF("OBU_00B400000A+rand+OBU_4F00指令长度不符" + res[1]);
  388. })
  389. } else {
  390. alertF("OBU_SYSTEM_FILE指令长度不符" + res[1]);
  391. }
  392. return;
  393. }
  394. alertF("OBU_SYSTEM_FILE指令长度不符" + res[1]);
  395. })
  396. };
  397. const saveRecordApi = () => {
  398. const options = {
  399. type: 2,
  400. data: {
  401. approvedCount: obu.approvedCount, // 核定载人数
  402. axleCount: obu.axleCount, // 车轴数
  403. axleDistance: obu.axleDistance, // 轴距
  404. bindingFinishStatus: card.favourableStr, // 卡签绑定完成状态
  405. cardEnableTime: card.startTime, // 卡启用时间
  406. cardExpireTime: card.endTime, // 卡过期时间
  407. cardId: card.cardNo, // 卡号
  408. cardVehiclePlate: card.vehiclePlate, // 车牌号码
  409. cardVehiclePlateColor: card.colorStr, // 车牌颜色
  410. cardVehicleType: card.typeStr, // 行驶证车辆类型
  411. cardVersion: card.version, // 卡版本号
  412. checksums: card.money, // 校验值
  413. customerIdNum: card.idNumStr, // 身份证号
  414. customerName: card.userNameStr, // 用户姓名
  415. isActive: state.cardStatus, // 是否激活
  416. loadStatus: obu.loadStatus, // 拆卸状态
  417. obuEnableTime: obu.startTime, // 启用时间
  418. obuExpireTime: obu.endTime, // 到期时间
  419. obuId: obu.num, // obu编号
  420. obuVehicleCustomerType: obu.userTypeStr, // 车辆用户类型
  421. obuVehiclePlate: obu.vehiclePlate, // 车牌号码
  422. obuVehiclePlateColor: obu.vehiclePlateColorStr, // 车牌颜色
  423. obuVehicleType: obu.typeStr, // 行驶证车辆类型
  424. obuVersion: obu.version ,// obu版本号
  425. vehicleDimensions: obu.outsideDimensions, // 外廓尺寸
  426. vehicleEngineNum: obu.engineNum, // 发动机号码
  427. vin: obu.vin, // 车辆识别代码
  428. wheelCount: obu.wheelCount, // 车轮数
  429. },
  430. method: "POST",
  431. showLoading: false,
  432. };
  433. requestNew(saveRecord, options).then((res) => {
  434. console.log("saveRecord", card, obu, state)
  435. });
  436. }
  437. /**
  438. * 解密OBU车辆信息
  439. */
  440. const decryptObuVehicleInfo = (num, data,obuVersion, keyIndex, reqType, proviceCode, func) => {
  441. const options = {
  442. type: 2,
  443. data: {
  444. contractSN: num,
  445. cipherData: data,
  446. reqType: reqType,
  447. keyIndex: keyIndex,
  448. proviceCode: proviceCode
  449. },
  450. method: "POST",
  451. showLoading: true,
  452. };
  453. requestNew(obuFileDataDecrypt, options).then((res) => {
  454. console.log("obuFileDataDecrypt",res)
  455. const data =res
  456. func(data)
  457. });
  458. };
  459. //返回按钮
  460. const back = () => {
  461. uni.$emit("refreshOrder");
  462. if(state.backIndex=="1"){
  463. uni.switchTab({
  464. url: "/pages/index/index"
  465. })
  466. }else{
  467. uni.redirectTo({
  468. url: "/pages/order/order"
  469. })
  470. }
  471. }
  472. //提示对话框
  473. const alertF = (msg) => {
  474. //隐藏加载框
  475. tools.hideLoadingAlert();
  476. //提示对话框
  477. tools.showModalAlert(msg);
  478. }
  479. const getObuList = () => {
  480. var data = {
  481. obuId: obu.num,
  482. cardId:card.cardNo,
  483. };
  484. const options = {
  485. type: 2,
  486. data: data,
  487. method: "POST",
  488. showLoading: true,
  489. };
  490. requestNew(cardObuQuery, options).then((res) => {
  491. tools.hideLoadingAlert();
  492. let result = res;
  493. state.obuStatus = result.obuStatus?result.obuStatus:""
  494. state.cardStatus = result.cardStatus
  495. if (result.cardType == 1 && result.debitType == 1) {
  496. state.cardTypeName = "预存卡"
  497. card['cardTypeName']=3
  498. } else if (result.cardType == 2) {
  499. state.cardTypeName = "储值卡"
  500. card['cardTypeName']=2
  501. } else {
  502. state.cardTypeName = "记账卡"
  503. card['cardTypeName']=1
  504. }
  505. // 卡签提交得信息
  506. card['cardStatus']=result.cardStatus
  507. obu['obuStatus']=result.obuStatus?result.obuStatus:""
  508. cardObuMsgUp()
  509. })
  510. }
  511. // 签信息提交日志记录
  512. const cardObuMsgUp = () => {
  513. var data = {
  514. cardLogInfo: card,
  515. obuLogInfo:obu,
  516. type:"normal"
  517. };
  518. const options = {
  519. type: 2,
  520. data: data,
  521. method: "POST",
  522. showLoading: true,
  523. };
  524. requestNew(cardObuQueryinLog, options).then((res) => {
  525. tools.hideLoadingAlert();
  526. saveRecordApi();
  527. console.log("提交成功")
  528. })
  529. }
  530. </script>
  531. <style scoped>
  532. .wrapper {
  533. padding-bottom: 50rpx;
  534. background: #E9EDF0;
  535. overflow: hidden;
  536. }
  537. .info-card {
  538. margin: 30rpx;
  539. border-radius: 16rpx;
  540. padding-bottom: 40rpx;
  541. background-color: white;
  542. padding: 0 30rpx;
  543. box-sizing: border-box;
  544. }
  545. .info-card .title {
  546. padding: 30rpx 0;
  547. font-size: 36rpx;
  548. text-align: center;
  549. color: #01243A;
  550. }
  551. .info-card .cell {
  552. display: flex;
  553. flex-direction: row;
  554. padding: 18rpx 0rpx;
  555. font-size: 30rpx;
  556. border-bottom: 1rpx solid #E6E9EB;
  557. }
  558. .cell-left {
  559. flex: 1;
  560. text-align: left;
  561. color: #6C6C6C;
  562. }
  563. .cell-right {
  564. margin-left: 30rpx;
  565. text-align: right;
  566. color: #111111;
  567. overflow: hidden;
  568. }
  569. .btn {
  570. background: linear-gradient(to right,#01243A,#004576);
  571. opacity: 1;
  572. border-radius: 100rpx;
  573. color: #fff;
  574. font-size: 30rpx;
  575. height: 80rpx;
  576. line-height: 80rpx;
  577. box-shadow: 0rpx 4rpx 11rpx 1rpx rgba(223, 223, 223, 0.5);
  578. width: 670rpx;
  579. margin: 40rpx;
  580. text-align: center;
  581. }
  582. </style>